diff --git a/libraries/script-engine/src/v8/FastScriptValueUtils.cpp b/libraries/script-engine/src/v8/FastScriptValueUtils.cpp index 66c5fce2e4..4a6d872801 100644 --- a/libraries/script-engine/src/v8/FastScriptValueUtils.cpp +++ b/libraries/script-engine/src/v8/FastScriptValueUtils.cpp @@ -31,7 +31,7 @@ ScriptValue vec3ToScriptValue(ScriptEngine* engine, const glm::vec3& vec3) { v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); auto context = engineV8->getContext(); - v8::Context::Scope contextScope(engineV8->getContext()); + v8::Context::Scope contextScope(context); V8ScriptValue v8ScriptValue = proxy->toV8Value(); v8::Local v8Object = v8::Local::Cast(v8ScriptValue.get()); @@ -106,7 +106,7 @@ bool vec3FromScriptValue(const ScriptValue& object, glm::vec3& vec3) { v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); auto context = engineV8->getContext(); - v8::Context::Scope contextScope(engineV8->getContext()); + v8::Context::Scope contextScope(context); V8ScriptValue v8ScriptValue = proxy->toV8Value(); v8::Local v8Value = v8ScriptValue.get(); diff --git a/libraries/script-engine/src/v8/ScriptEngineV8.cpp b/libraries/script-engine/src/v8/ScriptEngineV8.cpp index e4f6ad66f2..61dbdd00e0 100644 --- a/libraries/script-engine/src/v8/ScriptEngineV8.cpp +++ b/libraries/script-engine/src/v8/ScriptEngineV8.cpp @@ -307,7 +307,7 @@ void ScriptEngineV8::registerValue(const QString& valueName, V8ScriptValue value v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); v8::Local context = getContext(); - v8::Context::Scope contextScope(getContext()); + v8::Context::Scope contextScope(context); QStringList pathToValue = valueName.split("."); int partsToGo = pathToValue.length(); v8::Local partObject = context->Global(); @@ -370,17 +370,17 @@ void ScriptEngineV8::registerGlobalObject(const QString& name, QObject* object, Q_ASSERT(_v8Isolate->IsCurrent()); v8::Local context = getContext(); v8::Context::Scope contextScope(context); - v8::Local v8GlobalObject = getContext()->Global(); + v8::Local v8GlobalObject = context->Global(); v8::Local v8Name = v8::String::NewFromUtf8(_v8Isolate, name.toStdString().c_str()).ToLocalChecked(); - if (!v8GlobalObject->Get(getContext(), v8Name).IsEmpty()) { + if (!v8GlobalObject->Get(context, v8Name).IsEmpty()) { if (object) { V8ScriptValue value = ScriptObjectV8Proxy::newQObject(this, object, ScriptEngine::QtOwnership); - if(!v8GlobalObject->Set(getContext(), v8Name, value.get()).FromMaybe(false)) { + if(!v8GlobalObject->Set(context, v8Name, value.get()).FromMaybe(false)) { Q_ASSERT(false); } } else { - if(!v8GlobalObject->Set(getContext(), v8Name, v8::Null(_v8Isolate)).FromMaybe(false)) { + if(!v8GlobalObject->Set(context, v8Name, v8::Null(_v8Isolate)).FromMaybe(false)) { Q_ASSERT(false); } } @@ -458,7 +458,8 @@ void ScriptEngineV8::registerGetterSetter(const QString& name, ScriptEngine::Fun v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + auto context = getContext(); + v8::Context::Scope contextScope(context); ScriptValue setterFunction = newFunction(setter, 1); ScriptValue getterFunction = newFunction(getter); @@ -482,7 +483,7 @@ void ScriptEngineV8::registerGetterSetter(const QString& name, ScriptEngine::Fun } else { v8ObjectToSetProperty = v8ParentObject; } - if (!v8ObjectToSetProperty->DefineProperty(getContext(), v8propertyName, propertyDescriptor).FromMaybe(false)) { + if (!v8ObjectToSetProperty->DefineProperty(context, v8propertyName, propertyDescriptor).FromMaybe(false)) { qCDebug(scriptengine_v8) << "DefineProperty failed for registerGetterSetter \"" << name << "\" for parent: \"" << parent << "\""; } @@ -493,7 +494,7 @@ void ScriptEngineV8::registerGetterSetter(const QString& name, ScriptEngine::Fun } else { v8::Local v8propertyName = v8::String::NewFromUtf8(_v8Isolate, name.toStdString().c_str()).ToLocalChecked(); - if (!getContext()->Global()->DefineProperty(getContext(), v8propertyName, propertyDescriptor).FromMaybe(false)) { + if (!context->Global()->DefineProperty(context, v8propertyName, propertyDescriptor).FromMaybe(false)) { qCDebug(scriptengine_v8) << "DefineProperty failed for registerGetterSetter \"" << name << "\" for global object"; } } @@ -557,7 +558,8 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, ScriptProgramV8Wrapper* unwrappedProgram; { - v8::Context::Scope contextScope(getContext()); + auto context = getContext(); + v8::Context::Scope contextScope(context); unwrappedProgram = ScriptProgramV8Wrapper::unwrap(_program); if (unwrappedProgram == nullptr) { _evaluatingCounter--; @@ -588,7 +590,7 @@ ScriptValue ScriptEngineV8::evaluateInClosure(const ScriptValue& _closure, closureObject = v8::Local::Cast(closure.constGet()); qCDebug(scriptengine_v8) << "Closure object members:" << scriptValueDebugListMembersV8(closure); v8::Local testObject = v8::Object::New(_v8Isolate); - if(!testObject->Set(getContext(), v8::String::NewFromUtf8(_v8Isolate, "test_value").ToLocalChecked(), closureObject).FromMaybe(false)) { + if(!testObject->Set(context, v8::String::NewFromUtf8(_v8Isolate, "test_value").ToLocalChecked(), closureObject).FromMaybe(false)) { Q_ASSERT(false); } qCDebug(scriptengine_v8) << "Test object members:" << scriptValueDebugListMembersV8(V8ScriptValue(this, testObject)); @@ -770,12 +772,13 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + auto context = getContext(); + v8::Context::Scope contextScope(context); v8::ScriptOrigin scriptOrigin(getIsolate(), v8::String::NewFromUtf8(getIsolate(), fileName.toStdString().c_str()).ToLocalChecked()); v8::Local script; { v8::TryCatch tryCatch(getIsolate()); - if (!v8::Script::Compile(getContext(), v8::String::NewFromUtf8(getIsolate(), sourceCode.toStdString().c_str()).ToLocalChecked(), &scriptOrigin).ToLocal(&script)) { + if (!v8::Script::Compile(context, v8::String::NewFromUtf8(getIsolate(), sourceCode.toStdString().c_str()).ToLocalChecked(), &scriptOrigin).ToLocal(&script)) { QString errorMessage(QString("Error while compiling script: \"") + fileName + QString("\" ") + formatErrorMessageFromTryCatch(tryCatch)); if (_manager) { _manager->scriptErrorMessage(errorMessage); @@ -790,7 +793,7 @@ ScriptValue ScriptEngineV8::evaluate(const QString& sourceCode, const QString& f v8::Local result; v8::TryCatch tryCatchRun(getIsolate()); - if (!script->Run(getContext()).ToLocal(&result)) { + if (!script->Run(context).ToLocal(&result)) { Q_ASSERT(tryCatchRun.HasCaught()); auto runError = tryCatchRun.Message(); ScriptValue errorValue(new ScriptValueV8Wrapper(this, V8ScriptValue(this, runError->Get()))); @@ -829,7 +832,8 @@ void ScriptEngineV8::setUncaughtException(const v8::TryCatch &tryCatch, const QS v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + v8::Local context = getContext(); + v8::Context::Scope contextScope(context); QString result(""); QString errorMessage = ""; @@ -844,10 +848,10 @@ void ScriptEngineV8::setUncaughtException(const v8::TryCatch &tryCatch, const QS v8::Local exceptionMessage = tryCatch.Message(); if (!exceptionMessage.IsEmpty()) { - ex->errorLine = exceptionMessage->GetLineNumber(getContext()).FromJust(); - ex->errorColumn = exceptionMessage->GetStartColumn(getContext()).FromJust(); + ex->errorLine = exceptionMessage->GetLineNumber(context).FromJust(); + ex->errorColumn = exceptionMessage->GetStartColumn(context).FromJust(); v8::Local backtraceV8String; - if (tryCatch.StackTrace(getContext()).ToLocal(&backtraceV8String)) { + if (tryCatch.StackTrace(context).ToLocal(&backtraceV8String)) { if (backtraceV8String->IsString()) { if (v8::Local::Cast(backtraceV8String)->Length() > 0) { v8::String::Utf8Value backtraceUtf8Value(getIsolate(), backtraceV8String); @@ -875,7 +879,8 @@ QString ScriptEngineV8::formatErrorMessageFromTryCatch(v8::TryCatch &tryCatch) { v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + auto context = getContext(); + v8::Context::Scope contextScope(context); QString result(""); int errorColumnNumber = 0; int errorLineNumber = 0; @@ -885,10 +890,10 @@ QString ScriptEngineV8::formatErrorMessageFromTryCatch(v8::TryCatch &tryCatch) { errorMessage = QString(*utf8Value); v8::Local exceptionMessage = tryCatch.Message(); if (!exceptionMessage.IsEmpty()) { - errorLineNumber = exceptionMessage->GetLineNumber(getContext()).FromJust(); - errorColumnNumber = exceptionMessage->GetStartColumn(getContext()).FromJust(); + errorLineNumber = exceptionMessage->GetLineNumber(context).FromJust(); + errorColumnNumber = exceptionMessage->GetStartColumn(context).FromJust(); v8::Local backtraceV8String; - if (tryCatch.StackTrace(getContext()).ToLocal(&backtraceV8String)) { + if (tryCatch.StackTrace(context).ToLocal(&backtraceV8String)) { if (backtraceV8String->IsString()) { if (v8::Local::Cast(backtraceV8String)->Length() > 0) { v8::String::Utf8Value backtraceUtf8Value(getIsolate(), backtraceV8String); @@ -1000,7 +1005,8 @@ Q_INVOKABLE ScriptValue ScriptEngineV8::evaluate(const ScriptProgramPointer& pro v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + auto context = getContext(); + v8::Context::Scope contextScope(context); ScriptProgramV8Wrapper* unwrapped = ScriptProgramV8Wrapper::unwrap(program); if (!unwrapped) { setUncaughtEngineException("Could not unwrap program", "Compile error"); @@ -1020,7 +1026,7 @@ Q_INVOKABLE ScriptValue ScriptEngineV8::evaluate(const ScriptProgramPointer& pro const V8ScriptProgram& v8Program = unwrapped->toV8Value(); v8::TryCatch tryCatchRun(getIsolate()); - if (!v8Program.constGet()->Run(getContext()).ToLocal(&result)) { + if (!v8Program.constGet()->Run(context).ToLocal(&result)) { Q_ASSERT(tryCatchRun.HasCaught()); auto runError = tryCatchRun.Message(); errorValue = ScriptValue(new ScriptValueV8Wrapper(this, V8ScriptValue(this, runError->Get()))); @@ -1252,7 +1258,8 @@ ScriptValue ScriptEngineV8::newFunction(ScriptEngine::FunctionSignature fun, int v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + auto context = getContext(); + v8::Context::Scope contextScope(context); auto v8FunctionCallback = [](const v8::FunctionCallbackInfo& info) { //V8TODO: is using GetCurrentContext ok, or context wrapper needs to be added? @@ -1276,10 +1283,10 @@ ScriptValue ScriptEngineV8::newFunction(ScriptEngine::FunctionSignature fun, int } }; auto functionDataTemplate = getFunctionDataTemplate(); - auto functionData = functionDataTemplate->NewInstance(getContext()).ToLocalChecked(); + auto functionData = functionDataTemplate->NewInstance(context).ToLocalChecked(); functionData->SetAlignedPointerInInternalField(0, reinterpret_cast(fun)); functionData->SetAlignedPointerInInternalField(1, reinterpret_cast(this)); - auto v8Function = v8::Function::New(getContext(), v8FunctionCallback, functionData, length).ToLocalChecked(); + auto v8Function = v8::Function::New(context, v8FunctionCallback, functionData, length).ToLocalChecked(); V8ScriptValue result(this, v8Function); return ScriptValue(new ScriptValueV8Wrapper(this, std::move(result))); } @@ -1293,11 +1300,12 @@ bool ScriptEngineV8::setProperty(const char* name, const QVariant& value) { v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); - v8::Local global = getContext()->Global(); + v8::Local context = getContext(); + v8::Context::Scope contextScope(context); + v8::Local global = context->Global(); auto v8Name = v8::String::NewFromUtf8(getIsolate(), name).ToLocalChecked(); V8ScriptValue v8Value = castVariantToValue(value); - return global->Set(getContext(), v8Name, v8Value.get()).FromMaybe(false); + return global->Set(context, v8Name, v8Value.get()).FromMaybe(false); } void ScriptEngineV8::setProcessEventsInterval(int interval) { @@ -1411,10 +1419,11 @@ void ScriptEngineV8::compileTest() { v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + auto context = getContext(); + v8::Context::Scope contextScope(context); v8::Local script; v8::ScriptOrigin scriptOrigin(getIsolate(), v8::String::NewFromUtf8(getIsolate(),"test").ToLocalChecked()); - if (v8::Script::Compile(getContext(), v8::String::NewFromUtf8(getIsolate(), "print(\"hello world\");").ToLocalChecked(), &scriptOrigin).ToLocal(&script)) { + if (v8::Script::Compile(context, v8::String::NewFromUtf8(getIsolate(), "print(\"hello world\");").ToLocalChecked(), &scriptOrigin).ToLocal(&script)) { qCDebug(scriptengine_v8) << "Compile test successful"; } else { qCDebug(scriptengine_v8) << "Compile test failed"; @@ -1436,14 +1445,15 @@ QString ScriptEngineV8::scriptValueDebugListMembersV8(const V8ScriptValue &v8Val v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + v8::Local context = getContext(); + v8::Context::Scope contextScope(context); QString membersString(""); if (v8Value.constGet()->IsObject()) { v8::Local membersStringV8; v8::Local object = v8::Local::Cast(v8Value.constGet()); - auto names = object->GetPropertyNames(getContext()).ToLocalChecked(); - if (v8::JSON::Stringify(getContext(), names).ToLocal(&membersStringV8)) { + auto names = object->GetPropertyNames(context).ToLocalChecked(); + if (v8::JSON::Stringify(context, names).ToLocal(&membersStringV8)) { membersString = QString(*v8::String::Utf8Value(_v8Isolate, membersStringV8)); } membersString = QString(*v8::String::Utf8Value(_v8Isolate, membersStringV8)); @@ -1457,16 +1467,17 @@ QString ScriptEngineV8::scriptValueDebugDetailsV8(const V8ScriptValue &v8Value) v8::Locker locker(_v8Isolate); v8::Isolate::Scope isolateScope(_v8Isolate); v8::HandleScope handleScope(_v8Isolate); - v8::Context::Scope contextScope(getContext()); + v8::Local context = getContext(); + v8::Context::Scope contextScope(context); QString parentValueQString(""); v8::Local parentValueString; - if (v8Value.constGet()->ToDetailString(getContext()).ToLocal(&parentValueString)) { + if (v8Value.constGet()->ToDetailString(context).ToLocal(&parentValueString)) { parentValueQString = QString(*v8::String::Utf8Value(_v8Isolate, parentValueString)); } QString JSONQString; v8::Local JSONString; - if (v8::JSON::Stringify(getContext(), v8Value.constGet()).ToLocal(&JSONString)) { + if (v8::JSON::Stringify(context, v8Value.constGet()).ToLocal(&JSONString)) { JSONQString = QString(*v8::String::Utf8Value(_v8Isolate, JSONString)); } return parentValueQString + QString(" JSON: ") + JSONQString; diff --git a/libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp b/libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp index 8dead23ddb..211da7582f 100644 --- a/libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp +++ b/libraries/script-engine/src/v8/ScriptEngineV8_cast.cpp @@ -725,12 +725,12 @@ V8ScriptValue ScriptEngineV8::castVariantToValue(const QVariant& val) { case QMetaType::QDateTime: { double timeMs = val.value().currentMSecsSinceEpoch(); - return V8ScriptValue(this, v8::Date::New(getContext(), timeMs).ToLocalChecked()); + return V8ScriptValue(this, v8::Date::New(context, timeMs).ToLocalChecked()); } case QMetaType::QDate: { double timeMs = val.value().startOfDay().currentMSecsSinceEpoch(); - return V8ScriptValue(this, v8::Date::New(getContext(), timeMs).ToLocalChecked()); + return V8ScriptValue(this, v8::Date::New(context, timeMs).ToLocalChecked()); } default: // check to see if this is a pointer to a QObject-derived object diff --git a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp index 177eeb259f..09e7cb59bb 100644 --- a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp +++ b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp @@ -231,7 +231,8 @@ void ScriptObjectV8Proxy::investigate() { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(_engine->getIsolate()); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); const QMetaObject* metaObject = qobject->metaObject(); @@ -348,7 +349,7 @@ void ScriptObjectV8Proxy::investigate() { } } - v8::Local v8Object = objectTemplate->NewInstance(_engine->getContext()).ToLocalChecked(); + v8::Local v8Object = objectTemplate->NewInstance(context).ToLocalChecked(); v8Object->SetAlignedPointerInInternalField(0, const_cast(internalPointsToQObjectProxy)); v8Object->SetAlignedPointerInInternalField(1, reinterpret_cast(this)); @@ -366,7 +367,7 @@ void ScriptObjectV8Proxy::investigate() { for (auto i = _methods.begin(); i != _methods.end(); i++) { V8ScriptValue method = ScriptMethodV8Proxy::newMethod(_engine, qobject, V8ScriptValue(_engine, v8Object), i.value().methods, i.value().numMaxParams); - if(!propertiesObject->Set(_engine->getContext(), v8::String::NewFromUtf8(isolate, i.value().name.toStdString().c_str()).ToLocalChecked(), method.get()).FromMaybe(false)) { + if(!propertiesObject->Set(context, v8::String::NewFromUtf8(isolate, i.value().name.toStdString().c_str()).ToLocalChecked(), method.get()).FromMaybe(false)) { Q_ASSERT(false); } } @@ -555,7 +556,7 @@ v8::Local ScriptObjectV8Proxy::getPropertyNames() { v8::Isolate::Scope isolateScope(isolate); v8::EscapableHandleScope handleScope(_engine->getIsolate()); auto context = _engine->getContext(); - v8::Context::Scope contextScope(_engine->getContext()); + v8::Context::Scope contextScope(context); //V8TODO: this is really slow. It could be cached if this is called often. v8::Local properties = v8::Array::New(isolate, _props.size() + _methods.size() + _signals.size()); @@ -587,7 +588,8 @@ V8ScriptValue ScriptObjectV8Proxy::property(const V8ScriptValue& object, const V v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); QObject* qobject = _object; if (!qobject) { _engine->getIsolate()->ThrowError("Referencing deleted native object"); @@ -621,7 +623,7 @@ V8ScriptValue ScriptObjectV8Proxy::property(const V8ScriptValue& object, const V } } //V8TODO: is new method created during every call? It needs to be cached instead v8::Local property; - if(_v8Object.Get(isolate)->GetInternalField(2).As()->Get(_engine->getContext(), name.constGet()).ToLocal(&property)) { + if(_v8Object.Get(isolate)->GetInternalField(2).As()->Get(context, name.constGet()).ToLocal(&property)) { if (!property->IsUndefined()) { return V8ScriptValue(_engine, property); } @@ -698,9 +700,10 @@ ScriptVariantV8Proxy::ScriptVariantV8Proxy(ScriptEngineV8* engine, const QVarian v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(engine->getContext()); + auto context = engine->getContext(); + v8::Context::Scope contextScope(context); auto variantDataTemplate = _engine->getVariantDataTemplate(); - auto variantData = variantDataTemplate->NewInstance(engine->getContext()).ToLocalChecked(); + auto variantData = variantDataTemplate->NewInstance(context).ToLocalChecked(); variantData->SetAlignedPointerInInternalField(0, const_cast(internalPointsToQVariantInProxy)); // Internal field doesn't point directly to QVariant, because then alignment would need to be guaranteed in all compilers variantData->SetAlignedPointerInInternalField(1, reinterpret_cast(this)); @@ -723,7 +726,8 @@ V8ScriptValue ScriptVariantV8Proxy::newVariant(ScriptEngineV8* engine, const QVa v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(engine->getContext()); + auto context = engine->getContext(); + v8::Context::Scope contextScope(context); ScriptObjectV8Proxy* protoProxy = ScriptObjectV8Proxy::unwrapProxy(proto); if (!protoProxy) { Q_ASSERT(protoProxy); @@ -734,7 +738,7 @@ V8ScriptValue ScriptVariantV8Proxy::newVariant(ScriptEngineV8* engine, const QVa auto proxy = new ScriptVariantV8Proxy(engine, variant, proto, protoProxy); auto variantProxyTemplate = engine->getVariantProxyTemplate(); - auto variantProxy = variantProxyTemplate->NewInstance(engine->getContext()).ToLocalChecked(); + auto variantProxy = variantProxyTemplate->NewInstance(context).ToLocalChecked(); variantProxy->SetAlignedPointerInInternalField(0, const_cast(internalPointsToQVariantProxy)); variantProxy->SetAlignedPointerInInternalField(1, reinterpret_cast(proxy)); return V8ScriptValue(engine, variantProxy); @@ -912,12 +916,13 @@ V8ScriptValue ScriptMethodV8Proxy::newMethod(ScriptEngineV8* engine, QObject* ob v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(engine->getContext()); + auto context = engine->getContext(); + v8::Context::Scope contextScope(context); auto methodDataTemplate = engine->getMethodDataTemplate(); - auto methodData = methodDataTemplate->NewInstance(engine->getContext()).ToLocalChecked(); + auto methodData = methodDataTemplate->NewInstance(context).ToLocalChecked(); methodData->SetAlignedPointerInInternalField(0, const_cast(internalPointsToMethodProxy)); methodData->SetAlignedPointerInInternalField(1, reinterpret_cast(new ScriptMethodV8Proxy(engine, object, lifetime, metas, numMaxParams))); - auto v8Function = v8::Function::New(engine->getContext(), callback, methodData, numMaxParams).ToLocalChecked(); + auto v8Function = v8::Function::New(context, callback, methodData, numMaxParams).ToLocalChecked(); return V8ScriptValue(engine, v8Function); } @@ -964,7 +969,8 @@ void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo& argume v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); ContextScopeV8 contextScopeV8(_engine); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); QObject* qobject = _object; if (!qobject) { isolate->ThrowError("Referencing deleted native object"); @@ -1057,7 +1063,7 @@ void ScriptMethodV8Proxy::call(const v8::FunctionCallbackInfo& argume if (isValidMetaSelected) { // V8TODO: is this the correct wrapper? - ScriptContextV8Wrapper ourContext(_engine, &arguments, _engine->getContext(), + ScriptContextV8Wrapper ourContext(_engine, &arguments, context, _engine->currentContext()->parentContext()); ScriptContextGuard guard(&ourContext); const QMetaMethod& meta = _metas[bestMeta]; @@ -1153,10 +1159,11 @@ ScriptSignalV8Proxy::ScriptSignalV8Proxy(ScriptEngineV8* engine, QObject* object v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); _objectLifetime.Reset(isolate, lifetime.get()); _objectLifetime.SetWeak(this, weakHandleCallback, v8::WeakCallbackType::kParameter); - _v8Context.Reset(isolate, _engine->getContext()); + _v8Context.Reset(isolate, context); _engine->_signalProxySetLock.lockForWrite(); _engine->_signalProxySet.insert(this); _engine->_signalProxySetLock.unlock(); @@ -1313,7 +1320,8 @@ void ScriptSignalV8Proxy::connect(ScriptValue arg0, ScriptValue arg1) { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); QObject* qobject = _object; if (!qobject) { isolate->ThrowError("Referencing deleted native object"); @@ -1362,7 +1370,7 @@ void ScriptSignalV8Proxy::connect(ScriptValue arg0, ScriptValue arg1) { v8::Local destData; // V8TODO: I'm not sure which context to use here //auto destFunctionContext = destFunction->CreationContext(); - auto destFunctionContext = _engine->getContext(); + auto destFunctionContext = context; Q_ASSERT(thisObject().isObject()); V8ScriptValue v8ThisObject = ScriptValueV8Wrapper::fullUnwrap(_engine, thisObject()); Q_ASSERT(ScriptObjectV8Proxy::unwrapProxy(v8ThisObject)); @@ -1435,7 +1443,8 @@ void ScriptSignalV8Proxy::disconnect(ScriptValue arg0, ScriptValue arg1) { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); // untangle the arguments V8ScriptValue callback(_engine, v8::Null(isolate)); @@ -1481,7 +1490,7 @@ void ScriptSignalV8Proxy::disconnect(ScriptValue arg0, ScriptValue arg1) { v8::Local destData; //auto destFunctionContext = destFunction->CreationContext(); - auto destFunctionContext = _engine->getContext(); + auto destFunctionContext = context; Q_ASSERT(thisObject().isObject()); V8ScriptValue v8ThisObject = ScriptValueV8Wrapper::fullUnwrap(_engine, thisObject()); Q_ASSERT(ScriptObjectV8Proxy::unwrapProxy(v8ThisObject)); diff --git a/libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp b/libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp index fc329c9e19..40bfde0807 100644 --- a/libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp +++ b/libraries/script-engine/src/v8/ScriptValueV8Wrapper.cpp @@ -95,11 +95,11 @@ ScriptValue ScriptValueV8Wrapper::call(const ScriptValue& thisObject, const Scri if (v8This.get()->IsObject()) { recv = v8This.get(); }else{ - recv = _engine->getContext()->Global(); + recv = context->Global(); } lock.lockForRead(); - auto maybeResult = v8Function->Call(_engine->getContext(), recv, args.length(), v8Args); + auto maybeResult = v8Function->Call(context, recv, args.length(), v8Args); lock.unlock(); if (tryCatch.HasCaught()) { QString errorMessage(QString("Function call failed: \"") + _engine->formatErrorMessageFromTryCatch(tryCatch)); @@ -156,7 +156,8 @@ ScriptValue ScriptValueV8Wrapper::construct(const ScriptValueList& args) { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); Q_ASSERT(args.length() <= Q_METAMETHOD_INVOKE_MAX_ARGS); v8::Local v8Args[Q_METAMETHOD_INVOKE_MAX_ARGS]; int argIndex = 0; @@ -174,7 +175,7 @@ ScriptValue ScriptValueV8Wrapper::construct(const ScriptValueList& args) { // V8TODO: I'm not sure if this is correct, maybe use CallAsConstructor instead? // Maybe it's CallAsConstructor for function and NewInstance for class? lock.lockForRead(); - auto maybeResult = v8Function->NewInstance(_engine->getContext(), args.length(), v8Args); + auto maybeResult = v8Function->NewInstance(context, args.length(), v8Args); lock.unlock(); v8::Local result; if (maybeResult.ToLocal(&result)) { @@ -207,13 +208,14 @@ ScriptValue ScriptValueV8Wrapper::data() const { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); // Private properties are an experimental feature for now on V8, so we are using regular value for now if (_value.constGet()->IsObject()) { auto v8Object = v8::Local::Cast(_value.constGet()); v8::Local data; //bool createData = false; - if (!v8Object->Get(_engine->getContext(), v8::String::NewFromUtf8(isolate, "__data").ToLocalChecked()).ToLocal(&data)) { + if (!v8Object->Get(context, v8::String::NewFromUtf8(isolate, "__data").ToLocalChecked()).ToLocal(&data)) { data = v8::Undefined(isolate); Q_ASSERT(false); //createData = true; @@ -268,7 +270,8 @@ bool ScriptValueV8Wrapper::hasProperty(const QString& name) const { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); //V8TODO: does function return true on IsObject too? if (_value.constGet()->IsObject()) { //V8TODO: what about flags? @@ -276,7 +279,7 @@ bool ScriptValueV8Wrapper::hasProperty(const QString& name) const { v8::Local key = v8::String::NewFromUtf8(isolate, name.toStdString().c_str(),v8::NewStringType::kNormal).ToLocalChecked(); const v8::Local object = v8::Local::Cast(_value.constGet()); //V8TODO: Which context? - if (object->Get(_engine->getContext(), key).ToLocal(&resultLocal)) { + if (object->Get(context, key).ToLocal(&resultLocal)) { return true; } else { return false; @@ -292,7 +295,8 @@ ScriptValue ScriptValueV8Wrapper::property(const QString& name, const ScriptValu v8::Locker locker(_engine->getIsolate()); v8::Isolate::Scope isolateScope(_engine->getIsolate()); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); if (_value.constGet()->IsNullOrUndefined()) { return _engine->undefinedValue(); } @@ -303,14 +307,14 @@ ScriptValue ScriptValueV8Wrapper::property(const QString& name, const ScriptValu const v8::Local object = v8::Local::Cast(_value.constGet()); //V8TODO: Which context? lock.lockForRead(); - if (object->Get(_engine->getContext(), key).ToLocal(&resultLocal)) { + if (object->Get(context, key).ToLocal(&resultLocal)) { V8ScriptValue result(_engine, resultLocal); lock.unlock(); return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result))); } else { QString parentValueQString(""); v8::Local parentValueString; - if (_value.constGet()->ToDetailString(_engine->getContext()).ToLocal(&parentValueString)) { + if (_value.constGet()->ToDetailString(context).ToLocal(&parentValueString)) { QString(*v8::String::Utf8Value(isolate, parentValueString)); } qCDebug(scriptengine_v8) << "Failed to get property, parent of value: " << name << ", parent type: " << QString(*v8::String::Utf8Value(isolate, _value.constGet()->TypeOf(isolate))) << " parent value: " << parentValueQString; @@ -371,7 +375,8 @@ void ScriptValueV8Wrapper::setData(const ScriptValue& value) { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); V8ScriptValue unwrapped = fullUnwrap(value); // Private properties are an experimental feature for now on V8, so we are using regular value for now if (_value.constGet()->IsNullOrUndefined()) { @@ -380,7 +385,7 @@ void ScriptValueV8Wrapper::setData(const ScriptValue& value) { } if (_value.constGet()->IsObject()) { auto v8Object = v8::Local::Cast(_value.constGet()); - if( !v8Object->Set(_engine->getContext(), v8::String::NewFromUtf8(isolate, "__data").ToLocalChecked(), unwrapped.constGet()).FromMaybe(false)) { + if( !v8Object->Set(context, v8::String::NewFromUtf8(isolate, "__data").ToLocalChecked(), unwrapped.constGet()).FromMaybe(false)) { qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::data(): Data object couldn't be created"; Q_ASSERT(false); } @@ -396,7 +401,8 @@ void ScriptValueV8Wrapper::setProperty(const QString& name, const ScriptValue& v v8::Locker locker(_engine->getIsolate()); v8::Isolate::Scope isolateScope(_engine->getIsolate()); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); V8ScriptValue unwrapped = fullUnwrap(value); if (_value.constGet()->IsNullOrUndefined()) { qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::setProperty() was called on a value that is null or undefined"; @@ -415,7 +421,7 @@ void ScriptValueV8Wrapper::setProperty(const QString& name, const ScriptValue& v } else { v8::Local details; QString detailsString(""); - if(_value.get()->ToDetailString(_engine->getContext()).ToLocal(&details)) { + if(_value.get()->ToDetailString(context).ToLocal(&details)) { v8::String::Utf8Value utf8Value(isolate,details); detailsString = *utf8Value; } @@ -431,7 +437,8 @@ void ScriptValueV8Wrapper::setProperty(quint32 arrayIndex, const ScriptValue& va v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); V8ScriptValue unwrapped = fullUnwrap(value); if (_value.constGet()->IsNullOrUndefined()) { qCDebug(scriptengine_v8) << "ScriptValueV8Wrapper::setProperty() was called on a value that is null or undefined"; @@ -441,7 +448,7 @@ void ScriptValueV8Wrapper::setProperty(quint32 arrayIndex, const ScriptValue& va auto object = v8::Local::Cast(_value.get()); //V8TODO: I don't know which context to use here lock.lockForRead(); - v8::Maybe retVal(object->Set(_engine->getContext(), arrayIndex, unwrapped.constGet())); + v8::Maybe retVal(object->Set(context, arrayIndex, unwrapped.constGet())); lock.unlock(); if (retVal.IsJust() ? !retVal.FromJust() : true){ qCDebug(scriptengine_v8) << "Failed to set property"; @@ -531,9 +538,10 @@ qint32 ScriptValueV8Wrapper::toInt32() const { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); v8::Local integer; - if (!_value.constGet()->ToInteger(_engine->getContext()).ToLocal(&integer)) { + if (!_value.constGet()->ToInteger(context).ToLocal(&integer)) { Q_ASSERT(false); } return static_cast((integer)->Value()); @@ -544,9 +552,10 @@ double ScriptValueV8Wrapper::toInteger() const { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); v8::Local integer; - if (!_value.constGet()->ToInteger(_engine->getContext()).ToLocal(&integer)) { + if (!_value.constGet()->ToInteger(context).ToLocal(&integer)) { Q_ASSERT(false); } return (integer)->Value(); @@ -557,9 +566,10 @@ double ScriptValueV8Wrapper::toNumber() const { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); v8::Local number; - if (!_value.constGet()->ToNumber(_engine->getContext()).ToLocal(&number)) { + if (!_value.constGet()->ToNumber(context).ToLocal(&number)) { Q_ASSERT(false); } return number->Value(); @@ -581,9 +591,10 @@ quint16 ScriptValueV8Wrapper::toUInt16() const { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); v8::Local integer; - if (!_value.constGet()->ToUint32(_engine->getContext()).ToLocal(&integer)) { + if (!_value.constGet()->ToUint32(context).ToLocal(&integer)) { Q_ASSERT(false); } return static_cast(integer->Value()); @@ -594,9 +605,10 @@ quint32 ScriptValueV8Wrapper::toUInt32() const { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); v8::Local integer; - if (!_value.constGet()->ToUint32(_engine->getContext()).ToLocal(&integer)) { + if (!_value.constGet()->ToUint32(context).ToLocal(&integer)) { Q_ASSERT(false); } return integer->Value(); @@ -632,16 +644,17 @@ bool ScriptValueV8Wrapper::equals(const ScriptValue& other) const { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); - v8::Context::Scope contextScope(_engine->getContext()); + auto context = _engine->getContext(); + v8::Context::Scope contextScope(context); ScriptValueV8Wrapper* unwrappedOther = unwrap(other); Q_ASSERT(_engine->getIsolate() == unwrappedOther->_engine->getIsolate()); if (!unwrappedOther) { return false; }else{ - if (_value.constGet()->Equals(_engine->getContext(), unwrappedOther->toV8Value().constGet()).IsNothing()) { + if (_value.constGet()->Equals(context, unwrappedOther->toV8Value().constGet()).IsNothing()) { return false; } else { - return _value.constGet()->Equals(_engine->getContext(), unwrappedOther->toV8Value().constGet()).FromJust(); + return _value.constGet()->Equals(context, unwrappedOther->toV8Value().constGet()).FromJust(); } } } @@ -670,7 +683,7 @@ bool ScriptValueV8Wrapper::isError() const { v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); auto context = _engine->getContext(); - v8::Context::Scope contextScope(_engine->getContext()); + v8::Context::Scope contextScope(context); v8::Local error; if (!context->Global()->Get(context, v8::String::NewFromUtf8(isolate, "Error").ToLocalChecked()).ToLocal(&error)) { Q_ASSERT(false);