It looks like mesh is collected, not root. How does root keep mesh alive?

On Wed, Mar 23, 2016, 9:20 PM Scott Duensing <[email protected]>
wrote:

> I've been working on a game engine and using V8 as the embedded language.
> Everything has been going fairly well, using SWIG to wrap native C++
> classes for use in JS.
>
> Until today.
>
> My test code creates a triangle in JavaScript and sends it to the engine
> to be rendered.  It works.  For about 5 seconds.  Then the 'root' object of
> my scene gets garbage collected by V8 and I'm not sure why.  I set a
> breakpoint when the object is destroyed and captured a stack trace:
>
> 0    ComponentMesh::~ComponentMesh    componentMesh.cpp    18    0x4cd39e
> 1    ComponentMesh::~ComponentMesh    componentMesh.cpp    19    0x4cd472
> 2    _wrap_delete_ComponentMesh    componentMesh_wrap.cpp    1788
> 0x435c46
> 3    v8::internal::GlobalHandles::Node::PostGarbageCollectionProcessing(v8
> ::internal::Isolate *)            0x6a7fee
> 4    v8::internal::GlobalHandles::PostScavengeProcessing(int)
> 0x6a7e75
> 5    v8::internal::GlobalHandles::PostGarbageCollectionProcessing(v8::
> internal::GarbageCollector, v8::GCCallbackFlags)            0x6a86ba
> 6    v8::internal::Heap::PerformGarbageCollection(v8::internal::
> GarbageCollector, v8::GCCallbackFlags)            0x6afa77
> 7    v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector,
> const char *, const char *, v8::GCCallbackFlags)            0x6af054
> 8    v8::internal::Factory::NewRawOneByteString(int, v8::internal::
> PretenureFlag)            0x68677d
> 9    v8::internal::Factory::NewStringFromUtf8(v8::internal::Vector<char
> const>, v8::internal::PretenureFlag)            0x686bb0
> 10    v8::String::NewFromUtf8(v8::Isolate *, const char *, v8::
> NewStringType, int)            0x4d00ea
> 11    ScriptInstance::update    scriptInstance.cpp    179    0x41d744
> 12    Scripting::update    scripting.cpp    219    0x41609c
> 13    main    main.cpp    70    0x4b2331
>
>
>
> As you can see, my scripting system calls update() in the JS code which
> should call render() back in the engine.  Except the mesh is being GCed
> before that happens.  The JS is:
>
> "use strict";
>
> var root;
>
> function startup(scriptId) {
>     var mesh = new ComponentMesh("triangle");
>     mesh.addVertex(new Vertex(-1.0, -1.0, 0.0));
>     mesh.addVertex(new Vertex( 1.0, -1.0, 0.0));
>     mesh.addVertex(new Vertex( 0.0,  1.0, 0.0));
>     mesh.addIndex(0);
>     mesh.addIndex(1);
>     mesh.addIndex(2);
>
>     root = new Entity("root");
>     root.addComponent(mesh);
> }
>
> function update(delta, event) {
>     Engine.render(root);
> }
>
> function shutdown() {
> }
>
>
> Why is 'root' being GCed?  The context for this script is Persistent<> and
> I don't call Destroy()/Reset().
>
> The entire codebase is available to browse at
> http://skunkworks.kangaroopunch.com/projects/magrathea/repository
>
> Help?  Please?  Thanks!
>
>
> Scott
>
>
> --
> --
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to