From 9e6d0dd879f99220844ff9b792ab01add57e36ae Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 17 Mar 2021 21:50:33 +0100 Subject: [PATCH] LibJS: Always synthesize "arguments" object when there's a callee Instead of counting the number of call frames on the VM stack, we now always fake the "arguments" object when the current call frame has a callee value. This fixes an issue with DOM event handlers in LibWeb not being able to access "arguments" since they were called without an outer frame. --- Userland/Libraries/LibJS/Runtime/VM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Runtime/VM.cpp b/Userland/Libraries/LibJS/Runtime/VM.cpp index 5343297d27..894524f20d 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.cpp +++ b/Userland/Libraries/LibJS/Runtime/VM.cpp @@ -164,7 +164,7 @@ void VM::set_variable(const FlyString& name, Value value, GlobalObject& global_o Value VM::get_variable(const FlyString& name, GlobalObject& global_object) { if (!m_call_stack.is_empty()) { - if (name == names.arguments && m_call_stack.size() > 1) { + if (name == names.arguments && !call_frame().callee.is_empty()) { // HACK: Special handling for the name "arguments": // If the name "arguments" is defined in the current scope, for example via // a function parameter, or by a local var declaration, we use that.