From e205b7660079c6a775d6dbc291d028dddb9b0079 Mon Sep 17 00:00:00 2001 From: Aleksander Sotov Date: Thu, 11 Sep 2025 16:17:04 +0300 Subject: [PATCH] Add Class.ofAny, Class.ofObject Issue: https://gitee.com/openharmony/arkcompiler_runtime_core/issues/ICXM0P Testing: all tests passed Signed-off-by: Aleksander Sotov --- .../ets/runtime/ets_libbase_runtime.yaml | 12 +++++- .../ets/runtime/intrinsics/std_core_Class.cpp | 8 ++++ .../plugins/ets/stdlib/std/core/Class.ets | 20 +++++++++- .../ets_func_tests/std/core/ClassTest.ets | 38 +++++++++++++++++++ 4 files changed, 76 insertions(+), 2 deletions(-) diff --git a/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml b/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml index 37557a9960..e004565574 100644 --- a/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml +++ b/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml @@ -6812,13 +6812,23 @@ intrinsics: - name: StdCoreClassOf space: ets class_name: std.core.Class - method_name: of + method_name: ofObject static: true signature: ret: std.core.Class args: [ std.core.Object ] impl: ark::ets::intrinsics::StdCoreClassOf + - name: StdCoreClassOfNull + space: ets + class_name: std.core.Class + method_name: ofNull + static: true + signature: + ret: std.core.Class + args: [] + impl: ark::ets::intrinsics::StdCoreClassOfNull + - name: StdCoreClassCurrent space: ets class_name: std.core.Class diff --git a/static_core/plugins/ets/runtime/intrinsics/std_core_Class.cpp b/static_core/plugins/ets/runtime/intrinsics/std_core_Class.cpp index 0c59560841..a86506dca6 100644 --- a/static_core/plugins/ets/runtime/intrinsics/std_core_Class.cpp +++ b/static_core/plugins/ets/runtime/intrinsics/std_core_Class.cpp @@ -50,6 +50,14 @@ EtsClass *StdCoreClassOf(EtsObject *obj) return obj->GetClass(); } +EtsClass *StdCoreClassOfNull() +{ + auto *coro = EtsCoroutine::GetCurrent(); + ASSERT(coro != nullptr); + const auto *nullObject = EtsObject::FromCoreType(coro->GetNullValue()); + return nullObject->GetClass(); +} + EtsClass *StdCoreClassCurrent() { return GetMethodOwnerClassInFrames(EtsCoroutine::GetCurrent(), 0); diff --git a/static_core/plugins/ets/stdlib/std/core/Class.ets b/static_core/plugins/ets/stdlib/std/core/Class.ets index eafb797034..c09da2f5b9 100644 --- a/static_core/plugins/ets/stdlib/std/core/Class.ets +++ b/static_core/plugins/ets/stdlib/std/core/Class.ets @@ -45,7 +45,25 @@ export final class Class { */ public native initialize(): void - public static native of(obj: Object): Class + private static native ofObject(obj: Object): Class + + private static native ofNull(): Class + + public static ofAny(obj: Any): Class | undefined { + if (obj instanceof Object) { + return Class.ofObject(obj) + } else if (obj === null) { + return Class.ofNull() + } + return undefined + } + + public static of(obj: Object | null): Class { + if (obj instanceof Object) { + return Class.ofObject(obj) + } + return Class.ofNull() + } /** * Get current class diff --git a/static_core/plugins/ets/tests/ets_func_tests/std/core/ClassTest.ets b/static_core/plugins/ets/tests/ets_func_tests/std/core/ClassTest.ets index a3b6bbb970..1e0aff57f0 100644 --- a/static_core/plugins/ets/tests/ets_func_tests/std/core/ClassTest.ets +++ b/static_core/plugins/ets/tests/ets_func_tests/std/core/ClassTest.ets @@ -205,6 +205,42 @@ function checkFunctions() { } } +function checkClassOfAny() { + let clsObj: Class = Class.of(new Object) + let clsNull: Class = Class.of(null) + + arktest.assertEQ(Class.ofAny(undefined), undefined) + arktest.assertEQ(Class.ofAny(new Object), clsObj) + arktest.assertEQ(Class.ofAny(null), clsNull) + + arktest.assertEQ(Class.ofAny(1), Class.ofAny(2)) + arktest.assertEQ(Class.ofAny(1.0f), Class.ofAny(2.0f)) + arktest.assertEQ(Class.ofAny(true), Class.ofAny(false)) + arktest.assertEQ(Class.ofAny(1.0), Class.ofAny(2.0)) + arktest.assertEQ(Class.ofAny("foo"), Class.ofAny("bar")) + arktest.assertEQ(Class.ofAny(c'a'), Class.ofAny(c'b')) + arktest.assertEQ(Class.ofAny(() => {}), Class.ofAny(() => {})) + arktest.assertEQ(Class.ofAny([1,23]), Class.ofAny([1,2,3])) +} + +function checkClassOfObject() { + let clsObj: Class = Class.of(new Object) + let clsNull: Class = Class.of(null) + + arktest.assertNE(clsObj, clsNull) + arktest.assertEQ(clsObj.getName(), "std.core.Object") + arktest.assertEQ(clsNull.getName(), "std.core.Null") + + arktest.assertEQ(Class.of(1), Class.of(2)) + arktest.assertEQ(Class.of(1.0f), Class.of(2.0f)) + arktest.assertEQ(Class.of(true), Class.of(false)) + arktest.assertEQ(Class.of(1.0), Class.of(2.0)) + arktest.assertEQ(Class.of("foo"), Class.of("bar")) + arktest.assertEQ(Class.of(c'a'), Class.of(c'b')) + arktest.assertEQ(Class.of(() => {} as Function), Class.of(() => {} as Function)) + arktest.assertEQ(Class.of([1,23]), Class.of([1,2,3])) +} + function main(): void { let ts = new arktest.ArkTestsuite("Class API test") ts.addTest("checkClassIsNotEnumAndNotInterface", checkClassIsNotEnumAndNotInterface) @@ -212,5 +248,7 @@ function main(): void { ts.addTest("checkInterfaceIsInterfaceAndNotEnum", checkInterfaceIsInterfaceAndNotEnum) ts.addTest("checkFixedArray", checkFixedArray) ts.addTest("checkFunctions", checkFunctions) + ts.addTest("checkClassOfAny", checkClassOfAny) + ts.addTest("checkClassOfObject", checkClassOfObject) ts.run(); } -- Gitee