diff --git a/ecmascript/object_operator.cpp b/ecmascript/object_operator.cpp index 325ee997ac50f9e9704e72e897bf3dd6df14e7ba..0ba53219723d26a4b1dad11ba457dfc1eb589bc3 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 379c9b1c2d0c7d11753c8166d7d5ba02130e2a50..96db30e385969e561e8d9f82c975e564cc7be8c8 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 1caa189eb2292f6e930b3271056602c9b5ecd4cf..1d476d1ecc703067212b172990ed5feedce86b50 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);