diff options
Diffstat (limited to 'Libraries')
-rw-r--r-- | Libraries/LibJS/Interpreter.cpp | 10 | ||||
-rw-r--r-- | Libraries/LibJS/Interpreter.h | 2 |
2 files changed, 12 insertions, 0 deletions
diff --git a/Libraries/LibJS/Interpreter.cpp b/Libraries/LibJS/Interpreter.cpp index 8f36fe58e2..6c6b1563f2 100644 --- a/Libraries/LibJS/Interpreter.cpp +++ b/Libraries/LibJS/Interpreter.cpp @@ -161,4 +161,14 @@ void Interpreter::gather_roots(Badge<Heap>, HashTable<Cell*>& roots) } } +Value Interpreter::call(Function* function, Value this_value, const Vector<Value>& arguments) +{ + auto& call_frame = push_call_frame(); + call_frame.this_value = this_value; + call_frame.arguments = arguments; + auto result = function->call(*this, call_frame.arguments); + pop_call_frame(); + return result; +} + } diff --git a/Libraries/LibJS/Interpreter.h b/Libraries/LibJS/Interpreter.h index 727cc67629..fd4e92ecb8 100644 --- a/Libraries/LibJS/Interpreter.h +++ b/Libraries/LibJS/Interpreter.h @@ -84,6 +84,8 @@ public: void enter_scope(const ScopeNode&, Vector<Argument>, ScopeType); void exit_scope(const ScopeNode&); + Value call(Function*, Value this_value, const Vector<Value>& arguments); + CallFrame& push_call_frame() { m_call_stack.append({ js_undefined(), {} }); return m_call_stack.last(); } void pop_call_frame() { m_call_stack.take_last(); } Value this_value() const |