diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index c0eee56d5d..269afc5f32 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -362,6 +362,8 @@ public: ThrowCompletionOr execute_impl(Bytecode::Interpreter&) const; DeprecatedString to_deprecated_string_impl(Bytecode::Executable const&) const; + Register lhs() const { return m_lhs; } + private: Register m_lhs; }; diff --git a/Userland/Libraries/LibJS/JIT/Compiler.cpp b/Userland/Libraries/LibJS/JIT/Compiler.cpp index 48da931a2f..86fad4e6e3 100644 --- a/Userland/Libraries/LibJS/JIT/Compiler.cpp +++ b/Userland/Libraries/LibJS/JIT/Compiler.cpp @@ -1027,6 +1027,21 @@ void Compiler::compile_leave_lexical_environment(Bytecode::Op::LeaveLexicalEnvir native_call((void*)cxx_leave_lexical_environment); } +static Value cxx_concat_string(VM& vm, Value lhs, Value rhs) +{ + auto string = TRY_OR_SET_EXCEPTION(rhs.to_primitive_string(vm)); + return PrimitiveString::create(vm, lhs.as_string(), string); +} + +void Compiler::compile_concat_string(Bytecode::Op::ConcatString const& op) +{ + load_vm_register(ARG1, op.lhs()); + load_vm_register(ARG2, Bytecode::Register::accumulator()); + native_call((void*)cxx_concat_string); + store_vm_register(op.lhs(), RET); + check_exception(); +} + void Compiler::jump_to_exit() { m_assembler.jump(m_exit_label); @@ -1190,6 +1205,9 @@ OwnPtr Compiler::compile(Bytecode::Executable& bytecode_execut case Bytecode::Instruction::Type::ContinuePendingUnwind: compiler.compile_continue_pending_unwind(static_cast(op)); break; + case Bytecode::Instruction::Type::ConcatString: + compiler.compile_concat_string(static_cast(op)); + break; # define DO_COMPILE_COMMON_BINARY_OP(TitleCaseName, snake_case_name) \ case Bytecode::Instruction::Type::TitleCaseName: \ diff --git a/Userland/Libraries/LibJS/JIT/Compiler.h b/Userland/Libraries/LibJS/JIT/Compiler.h index 229f2c44a6..f60f55266f 100644 --- a/Userland/Libraries/LibJS/JIT/Compiler.h +++ b/Userland/Libraries/LibJS/JIT/Compiler.h @@ -115,6 +115,7 @@ private: void compile_typeof_variable(Bytecode::Op::TypeofVariable const&); void compile_set_variable(Bytecode::Op::SetVariable const&); void compile_continue_pending_unwind(Bytecode::Op::ContinuePendingUnwind const&); + void compile_concat_string(Bytecode::Op::ConcatString const&); void store_vm_register(Bytecode::Register, Assembler::Reg); void load_vm_register(Assembler::Reg, Bytecode::Register);