From bf9912cc59327904ac7023f0aac31dbccc84d8de Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 17 Mar 2020 11:00:09 +0100 Subject: LibJS: Protect function call "this" and arguments from GC This patch adds a CallFrame stack to Interpreter, which keeps track of the "this" value and all argument values passed in function calls. Interpreter::gather_roots() scans the call stack, making sure that all argument values get marked. :^) --- Libraries/LibJS/AST.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) (limited to 'Libraries/LibJS/AST.cpp') diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index fb7993aea7..d1e9d53828 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -59,21 +59,15 @@ Value CallExpression::execute(Interpreter& interpreter) const ASSERT(callee.as_object()->is_function()); auto* function = static_cast(callee.as_object()); - Vector argument_values; + auto& call_frame = interpreter.push_call_frame(); for (size_t i = 0; i < m_arguments.size(); ++i) - argument_values.append(m_arguments[i].execute(interpreter)); + call_frame.arguments.append(m_arguments[i].execute(interpreter)); - Value this_value = js_undefined(); if (m_callee->is_member_expression()) - this_value = static_cast(*m_callee).object().execute(interpreter).to_object(interpreter.heap()); + call_frame.this_value = static_cast(*m_callee).object().execute(interpreter).to_object(interpreter.heap()); - if (!this_value.is_undefined()) - interpreter.push_this_value(this_value); - - auto result = function->call(interpreter, move(argument_values)); - - if (!this_value.is_undefined()) - interpreter.pop_this_value(); + auto result = function->call(interpreter, call_frame.arguments); + interpreter.pop_call_frame(); return result; } -- cgit v1.2.3