diff --git a/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp b/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp index 9efc95e27ffe3016dc0665858c04d4d2f882de8f..fc6016499e1f98105c12dc481abf8a15036b4ce8 100644 --- a/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp +++ b/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp @@ -203,7 +203,8 @@ bool EtsClassLinkerExtension::InitializeArrayClass(Class *arrayClass, Class *com return true; } -bool EtsClassLinkerExtension::InitializeClass(Class *klass) +// zzm +bool EtsClassLinkerExtension::InitializeClass(Class *klass, [[maybe_unused]] ClassLinkerErrorHandler *errorHandler) { ASSERT(IsInitialized()); ASSERT_HAVE_ACCESS_TO_MANAGED_OBJECTS(); diff --git a/static_core/plugins/ets/runtime/ets_class_linker_extension.h b/static_core/plugins/ets/runtime/ets_class_linker_extension.h index 1800ebf9ac879fa087866290e19ef883d8509b5f..01fcde8817b1ce16e69238ef6b4e1ae9f09dcc3b 100644 --- a/static_core/plugins/ets/runtime/ets_class_linker_extension.h +++ b/static_core/plugins/ets/runtime/ets_class_linker_extension.h @@ -69,7 +69,7 @@ public: void InitializeClassRoots(); - bool InitializeClass(Class *klass) override; + bool InitializeClass(Class *klass, ClassLinkerErrorHandler *errorHandler = nullptr) override; bool IsMethodNativeApi(const Method *method) const override; diff --git a/static_core/plugins/ets/runtime/types/ets_class.cpp b/static_core/plugins/ets/runtime/types/ets_class.cpp index ca06a88b58035c84e271009d421b640ff8d40937..7b610aaba1e52eeefaa68f653fccd447930384dc 100644 --- a/static_core/plugins/ets/runtime/types/ets_class.cpp +++ b/static_core/plugins/ets/runtime/types/ets_class.cpp @@ -421,6 +421,7 @@ static bool HasFunctionTypeInSuperClasses(EtsClass *cls) return false; } +// zzm void EtsClass::Initialize(EtsClass *superClass, uint16_t accessFlags, bool isPrimitiveType) { ASSERT_HAVE_ACCESS_TO_MANAGED_OBJECTS(); diff --git a/static_core/plugins/ets/runtime/types/ets_class.h b/static_core/plugins/ets/runtime/types/ets_class.h index 1f7f9a0a17d6301c8dc6b65b42e26a644b7d9750..2515da3eae6bf7f0660304a3d619c9368aa68dbd 100644 --- a/static_core/plugins/ets/runtime/types/ets_class.h +++ b/static_core/plugins/ets/runtime/types/ets_class.h @@ -609,6 +609,7 @@ private: FIELD_UNUSED ObjectPointer name_; // String FIELD_UNUSED ObjectPointer superClass_; // Class FIELD_UNUSED uint32_t flags_; + FIELD_UNUSED uint32_t typeMetadata_; // ets.Class fields END ark::Class klass_; diff --git a/static_core/plugins/ets/stdlib/std/core/Class.ets b/static_core/plugins/ets/stdlib/std/core/Class.ets index e2ea8bea008c1f330d3cb3d321d09af36ad9a5f5..873eee43bee559da57f7c0d6e8e8467276b377eb 100644 --- a/static_core/plugins/ets/stdlib/std/core/Class.ets +++ b/static_core/plugins/ets/stdlib/std/core/Class.ets @@ -22,6 +22,7 @@ export final class Class { private name: string | undefined private superClass: Class | undefined private flags: int + private typeMetadata: long private constructor() { throw new Error("Class constructor called") } private native getNameInternal(): string; diff --git a/static_core/runtime/class_linker.cpp b/static_core/runtime/class_linker.cpp index cad9d9876efe3eaf696d89af7e792e378bb0f5ee..56278b872633814671f0120e4a5862ec03225f44 100644 --- a/static_core/runtime/class_linker.cpp +++ b/static_core/runtime/class_linker.cpp @@ -1051,6 +1051,7 @@ Class *ClassLinker::LoadClass(const panda_file::File *pf, panda_file::File::Enti Runtime::GetCurrent()->GetCha()->Update(klass); if (LIKELY(ext->CanInitializeClasses())) { + // zzm if (!ext->InitializeClass(klass)) { LOG(ERROR, CLASS_LINKER) << "Language specific initialization for class '" << descriptor << "' failed"; FreeClass(klass); diff --git a/static_core/runtime/core/core_class_linker_extension.h b/static_core/runtime/core/core_class_linker_extension.h index 24ba66eed8ee3fadccc96739a6e0ecacba5e7e6b..c153d167dc4068c3ad647dab9fc42778831f1c2b 100644 --- a/static_core/runtime/core/core_class_linker_extension.h +++ b/static_core/runtime/core/core_class_linker_extension.h @@ -46,7 +46,8 @@ public: void FreeClass(Class *klass) override; - bool InitializeClass([[maybe_unused]] Class *klass) override + bool InitializeClass([[maybe_unused]] Class *klass, + [[maybe_unused]]ClassLinkerErrorHandler *handler = nullptr) override { return true; } diff --git a/static_core/runtime/include/class_linker_extension.h b/static_core/runtime/include/class_linker_extension.h index 787ad45c337efa884c7734ee97617d84770ea923..e0645a60307e6a23049c4557dacd7023efbb5e80 100644 --- a/static_core/runtime/include/class_linker_extension.h +++ b/static_core/runtime/include/class_linker_extension.h @@ -60,7 +60,8 @@ public: virtual void FreeClass(Class *klass) = 0; - virtual bool InitializeClass(Class *klass) = 0; + // zzm + virtual bool InitializeClass(Class *klass, ClassLinkerErrorHandler *handler = nullptr) = 0; virtual const void *GetNativeEntryPointFor(Method *method) const = 0; diff --git a/static_core/runtime/tests/class_linker_test_extension.h b/static_core/runtime/tests/class_linker_test_extension.h index a2e9af5410ef1eac376a08db0a2d35b7463d751a..2140012b9526f245d88834c7f7e832e124b9d1ac 100644 --- a/static_core/runtime/tests/class_linker_test_extension.h +++ b/static_core/runtime/tests/class_linker_test_extension.h @@ -99,7 +99,7 @@ public: RemoveCreatedClass(klass); } - bool InitializeClass(Class * /*klass*/) override + bool InitializeClass(Class * /*klass*/, ClassLinkerErrorHandler * /* */) override { return true; }