From 497af036c2c7299b239d407710f173e2e6c6be34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E4=BA=91=E9=A3=9E?= Date: Mon, 10 Feb 2025 09:54:23 +0800 Subject: [PATCH] =?UTF-8?q?WriteDataProperty=20=E8=8E=B7=E5=8F=96InternalA?= =?UTF-8?q?ccessor=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/IBL4J7?from=project-issue Signed-off-by: 杨云飞 --- ecmascript/object_operator.cpp | 15 ++++++++------- .../objectdefineproperties/expect_output.txt | 1 + .../objectdefineproperties.js | 7 +++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ecmascript/object_operator.cpp b/ecmascript/object_operator.cpp index 325ee997ac..0ba5321972 100644 --- a/ecmascript/object_operator.cpp +++ b/ecmascript/object_operator.cpp @@ -807,7 +807,13 @@ bool ObjectOperator::WriteDataProperty(const JSHandle &receiver, const return UpdateValueAndDetails(receiver, desc.GetValue(), attr, attrChanged); } else { - if (IsAccessorDescriptor() && !IsElement()) { + auto valueAccessor = GetValue(); + if (valueAccessor.IsPropertyBox()) { + valueAccessor = PropertyBox::Cast(valueAccessor.GetTaggedObject())->GetValue(); + } + bool isNotInternalAccessor = IsAccessorDescriptor() + && !AccessorData::Cast(valueAccessor.GetTaggedObject())->IsInternal(); + if (isNotInternalAccessor && !IsElement()) { TaggedArray *properties = TaggedArray::Cast(receiver->GetProperties().GetTaggedObject()); if (attrChanged && !properties->IsDictionaryMode()) { // as some accessorData is in globalEnv, we need to new accessorData. @@ -833,12 +839,7 @@ bool ObjectOperator::WriteDataProperty(const JSHandle &receiver, const } } - auto valueAccessor = GetValue(); - if (valueAccessor.IsPropertyBox()) { - valueAccessor = PropertyBox::Cast(valueAccessor.GetTaggedObject())->GetValue(); - } - JSHandle accessor = - (IsAccessorDescriptor() && !JSHandle(thread_, valueAccessor)->IsInternal()) ? + JSHandle accessor = isNotInternalAccessor ? JSHandle(thread_, valueAccessor) : thread_->GetEcmaVM()->GetFactory()->NewAccessorData(); if (desc.HasGetter()) { diff --git a/test/moduletest/objectdefineproperties/expect_output.txt b/test/moduletest/objectdefineproperties/expect_output.txt index 379c9b1c2d..96db30e385 100644 --- a/test/moduletest/objectdefineproperties/expect_output.txt +++ b/test/moduletest/objectdefineproperties/expect_output.txt @@ -17,3 +17,4 @@ undefined 1 2 3 +1 diff --git a/test/moduletest/objectdefineproperties/objectdefineproperties.js b/test/moduletest/objectdefineproperties/objectdefineproperties.js index 1caa189eb2..1d476d1ecc 100644 --- a/test/moduletest/objectdefineproperties/objectdefineproperties.js +++ b/test/moduletest/objectdefineproperties/objectdefineproperties.js @@ -45,3 +45,10 @@ Object.defineProperties(obj1, { print(obj1.foo); print(obj1.bar); print(obj1.hhh); + +function f0() { + return 1; +} + +Object.defineProperty(f0, "length", { enumerable: true, get: f0 }); +print(f0.length); -- Gitee