1
Fork 0
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:
Andreas Kling 2023-07-10 08:44:28 +02:00 committed by Linus Groh
parent 91528e94ac
commit e0b2757f95
3 changed files with 5 additions and 1 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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,
}; };