mirror of
https://github.com/RGBCube/serenity
synced 2025-05-18 21:35:06 +00:00
LibJS/Bytecode: Always make own properties in object expressions
When building an object from an object expression, we don't want to go through the full property setting machinery. This patch adds a new PropertyKind::DirectKeyValue for PutById which guarantees that the property becomes an own property. This fixes an issue where setting the "__proto__" property in object expressions wasn't working right. 12 new passes on test262. :^)
This commit is contained in:
parent
91528e94ac
commit
e0b2757f95
3 changed files with 5 additions and 1 deletions
|
@ -936,7 +936,7 @@ Bytecode::CodeGenerationErrorOr<void> ObjectExpression::generate_bytecode(Byteco
|
||||||
Bytecode::Op::PropertyKind property_kind;
|
Bytecode::Op::PropertyKind property_kind;
|
||||||
switch (property->type()) {
|
switch (property->type()) {
|
||||||
case ObjectProperty::Type::KeyValue:
|
case ObjectProperty::Type::KeyValue:
|
||||||
property_kind = Bytecode::Op::PropertyKind::KeyValue;
|
property_kind = Bytecode::Op::PropertyKind::DirectKeyValue;
|
||||||
break;
|
break;
|
||||||
case ObjectProperty::Type::Getter:
|
case ObjectProperty::Type::Getter:
|
||||||
property_kind = Bytecode::Op::PropertyKind::Getter;
|
property_kind = Bytecode::Op::PropertyKind::Getter;
|
||||||
|
|
|
@ -76,6 +76,9 @@ static ThrowCompletionOr<void> put_by_property_key(VM& vm, Value base, Value thi
|
||||||
return vm.throw_completion<TypeError>(ErrorType::ReferenceNullishSetProperty, name, TRY_OR_THROW_OOM(vm, base.to_string_without_side_effects()));
|
return vm.throw_completion<TypeError>(ErrorType::ReferenceNullishSetProperty, name, TRY_OR_THROW_OOM(vm, base.to_string_without_side_effects()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PropertyKind::DirectKeyValue:
|
||||||
|
object->define_direct_property(name, value, Attribute::Enumerable | Attribute::Writable | Attribute::Configurable);
|
||||||
|
break;
|
||||||
case PropertyKind::Spread:
|
case PropertyKind::Spread:
|
||||||
TRY(object->copy_data_properties(vm, value, {}));
|
TRY(object->copy_data_properties(vm, value, {}));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -644,6 +644,7 @@ enum class PropertyKind {
|
||||||
Getter,
|
Getter,
|
||||||
Setter,
|
Setter,
|
||||||
KeyValue,
|
KeyValue,
|
||||||
|
DirectKeyValue, // Used for Object expressions. Always sets an own property, never calls a setter.
|
||||||
Spread,
|
Spread,
|
||||||
ProtoSetter,
|
ProtoSetter,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue