| Index: xfa/fxjse/runtime.cpp
|
| diff --git a/xfa/fxjse/runtime.cpp b/xfa/fxjse/runtime.cpp
|
| index 70d90c44fa53baa16acf929c82e3d75d62ec5c1f..c3d12c3745b0b7d9ad660a461c9a45b65cfa1627 100644
|
| --- a/xfa/fxjse/runtime.cpp
|
| +++ b/xfa/fxjse/runtime.cpp
|
| @@ -24,56 +24,49 @@ static void FXJSE_KillV8() {
|
| }
|
|
|
| void FXJSE_Initialize() {
|
| - if (!CFXJSE_RuntimeData::g_RuntimeList) {
|
| - CFXJSE_RuntimeData::g_RuntimeList = new CFXJSE_RuntimeList;
|
| - }
|
| + if (!CFXJSE_IsolateTracker::g_pInstance)
|
| + CFXJSE_IsolateTracker::g_pInstance = new CFXJSE_IsolateTracker;
|
| +
|
| static FX_BOOL bV8Initialized = FALSE;
|
| - if (bV8Initialized) {
|
| + if (bV8Initialized)
|
| return;
|
| - }
|
| +
|
| bV8Initialized = TRUE;
|
| atexit(FXJSE_KillV8);
|
| }
|
|
|
| -static void FXJSE_Runtime_DisposeCallback(v8::Isolate* pIsolate) {
|
| +static void FXJSE_Runtime_DisposeCallback(v8::Isolate* pIsolate, bool bOwned) {
|
| if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) {
|
| delete pData->m_pFXJSERuntimeData;
|
| pData->m_pFXJSERuntimeData = nullptr;
|
| }
|
| - pIsolate->Dispose();
|
| + if (bOwned)
|
| + pIsolate->Dispose();
|
| }
|
|
|
| void FXJSE_Finalize() {
|
| - if (CFXJSE_RuntimeData::g_RuntimeList) {
|
| - CFXJSE_RuntimeData::g_RuntimeList->RemoveAllRuntimes(
|
| - FXJSE_Runtime_DisposeCallback);
|
| - delete CFXJSE_RuntimeData::g_RuntimeList;
|
| - CFXJSE_RuntimeData::g_RuntimeList = NULL;
|
| - }
|
| + if (!CFXJSE_IsolateTracker::g_pInstance)
|
| + return;
|
| +
|
| + CFXJSE_IsolateTracker::g_pInstance->RemoveAll(FXJSE_Runtime_DisposeCallback);
|
| + delete CFXJSE_IsolateTracker::g_pInstance;
|
| + CFXJSE_IsolateTracker::g_pInstance = nullptr;
|
| }
|
|
|
| -v8::Isolate* FXJSE_Runtime_Create() {
|
| +v8::Isolate* FXJSE_Runtime_Create_Own() {
|
| v8::Isolate::CreateParams params;
|
| params.array_buffer_allocator = new FXJSE_ArrayBufferAllocator();
|
| v8::Isolate* pIsolate = v8::Isolate::New(params);
|
| - ASSERT(pIsolate && CFXJSE_RuntimeData::g_RuntimeList);
|
| - CFXJSE_RuntimeData::g_RuntimeList->AppendRuntime(pIsolate);
|
| + ASSERT(pIsolate && CFXJSE_IsolateTracker::g_pInstance);
|
| + CFXJSE_IsolateTracker::g_pInstance->Append(pIsolate);
|
| return pIsolate;
|
| }
|
|
|
| -void FXJSE_Runtime_Release(v8::Isolate* pIsolate, bool bOwnedRuntime) {
|
| +void FXJSE_Runtime_Release(v8::Isolate* pIsolate) {
|
| if (!pIsolate)
|
| return;
|
| - if (bOwnedRuntime) {
|
| - ASSERT(CFXJSE_RuntimeData::g_RuntimeList);
|
| - CFXJSE_RuntimeData::g_RuntimeList->RemoveRuntime(
|
| - pIsolate, FXJSE_Runtime_DisposeCallback);
|
| - } else {
|
| - if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) {
|
| - delete pData->m_pFXJSERuntimeData;
|
| - pData->m_pFXJSERuntimeData = nullptr;
|
| - }
|
| - }
|
| + CFXJSE_IsolateTracker::g_pInstance->Remove(pIsolate,
|
| + FXJSE_Runtime_DisposeCallback);
|
| }
|
|
|
| CFXJSE_RuntimeData* CFXJSE_RuntimeData::Create(v8::Isolate* pIsolate) {
|
| @@ -97,27 +90,26 @@ CFXJSE_RuntimeData* CFXJSE_RuntimeData::Get(v8::Isolate* pIsolate) {
|
| return pData->m_pFXJSERuntimeData;
|
| }
|
|
|
| -CFXJSE_RuntimeList* CFXJSE_RuntimeData::g_RuntimeList = nullptr;
|
| +CFXJSE_IsolateTracker* CFXJSE_IsolateTracker::g_pInstance = nullptr;
|
|
|
| -void CFXJSE_RuntimeList::AppendRuntime(v8::Isolate* pIsolate) {
|
| - m_RuntimeList.push_back(pIsolate);
|
| +void CFXJSE_IsolateTracker::Append(v8::Isolate* pIsolate) {
|
| + m_OwnedIsolates.push_back(pIsolate);
|
| }
|
|
|
| -void CFXJSE_RuntimeList::RemoveRuntime(
|
| +void CFXJSE_IsolateTracker::Remove(
|
| v8::Isolate* pIsolate,
|
| - CFXJSE_RuntimeList::RuntimeDisposeCallback lpfnDisposeCallback) {
|
| - auto it = std::find(m_RuntimeList.begin(), m_RuntimeList.end(), pIsolate);
|
| - if (it != m_RuntimeList.end())
|
| - m_RuntimeList.erase(it);
|
| - if (lpfnDisposeCallback)
|
| - lpfnDisposeCallback(pIsolate);
|
| + CFXJSE_IsolateTracker::DisposeCallback lpfnDisposeCallback) {
|
| + auto it = std::find(m_OwnedIsolates.begin(), m_OwnedIsolates.end(), pIsolate);
|
| + bool bFound = it != m_OwnedIsolates.end();
|
| + if (bFound)
|
| + m_OwnedIsolates.erase(it);
|
| + lpfnDisposeCallback(pIsolate, bFound);
|
| }
|
|
|
| -void CFXJSE_RuntimeList::RemoveAllRuntimes(
|
| - CFXJSE_RuntimeList::RuntimeDisposeCallback lpfnDisposeCallback) {
|
| - if (lpfnDisposeCallback) {
|
| - for (v8::Isolate* pIsolate : m_RuntimeList)
|
| - lpfnDisposeCallback(pIsolate);
|
| - }
|
| - m_RuntimeList.clear();
|
| +void CFXJSE_IsolateTracker::RemoveAll(
|
| + CFXJSE_IsolateTracker::DisposeCallback lpfnDisposeCallback) {
|
| + for (v8::Isolate* pIsolate : m_OwnedIsolates)
|
| + lpfnDisposeCallback(pIsolate, true);
|
| +
|
| + m_OwnedIsolates.clear();
|
| }
|
|
|