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.