diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index 0b90532635d9a39a0e7f9b896f816795a0927552..d8b0af9ee2385a5a8fbf08ef8a2a8b0d77ba0bf9 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -5086,6 +5086,7 @@ JSVM_Status JSVM_CDECL OH_JSVM_RetainScript(JSVM_Env env, JSVM_Script script) { jsvmData->taggedPointer = v8::Global( env->isolate, jsvmData->ToV8Local(env->isolate)); + env->RetainJsvmData(jsvmData); jsvmData->isGlobal = true; return jsvm_clear_last_error(env); } diff --git a/src/js_native_api_v8.h b/src/js_native_api_v8.h index b9111dff98fa8e5f5e6862a03b0bc864e7bbcb02..575e4e954108013a60c187356a2f893b5808792f 100644 --- a/src/js_native_api_v8.h +++ b/src/js_native_api_v8.h @@ -1,6 +1,7 @@ #ifndef SRC_JS_NATIVE_API_V8_H_ #define SRC_JS_NATIVE_API_V8_H_ +#include #include #include "jsvm_types.h" #include "js_native_api_v8_internals.h" @@ -194,24 +195,36 @@ struct JSVM_Env__ { template JSVM_Data__ *NewJsvmData(T srcPtr, JSVM_Data__::DataType type = JSVM_Data__::kJsvmScript) { - if (dataStack.empty() || open_handle_scopes != dataStack.top().first) { - dataStack.emplace(open_handle_scopes, std::vector()); + if (dataStack.size() == 0 || open_handle_scopes != dataStack.back().first) { + dataStack.emplace_back(open_handle_scopes, std::list()); } auto newData = new JSVM_Data__(srcPtr, false, type); - dataStack.top().second.push_back(newData); + dataStack.back().second.push_back(newData); return newData; } void ReleaseJsvmData() { - if (dataStack.empty() || open_handle_scopes != dataStack.top().first) { + if (dataStack.size() == 0 || open_handle_scopes != dataStack.back().first) { return; } - for (auto data : dataStack.top().second) { + for (auto data : dataStack.back().second) { if (!data->isGlobal) { delete data; } } - dataStack.pop(); + dataStack.pop_back(); + } + + void RetainJsvmData(JSVM_Data__* data) + { + for (auto iter = dataStack.rbegin(); iter != dataStack.rend(); ++iter) { + auto& current = iter->second; + auto globalData = std::find(current.begin(), current.end(), data); + if (globalData != current.end()) { + current.erase(globalData); + break; + } + } } v8::Isolate* const isolate; // Shortcut for context()->GetIsolate() @@ -234,7 +247,7 @@ struct JSVM_Env__ { int32_t module_api_version = NODE_API_DEFAULT_MODULE_API_VERSION; bool in_gc_finalizer = false; v8::Locker* locker = nullptr; - std::stack>> dataStack; + std::vector>> dataStack; private: v8impl::Agent* inspector_agent_;