From 4534d321572f0c0feb33ad214024a3a4ea6c80f4 Mon Sep 17 00:00:00 2001 From: hellowww321 Date: Sat, 16 Aug 2025 10:36:26 +0800 Subject: [PATCH] Fix getProperty by number Issue: https://gitee.com/openharmony/arkui_ace_engine/issues/ICT9CB Signed-off-by: hellowww321 Change-Id: I42e9658cbd5a5001a300418f5918904971f144d7 --- static_core/plugins/ets/runtime/ets_stubs.cpp | 19 ++----------------- .../ets/stdlib/std/interop/ESValue.ets | 18 +++++++++++------- .../tests/test_esvalue/esvalue_def_test.cpp | 4 ++-- .../tests/test_esvalue/esvalue_def_test.ets | 13 +++++++++++-- .../tests/test_esvalue/esvalue_def_test.js | 3 ++- .../tests/test_esvalue2/esvalue_def_test.cpp | 3 +-- 6 files changed, 29 insertions(+), 31 deletions(-) diff --git a/static_core/plugins/ets/runtime/ets_stubs.cpp b/static_core/plugins/ets/runtime/ets_stubs.cpp index fa532f63e9..b2f1f6f6ef 100644 --- a/static_core/plugins/ets/runtime/ets_stubs.cpp +++ b/static_core/plugins/ets/runtime/ets_stubs.cpp @@ -578,16 +578,9 @@ EtsObject *EtsLdbyval(EtsCoroutine *coro, EtsObject *thisObj, EtsObject *valObj) if (valObj->IsStringClass()) { return xRefObjectThis.GetProperty( coro, utf::Mutf8AsCString(EtsString::FromEtsObject(valObj)->GetDataMUtf8())); - } - if (valObj->GetClass()->GetRuntimeClass()->IsXRefClass()) { + } else { return xRefObjectThis.GetProperty(coro, valObj); } - auto unboxedValue = GetBoxedNumericValue(PlatformTypes(coro), valObj); - if (unboxedValue.has_value()) { - return xRefObjectThis.GetProperty(coro, unboxedValue.value()); - } - ThrowEtsInvalidKey(coro, valObj->GetClass()->GetDescriptor()); - return nullptr; }); } else { // ASSERTION. LHS is not a JSValue @@ -627,17 +620,9 @@ bool EtsStbyval(EtsCoroutine *coro, EtsObject *thisObj, EtsObject *key, EtsObjec if (key->IsStringClass()) { std::string name = utf::Mutf8AsCString(EtsString::FromEtsObject(key)->GetDataMUtf8()); return xRefObjectOperator.SetProperty(coro, name, value); - } - if (key->GetClass()->GetRuntimeClass()->IsXRefClass()) { + } else { return xRefObjectOperator.SetProperty(coro, key, value); } - auto unboxedValue = GetBoxedNumericValue(PlatformTypes(coro), key); - if (unboxedValue.has_value()) { - uint32_t index = unboxedValue.value(); - return xRefObjectOperator.SetProperty(coro, index, value); - } - ThrowEtsInvalidKey(coro, key->GetClass()->GetDescriptor()); - return false; }); } else { // ASSERTION. LHS is not a JSValue diff --git a/static_core/plugins/ets/stdlib/std/interop/ESValue.ets b/static_core/plugins/ets/stdlib/std/interop/ESValue.ets index 0630ef086f..a769f61e63 100644 --- a/static_core/plugins/ets/stdlib/std/interop/ESValue.ets +++ b/static_core/plugins/ets/stdlib/std/interop/ESValue.ets @@ -21,8 +21,8 @@ type Any = Object | null | undefined export type StaticOrESValue = ESValue | Object | null | undefined export type ESValueCallbackData = object export type ESValueCallback = (argThis: ESValue, argNewTgt: ESValue, args: FixedArray, data?: ESValueCallbackData) => ESValue -export declare class ESValuePropertyDescriptor { - key: string | ESValue +export class ESValuePropertyDescriptor { + key: string | ESValue = '' call?: ESValueCallback getter?: ESValueCallback setter?: ESValueCallback @@ -317,11 +317,18 @@ export final class ESValue { } public setProperty(index: number, value: StaticOrESValue): void { + let valueObj: Any; if (value instanceof ESValue) { - JSRuntime.setElementObject(this.ev, index.toInt(), (value as ESValue).ev); + valueObj = (value as ESValue).ev + } else { + valueObj = ESValue.wrap(value).ev; + } + if (Number.isInteger(index) && index >= 0) { + JSRuntime.setElementObject(this.ev, index.toInt(), valueObj); return; } - JSRuntime.setElementObject(this.ev, index.toInt(), ESValue.wrap(value).ev); + let numObj = ESValue.wrapNumber(index); + this.setProperty(numObj, value); } public setProperty(property: ESValue, value: StaticOrESValue): void { @@ -459,9 +466,6 @@ export final class ESValue { if (!this.isPromise()) { throw new TypeError("Promise expected"); } - const callerClass = Class.ofCaller(); - const linker = callerClass == undefined ? getBootRuntimeLinker() : callerClass.getLinker(); - let clsName = 'std.core.Promise'; return new Promise((resolve, reject) => { let jsPromise = this.ev as Promise; jsPromise.then((value: Any) => { diff --git a/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.cpp b/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.cpp index 3b1a7c3f82..8caf1a5568 100644 --- a/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.cpp +++ b/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.cpp @@ -141,10 +141,9 @@ TEST_F(EtsESValueJsToEtsTest, test_esvalue_get_property_by_name_safe) ASSERT_EQ(true, CallEtsFunction(GetPackageName(), "checkGetPropertyByNameSafe")); } -TEST_F(EtsESValueJsToEtsTest, DISABLED_test_esvalue_get_property_by_index) +TEST_F(EtsESValueJsToEtsTest, test_esvalue_get_property_by_index) { ASSERT_EQ(true, CallEtsFunction(GetPackageName(), "checkGetPropertyByIndex")); - // NOTE(www): #ICMNGF, need to handle when key is doubel. ASSERT_EQ(true, CallEtsFunction(GetPackageName(), "checkGetPropertyByIndexDouble")); } @@ -171,6 +170,7 @@ TEST_F(EtsESValueJsToEtsTest, test_esvalue_set_property_by_name) TEST_F(EtsESValueJsToEtsTest, test_esvalue_set_property_by_index) { ASSERT_EQ(true, CallEtsFunction(GetPackageName(), "checkSetPropertyByIndex")); + ASSERT_EQ(true, CallEtsFunction(GetPackageName(), "checkSetPropertyByIndexDouble")); } TEST_F(EtsESValueJsToEtsTest, test_esvalue_set_property) diff --git a/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.ets b/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.ets index 6b341a3319..c72ccb1e34 100644 --- a/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.ets +++ b/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.ets @@ -208,6 +208,15 @@ function checkSetPropertyByIndex(): boolean { return val.toBoolean() === false; } +function checkSetPropertyByIndexDouble(): boolean { + let index = 4.2; + let val = 'cccc'; + jsDoubledObj.setProperty(index, val); + jsDoubledObj.setProperty(ESValue.wrap(4.5), val); + return jsDoubledObj.getProperty(index).toString() === val && + jsDoubledObj.getProperty(ESValue.wrap(4.5)).toString() === val; +} + function checkSetProperty(): boolean { let value = ESValue.wrapNumber(5); let property = ESValue.wrapString('property1'); @@ -363,8 +372,8 @@ function testUndefined(): boolean { propObj.setProperty('property2', ESValue.wrap(undefined)); propObj.setProperty(123, undefined); return propObj.getProperty('property1').isUndefined() && - propObj.getProperty('property2').isUndefined() && - propObj.getProperty(123).isUndefined(); + propObj.getProperty('property2').isUndefined() && + propObj.getProperty(123).isUndefined(); } function checkThrowNullOrUndefined(): boolean { diff --git a/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.js b/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.js index ef78d38d12..3a5b3d0aa4 100644 --- a/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.js +++ b/static_core/plugins/ets/tests/interop_js/tests/test_esvalue/esvalue_def_test.js @@ -51,7 +51,8 @@ export class User { } export let doubledObj = { - 3.2: 'aaa' + 3.2: 'aaa', + 4.5: 'bbb', }; export let propObj = { diff --git a/static_core/plugins/ets/tests/interop_js/tests/test_esvalue2/esvalue_def_test.cpp b/static_core/plugins/ets/tests/interop_js/tests/test_esvalue2/esvalue_def_test.cpp index e650df1756..55592e3cc0 100644 --- a/static_core/plugins/ets/tests/interop_js/tests/test_esvalue2/esvalue_def_test.cpp +++ b/static_core/plugins/ets/tests/interop_js/tests/test_esvalue2/esvalue_def_test.cpp @@ -166,10 +166,9 @@ TEST_F(EtsESValueJsToEtsTest, test_esvalue_get_property_by_name_safe) ASSERT_EQ(true, CallEtsFunction(GetPackageName(), "checkGetPropertyByNameSafe")); } -TEST_F(EtsESValueJsToEtsTest, DISABLED_test_esvalue_get_property_by_index) +TEST_F(EtsESValueJsToEtsTest, test_esvalue_get_property_by_index) { ASSERT_EQ(true, CallEtsFunction(GetPackageName(), "checkGetPropertyByIndex")); - // NOTE(www): #ICMNGF, need to handle when key is double. ASSERT_EQ(true, CallEtsFunction(GetPackageName(), "checkGetPropertyByIndexDouble")); } -- Gitee