diff --git a/static_core/plugins/ets/runtime/ets_stubs.cpp b/static_core/plugins/ets/runtime/ets_stubs.cpp index fa532f63e98d196bdaee0a3eb7ff090e3618298a..b2f1f6f6efd0fd1483cb50e2f3622d285cdc41aa 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 0630ef086fd34f92e2f749d95a34db998c29a915..a769f61e638618b42ce3d9d212b0fb81fa9ba7cf 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 3b1a7c3f8262b061c0a8da35be7f29287ac5b0c2..8caf1a55688799a1111e9c1468d4dc00f16fbb59 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 6b341a3319c648e204d86e4c4b6702539cfa37b8..c72ccb1e34841784fd0e6ac0e09ef269bd92ffaa 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 ef78d38d12ba0ae19787dd8e102a49b748b0878f..3a5b3d0aa4d4f61dbc766b2cae6af5bfeaabf946 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 e650df17568e90608794f4a3da49f532a2ad03a1..55592e3cc0c30aa83b32b4150d80257b7fa5843d 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")); }