mirror of
https://github.com/RGBCube/serenity
synced 2025-07-17 03:57:39 +00:00
LibJS/Bytecode: Implement destructuring assignment
This commit is contained in:
parent
f99f5d740e
commit
0151dc562a
1 changed files with 14 additions and 3 deletions
|
@ -521,6 +521,8 @@ Bytecode::CodeGenerationErrorOr<void> Identifier::generate_bytecode(Bytecode::Ge
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Bytecode::CodeGenerationErrorOr<void> generate_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::SetVariable::InitializationMode, Bytecode::Register const& value_reg);
|
||||||
|
|
||||||
Bytecode::CodeGenerationErrorOr<void> AssignmentExpression::generate_bytecode(Bytecode::Generator& generator) const
|
Bytecode::CodeGenerationErrorOr<void> AssignmentExpression::generate_bytecode(Bytecode::Generator& generator) const
|
||||||
{
|
{
|
||||||
if (m_op == AssignmentOp::Assignment) {
|
if (m_op == AssignmentOp::Assignment) {
|
||||||
|
@ -600,7 +602,18 @@ Bytecode::CodeGenerationErrorOr<void> AssignmentExpression::generate_bytecode(By
|
||||||
},
|
},
|
||||||
// 2. Let assignmentPattern be the AssignmentPattern that is covered by LeftHandSideExpression.
|
// 2. Let assignmentPattern be the AssignmentPattern that is covered by LeftHandSideExpression.
|
||||||
[&](NonnullRefPtr<BindingPattern> const& pattern) -> Bytecode::CodeGenerationErrorOr<void> {
|
[&](NonnullRefPtr<BindingPattern> const& pattern) -> Bytecode::CodeGenerationErrorOr<void> {
|
||||||
TODO();
|
// 3. Let rref be the result of evaluating AssignmentExpression.
|
||||||
|
// 4. Let rval be ? GetValue(rref).
|
||||||
|
TRY(m_rhs->generate_bytecode(generator));
|
||||||
|
auto value_register = generator.allocate_register();
|
||||||
|
generator.emit<Bytecode::Op::Store>(value_register);
|
||||||
|
|
||||||
|
// 5. Perform ? DestructuringAssignmentEvaluation of assignmentPattern with argument rval.
|
||||||
|
TRY(generate_binding_pattern_bytecode(generator, pattern, Bytecode::Op::SetVariable::InitializationMode::Set, value_register));
|
||||||
|
|
||||||
|
// 6. Return rval.
|
||||||
|
generator.emit<Bytecode::Op::Load>(value_register);
|
||||||
|
return {};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1107,8 +1120,6 @@ Bytecode::CodeGenerationErrorOr<void> FunctionExpression::generate_bytecode(Byte
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static Bytecode::CodeGenerationErrorOr<void> generate_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::SetVariable::InitializationMode, Bytecode::Register const& value_reg);
|
|
||||||
|
|
||||||
static Bytecode::CodeGenerationErrorOr<void> generate_object_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::SetVariable::InitializationMode initialization_mode, Bytecode::Register const& value_reg)
|
static Bytecode::CodeGenerationErrorOr<void> generate_object_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::SetVariable::InitializationMode initialization_mode, Bytecode::Register const& value_reg)
|
||||||
{
|
{
|
||||||
Vector<Bytecode::Register> excluded_property_names;
|
Vector<Bytecode::Register> excluded_property_names;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue