Fix AccessorData Cast Bug

Deal with PropertyBox before cast to AccessorData.

Issue: #I7FLRW

Signed-off-by: lichenshuai <lichenshuai@huawei.com>
Change-Id: Ice3c11d8c5ea5f0e12fe5d3686773f6fd6b8da35
This commit is contained in:
lichenshuai 2023-06-25 10:19:30 +08:00
parent 880ef2dd83
commit d9a0ed1bb7
2 changed files with 25 additions and 4 deletions

View File

@ -424,7 +424,12 @@ void ObjectOperator::TransitionForAttributeChanged(const JSHandle<JSObject> &rec
bool ObjectOperator::UpdateValueAndDetails(const JSHandle<JSObject> &receiver, const JSHandle<JSTaggedValue> &value,
PropertyAttributes attr, bool attrChanged)
{
bool isInternalAccessor = IsAccessorDescriptor() && AccessorData::Cast(GetValue().GetTaggedObject())->IsInternal();
auto valueAccessor = GetValue();
if (valueAccessor.IsPropertyBox()) {
valueAccessor = PropertyBox::Cast(valueAccessor.GetTaggedObject())->GetValue();
}
bool isInternalAccessor = IsAccessorDescriptor()
&& AccessorData::Cast(valueAccessor.GetTaggedObject())->IsInternal();
if (attrChanged) {
TransitionForAttributeChanged(receiver, attr);
}
@ -568,9 +573,13 @@ bool ObjectOperator::WriteDataProperty(const JSHandle<JSObject> &receiver, const
}
}
auto valueAccessor = GetValue();
if (valueAccessor.IsPropertyBox()) {
valueAccessor = PropertyBox::Cast(valueAccessor.GetTaggedObject())->GetValue();
}
JSHandle<AccessorData> accessor =
(IsAccessorDescriptor() && !JSHandle<AccessorData>::Cast(value_)->IsInternal()) ?
JSHandle<AccessorData>::Cast(value_) :
(IsAccessorDescriptor() && !JSHandle<AccessorData>(thread_, valueAccessor)->IsInternal()) ?
JSHandle<AccessorData>(thread_, valueAccessor) :
thread_->GetEcmaVM()->GetFactory()->NewAccessorData();
if (desc.HasGetter()) {
accessor->SetGetter(thread_, desc.GetGetter().GetTaggedValue());

View File

@ -34,4 +34,16 @@ var obj2 = {d:1, ...obj1, e:5};
assertEqual(obj2, {d:1, a:2, b:3, c:4, e:5});
var obj = {["a" + "b" + "de"]:function() {return 1;}}
assertEqual(obj.abde.name, "abde");
assertEqual(obj.abde.name, "abde");
var foo = () => {
function f1() {
return this;
}
function f2() {
return f1;
}
Object.defineProperty(this, "detailed", {configurable:true, enumerable:true, get:f1, set:f2});
};
foo();
foo(); // expect no error