diff --git a/runtime/ecma_vm.cpp b/runtime/ecma_vm.cpp index 9bc11af0a18bd6f548951403b41f03c0792c213c..0db8ca135f04ca8eafe85af7c622bc8205e83c3c 100644 --- a/runtime/ecma_vm.cpp +++ b/runtime/ecma_vm.cpp @@ -253,11 +253,13 @@ bool EcmaVM::Initialize() global_env_ = global_env_handle.GetTaggedValue(); // init global env - global_const->InitRootsClass(thread_, *dyn_class_class_handle); + global_const->InitRootsClass(thread_, dyn_class_class_handle); factory_->ObtainRootClass(GetGlobalEnv()); global_const->InitGlobalConstant(thread_); - global_env_handle->SetEmptyArray(thread_, factory_->NewEmptyArray()); - global_env_handle->SetEmptyWeakArray(thread_, factory_->NewEmptyArray(true)); + JSHandle global_env_handle_array = factory_->NewEmptyArray(); + global_env_handle->SetEmptyArray(thread_, global_env_handle_array); + JSHandle global_env_handle_weak_array = factory_->NewEmptyArray(true); + global_env_handle->SetEmptyWeakArray(thread_, global_env_handle_weak_array); auto layout_info_handle = factory_->CreateLayoutInfo(0); global_env_handle->SetEmptyLayoutInfo(thread_, layout_info_handle); auto symbol_table_handle = SymbolTable::Create(thread_); diff --git a/runtime/global_env_constants.cpp b/runtime/global_env_constants.cpp index c54bfe7d52fffe643f185cb423d2a45b88d422fa..51fb1b1f0a721abf7536267125783812d3eea0b3 100644 --- a/runtime/global_env_constants.cpp +++ b/runtime/global_env_constants.cpp @@ -56,132 +56,150 @@ #include "plugins/ecmascript/runtime/object_wrapper.h" namespace panda::ecmascript { -void GlobalEnvConstants::InitRootsClass([[maybe_unused]] JSThread *thread, JSHClass *dyn_class_class) +void GlobalEnvConstants::InitRootsClass([[maybe_unused]] JSThread *thread, + const JSHandle &dyn_class_class_handle) { // Global constants are readonly. ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); - SetConstant(ConstantIndex::HCLASS_CLASS_INDEX, JSTaggedValue(dyn_class_class)); + SetConstant(ConstantIndex::HCLASS_CLASS_INDEX, JSTaggedValue(*dyn_class_class_handle)); SetConstant(ConstantIndex::STRING_CLASS_INDEX, - factory->NewEcmaDynClass(dyn_class_class, 0, JSType::STRING, HClass::STRING).GetTaggedValue()); - SetConstant(ConstantIndex::ARRAY_CLASS_INDEX, - factory->NewEcmaDynClass(dyn_class_class, 0, JSType::TAGGED_ARRAY, HClass::ARRAY).GetTaggedValue()); - JSHClass *weak_array_class = *factory->NewEcmaDynClass(dyn_class_class, 0, JSType::TAGGED_ARRAY, HClass::ARRAY); + factory->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::STRING, HClass::STRING).GetTaggedValue()); + SetConstant( + ConstantIndex::ARRAY_CLASS_INDEX, + factory->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::TAGGED_ARRAY, HClass::ARRAY).GetTaggedValue()); + JSHClass *weak_array_class = + *factory->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::TAGGED_ARRAY, HClass::ARRAY); weak_array_class->SetWeakContainer(true); SetConstant(ConstantIndex::WEAK_ARRAY_CLASS_INDEX, JSTaggedValue(weak_array_class)); SetConstant(ConstantIndex::BIGINT_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::BIGINT).GetTaggedValue()); + factory->CreateDynClass(*dyn_class_class_handle, JSType::BIGINT).GetTaggedValue()); SetConstant(ConstantIndex::DICTIONARY_CLASS_INDEX, factory - ->NewEcmaDynClass(dyn_class_class, 0, JSType::TAGGED_DICTIONARY, + ->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::TAGGED_DICTIONARY, HClass::ARRAY | HClass::IS_DICTIONARY_ARRAY) .GetTaggedValue()); + SetConstant(ConstantIndex::JS_NATIVE_POINTER_CLASS_INDEX, + factory + ->CreateDynClass(*dyn_class_class_handle, JSType::JS_NATIVE_POINTER, + HClass::NATIVE_POINTER) + .GetTaggedValue()); SetConstant( - ConstantIndex::JS_NATIVE_POINTER_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::JS_NATIVE_POINTER, HClass::NATIVE_POINTER) - .GetTaggedValue()); - SetConstant(ConstantIndex::ENV_CLASS_INDEX, - factory->NewEcmaDynClass(dyn_class_class, 0, JSType::TAGGED_ARRAY, HClass::ARRAY).GetTaggedValue()); - JSHClass *free_object0_class = *factory->NewEcmaDynClass(dyn_class_class, FreeObject::GetTaggedNextOffset(), + ConstantIndex::ENV_CLASS_INDEX, + factory->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::TAGGED_ARRAY, HClass::ARRAY).GetTaggedValue()); + JSHClass *free_object0_class = *factory->NewEcmaDynClass(*dyn_class_class_handle, FreeObject::GetTaggedNextOffset(), JSType::FREE_OBJECT_WITH_NONE_FIELD); free_object0_class->GetHClass()->SetNativeFieldMask(FreeObject::NATIVE_FIELDS_MASK); SetConstant(ConstantIndex::FREE_OBJECT_WITH_NONE_FIELD_CLASS_INDEX, JSTaggedValue(free_object0_class)); - JSHClass *free_object1_class = *factory->NewEcmaDynClass(dyn_class_class, FreeObject::GetTaggedSizeOffset(), + JSHClass *free_object1_class = *factory->NewEcmaDynClass(*dyn_class_class_handle, FreeObject::GetTaggedSizeOffset(), JSType::FREE_OBJECT_WITH_ONE_FIELD); free_object1_class->GetHClass()->SetNativeFieldMask(FreeObject::NATIVE_FIELDS_MASK); SetConstant(ConstantIndex::FREE_OBJECT_WITH_ONE_FIELD_CLASS_INDEX, JSTaggedValue(free_object1_class)); JSHClass *free_object2_class = *factory->CreateDynClass( - dyn_class_class, JSType::FREE_OBJECT_WITH_TWO_FIELD, HClass::IS_FREE_OBJECT); + *dyn_class_class_handle, JSType::FREE_OBJECT_WITH_TWO_FIELD, HClass::IS_FREE_OBJECT); free_object2_class->GetHClass()->SetNativeFieldMask(FreeObject::NATIVE_FIELDS_MASK); SetConstant(ConstantIndex::FREE_OBJECT_WITH_TWO_FIELD_CLASS_INDEX, JSTaggedValue(free_object2_class)); SetConstant(ConstantIndex::SYMBOL_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::SYMBOL).GetTaggedValue()); + factory->CreateDynClass(*dyn_class_class_handle, JSType::SYMBOL).GetTaggedValue()); SetConstant(ConstantIndex::ACCESSOE_DATA_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::ACCESSOR_DATA).GetTaggedValue()); - SetConstant(ConstantIndex::INTERNAL_ACCESSOR_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::INTERNAL_ACCESSOR).GetTaggedValue()); - JSHClass *js_proxy_ordinary_class = *factory->CreateDynClass(dyn_class_class, JSType::JS_PROXY); + factory->CreateDynClass(*dyn_class_class_handle, JSType::ACCESSOR_DATA).GetTaggedValue()); + SetConstant( + ConstantIndex::INTERNAL_ACCESSOR_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::INTERNAL_ACCESSOR).GetTaggedValue()); + JSHClass *js_proxy_ordinary_class = *factory->CreateDynClass(*dyn_class_class_handle, JSType::JS_PROXY); SetConstant(ConstantIndex::JS_PROXY_ORDINARY_CLASS_INDEX, JSTaggedValue(js_proxy_ordinary_class)); - SetConstant(ConstantIndex::OBJECT_WRAPPER_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::OBJECT_WRAPPER).GetTaggedValue()); - SetConstant(ConstantIndex::COMPLETION_RECORD_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::COMPLETION_RECORD).GetTaggedValue()); SetConstant( - ConstantIndex::GENERATOR_CONTEST_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::JS_GENERATOR_CONTEXT).GetTaggedValue()); + ConstantIndex::OBJECT_WRAPPER_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::OBJECT_WRAPPER).GetTaggedValue()); SetConstant( - ConstantIndex::CAPABILITY_RECORD_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::PROMISE_CAPABILITY).GetTaggedValue()); - SetConstant(ConstantIndex::REACTIONS_RECORD_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::PROMISE_REACTIONS).GetTaggedValue()); - SetConstant(ConstantIndex::PROMISE_ITERATOR_RECORD_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::PROMISE_ITERATOR_RECORD) + ConstantIndex::COMPLETION_RECORD_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::COMPLETION_RECORD).GetTaggedValue()); + SetConstant(ConstantIndex::GENERATOR_CONTEST_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::JS_GENERATOR_CONTEXT) .GetTaggedValue()); - SetConstant(ConstantIndex::PROMISE_RECORD_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::PROMISE_RECORD).GetTaggedValue()); - SetConstant(ConstantIndex::PROMISE_RESOLVING_FUNCTIONS_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::RESOLVING_FUNCTIONS_RECORD) + SetConstant(ConstantIndex::CAPABILITY_RECORD_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::PROMISE_CAPABILITY) .GetTaggedValue()); - SetConstant(ConstantIndex::MICRO_JOB_QUEUE_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::MICRO_JOB_QUEUE).GetTaggedValue()); - SetConstant(ConstantIndex::PENDING_JOB_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::PENDING_JOB).GetTaggedValue()); + SetConstant( + ConstantIndex::REACTIONS_RECORD_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::PROMISE_REACTIONS).GetTaggedValue()); + SetConstant(ConstantIndex::PROMISE_ITERATOR_RECORD_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::PROMISE_ITERATOR_RECORD) + .GetTaggedValue()); + SetConstant( + ConstantIndex::PROMISE_RECORD_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::PROMISE_RECORD).GetTaggedValue()); + SetConstant( + ConstantIndex::PROMISE_RESOLVING_FUNCTIONS_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::RESOLVING_FUNCTIONS_RECORD) + .GetTaggedValue()); + SetConstant( + ConstantIndex::MICRO_JOB_QUEUE_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::MICRO_JOB_QUEUE).GetTaggedValue()); + SetConstant( + ConstantIndex::PENDING_JOB_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::PENDING_JOB).GetTaggedValue()); JSHClass *proto_change_marker_class = - *factory->CreateDynClass(dyn_class_class, JSType::PROTO_CHANGE_MARKER); + *factory->CreateDynClass(*dyn_class_class_handle, JSType::PROTO_CHANGE_MARKER); SetConstant(ConstantIndex::PROTO_CHANGE_MARKER_CLASS_INDEX, JSTaggedValue(proto_change_marker_class)); - SetConstant(ConstantIndex::PROTO_CHANGE_DETAILS_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::PROTOTYPE_INFO).GetTaggedValue()); - SetConstant(ConstantIndex::PROTOTYPE_HANDLER_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::PROTOTYPE_HANDLER).GetTaggedValue()); SetConstant( - ConstantIndex::TRANSITION_HANDLER_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::TRANSITION_HANDLER).GetTaggedValue()); - SetConstant(ConstantIndex::PROPERTY_BOX_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::PROPERTY_BOX).GetTaggedValue()); + ConstantIndex::PROTO_CHANGE_DETAILS_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::PROTOTYPE_INFO).GetTaggedValue()); SetConstant( - ConstantIndex::FUNCTION_EXTRA_INFO_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::FUNCTION_EXTRA_INFO).GetTaggedValue()); - JSHClass *program_class = *factory->CreateDynClass(dyn_class_class, JSType::PROGRAM); + ConstantIndex::PROTOTYPE_HANDLER_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::PROTOTYPE_HANDLER).GetTaggedValue()); + SetConstant(ConstantIndex::TRANSITION_HANDLER_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::TRANSITION_HANDLER) + .GetTaggedValue()); + SetConstant(ConstantIndex::PROPERTY_BOX_CLASS_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::PROPERTY_BOX).GetTaggedValue()); + SetConstant(ConstantIndex::FUNCTION_EXTRA_INFO_INDEX, + factory->CreateDynClass(*dyn_class_class_handle, JSType::FUNCTION_EXTRA_INFO) + .GetTaggedValue()); + JSHClass *program_class = *factory->CreateDynClass(*dyn_class_class_handle, JSType::PROGRAM); SetConstant(ConstantIndex::PROGRAM_CLASS_INDEX, JSTaggedValue(program_class)); SetConstant(ConstantIndex::ECMA_MODULE_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::ECMA_MODULE).GetTaggedValue()); + factory->CreateDynClass(*dyn_class_class_handle, JSType::ECMA_MODULE).GetTaggedValue()); JSHClass *js_proxy_callable_class = - *factory->CreateDynClass(dyn_class_class, JSType::JS_PROXY, HClass::IS_CALLABLE); + *factory->CreateDynClass(*dyn_class_class_handle, JSType::JS_PROXY, HClass::IS_CALLABLE); SetConstant(ConstantIndex::JS_PROXY_CALLABLE_CLASS_INDEX, JSTaggedValue(js_proxy_callable_class)); JSHClass *js_proxy_construct_class = - *factory->CreateDynClass(dyn_class_class, JSType::JS_PROXY, HClass::IS_CALLABLE); + *factory->CreateDynClass(*dyn_class_class_handle, JSType::JS_PROXY, HClass::IS_CALLABLE); js_proxy_construct_class->SetConstructor(true); SetConstant(ConstantIndex::JS_PROXY_CONSTRUCT_CLASS_INDEX, JSTaggedValue(js_proxy_construct_class)); SetConstant(ConstantIndex::JS_REALM_CLASS_INDEX, - factory->CreateDynClass(dyn_class_class, JSType::JS_REALM).GetTaggedValue()); + factory->CreateDynClass(*dyn_class_class_handle, JSType::JS_REALM).GetTaggedValue()); JSHClass *class_info_extractor_class = - *factory->CreateDynClass(dyn_class_class, JSType::CLASS_INFO_EXTRACTOR); + *factory->CreateDynClass(*dyn_class_class_handle, JSType::CLASS_INFO_EXTRACTOR); SetConstant(ConstantIndex::CLASS_INFO_EXTRACTOR_HCLASS_INDEX, JSTaggedValue(class_info_extractor_class)); JSHClass *js_regexp_iterator_class = - *factory->CreateDynClass(dyn_class_class, JSType::JS_REG_EXP_ITERATOR, 0); + *factory->CreateDynClass(*dyn_class_class_handle, JSType::JS_REG_EXP_ITERATOR, 0); SetConstant(ConstantIndex::JS_REGEXP_ITERATOR_CLASS_INDEX, JSTaggedValue(js_regexp_iterator_class)); - SetConstant(ConstantIndex::LINKED_HASH_SET_CLASS_INDEX, - factory->NewEcmaDynClass(dyn_class_class, 0, JSType::LINKED_HASH_SET, HClass::ARRAY).GetTaggedValue()); - SetConstant(ConstantIndex::LINKED_HASH_MAP_CLASS_INDEX, - factory->NewEcmaDynClass(dyn_class_class, 0, JSType::LINKED_HASH_MAP, HClass::ARRAY).GetTaggedValue()); + SetConstant( + ConstantIndex::LINKED_HASH_SET_CLASS_INDEX, + factory->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::LINKED_HASH_SET, HClass::ARRAY).GetTaggedValue()); + SetConstant( + ConstantIndex::LINKED_HASH_MAP_CLASS_INDEX, + factory->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::LINKED_HASH_MAP, HClass::ARRAY).GetTaggedValue()); - JSHClass *js_weak_ref_class = *factory->CreateDynClass(dyn_class_class, JSType::JS_WEAK_REF, 0, 0); + JSHClass *js_weak_ref_class = + *factory->CreateDynClass(*dyn_class_class_handle, JSType::JS_WEAK_REF, 0, 0); js_weak_ref_class->SetWeakContainer(true); SetConstant(ConstantIndex::WEAK_REF_CLASS_INDEX, JSTaggedValue(js_weak_ref_class)); JSHClass *weak_hash_set_class = - *factory->NewEcmaDynClass(dyn_class_class, 0, JSType::LINKED_HASH_SET, HClass::ARRAY); + *factory->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::LINKED_HASH_SET, HClass::ARRAY); weak_hash_set_class->SetWeakContainer(true); SetConstant(ConstantIndex::WEAK_LINKED_HASH_SET_CLASS_INDEX, JSTaggedValue(weak_hash_set_class)); JSHClass *weak_hash_map_class = - *factory->NewEcmaDynClass(dyn_class_class, 0, JSType::LINKED_HASH_MAP, HClass::ARRAY); + *factory->NewEcmaDynClass(*dyn_class_class_handle, 0, JSType::LINKED_HASH_MAP, HClass::ARRAY); weak_hash_map_class->SetWeakContainer(true); SetConstant(ConstantIndex::WEAK_LINKED_HASH_MAP_CLASS_INDEX, JSTaggedValue(weak_hash_map_class)); } diff --git a/runtime/global_env_constants.h b/runtime/global_env_constants.h index 0477d3d7d991f1c49fa077876a9e032e1f91c2fd..652aef69b687e6f27b17124fdead2f25a8828320 100644 --- a/runtime/global_env_constants.h +++ b/runtime/global_env_constants.h @@ -361,7 +361,7 @@ public: const JSTaggedValue *EndSlot() const; - void InitRootsClass(JSThread *thread, JSHClass *dyn_class_class); + void InitRootsClass(JSThread *thread, const JSHandle &dyn_class_class_handle); void InitGlobalConstant(JSThread *thread); diff --git a/runtime/object_factory.cpp b/runtime/object_factory.cpp index 2cc0f5be94583ef8a67e61b432924224441db1f9..cdfddbfde377b65a5383e34b1e9631f550b2a932 100644 --- a/runtime/object_factory.cpp +++ b/runtime/object_factory.cpp @@ -1631,7 +1631,8 @@ JSHandle ObjectFactory::NewJSRealm() JSHandle realm_env_handle = NewGlobalEnv(*realm_env_class); ObtainRootClass(env); - realm_env_handle->SetEmptyArray(thread_, NewEmptyArray()); + JSHandle empty_arr = NewEmptyArray(); + realm_env_handle->SetEmptyArray(thread_, empty_arr); auto tagged_queue_handle = NewTaggedQueue(0); realm_env_handle->SetEmptyTaggedQueue(thread_, tagged_queue_handle); auto result = TemplateMap::Create(thread_);