From 89510040cc8f128ef16b861bb2afecba2cdc4eef Mon Sep 17 00:00:00 2001 From: Aleksander Sotov Date: Fri, 5 Sep 2025 11:59:02 +0300 Subject: [PATCH] Add Class.isSubtypeOf Issue: https://gitee.com/openharmony/arkcompiler_runtime_core/issues/ICWMFL Testing: all tests passed Signed-off-by: Aleksander Sotov --- .../ets/runtime/ets_libbase_runtime.yaml | 10 ++++ .../ets/runtime/intrinsics/std_core_Class.cpp | 8 +++ .../plugins/ets/stdlib/std/core/Class.ets | 2 + .../ets_func_tests/std/core/ClassTest.ets | 60 +++++++++++++++++++ 4 files changed, 80 insertions(+) diff --git a/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml b/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml index 37557a9960..cba1c334e0 100644 --- a/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml +++ b/static_core/plugins/ets/runtime/ets_libbase_runtime.yaml @@ -6909,6 +6909,16 @@ intrinsics: args: [ ] impl: ark::ets::intrinsics::StdCoreClassIsFixedArray + - name: StdCoreClassIsSubtypeOf + space: ets + class_name: std.core.Class + method_name: isSubtypeOf + static: false + signature: + ret: u1 + args: [ std.core.Class ] + impl: ark::ets::intrinsics::StdCoreClassIsSubtypeOf + ########################## # std.core.RuntimeLinker # ########################## 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..c7a600a757 100644 --- a/static_core/plugins/ets/runtime/intrinsics/std_core_Class.cpp +++ b/static_core/plugins/ets/runtime/intrinsics/std_core_Class.cpp @@ -189,4 +189,12 @@ EtsBoolean StdCoreClassIsFixedArray(EtsClass *cls) return cls->IsArrayClass(); } +EtsBoolean StdCoreClassIsSubtypeOf(EtsClass *cls, EtsClass *other) +{ + if (LIKELY(other->IsInterface())) { + return static_cast(cls->GetRuntimeClass()->Implements(other->GetRuntimeClass())); + } + return static_cast(cls->IsSubClass(other)); +} + } // namespace ark::ets::intrinsics diff --git a/static_core/plugins/ets/stdlib/std/core/Class.ets b/static_core/plugins/ets/stdlib/std/core/Class.ets index eafb797034..3a20433655 100644 --- a/static_core/plugins/ets/stdlib/std/core/Class.ets +++ b/static_core/plugins/ets/stdlib/std/core/Class.ets @@ -36,6 +36,8 @@ export final class Class { return this.superClass } + public native final isSubtypeOf(other: Class): boolean + public native getLinker(): RuntimeLinker public native getInterfaces(): FixedArray 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..ca9bba9543 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,63 @@ function checkFunctions() { } } +class AA {} + +class BB extends AA {} + +class CC extends BB {} + +interface I1 {} + +interface I2 {} + +interface I3 extends I2 {} + +class C3 implements I3 {} + +class Multi extends AA implements I1, I2 {} + +function checkSubTypeOf() { + let a = Class.of(new AA) + let b = Class.of(new BB) + let c = Class.of(new CC) + + arktest.assertTrue(c.isSubtypeOf(Class.of(new Object)), "C is subtype of object") + + arktest.assertTrue(a.isSubtypeOf(a), "AA is subtype of AA") + arktest.assertTrue(b.isSubtypeOf(a), "BB is subtype of AA") + arktest.assertTrue(c.isSubtypeOf(a), "CC is subtype of AA") + arktest.assertTrue(c.isSubtypeOf(b), "CC is subtype of BB") + + arktest.assertFalse(a.isSubtypeOf(b), "AA is not subtype of BB") + arktest.assertFalse(a.isSubtypeOf(c), "AA is not subtype of CC") +} + +function checkSubTypeOfMultipleInterfaces() { + let a = Class.of(new AA) + let b = Class.of(new BB) + let m = Class.of(new Multi) + let ifaces = m.getInterfaces() + let i1 = ifaces[0] + let i2 = ifaces[1] + + arktest.assertTrue(m.isSubtypeOf(a), "Multi is subtype of AA") + arktest.assertTrue(m.isSubtypeOf(i1), "Multi is subtype of I1") + arktest.assertTrue(m.isSubtypeOf(i2), "Multi is subtype of I2") + arktest.assertFalse(m.isSubtypeOf(b), "Multi is not subtype of B") +} + +function checkSubTypeOfInterfaces() { + let m = Class.of(new Multi) + let c3 = Class.of(new C3) + let ifaces = m.getInterfaces() + let i1 = ifaces[0] + let i2 = ifaces[1] + let i3 = c3.getInterfaces()[0] + arktest.assertTrue(i3.isSubtypeOf(i2), "I3 extends I2") + arktest.assertFalse(i2.isSubtypeOf(i3), "I2 doesn't extends I3") +} + function main(): void { let ts = new arktest.ArkTestsuite("Class API test") ts.addTest("checkClassIsNotEnumAndNotInterface", checkClassIsNotEnumAndNotInterface) @@ -212,5 +269,8 @@ function main(): void { ts.addTest("checkInterfaceIsInterfaceAndNotEnum", checkInterfaceIsInterfaceAndNotEnum) ts.addTest("checkFixedArray", checkFixedArray) ts.addTest("checkFunctions", checkFunctions) + ts.addTest('SubtypeOf', checkSubTypeOf) + ts.addTest('Subtypeof multiple interfaces', checkSubTypeOfMultipleInterfaces) + ts.addTest('Subtypeof interfaces', checkSubTypeOfInterfaces) ts.run(); } -- Gitee