1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:17:34 +00:00

LibJS/JIT: Compile the BlockDeclarationInstantiation instruction

This commit is contained in:
Simon Wanner 2023-10-29 15:13:28 +01:00 committed by Andreas Kling
parent a28d6291ad
commit 09dce5f1bd
3 changed files with 20 additions and 1 deletions

View file

@ -1047,6 +1047,8 @@ public:
ThrowCompletionOr<void> execute_impl(Bytecode::Interpreter&) const;
DeprecatedString to_deprecated_string_impl(Bytecode::Executable const&) const;
ScopeNode const& scope_node() const { return m_scope_node; }
private:
ScopeNode const& m_scope_node;
};

View file

@ -1162,6 +1162,22 @@ void Compiler::compile_concat_string(Bytecode::Op::ConcatString const& op)
check_exception();
}
static void cxx_block_declaration_instantiation(VM& vm, ScopeNode const& scope_node)
{
auto old_environment = vm.running_execution_context().lexical_environment;
vm.bytecode_interpreter().saved_lexical_environment_stack().append(old_environment);
vm.running_execution_context().lexical_environment = new_declarative_environment(*old_environment);
scope_node.block_declaration_instantiation(vm, vm.running_execution_context().lexical_environment);
}
void Compiler::compile_block_declaration_instantiation(Bytecode::Op::BlockDeclarationInstantiation const& op)
{
m_assembler.mov(
Assembler::Operand::Register(ARG1),
Assembler::Operand::Imm(bit_cast<u64>(&op.scope_node())));
native_call((void*)cxx_block_declaration_instantiation);
}
void Compiler::jump_to_exit()
{
m_assembler.jump(m_exit_label);

View file

@ -103,7 +103,8 @@ private:
O(TypeofVariable, typeof_variable) \
O(SetVariable, set_variable) \
O(ContinuePendingUnwind, continue_pending_unwind) \
O(ConcatString, concat_string)
O(ConcatString, concat_string) \
O(BlockDeclarationInstantiation, block_declaration_instantiation)
# define DECLARE_COMPILE_OP(OpTitleCase, op_snake_case) \
void compile_##op_snake_case(Bytecode::Op::OpTitleCase const&);