diff --git a/Userland/Libraries/LibJS/AST.cpp b/Userland/Libraries/LibJS/AST.cpp index 57b5773aab..ed59f252c2 100644 --- a/Userland/Libraries/LibJS/AST.cpp +++ b/Userland/Libraries/LibJS/AST.cpp @@ -225,6 +225,7 @@ Value CallExpression::execute(Interpreter& interpreter, GlobalObject& global_obj } } + vm.call_frame().current_node = vm.node_stack().last(); Object* new_object = nullptr; Value result; if (is(*this)) { diff --git a/Userland/Libraries/LibJS/Interpreter.cpp b/Userland/Libraries/LibJS/Interpreter.cpp index 5b14b8101c..3fcdc00852 100644 --- a/Userland/Libraries/LibJS/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Interpreter.cpp @@ -62,6 +62,7 @@ Value Interpreter::run(GlobalObject& global_object, const Program& program) VM::InterpreterExecutionScope scope(*this); CallFrame global_call_frame; + global_call_frame.current_node = &program; global_call_frame.this_value = &global_object; static FlyString global_execution_context_name = "(global execution context)"; global_call_frame.function_name = global_execution_context_name; @@ -140,6 +141,7 @@ void Interpreter::exit_scope(const ScopeNode& scope_node) void Interpreter::enter_node(const ASTNode& node) { + vm().call_frame().current_node = &node; vm().push_ast_node(node); } diff --git a/Userland/Libraries/LibJS/Runtime/Object.cpp b/Userland/Libraries/LibJS/Runtime/Object.cpp index a6d76f6903..4132dc9f4e 100644 --- a/Userland/Libraries/LibJS/Runtime/Object.cpp +++ b/Userland/Libraries/LibJS/Runtime/Object.cpp @@ -900,6 +900,7 @@ Value Object::call_native_property_getter(NativeProperty& property, Value this_v { auto& vm = this->vm(); CallFrame call_frame; + call_frame.current_node = property.vm().node_stack().last(); call_frame.is_strict_mode = vm.in_strict_mode(); call_frame.this_value = this_value; vm.push_call_frame(call_frame, global_object()); @@ -914,6 +915,7 @@ void Object::call_native_property_setter(NativeProperty& property, Value this_va { auto& vm = this->vm(); CallFrame call_frame; + call_frame.current_node = property.vm().node_stack().last(); call_frame.is_strict_mode = vm.in_strict_mode(); call_frame.this_value = this_value; vm.push_call_frame(call_frame, global_object()); diff --git a/Userland/Libraries/LibJS/Runtime/VM.cpp b/Userland/Libraries/LibJS/Runtime/VM.cpp index ea88e9fc01..10d15d519f 100644 --- a/Userland/Libraries/LibJS/Runtime/VM.cpp +++ b/Userland/Libraries/LibJS/Runtime/VM.cpp @@ -211,6 +211,7 @@ Reference VM::get_reference(const FlyString& name) Value VM::construct(Function& function, Function& new_target, Optional arguments, GlobalObject& global_object) { CallFrame call_frame; + call_frame.current_node = function.vm().node_stack().last(); call_frame.is_strict_mode = function.is_strict_mode(); push_call_frame(call_frame, function.global_object()); @@ -285,10 +286,11 @@ void VM::throw_exception(Exception* exception) dbgln("Throwing JavaScript Error: {}, {}", error.name(), error.message()); for (ssize_t i = m_call_stack.size() - 1; i >= 0; --i) { + const auto& source_range = m_call_stack[i]->current_node->source_range(); auto function_name = m_call_stack[i]->function_name; if (function_name.is_empty()) function_name = ""; - dbgln(" {}", function_name); + dbgln(" {} at {}:{}:{}", function_name, source_range.filename, source_range.start.line, source_range.start.column); } } @@ -333,6 +335,7 @@ Value VM::call_internal(Function& function, Value this_value, Optional arguments;