From e75c671a70e842292505ac2ed25e7c4604f8b877 Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Sun, 19 Mar 2023 21:18:58 +0100 Subject: [PATCH] Fixed crash with Cameras app --- interface/src/avatar/MyAvatar.cpp | 4 ++-- .../script-engine/src/v8/ScriptObjectV8Proxy.cpp | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 80a0022cbf..1a843156dc 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -116,9 +116,9 @@ const QString POINT_REF_JOINT_NAME = "RightShoulder"; const float POINT_ALPHA_BLENDING = 1.0f; STATIC_SCRIPT_TYPES_INITIALIZER(+[](ScriptManager* manager){ - auto scriptEngine = manager->engine().get(); + auto scriptEngine = manager->engine(); - registerMetaTypes(scriptEngine); + MyAvatar::registerMetaTypes(scriptEngine); }); STATIC_SCRIPT_INITIALIZER(+[](ScriptManager* manager){ diff --git a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp index 3f80a14fc8..1c5855968b 100644 --- a/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp +++ b/libraries/script-engine/src/v8/ScriptObjectV8Proxy.cpp @@ -48,7 +48,7 @@ static const void *internalPointsToQVariantProxy = (void *)0x13371000; static const void *internalPointsToMethodProxy = (void *)0x13373000; // This is used to pass object in ScriptVariantV8Proxy to methods of prototype object, for example passing AnimationPointer to AnimationObject // Object is then converted using scriptvalue_cast for use inside the prototype -static const void *internalPointsToQVariant = (void *)0x13374000; +static const void *internalPointsToQVariantInProxy = (void *)0x13374000; // Used strictly to replace the "this" object value for property access. May expand to a full context element // if we find it necessary to, but hopefully not needed @@ -727,8 +727,9 @@ ScriptVariantV8Proxy::ScriptVariantV8Proxy(ScriptEngineV8* engine, const QVarian auto variantDataTemplate = v8::ObjectTemplate::New(isolate); variantDataTemplate->SetInternalFieldCount(2); auto variantData = variantDataTemplate->NewInstance(engine->getContext()).ToLocalChecked(); - variantData->SetAlignedPointerInInternalField(0, const_cast(internalPointsToQVariant)); - variantData->SetAlignedPointerInInternalField(1, reinterpret_cast(&_variant)); + 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)); _v8Object.Reset(isolate, v8::Local::Cast(variantData)); _name = QString::fromLatin1(variant.typeName()); } @@ -738,6 +739,7 @@ ScriptVariantV8Proxy::~ScriptVariantV8Proxy() { v8::Locker locker(isolate); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); + // V8TODO: Add similar deletion handling as for object proxy //_v8ObjectTemplate.Reset(); _v8Object.Reset(); } @@ -817,10 +819,11 @@ QVariant* ScriptVariantV8Proxy::unwrapQVariantPointer(v8::Isolate* isolate, cons if (v8Object->InternalFieldCount() != 2) { return nullptr; } - if (v8Object->GetAlignedPointerFromInternalField(0) != internalPointsToQVariant) { + if (v8Object->GetAlignedPointerFromInternalField(0) != internalPointsToQVariantInProxy) { return nullptr; } - return reinterpret_cast(v8Object->GetAlignedPointerFromInternalField(1)); + auto proxy = reinterpret_cast(v8Object->GetAlignedPointerFromInternalField(1)); + return &(proxy->_variant); }