From 4cfa217a44ea4e8b833e4151d4661f6734d3c5f3 Mon Sep 17 00:00:00 2001 From: zhangyouyou Date: Tue, 19 Mar 2024 20:13:12 +0800 Subject: [PATCH] fixbug set and get IC update op Signed-off-by: zhangyouyou --- ecmascript/ic/ic_runtime.cpp | 5 +- test/moduletest/BUILD.gn | 1 + test/moduletest/ictest/BUILD.gn | 18 ++++ test/moduletest/ictest/expect_output.txt | 21 ++++ test/moduletest/ictest/ictest.js | 116 +++++++++++++++++++++++ 5 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 test/moduletest/ictest/BUILD.gn create mode 100644 test/moduletest/ictest/expect_output.txt create mode 100644 test/moduletest/ictest/ictest.js diff --git a/ecmascript/ic/ic_runtime.cpp b/ecmascript/ic/ic_runtime.cpp index 81b639d609..3d4c971521 100644 --- a/ecmascript/ic/ic_runtime.cpp +++ b/ecmascript/ic/ic_runtime.cpp @@ -169,7 +169,7 @@ JSTaggedValue LoadICRuntime::LoadMiss(JSHandle receiver, JSHandle ObjectOperator op(GetThread(), receiver, key); auto result = JSHandle(thread_, JSObject::GetProperty(GetThread(), &op)); - if (op.GetValue().IsInternalAccessor()) { + if (op.GetValue().IsAccessor()) { op = ObjectOperator(GetThread(), receiver, key); } if (!op.IsFound() && kind == ICKind::NamedGlobalTryLoadIC) { @@ -226,6 +226,9 @@ JSTaggedValue StoreICRuntime::StoreMiss(JSHandle receiver, JSHand } } bool success = JSObject::SetProperty(&op, value, true); + if (op.GetValue().IsAccessor()) { + op = ObjectOperator(GetThread(), receiver, key); + } RETURN_EXCEPTION_IF_ABRUPT_COMPLETION(thread_); // ic-switch if (!GetThread()->GetEcmaVM()->ICEnabled()) { diff --git a/test/moduletest/BUILD.gn b/test/moduletest/BUILD.gn index 0807bf537b..cdceecbd15 100644 --- a/test/moduletest/BUILD.gn +++ b/test/moduletest/BUILD.gn @@ -282,6 +282,7 @@ group("ark_asm_single_step_test") { "globalthis", # "helloworld", + "ictest", "instanceofic", "jsonparser", "jsonstringifier", diff --git a/test/moduletest/ictest/BUILD.gn b/test/moduletest/ictest/BUILD.gn new file mode 100644 index 0000000000..1b2b204246 --- /dev/null +++ b/test/moduletest/ictest/BUILD.gn @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//arkcompiler/ets_runtime/test/test_helper.gni") + +host_moduletest_action("ictest") { + deps = [] +} diff --git a/test/moduletest/ictest/expect_output.txt b/test/moduletest/ictest/expect_output.txt new file mode 100644 index 0000000000..5ed5748e04 --- /dev/null +++ b/test/moduletest/ictest/expect_output.txt @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +true +true +undefined +get +get +undefined +0 +1 diff --git a/test/moduletest/ictest/ictest.js b/test/moduletest/ictest/ictest.js new file mode 100644 index 0000000000..36ef4aad31 --- /dev/null +++ b/test/moduletest/ictest/ictest.js @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// enable ic +var a = 0 +for (var i = 0; i < 10000; i++) { + a = a + a; +} + +// case 1 +// test toString in holder. +function t() {} +var I = t.prototype +I.toInt = function() {} +I.toNumber = function() {} +I.toString = function() {} +print(Object.getOwnPropertyDescriptor(I, 'toString').enumerable) + +const o6 = { + ..."function", +} +print(Object.getOwnPropertyDescriptor(o6, 0).configurable) + +try { + const v2 = ("string").match(ArrayBuffer) + class C4 extends Array { + constructor(a6, a7) { + super() + try { + this.concat(ArrayBuffer, v2, ArrayBuffer); + return v2 + } catch (e) {} + } + } + new C4(C4, C4); +} catch(e) {} + +let arr = new Int8Array(10) +for (let v5 =0; v5 < 400;v5++) { +} +Object.defineProperty(arr,"a", { + set(x) { + Reflect.deleteProperty(arr , "b") + return "a"; + } +}) +arr["b"] = "b" +for (let i = 0; i < 1; ++i) { + arr["a"] = 1; + print(arr["a"]) +} + +let obj = { + get a() { + Reflect.deleteProperty(this, "b") + print("get") + return "a"; + }, + b:"b" +} + +for (let v5 =0;v5 < 400; v5++) { +} + +for (let i = 0; i <2; i++) { + obj["a"] +} + +let arr2 = {} +for (let v5 =0; v5 < 400;v5++) { + +} +Object.defineProperty(arr2,"a", { + set(x) { + Reflect.deleteProperty(this , "b") + return "a"; + } +}) +arr2["b"] = "b" + +for(let i = 0; i