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:
parent
a28d6291ad
commit
09dce5f1bd
3 changed files with 20 additions and 1 deletions
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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&);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue