From 615c9925e88a0f43d089d743ca04590f4a8d468a Mon Sep 17 00:00:00 2001 From: quiet-thought Date: Tue, 1 Jul 2025 13:02:27 +0800 Subject: [PATCH] Disable profiletypeinfo for multi-contexts Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/ICJ2ZB Signed-off-by: quiet-thought Change-Id: I3106cb2d7473cd130e1b718cf9b0722e9c70f433 --- ecmascript/js_thread.h | 20 ++++++++++++++++++- .../jspandafile/class_info_extractor.cpp | 8 +++++++- ecmascript/napi/jsnapi_expo.cpp | 1 + 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/ecmascript/js_thread.h b/ecmascript/js_thread.h index 7f57eb5ebb..bfd90e3d6d 100644 --- a/ecmascript/js_thread.h +++ b/ecmascript/js_thread.h @@ -1142,7 +1142,8 @@ public: base::AlignedUint64, ElementsHClassEntries, base::AlignedPointer, - base::AlignedUint32> { + base::AlignedUint32, + base::AlignedBool> { enum class Index : size_t { BcStubEntriesIndex = 0, IsEnableCMCGCIndex, @@ -1197,6 +1198,7 @@ public: ArrayHClassIndexesIndex, moduleLoggerIndex, stageOfHotReloadIndex, + isMultiContextTriggeredIndex, NumOfMembers }; static_assert(static_cast(Index::NumOfMembers) == NumOfTypes); @@ -1480,6 +1482,11 @@ public: return GetOffset(Index::stageOfHotReloadIndex)>( isArch32); } + static size_t GetIsMultiContextTriggeredOffset(bool isArch32) + { + return GetOffset(Index::isMultiContextTriggeredIndex)>( + isArch32); + } alignas(EAS) BCStubEntries bcStubEntries_ {}; alignas(EAS) uint32_t isEnableCMCGC_ {0}; @@ -1534,6 +1541,7 @@ public: alignas(EAS) ElementsHClassEntries arrayHClassIndexes_ {}; alignas(EAS) ModuleLogger *moduleLogger_ {nullptr}; alignas(EAS) StageOfHotReload stageOfHotReload_ {StageOfHotReload::INITIALIZE_STAGE_OF_HOTRELOAD}; + alignas(EAS) bool isMultiContextTriggered_ {false}; }; STATIC_ASSERT_EQ_ARCH(sizeof(GlueData), GlueData::SizeArch32, GlueData::SizeArch64); @@ -1576,6 +1584,16 @@ public: glueData_.stageOfHotReload_ = stageOfHotReload; } + bool IsMultiContextTriggered() const + { + return glueData_.isMultiContextTriggered_; + } + + void SetMultiContextTriggered(bool isMultiContextTriggered) + { + glueData_.isMultiContextTriggered_ = isMultiContextTriggered; + } + JSHandle GetDependentInfo() const; void SetDependentInfo(JSTaggedValue info); diff --git a/ecmascript/jspandafile/class_info_extractor.cpp b/ecmascript/jspandafile/class_info_extractor.cpp index 36ef9a9f26..ef47eb2a5d 100644 --- a/ecmascript/jspandafile/class_info_extractor.cpp +++ b/ecmascript/jspandafile/class_info_extractor.cpp @@ -593,7 +593,13 @@ JSHandle ClassHelper::CreateJSFunctionFromTemplate(JSThread *thread, { ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); JSHandle propFunc = factory->CreateJSFunctionFromTemplate(funcTemp); - JSFunction::UpdateProfileTypeInfoCell(thread, funcTemp, propFunc); + if (thread->IsMultiContextTriggered()) { + // Disable the profileTypeInfo sharing in the multi-context scenario. + const GlobalEnvConstants *globalConst = thread->GlobalConstants(); + propFunc->SetRawProfileTypeInfo(thread, globalConst->GetEmptyProfileTypeInfoCell()); + } else { + JSFunction::UpdateProfileTypeInfoCell(thread, funcTemp, propFunc); + } propFunc->SetHomeObject(thread, homeObject); propFunc->SetLexicalEnv(thread, lexenv); return propFunc; diff --git a/ecmascript/napi/jsnapi_expo.cpp b/ecmascript/napi/jsnapi_expo.cpp index ba2d1cfbbb..8dca694b82 100644 --- a/ecmascript/napi/jsnapi_expo.cpp +++ b/ecmascript/napi/jsnapi_expo.cpp @@ -5899,6 +5899,7 @@ Local JSNApi::CreateContext(const EcmaVM *vm) { CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm)); ecmascript::ThreadManagedScope managedScope(thread); + thread->SetMultiContextTriggered(true); ObjectFactory *factory = vm->GetFactory(); JSHandle globalEnv = factory->NewGlobalEnv(); return JSNApiHelper::ToLocal(JSHandle(globalEnv)); -- Gitee