diff --git a/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml b/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml index 37557a9960ef9ab6e366fad925b77328be8959a0..e004565574246201cea71f4d22d849bee2694157 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 0c59560841c7fb84d8094c4014f138c8365f39cc..a86506dca6ff237073fe29e037f75f7fc59d2be4 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 eafb797034624045541c69cdb89587b485055c4a..c09da2f5b96973dede43338479f210d3bcf2fa41 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 a3b6bbb970e26c63fc6e17501481dfa5c70c09e7..1e0aff57f02909f97ff912665b4fc582251e3a4b 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(); }