diff --git a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp index 124cf5f3ad..0fc6722b5d 100644 --- a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp +++ b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp @@ -345,22 +345,21 @@ ThrowCompletionOr get_variable(Bytecode::Interpreter& interpreter, Deprec return TRY(reference.get_value(vm)); } -ThrowCompletionOr get_callee_and_this_from_environment(Bytecode::Interpreter& interpreter, DeprecatedFlyString const& name, u32 cache_index) +ThrowCompletionOr get_callee_and_this_from_environment(Bytecode::Interpreter& interpreter, DeprecatedFlyString const& name, EnvironmentVariableCache& cache) { auto& vm = interpreter.vm(); Value callee = js_undefined(); Value this_value = js_undefined(); - auto& cached_environment_coordinate = interpreter.current_executable().environment_variable_caches[cache_index]; - if (cached_environment_coordinate.has_value()) { + if (cache.has_value()) { auto environment = vm.running_execution_context().lexical_environment; - for (size_t i = 0; i < cached_environment_coordinate->hops; ++i) + for (size_t i = 0; i < cache->hops; ++i) environment = environment->outer_environment(); VERIFY(environment); VERIFY(environment->is_declarative_environment()); if (!environment->is_permanently_screwed_by_eval()) { - callee = TRY(verify_cast(*environment).get_binding_value_direct(vm, cached_environment_coordinate.value().index, vm.in_strict_mode())); + callee = TRY(verify_cast(*environment).get_binding_value_direct(vm, cache.value().index, vm.in_strict_mode())); this_value = js_undefined(); if (auto base_object = environment->with_base_object()) this_value = base_object; @@ -369,12 +368,12 @@ ThrowCompletionOr get_callee_and_this_from_environment(Bytecode:: .this_value = this_value, }; } - cached_environment_coordinate = {}; + cache = {}; } auto reference = TRY(vm.resolve_binding(name)); if (reference.environment_coordinate().has_value()) - cached_environment_coordinate = reference.environment_coordinate(); + cache = reference.environment_coordinate(); callee = TRY(reference.get_value(vm)); diff --git a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h index 369b15af01..94725a5ed0 100644 --- a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h +++ b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h @@ -29,7 +29,7 @@ struct CalleeAndThis { Value callee; Value this_value; }; -ThrowCompletionOr get_callee_and_this_from_environment(Bytecode::Interpreter&, DeprecatedFlyString const& name, u32 cache_index); +ThrowCompletionOr get_callee_and_this_from_environment(Bytecode::Interpreter&, DeprecatedFlyString const& name, EnvironmentVariableCache&); Value new_regexp(VM&, ParsedRegex const&, DeprecatedString const& pattern, DeprecatedString const& flags); MarkedVector argument_list_evaluation(VM&, Value arguments); ThrowCompletionOr create_variable(VM&, DeprecatedFlyString const& name, Op::EnvironmentMode, bool is_global, bool is_immutable, bool is_strict); diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index 89b2f90ece..492859ce20 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -692,7 +692,10 @@ ThrowCompletionOr GetVariable::execute_impl(Bytecode::Interpreter& interpr ThrowCompletionOr GetCalleeAndThisFromEnvironment::execute_impl(Bytecode::Interpreter& interpreter) const { - auto callee_and_this = TRY(get_callee_and_this_from_environment(interpreter, interpreter.current_executable().get_identifier(m_identifier), m_cache_index)); + auto callee_and_this = TRY(get_callee_and_this_from_environment( + interpreter, + interpreter.current_executable().get_identifier(m_identifier), + interpreter.current_executable().environment_variable_caches[m_cache_index])); interpreter.reg(m_callee_reg) = callee_and_this.callee; interpreter.reg(m_this_reg) = callee_and_this.this_value; return {}; diff --git a/Userland/Libraries/LibJS/JIT/Compiler.cpp b/Userland/Libraries/LibJS/JIT/Compiler.cpp index 821f481939..705de343b0 100644 --- a/Userland/Libraries/LibJS/JIT/Compiler.cpp +++ b/Userland/Libraries/LibJS/JIT/Compiler.cpp @@ -1544,13 +1544,13 @@ void Compiler::compile_get_variable(Bytecode::Op::GetVariable const& op) end.link(m_assembler); } -static Value cxx_get_callee_and_this_from_environment(VM& vm, DeprecatedFlyString const& name, u32 cache_index, Bytecode::Register callee_reg, Bytecode::Register this_reg) +static Value cxx_get_callee_and_this_from_environment(VM& vm, DeprecatedFlyString const& name, Bytecode::Register callee_reg, Bytecode::Register this_reg, Bytecode::EnvironmentVariableCache& cache) { auto& bytecode_interpreter = vm.bytecode_interpreter(); auto callee_and_this = TRY_OR_SET_EXCEPTION(Bytecode::get_callee_and_this_from_environment( bytecode_interpreter, name, - cache_index)); + cache)); bytecode_interpreter.reg(callee_reg) = callee_and_this.callee; bytecode_interpreter.reg(this_reg) = callee_and_this.this_value; @@ -1564,13 +1564,13 @@ void Compiler::compile_get_callee_and_this_from_environment(Bytecode::Op::GetCal Assembler::Operand::Imm(bit_cast(&m_bytecode_executable.get_identifier(op.identifier())))); m_assembler.mov( Assembler::Operand::Register(ARG2), - Assembler::Operand::Imm(op.cache_index())); - m_assembler.mov( - Assembler::Operand::Register(ARG3), Assembler::Operand::Imm(op.callee().index())); m_assembler.mov( - Assembler::Operand::Register(ARG4), + Assembler::Operand::Register(ARG3), Assembler::Operand::Imm(op.this_().index())); + m_assembler.mov( + Assembler::Operand::Register(ARG4), + Assembler::Operand::Imm(bit_cast(&m_bytecode_executable.environment_variable_caches[op.cache_index()]))); native_call((void*)cxx_get_callee_and_this_from_environment); check_exception(); }