diff --git a/src/rtScriptV8/rtScriptNode.cpp b/src/rtScriptV8/rtScriptNode.cpp index 1019592c9b..71f9a2cca3 100644 --- a/src/rtScriptV8/rtScriptNode.cpp +++ b/src/rtScriptV8/rtScriptNode.cpp @@ -104,6 +104,7 @@ using namespace rtScriptV8NodeUtils; #ifdef RUNINMAIN bool gIsPumpingJavaScript = false; #endif +bool gIsDisposingGCObjs = false; #if NODE_VERSION_AT_LEAST(8,12,0) #define USE_NODE_PLATFORM @@ -119,6 +120,8 @@ class rtNodeContext; typedef rtRef rtNodeContextRef; +std::vector gcdObjs; +void disposeGarbageCollectedObjs(); class rtNodeContext: rtIScriptContext // V8 { public: @@ -1178,6 +1181,7 @@ rtError rtScriptNode::pump() } } #ifdef RUNINMAIN + disposeGarbageCollectedObjs(); gIsPumpingJavaScript = false; } #endif @@ -1197,6 +1201,7 @@ rtError rtScriptNode::collectGarbage() Local local_context = Context::New(mIsolate); Context::Scope contextScope(local_context); mIsolate->LowMemoryNotification(); + disposeGarbageCollectedObjs(); //#endif // RUNINMAIN return RT_OK; } @@ -1452,4 +1457,18 @@ rtError createScriptNode(rtScriptRef& script) return RT_OK; } +void disposeGarbageCollectedObjs() +{ + if (gIsDisposingGCObjs == false) + { + gIsDisposingGCObjs = true; + size_t noelems = gcdObjs.size(); + for (size_t i=0; i gcdObjs; //----------------------------------- @@ -106,7 +107,7 @@ rtWrapperSceneUpdateExit(); { if (NULL == parentRef) { - temp.send("dispose"); + gcdObjs.push_back(temp); } } } @@ -188,7 +189,7 @@ rtWrapperSceneUpdateExit(); { if (NULL == parentRef) { - temp.send("dispose"); + gcdObjs.push_back(temp); } } }