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..bd90f0b18aa428a7871ccee4dee6c4e01b30804f 100644 --- a/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp +++ b/static_core/plugins/ets/runtime/ets_class_linker_extension.cpp @@ -204,6 +204,11 @@ bool EtsClassLinkerExtension::InitializeArrayClass(Class *arrayClass, Class *com } bool EtsClassLinkerExtension::InitializeClass(Class *klass) +{ + return InitializeClass(klass, GetErrorHandler()); +} + +bool EtsClassLinkerExtension::InitializeClass(ark::Class *klass, [[maybe_unused]] ark::ClassLinkerErrorHandler *handler) { ASSERT(IsInitialized()); ASSERT_HAVE_ACCESS_TO_MANAGED_OBJECTS(); @@ -211,10 +216,11 @@ bool EtsClassLinkerExtension::InitializeClass(Class *klass) constexpr uint32_t ETS_ACCESS_FLAGS_MASK = 0xFFFFU; EtsClass::FromRuntimeClass(klass)->Initialize( - klass->GetBase() != nullptr ? EtsClass::FromRuntimeClass(klass->GetBase()) : nullptr, - klass->GetAccessFlags() & ETS_ACCESS_FLAGS_MASK, klass->IsPrimitive()); + klass->GetBase() != nullptr ? EtsClass::FromRuntimeClass(klass->GetBase()) : nullptr, + klass->GetAccessFlags() & ETS_ACCESS_FLAGS_MASK, klass->IsPrimitive()); return true; + } void EtsClassLinkerExtension::InitializePrimitiveClass(Class *primitiveClass) 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..a63e0281b7adbc92c594b9521aada86164938644 100644 --- a/static_core/plugins/ets/runtime/ets_class_linker_extension.h +++ b/static_core/plugins/ets/runtime/ets_class_linker_extension.h @@ -71,6 +71,8 @@ public: bool InitializeClass(Class *klass) override; + bool InitializeClass(Class *klass, ClassLinkerErrorHandler *handler) override; + bool IsMethodNativeApi(const Method *method) const override; const void *GetNativeEntryPointFor(Method *method) const override; diff --git a/static_core/plugins/ets/runtime/types/ets_class.h b/static_core/plugins/ets/runtime/types/ets_class.h index 1f7f9a0a17d6301c8dc6b65b42e26a644b7d9750..36fe9da636f02844657627d50c1306e3fe985b51 100644 --- a/static_core/plugins/ets/runtime/types/ets_class.h +++ b/static_core/plugins/ets/runtime/types/ets_class.h @@ -502,6 +502,11 @@ public: return MEMBER_OFFSET(EtsClass, flags_); } + static constexpr size_t GetTypeMetadataOffset() + { + return MEMBER_OFFSET(EtsClass, typeMetadata_); + } + static constexpr size_t GCRefFieldsOffset() { return GetHeaderOffset() + sizeof(header_); @@ -609,6 +614,7 @@ private: FIELD_UNUSED ObjectPointer name_; // String FIELD_UNUSED ObjectPointer superClass_; // Class FIELD_UNUSED uint32_t flags_; + FIELD_UNUSED uint64_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/include/class_linker_extension.h b/static_core/runtime/include/class_linker_extension.h index 787ad45c337efa884c7734ee97617d84770ea923..b0c7f34ebbcfd47e255fafeee65a70445a0217b5 100644 --- a/static_core/runtime/include/class_linker_extension.h +++ b/static_core/runtime/include/class_linker_extension.h @@ -62,6 +62,10 @@ public: virtual bool InitializeClass(Class *klass) = 0; + virtual bool InitializeClass(Class *klass, [[maybe_unused]] ClassLinkerErrorHandler *handler) { + return InitializeClass(klass); + } + virtual const void *GetNativeEntryPointFor(Method *method) const = 0; virtual bool CanThrowException(const Method *method) const = 0;