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.

Reply via email to