Chromium Code Reviews| Index: xfa/fxjse/runtime.cpp |
| diff --git a/xfa/fxjse/runtime.cpp b/xfa/fxjse/runtime.cpp |
| index 64d685bd5ff097cc4b6969388f7836dd41d1fdc0..40652f57ab03ec93bdf4c2c1098d08b57ec724f0 100644 |
| --- a/xfa/fxjse/runtime.cpp |
| +++ b/xfa/fxjse/runtime.cpp |
| @@ -24,18 +24,18 @@ 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) { |
| { |
| v8::Locker locker(pIsolate); |
| if (FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate)) { |
| @@ -43,40 +43,33 @@ static void FXJSE_Runtime_DisposeCallback(v8::Isolate* pIsolate) { |
| pData->m_pFXJSERuntimeData = nullptr; |
| } |
| } |
| - pIsolate->Dispose(); |
| + if (bOwned) |
| + pIsolate->Dispose(); |
| } |
| void FXJSE_Finalize() { |
| - if (CFXJSE_RuntimeData::g_RuntimeList) { |
| - CFXJSE_RuntimeData::g_RuntimeList->RemoveAllRuntimes( |
| + if (CFXJSE_IsolateTracker::g_pInstance) { |
|
dsinclair
2016/06/01 02:57:36
if (!CFXJSE_IsolateTracker::g_pInstance)
return;
Tom Sepez
2016/06/01 20:48:19
Done.
|
| + CFXJSE_IsolateTracker::g_pInstance->RemoveAll( |
| FXJSE_Runtime_DisposeCallback); |
| - delete CFXJSE_RuntimeData::g_RuntimeList; |
| - CFXJSE_RuntimeData::g_RuntimeList = NULL; |
| + delete CFXJSE_IsolateTracker::g_pInstance; |
| + CFXJSE_IsolateTracker::g_pInstance = NULL; |
|
dsinclair
2016/06/01 02:57:36
nit: nullptr
Tom Sepez
2016/06/01 20:48:19
Done.
|
| } |
| } |
| -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) { |
| @@ -100,27 +93,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(); |
| } |