mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-06 23:54:03 +00:00
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:
parent
880ef2dd83
commit
d9a0ed1bb7
@ -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());
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user