diff --git a/libraries/script-engine/src/v8/ScriptEngineV8.cpp b/libraries/script-engine/src/v8/ScriptEngineV8.cpp index 6d93a735ba..c39995af41 100644 --- a/libraries/script-engine/src/v8/ScriptEngineV8.cpp +++ b/libraries/script-engine/src/v8/ScriptEngineV8.cpp @@ -1164,6 +1164,7 @@ ScriptValue ScriptEngineV8::newFunction(ScriptEngine::FunctionSignature fun, int (object->GetAlignedPointerFromInternalField(0)); ScriptEngineV8 *scriptEngine = reinterpret_cast (object->GetAlignedPointerFromInternalField(1)); + ContextScopeV8 contextScopeV8(scriptEngine); ScriptContextV8Wrapper scriptContext(scriptEngine, &info, scriptEngine->getContext(), scriptEngine->currentContext()->parentContext()); ScriptContextGuard scriptContextGuard(&scriptContext); ScriptValue result = function(&scriptContext, scriptEngine); @@ -1433,3 +1434,18 @@ void ScriptEngineV8::dumpHeapObjectStatistics() { } } } + +ContextScopeV8::ContextScopeV8(ScriptEngineV8 *engine) : + _engine(engine) { + Q_ASSERT(engine); + _isContextChangeNeeded = engine->getContext() != engine->getIsolate()->GetCurrentContext(); + if (_isContextChangeNeeded) { + engine->pushContext(engine->getIsolate()->GetCurrentContext()); + } +} + +ContextScopeV8::~ContextScopeV8() { + if (_isContextChangeNeeded) { + _engine->popContext(); + } +} diff --git a/libraries/script-engine/src/v8/ScriptEngineV8.h b/libraries/script-engine/src/v8/ScriptEngineV8.h index fce0f40edb..f775abc775 100644 --- a/libraries/script-engine/src/v8/ScriptEngineV8.h +++ b/libraries/script-engine/src/v8/ScriptEngineV8.h @@ -274,6 +274,18 @@ private: #endif }; +// This class is used to automatically add context to script engine's context list that is used by C++ calls +// An instance of it needs to be created in every V8 callback + +class ContextScopeV8 { +public: + ContextScopeV8(ScriptEngineV8 *engine); + ~ContextScopeV8(); +private: + bool _isContextChangeNeeded; + ScriptEngineV8* _engine; +}; + #include "V8Types.h" #endif // hifi_ScriptEngineV8_h diff --git a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp index 9ea1ab0ded..8a727559f2 100644 --- a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp +++ b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp @@ -462,6 +462,8 @@ void ScriptObjectV8Proxy::v8Get(v8::Local name, const v8::PropertyCall } v8::Local v8NameString; + ContextScopeV8 contextScopeV8(proxy->_engine); + if (name->IsString()) { V8ScriptString nameString(proxy->_engine, v8::Local::Cast(name)); uint id; @@ -497,6 +499,8 @@ void ScriptObjectV8Proxy::v8Set(v8::Local name, v8::Local v Q_ASSERT(false); } + ContextScopeV8 contextScopeV8(proxy->_engine); + if (name->IsString()) { V8ScriptString nameString(proxy->_engine, v8::Local::Cast(name)); uint id; @@ -800,6 +804,8 @@ void ScriptVariantV8Proxy::v8Get(v8::Local name, const v8::PropertyCal } V8ScriptValue object(proxy->_engine, proxy->_v8Object.Get(info.GetIsolate())); + ContextScopeV8 contextScopeV8(proxy->_engine); + if (name->IsString()) { V8ScriptString nameString(proxy->_engine, v8::Local::Cast(name)); uint id; @@ -831,6 +837,7 @@ void ScriptVariantV8Proxy::v8Set(v8::Local name, v8::Local Q_ASSERT(false); } + ContextScopeV8 contextScopeV8(proxy->_engine); if (name->IsString()) { V8ScriptString nameString(proxy->_engine, v8::Local::Cast(name)); uint id; @@ -940,16 +947,8 @@ void ScriptMethodV8Proxy::callback(const v8::FunctionCallbackInfo& ar } ScriptMethodV8Proxy *proxy = reinterpret_cast(data->GetAlignedPointerFromInternalField(1)); - // V8TODO: all other V8 callbacks need this too - bool isContextChangeNeeded = (proxy->_engine->getContext() != arguments.GetIsolate()->GetCurrentContext()); - if (isContextChangeNeeded) { - qDebug() << "ScriptMethodV8Proxy::callback : changing context"; - proxy->_engine->pushContext(arguments.GetIsolate()->GetCurrentContext()); - } + ContextScopeV8 contextScopeV8(proxy->_engine); proxy->call(arguments); - if (isContextChangeNeeded) { - proxy->_engine->popContext(); - } } void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo& arguments) { @@ -958,6 +957,7 @@ void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo& argume v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); + ContextScopeV8 contextScopeV8(_engine); v8::Context::Scope contextScope(_engine->getContext()); QObject* qobject = _object; if (!qobject) {