mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 13:47:45 +00:00
LibJS: Add vector of local variables in ExecutionContext
Now ExecutionContext has vector of values that will represent values of local variables. This vector is initialized in ECMAScriptFunctionObject::internal_call() or ECMAScriptFunctionObject::internal_const() using number of local variables provided to ECMAScriptFunctionObject by the parser.
This commit is contained in:
parent
7765ebb5f2
commit
0daff637e2
3 changed files with 10 additions and 3 deletions
|
@ -149,6 +149,8 @@ ThrowCompletionOr<Value> ECMAScriptFunctionObject::internal_call(Value this_argu
|
||||||
|
|
||||||
ExecutionContext callee_context(heap());
|
ExecutionContext callee_context(heap());
|
||||||
|
|
||||||
|
callee_context.local_variables.resize(m_local_variables_names.size());
|
||||||
|
|
||||||
// Non-standard
|
// Non-standard
|
||||||
callee_context.arguments.extend(move(arguments_list));
|
callee_context.arguments.extend(move(arguments_list));
|
||||||
if (auto* interpreter = vm.interpreter_if_exists())
|
if (auto* interpreter = vm.interpreter_if_exists())
|
||||||
|
@ -218,6 +220,8 @@ ThrowCompletionOr<NonnullGCPtr<Object>> ECMAScriptFunctionObject::internal_const
|
||||||
|
|
||||||
ExecutionContext callee_context(heap());
|
ExecutionContext callee_context(heap());
|
||||||
|
|
||||||
|
callee_context.local_variables.resize(m_local_variables_names.size());
|
||||||
|
|
||||||
// Non-standard
|
// Non-standard
|
||||||
callee_context.arguments.extend(move(arguments_list));
|
callee_context.arguments.extend(move(arguments_list));
|
||||||
if (auto* interpreter = vm.interpreter_if_exists())
|
if (auto* interpreter = vm.interpreter_if_exists())
|
||||||
|
|
|
@ -13,17 +13,19 @@ namespace JS {
|
||||||
|
|
||||||
ExecutionContext::ExecutionContext(Heap& heap)
|
ExecutionContext::ExecutionContext(Heap& heap)
|
||||||
: arguments(heap)
|
: arguments(heap)
|
||||||
|
, local_variables(heap)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ExecutionContext::ExecutionContext(MarkedVector<Value> existing_arguments)
|
ExecutionContext::ExecutionContext(MarkedVector<Value> existing_arguments, MarkedVector<Value> existing_local_variables)
|
||||||
: arguments(move(existing_arguments))
|
: arguments(move(existing_arguments))
|
||||||
|
, local_variables(move(existing_local_variables))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ExecutionContext ExecutionContext::copy() const
|
ExecutionContext ExecutionContext::copy() const
|
||||||
{
|
{
|
||||||
ExecutionContext copy { arguments };
|
ExecutionContext copy { arguments, local_variables };
|
||||||
|
|
||||||
copy.function = function;
|
copy.function = function;
|
||||||
copy.realm = realm;
|
copy.realm = realm;
|
||||||
|
|
|
@ -29,7 +29,7 @@ struct ExecutionContext {
|
||||||
void visit_edges(Cell::Visitor&);
|
void visit_edges(Cell::Visitor&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit ExecutionContext(MarkedVector<Value> existing_arguments);
|
explicit ExecutionContext(MarkedVector<Value> existing_arguments, MarkedVector<Value> existing_local_variables);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GCPtr<FunctionObject> function; // [[Function]]
|
GCPtr<FunctionObject> function; // [[Function]]
|
||||||
|
@ -46,6 +46,7 @@ public:
|
||||||
DeprecatedFlyString function_name;
|
DeprecatedFlyString function_name;
|
||||||
Value this_value;
|
Value this_value;
|
||||||
MarkedVector<Value> arguments;
|
MarkedVector<Value> arguments;
|
||||||
|
MarkedVector<Value> local_variables;
|
||||||
bool is_strict_mode { false };
|
bool is_strict_mode { false };
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/webappapis.html#skip-when-determining-incumbent-counter
|
// https://html.spec.whatwg.org/multipage/webappapis.html#skip-when-determining-incumbent-counter
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue