mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 15:28:11 +00:00
LibJS: Pass GlobalObject& to AST node execute() functions
More work towards supporting multiple global objects.
This commit is contained in:
parent
92392398a2
commit
25f2a29d84
5 changed files with 178 additions and 179 deletions
|
@ -65,50 +65,50 @@ static void update_function_name(Value& value, const FlyString& name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ScopeNode::execute(Interpreter& interpreter) const
|
Value ScopeNode::execute(Interpreter& interpreter, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return interpreter.run(*this);
|
return interpreter.run(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value FunctionDeclaration::execute(Interpreter&) const
|
Value FunctionDeclaration::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value FunctionExpression::execute(Interpreter& interpreter) const
|
Value FunctionExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
return ScriptFunction::create(interpreter.global_object(), name(), body(), parameters(), function_length(), interpreter.current_environment(), m_is_arrow_function);
|
return ScriptFunction::create(global_object, name(), body(), parameters(), function_length(), interpreter.current_environment(), m_is_arrow_function);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ExpressionStatement::execute(Interpreter& interpreter) const
|
Value ExpressionStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
return m_expression->execute(interpreter);
|
return m_expression->execute(interpreter, global_object);
|
||||||
}
|
}
|
||||||
|
|
||||||
CallExpression::ThisAndCallee CallExpression::compute_this_and_callee(Interpreter& interpreter) const
|
CallExpression::ThisAndCallee CallExpression::compute_this_and_callee(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
if (is_new_expression()) {
|
if (is_new_expression()) {
|
||||||
// Computing |this| is irrelevant for "new" expression.
|
// Computing |this| is irrelevant for "new" expression.
|
||||||
return { js_undefined(), m_callee->execute(interpreter) };
|
return { js_undefined(), m_callee->execute(interpreter, global_object) };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_callee->is_member_expression()) {
|
if (m_callee->is_member_expression()) {
|
||||||
auto& member_expression = static_cast<const MemberExpression&>(*m_callee);
|
auto& member_expression = static_cast<const MemberExpression&>(*m_callee);
|
||||||
auto object_value = member_expression.object().execute(interpreter);
|
auto object_value = member_expression.object().execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto* this_value = object_value.to_object(interpreter);
|
auto* this_value = object_value.to_object(interpreter);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto callee = this_value->get(member_expression.computed_property_name(interpreter)).value_or(js_undefined());
|
auto callee = this_value->get(member_expression.computed_property_name(interpreter, global_object)).value_or(js_undefined());
|
||||||
return { this_value, callee };
|
return { this_value, callee };
|
||||||
}
|
}
|
||||||
return { &interpreter.global_object(), m_callee->execute(interpreter) };
|
return { &interpreter.global_object(), m_callee->execute(interpreter, global_object) };
|
||||||
}
|
}
|
||||||
|
|
||||||
Value CallExpression::execute(Interpreter& interpreter) const
|
Value CallExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto [this_value, callee] = compute_this_and_callee(interpreter);
|
auto [this_value, callee] = compute_this_and_callee(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ Value CallExpression::execute(Interpreter& interpreter) const
|
||||||
arguments.values().append(function.bound_arguments());
|
arguments.values().append(function.bound_arguments());
|
||||||
|
|
||||||
for (size_t i = 0; i < m_arguments.size(); ++i) {
|
for (size_t i = 0; i < m_arguments.size(); ++i) {
|
||||||
auto value = m_arguments[i].value->execute(interpreter);
|
auto value = m_arguments[i].value->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
if (m_arguments[i].is_spread) {
|
if (m_arguments[i].is_spread) {
|
||||||
|
@ -200,18 +200,18 @@ Value CallExpression::execute(Interpreter& interpreter) const
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ReturnStatement::execute(Interpreter& interpreter) const
|
Value ReturnStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto value = argument() ? argument()->execute(interpreter) : js_undefined();
|
auto value = argument() ? argument()->execute(interpreter, global_object) : js_undefined();
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
interpreter.unwind(ScopeType::Function);
|
interpreter.unwind(ScopeType::Function);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value IfStatement::execute(Interpreter& interpreter) const
|
Value IfStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto predicate_result = m_predicate->execute(interpreter);
|
auto predicate_result = m_predicate->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -224,10 +224,10 @@ Value IfStatement::execute(Interpreter& interpreter) const
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value WhileStatement::execute(Interpreter& interpreter) const
|
Value WhileStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
Value last_value = js_undefined();
|
Value last_value = js_undefined();
|
||||||
while (m_test->execute(interpreter).to_boolean()) {
|
while (m_test->execute(interpreter, global_object).to_boolean()) {
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
last_value = interpreter.run(*m_body);
|
last_value = interpreter.run(*m_body);
|
||||||
|
@ -238,7 +238,7 @@ Value WhileStatement::execute(Interpreter& interpreter) const
|
||||||
return last_value;
|
return last_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value DoWhileStatement::execute(Interpreter& interpreter) const
|
Value DoWhileStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
Value last_value = js_undefined();
|
Value last_value = js_undefined();
|
||||||
do {
|
do {
|
||||||
|
@ -247,12 +247,12 @@ Value DoWhileStatement::execute(Interpreter& interpreter) const
|
||||||
last_value = interpreter.run(*m_body);
|
last_value = interpreter.run(*m_body);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
} while (m_test->execute(interpreter).to_boolean());
|
} while (m_test->execute(interpreter, global_object).to_boolean());
|
||||||
|
|
||||||
return last_value;
|
return last_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ForStatement::execute(Interpreter& interpreter) const
|
Value ForStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
RefPtr<BlockStatement> wrapper;
|
RefPtr<BlockStatement> wrapper;
|
||||||
|
|
||||||
|
@ -272,14 +272,14 @@ Value ForStatement::execute(Interpreter& interpreter) const
|
||||||
Value last_value = js_undefined();
|
Value last_value = js_undefined();
|
||||||
|
|
||||||
if (m_init) {
|
if (m_init) {
|
||||||
m_init->execute(interpreter);
|
m_init->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_test) {
|
if (m_test) {
|
||||||
while (true) {
|
while (true) {
|
||||||
auto test_result = m_test->execute(interpreter);
|
auto test_result = m_test->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
if (!test_result.to_boolean())
|
if (!test_result.to_boolean())
|
||||||
|
@ -298,7 +298,7 @@ Value ForStatement::execute(Interpreter& interpreter) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m_update) {
|
if (m_update) {
|
||||||
m_update->execute(interpreter);
|
m_update->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -319,7 +319,7 @@ Value ForStatement::execute(Interpreter& interpreter) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m_update) {
|
if (m_update) {
|
||||||
m_update->execute(interpreter);
|
m_update->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -329,7 +329,7 @@ Value ForStatement::execute(Interpreter& interpreter) const
|
||||||
return last_value;
|
return last_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FlyString variable_from_for_declaration(Interpreter& interpreter, NonnullRefPtr<ASTNode> node, RefPtr<BlockStatement> wrapper)
|
static FlyString variable_from_for_declaration(Interpreter& interpreter, GlobalObject& global_object, NonnullRefPtr<ASTNode> node, RefPtr<BlockStatement> wrapper)
|
||||||
{
|
{
|
||||||
FlyString variable_name;
|
FlyString variable_name;
|
||||||
if (node->is_variable_declaration()) {
|
if (node->is_variable_declaration()) {
|
||||||
|
@ -339,7 +339,7 @@ static FlyString variable_from_for_declaration(Interpreter& interpreter, Nonnull
|
||||||
wrapper = create_ast_node<BlockStatement>();
|
wrapper = create_ast_node<BlockStatement>();
|
||||||
interpreter.enter_scope(*wrapper, {}, ScopeType::Block);
|
interpreter.enter_scope(*wrapper, {}, ScopeType::Block);
|
||||||
}
|
}
|
||||||
variable_declaration->execute(interpreter);
|
variable_declaration->execute(interpreter, global_object);
|
||||||
variable_name = variable_declaration->declarations().first().id().string();
|
variable_name = variable_declaration->declarations().first().id().string();
|
||||||
} else if (node->is_identifier()) {
|
} else if (node->is_identifier()) {
|
||||||
variable_name = static_cast<const Identifier&>(*node).string();
|
variable_name = static_cast<const Identifier&>(*node).string();
|
||||||
|
@ -349,20 +349,20 @@ static FlyString variable_from_for_declaration(Interpreter& interpreter, Nonnull
|
||||||
return variable_name;
|
return variable_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ForInStatement::execute(Interpreter& interpreter) const
|
Value ForInStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
if (!m_lhs->is_variable_declaration() && !m_lhs->is_identifier()) {
|
if (!m_lhs->is_variable_declaration() && !m_lhs->is_identifier()) {
|
||||||
// FIXME: Implement "for (foo.bar in baz)", "for (foo[0] in bar)"
|
// FIXME: Implement "for (foo.bar in baz)", "for (foo[0] in bar)"
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
RefPtr<BlockStatement> wrapper;
|
RefPtr<BlockStatement> wrapper;
|
||||||
auto variable_name = variable_from_for_declaration(interpreter, m_lhs, wrapper);
|
auto variable_name = variable_from_for_declaration(interpreter, global_object, m_lhs, wrapper);
|
||||||
auto wrapper_cleanup = ScopeGuard([&] {
|
auto wrapper_cleanup = ScopeGuard([&] {
|
||||||
if (wrapper)
|
if (wrapper)
|
||||||
interpreter.exit_scope(*wrapper);
|
interpreter.exit_scope(*wrapper);
|
||||||
});
|
});
|
||||||
auto last_value = js_undefined();
|
auto last_value = js_undefined();
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto* object = rhs_result.to_object(interpreter);
|
auto* object = rhs_result.to_object(interpreter);
|
||||||
|
@ -393,20 +393,20 @@ Value ForInStatement::execute(Interpreter& interpreter) const
|
||||||
return last_value;
|
return last_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ForOfStatement::execute(Interpreter& interpreter) const
|
Value ForOfStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
if (!m_lhs->is_variable_declaration() && !m_lhs->is_identifier()) {
|
if (!m_lhs->is_variable_declaration() && !m_lhs->is_identifier()) {
|
||||||
// FIXME: Implement "for (foo.bar of baz)", "for (foo[0] of bar)"
|
// FIXME: Implement "for (foo.bar of baz)", "for (foo[0] of bar)"
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
RefPtr<BlockStatement> wrapper;
|
RefPtr<BlockStatement> wrapper;
|
||||||
auto variable_name = variable_from_for_declaration(interpreter, m_lhs, wrapper);
|
auto variable_name = variable_from_for_declaration(interpreter, global_object, m_lhs, wrapper);
|
||||||
auto wrapper_cleanup = ScopeGuard([&] {
|
auto wrapper_cleanup = ScopeGuard([&] {
|
||||||
if (wrapper)
|
if (wrapper)
|
||||||
interpreter.exit_scope(*wrapper);
|
interpreter.exit_scope(*wrapper);
|
||||||
});
|
});
|
||||||
auto last_value = js_undefined();
|
auto last_value = js_undefined();
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
// FIXME: We need to properly implement the iterator protocol
|
// FIXME: We need to properly implement the iterator protocol
|
||||||
|
@ -459,12 +459,12 @@ Value ForOfStatement::execute(Interpreter& interpreter) const
|
||||||
return last_value;
|
return last_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value BinaryExpression::execute(Interpreter& interpreter) const
|
Value BinaryExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto lhs_result = m_lhs->execute(interpreter);
|
auto lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -518,16 +518,16 @@ Value BinaryExpression::execute(Interpreter& interpreter) const
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value LogicalExpression::execute(Interpreter& interpreter) const
|
Value LogicalExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto lhs_result = m_lhs->execute(interpreter);
|
auto lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
switch (m_op) {
|
switch (m_op) {
|
||||||
case LogicalOp::And:
|
case LogicalOp::And:
|
||||||
if (lhs_result.to_boolean()) {
|
if (lhs_result.to_boolean()) {
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
return rhs_result;
|
return rhs_result;
|
||||||
|
@ -536,14 +536,14 @@ Value LogicalExpression::execute(Interpreter& interpreter) const
|
||||||
case LogicalOp::Or: {
|
case LogicalOp::Or: {
|
||||||
if (lhs_result.to_boolean())
|
if (lhs_result.to_boolean())
|
||||||
return lhs_result;
|
return lhs_result;
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
return rhs_result;
|
return rhs_result;
|
||||||
}
|
}
|
||||||
case LogicalOp::NullishCoalescing:
|
case LogicalOp::NullishCoalescing:
|
||||||
if (lhs_result.is_null() || lhs_result.is_undefined()) {
|
if (lhs_result.is_null() || lhs_result.is_undefined()) {
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
return rhs_result;
|
return rhs_result;
|
||||||
|
@ -554,31 +554,31 @@ Value LogicalExpression::execute(Interpreter& interpreter) const
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference Expression::to_reference(Interpreter&) const
|
Reference Expression::to_reference(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference Identifier::to_reference(Interpreter& interpreter) const
|
Reference Identifier::to_reference(Interpreter& interpreter, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return interpreter.get_reference(string());
|
return interpreter.get_reference(string());
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference MemberExpression::to_reference(Interpreter& interpreter) const
|
Reference MemberExpression::to_reference(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto object_value = m_object->execute(interpreter);
|
auto object_value = m_object->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto property_name = computed_property_name(interpreter);
|
auto property_name = computed_property_name(interpreter, global_object);
|
||||||
if (!property_name.is_valid())
|
if (!property_name.is_valid())
|
||||||
return {};
|
return {};
|
||||||
return { object_value, property_name };
|
return { object_value, property_name };
|
||||||
}
|
}
|
||||||
|
|
||||||
Value UnaryExpression::execute(Interpreter& interpreter) const
|
Value UnaryExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
if (m_op == UnaryOp::Delete) {
|
if (m_op == UnaryOp::Delete) {
|
||||||
auto reference = m_lhs->to_reference(interpreter);
|
auto reference = m_lhs->to_reference(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
if (reference.is_unresolvable())
|
if (reference.is_unresolvable())
|
||||||
|
@ -595,7 +595,7 @@ Value UnaryExpression::execute(Interpreter& interpreter) const
|
||||||
|
|
||||||
Value lhs_result;
|
Value lhs_result;
|
||||||
if (m_op == UnaryOp::Typeof && m_lhs->is_identifier()) {
|
if (m_op == UnaryOp::Typeof && m_lhs->is_identifier()) {
|
||||||
auto reference = m_lhs->to_reference(interpreter);
|
auto reference = m_lhs->to_reference(interpreter, global_object);
|
||||||
if (interpreter.exception()) {
|
if (interpreter.exception()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -607,7 +607,7 @@ Value UnaryExpression::execute(Interpreter& interpreter) const
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -981,7 +981,7 @@ void ForOfStatement::dump(int indent) const
|
||||||
body().dump(indent + 1);
|
body().dump(indent + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value Identifier::execute(Interpreter& interpreter) const
|
Value Identifier::execute(Interpreter& interpreter, GlobalObject&) const
|
||||||
{
|
{
|
||||||
auto value = interpreter.get_variable(string());
|
auto value = interpreter.get_variable(string());
|
||||||
if (value.is_empty())
|
if (value.is_empty())
|
||||||
|
@ -1001,12 +1001,12 @@ void SpreadExpression::dump(int indent) const
|
||||||
m_target->dump(indent + 1);
|
m_target->dump(indent + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value SpreadExpression::execute(Interpreter& interpreter) const
|
Value SpreadExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
return m_target->execute(interpreter);
|
return m_target->execute(interpreter, global_object);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ThisExpression::execute(Interpreter& interpreter) const
|
Value ThisExpression::execute(Interpreter& interpreter, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return interpreter.this_value();
|
return interpreter.this_value();
|
||||||
}
|
}
|
||||||
|
@ -1016,9 +1016,9 @@ void ThisExpression::dump(int indent) const
|
||||||
ASTNode::dump(indent);
|
ASTNode::dump(indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value AssignmentExpression::execute(Interpreter& interpreter) const
|
Value AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto rhs_result = m_rhs->execute(interpreter);
|
auto rhs_result = m_rhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -1027,73 +1027,73 @@ Value AssignmentExpression::execute(Interpreter& interpreter) const
|
||||||
case AssignmentOp::Assignment:
|
case AssignmentOp::Assignment:
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::AdditionAssignment:
|
case AssignmentOp::AdditionAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = add(interpreter, lhs_result, rhs_result);
|
rhs_result = add(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::SubtractionAssignment:
|
case AssignmentOp::SubtractionAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = sub(interpreter, lhs_result, rhs_result);
|
rhs_result = sub(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::MultiplicationAssignment:
|
case AssignmentOp::MultiplicationAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = mul(interpreter, lhs_result, rhs_result);
|
rhs_result = mul(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::DivisionAssignment:
|
case AssignmentOp::DivisionAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = div(interpreter, lhs_result, rhs_result);
|
rhs_result = div(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::ModuloAssignment:
|
case AssignmentOp::ModuloAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = mod(interpreter, lhs_result, rhs_result);
|
rhs_result = mod(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::ExponentiationAssignment:
|
case AssignmentOp::ExponentiationAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = exp(interpreter, lhs_result, rhs_result);
|
rhs_result = exp(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::BitwiseAndAssignment:
|
case AssignmentOp::BitwiseAndAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = bitwise_and(interpreter, lhs_result, rhs_result);
|
rhs_result = bitwise_and(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::BitwiseOrAssignment:
|
case AssignmentOp::BitwiseOrAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = bitwise_or(interpreter, lhs_result, rhs_result);
|
rhs_result = bitwise_or(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::BitwiseXorAssignment:
|
case AssignmentOp::BitwiseXorAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = bitwise_xor(interpreter, lhs_result, rhs_result);
|
rhs_result = bitwise_xor(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::LeftShiftAssignment:
|
case AssignmentOp::LeftShiftAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = left_shift(interpreter, lhs_result, rhs_result);
|
rhs_result = left_shift(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::RightShiftAssignment:
|
case AssignmentOp::RightShiftAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = right_shift(interpreter, lhs_result, rhs_result);
|
rhs_result = right_shift(interpreter, lhs_result, rhs_result);
|
||||||
break;
|
break;
|
||||||
case AssignmentOp::UnsignedRightShiftAssignment:
|
case AssignmentOp::UnsignedRightShiftAssignment:
|
||||||
lhs_result = m_lhs->execute(interpreter);
|
lhs_result = m_lhs->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
rhs_result = unsigned_right_shift(interpreter, lhs_result, rhs_result);
|
rhs_result = unsigned_right_shift(interpreter, lhs_result, rhs_result);
|
||||||
|
@ -1102,7 +1102,7 @@ Value AssignmentExpression::execute(Interpreter& interpreter) const
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
auto reference = m_lhs->to_reference(interpreter);
|
auto reference = m_lhs->to_reference(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -1117,9 +1117,9 @@ Value AssignmentExpression::execute(Interpreter& interpreter) const
|
||||||
return rhs_result;
|
return rhs_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value UpdateExpression::execute(Interpreter& interpreter) const
|
Value UpdateExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto reference = m_argument->to_reference(interpreter);
|
auto reference = m_argument->to_reference(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto old_value = reference.get(interpreter);
|
auto old_value = reference.get(interpreter);
|
||||||
|
@ -1228,11 +1228,11 @@ void UpdateExpression::dump(int indent) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Value VariableDeclaration::execute(Interpreter& interpreter) const
|
Value VariableDeclaration::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
for (auto& declarator : m_declarations) {
|
for (auto& declarator : m_declarations) {
|
||||||
if (auto* init = declarator.init()) {
|
if (auto* init = declarator.init()) {
|
||||||
auto initalizer_result = init->execute(interpreter);
|
auto initalizer_result = init->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto variable_name = declarator.id().string();
|
auto variable_name = declarator.id().string();
|
||||||
|
@ -1243,7 +1243,7 @@ Value VariableDeclaration::execute(Interpreter& interpreter) const
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value VariableDeclarator::execute(Interpreter&) const
|
Value VariableDeclarator::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
// NOTE: This node is handled by VariableDeclaration.
|
// NOTE: This node is handled by VariableDeclaration.
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
|
@ -1301,17 +1301,17 @@ void ExpressionStatement::dump(int indent) const
|
||||||
m_expression->dump(indent + 1);
|
m_expression->dump(indent + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ObjectProperty::execute(Interpreter&) const
|
Value ObjectProperty::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
// NOTE: ObjectProperty execution is handled by ObjectExpression.
|
// NOTE: ObjectProperty execution is handled by ObjectExpression.
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ObjectExpression::execute(Interpreter& interpreter) const
|
Value ObjectExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto* object = Object::create_empty(interpreter, interpreter.global_object());
|
auto* object = Object::create_empty(interpreter, global_object);
|
||||||
for (auto& property : m_properties) {
|
for (auto& property : m_properties) {
|
||||||
auto key_result = property.key().execute(interpreter);
|
auto key_result = property.key().execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -1349,7 +1349,7 @@ Value ObjectExpression::execute(Interpreter& interpreter) const
|
||||||
auto key = key_result.to_string(interpreter);
|
auto key = key_result.to_string(interpreter);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto value = property.value().execute(interpreter);
|
auto value = property.value().execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -1398,13 +1398,13 @@ void MemberExpression::dump(int indent) const
|
||||||
m_property->dump(indent + 1);
|
m_property->dump(indent + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
PropertyName MemberExpression::computed_property_name(Interpreter& interpreter) const
|
PropertyName MemberExpression::computed_property_name(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
if (!is_computed()) {
|
if (!is_computed()) {
|
||||||
ASSERT(m_property->is_identifier());
|
ASSERT(m_property->is_identifier());
|
||||||
return static_cast<const Identifier&>(*m_property).string();
|
return static_cast<const Identifier&>(*m_property).string();
|
||||||
}
|
}
|
||||||
auto index = m_property->execute(interpreter);
|
auto index = m_property->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -1430,38 +1430,38 @@ String MemberExpression::to_string_approximation() const
|
||||||
return String::format("%s.%s", object_string.characters(), static_cast<const Identifier&>(*m_property).string().characters());
|
return String::format("%s.%s", object_string.characters(), static_cast<const Identifier&>(*m_property).string().characters());
|
||||||
}
|
}
|
||||||
|
|
||||||
Value MemberExpression::execute(Interpreter& interpreter) const
|
Value MemberExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto object_value = m_object->execute(interpreter);
|
auto object_value = m_object->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto* object_result = object_value.to_object(interpreter);
|
auto* object_result = object_value.to_object(interpreter);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
return object_result->get(computed_property_name(interpreter)).value_or(js_undefined());
|
return object_result->get(computed_property_name(interpreter, global_object)).value_or(js_undefined());
|
||||||
}
|
}
|
||||||
|
|
||||||
Value StringLiteral::execute(Interpreter& interpreter) const
|
Value StringLiteral::execute(Interpreter& interpreter, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return js_string(interpreter, m_value);
|
return js_string(interpreter, m_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value NumericLiteral::execute(Interpreter&) const
|
Value NumericLiteral::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return Value(m_value);
|
return Value(m_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value BigIntLiteral::execute(Interpreter& interpreter) const
|
Value BigIntLiteral::execute(Interpreter& interpreter, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return js_bigint(interpreter, Crypto::SignedBigInteger::from_base10(m_value.substring(0, m_value.length() - 1)));
|
return js_bigint(interpreter, Crypto::SignedBigInteger::from_base10(m_value.substring(0, m_value.length() - 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Value BooleanLiteral::execute(Interpreter&) const
|
Value BooleanLiteral::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return Value(m_value);
|
return Value(m_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value NullLiteral::execute(Interpreter&) const
|
Value NullLiteral::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
return js_null();
|
return js_null();
|
||||||
}
|
}
|
||||||
|
@ -1472,9 +1472,9 @@ void RegExpLiteral::dump(int indent) const
|
||||||
printf("%s (/%s/%s)\n", class_name(), content().characters(), flags().characters());
|
printf("%s (/%s/%s)\n", class_name(), content().characters(), flags().characters());
|
||||||
}
|
}
|
||||||
|
|
||||||
Value RegExpLiteral::execute(Interpreter& interpreter) const
|
Value RegExpLiteral::execute(Interpreter&, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
return RegExpObject::create(interpreter.global_object(), content(), flags());
|
return RegExpObject::create(global_object, content(), flags());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArrayExpression::dump(int indent) const
|
void ArrayExpression::dump(int indent) const
|
||||||
|
@ -1490,13 +1490,13 @@ void ArrayExpression::dump(int indent) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ArrayExpression::execute(Interpreter& interpreter) const
|
Value ArrayExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto* array = Array::create(interpreter.global_object());
|
auto* array = Array::create(interpreter.global_object());
|
||||||
for (auto& element : m_elements) {
|
for (auto& element : m_elements) {
|
||||||
auto value = Value();
|
auto value = Value();
|
||||||
if (element) {
|
if (element) {
|
||||||
value = element->execute(interpreter);
|
value = element->execute(interpreter, global_object);
|
||||||
|
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
@ -1539,12 +1539,12 @@ void TemplateLiteral::dump(int indent) const
|
||||||
expression.dump(indent + 1);
|
expression.dump(indent + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value TemplateLiteral::execute(Interpreter& interpreter) const
|
Value TemplateLiteral::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
StringBuilder string_builder;
|
StringBuilder string_builder;
|
||||||
|
|
||||||
for (auto& expression : m_expressions) {
|
for (auto& expression : m_expressions) {
|
||||||
auto expr = expression.execute(interpreter);
|
auto expr = expression.execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
auto string = expr.to_string(interpreter);
|
auto string = expr.to_string(interpreter);
|
||||||
|
@ -1567,9 +1567,9 @@ void TaggedTemplateLiteral::dump(int indent) const
|
||||||
m_template_literal->dump(indent + 2);
|
m_template_literal->dump(indent + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value TaggedTemplateLiteral::execute(Interpreter& interpreter) const
|
Value TaggedTemplateLiteral::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto tag = m_tag->execute(interpreter);
|
auto tag = m_tag->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
if (!tag.is_function()) {
|
if (!tag.is_function()) {
|
||||||
|
@ -1582,7 +1582,7 @@ Value TaggedTemplateLiteral::execute(Interpreter& interpreter) const
|
||||||
MarkedValueList arguments(interpreter.heap());
|
MarkedValueList arguments(interpreter.heap());
|
||||||
arguments.append(strings);
|
arguments.append(strings);
|
||||||
for (size_t i = 0; i < expressions.size(); ++i) {
|
for (size_t i = 0; i < expressions.size(); ++i) {
|
||||||
auto value = expressions[i].execute(interpreter);
|
auto value = expressions[i].execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
// tag`${foo}` -> "", foo, "" -> tag(["", ""], foo)
|
// tag`${foo}` -> "", foo, "" -> tag(["", ""], foo)
|
||||||
|
@ -1594,9 +1594,9 @@ Value TaggedTemplateLiteral::execute(Interpreter& interpreter) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* raw_strings = Array::create(interpreter.global_object());
|
auto* raw_strings = Array::create(global_object);
|
||||||
for (auto& raw_string : m_template_literal->raw_strings()) {
|
for (auto& raw_string : m_template_literal->raw_strings()) {
|
||||||
auto value = raw_string.execute(interpreter);
|
auto value = raw_string.execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
raw_strings->indexed_properties().append(value);
|
raw_strings->indexed_properties().append(value);
|
||||||
|
@ -1644,7 +1644,7 @@ void ThrowStatement::dump(int indent) const
|
||||||
argument().dump(indent + 1);
|
argument().dump(indent + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value TryStatement::execute(Interpreter& interpreter) const
|
Value TryStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
interpreter.run(block(), {}, ScopeType::Try);
|
interpreter.run(block(), {}, ScopeType::Try);
|
||||||
if (auto* exception = interpreter.exception()) {
|
if (auto* exception = interpreter.exception()) {
|
||||||
|
@ -1656,29 +1656,29 @@ Value TryStatement::execute(Interpreter& interpreter) const
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_finalizer)
|
if (m_finalizer)
|
||||||
m_finalizer->execute(interpreter);
|
m_finalizer->execute(interpreter, global_object);
|
||||||
|
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value CatchClause::execute(Interpreter&) const
|
Value CatchClause::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
// NOTE: CatchClause execution is handled by TryStatement.
|
// NOTE: CatchClause execution is handled by TryStatement.
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ThrowStatement::execute(Interpreter& interpreter) const
|
Value ThrowStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto value = m_argument->execute(interpreter);
|
auto value = m_argument->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
return interpreter.throw_exception(value);
|
return interpreter.throw_exception(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value SwitchStatement::execute(Interpreter& interpreter) const
|
Value SwitchStatement::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto discriminant_result = m_discriminant->execute(interpreter);
|
auto discriminant_result = m_discriminant->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -1686,7 +1686,7 @@ Value SwitchStatement::execute(Interpreter& interpreter) const
|
||||||
|
|
||||||
for (auto& switch_case : m_cases) {
|
for (auto& switch_case : m_cases) {
|
||||||
if (!falling_through && switch_case.test()) {
|
if (!falling_through && switch_case.test()) {
|
||||||
auto test_result = switch_case.test()->execute(interpreter);
|
auto test_result = switch_case.test()->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
if (!strict_eq(interpreter, discriminant_result, test_result))
|
if (!strict_eq(interpreter, discriminant_result, test_result))
|
||||||
|
@ -1695,7 +1695,7 @@ Value SwitchStatement::execute(Interpreter& interpreter) const
|
||||||
falling_through = true;
|
falling_through = true;
|
||||||
|
|
||||||
for (auto& statement : switch_case.consequent()) {
|
for (auto& statement : switch_case.consequent()) {
|
||||||
statement.execute(interpreter);
|
statement.execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
if (interpreter.should_unwind()) {
|
if (interpreter.should_unwind()) {
|
||||||
|
@ -1711,19 +1711,18 @@ Value SwitchStatement::execute(Interpreter& interpreter) const
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value SwitchCase::execute(Interpreter& interpreter) const
|
Value SwitchCase::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
(void)interpreter;
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Value BreakStatement::execute(Interpreter& interpreter) const
|
Value BreakStatement::execute(Interpreter& interpreter, GlobalObject&) const
|
||||||
{
|
{
|
||||||
interpreter.unwind(ScopeType::Breakable, m_target_label);
|
interpreter.unwind(ScopeType::Breakable, m_target_label);
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ContinueStatement::execute(Interpreter& interpreter) const
|
Value ContinueStatement::execute(Interpreter& interpreter, GlobalObject&) const
|
||||||
{
|
{
|
||||||
interpreter.unwind(ScopeType::Continuable, m_target_label);
|
interpreter.unwind(ScopeType::Continuable, m_target_label);
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
|
@ -1754,16 +1753,16 @@ void SwitchCase::dump(int indent) const
|
||||||
statement.dump(indent + 2);
|
statement.dump(indent + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ConditionalExpression::execute(Interpreter& interpreter) const
|
Value ConditionalExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto test_result = m_test->execute(interpreter);
|
auto test_result = m_test->execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
Value result;
|
Value result;
|
||||||
if (test_result.to_boolean()) {
|
if (test_result.to_boolean()) {
|
||||||
result = m_consequent->execute(interpreter);
|
result = m_consequent->execute(interpreter, global_object);
|
||||||
} else {
|
} else {
|
||||||
result = m_alternate->execute(interpreter);
|
result = m_alternate->execute(interpreter, global_object);
|
||||||
}
|
}
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
@ -1791,18 +1790,18 @@ void SequenceExpression::dump(int indent) const
|
||||||
expression.dump(indent + 1);
|
expression.dump(indent + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Value SequenceExpression::execute(Interpreter& interpreter) const
|
Value SequenceExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
Value last_value;
|
Value last_value;
|
||||||
for (auto& expression : m_expressions) {
|
for (auto& expression : m_expressions) {
|
||||||
last_value = expression.execute(interpreter);
|
last_value = expression.execute(interpreter, global_object);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
return last_value;
|
return last_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
Value DebuggerStatement::execute(Interpreter&) const
|
Value DebuggerStatement::execute(Interpreter&, GlobalObject&) const
|
||||||
{
|
{
|
||||||
dbg() << "Sorry, no JavaScript debugger available (yet)!";
|
dbg() << "Sorry, no JavaScript debugger available (yet)!";
|
||||||
return js_undefined();
|
return js_undefined();
|
||||||
|
|
|
@ -53,7 +53,7 @@ class ASTNode : public RefCounted<ASTNode> {
|
||||||
public:
|
public:
|
||||||
virtual ~ASTNode() { }
|
virtual ~ASTNode() { }
|
||||||
virtual const char* class_name() const = 0;
|
virtual const char* class_name() const = 0;
|
||||||
virtual Value execute(Interpreter&) const = 0;
|
virtual Value execute(Interpreter&, GlobalObject&) const = 0;
|
||||||
virtual void dump(int indent) const;
|
virtual void dump(int indent) const;
|
||||||
virtual bool is_identifier() const { return false; }
|
virtual bool is_identifier() const { return false; }
|
||||||
virtual bool is_spread_expression() const { return false; }
|
virtual bool is_spread_expression() const { return false; }
|
||||||
|
@ -81,13 +81,13 @@ protected:
|
||||||
|
|
||||||
class EmptyStatement final : public Statement {
|
class EmptyStatement final : public Statement {
|
||||||
public:
|
public:
|
||||||
Value execute(Interpreter&) const override { return js_undefined(); }
|
Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
|
||||||
const char* class_name() const override { return "EmptyStatement"; }
|
const char* class_name() const override { return "EmptyStatement"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class ErrorStatement final : public Statement {
|
class ErrorStatement final : public Statement {
|
||||||
public:
|
public:
|
||||||
Value execute(Interpreter&) const override { return js_undefined(); }
|
Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
|
||||||
const char* class_name() const override { return "ErrorStatement"; }
|
const char* class_name() const override { return "ErrorStatement"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Value execute(Interpreter&) const override;
|
Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
const char* class_name() const override { return "ExpressionStatement"; }
|
const char* class_name() const override { return "ExpressionStatement"; }
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonnullRefPtrVector<Statement>& children() const { return m_children; }
|
const NonnullRefPtrVector<Statement>& children() const { return m_children; }
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
void add_variables(NonnullRefPtrVector<VariableDeclaration>);
|
void add_variables(NonnullRefPtrVector<VariableDeclaration>);
|
||||||
|
@ -161,7 +161,7 @@ private:
|
||||||
|
|
||||||
class Expression : public ASTNode {
|
class Expression : public ASTNode {
|
||||||
public:
|
public:
|
||||||
virtual Reference to_reference(Interpreter&) const;
|
virtual Reference to_reference(Interpreter&, GlobalObject&) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Declaration : public Statement {
|
class Declaration : public Statement {
|
||||||
|
@ -213,7 +213,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -232,7 +232,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -243,7 +243,7 @@ private:
|
||||||
|
|
||||||
class ErrorExpression final : public Expression {
|
class ErrorExpression final : public Expression {
|
||||||
public:
|
public:
|
||||||
Value execute(Interpreter&) const override { return js_undefined(); }
|
Value execute(Interpreter&, GlobalObject&) const override { return js_undefined(); }
|
||||||
const char* class_name() const override { return "ErrorExpression"; }
|
const char* class_name() const override { return "ErrorExpression"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -256,7 +256,7 @@ public:
|
||||||
|
|
||||||
const Expression* argument() const { return m_argument; }
|
const Expression* argument() const { return m_argument; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -278,7 +278,7 @@ public:
|
||||||
const Statement& consequent() const { return *m_consequent; }
|
const Statement& consequent() const { return *m_consequent; }
|
||||||
const Statement* alternate() const { return m_alternate; }
|
const Statement* alternate() const { return m_alternate; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -300,7 +300,7 @@ public:
|
||||||
const Expression& test() const { return *m_test; }
|
const Expression& test() const { return *m_test; }
|
||||||
const Statement& body() const { return *m_body; }
|
const Statement& body() const { return *m_body; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -321,7 +321,7 @@ public:
|
||||||
const Expression& test() const { return *m_test; }
|
const Expression& test() const { return *m_test; }
|
||||||
const Statement& body() const { return *m_body; }
|
const Statement& body() const { return *m_body; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -346,7 +346,7 @@ public:
|
||||||
const Expression* update() const { return m_update; }
|
const Expression* update() const { return m_update; }
|
||||||
const Statement& body() const { return *m_body; }
|
const Statement& body() const { return *m_body; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -371,7 +371,7 @@ public:
|
||||||
const Expression& rhs() const { return *m_rhs; }
|
const Expression& rhs() const { return *m_rhs; }
|
||||||
const Statement& body() const { return *m_body; }
|
const Statement& body() const { return *m_body; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -395,7 +395,7 @@ public:
|
||||||
const Expression& rhs() const { return *m_rhs; }
|
const Expression& rhs() const { return *m_rhs; }
|
||||||
const Statement& body() const { return *m_body; }
|
const Statement& body() const { return *m_body; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -440,7 +440,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -466,7 +466,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -495,7 +495,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -513,7 +513,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "SequenceExpression"; }
|
virtual const char* class_name() const override { return "SequenceExpression"; }
|
||||||
|
@ -533,7 +533,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -549,7 +549,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -565,7 +565,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -581,7 +581,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -594,7 +594,7 @@ class NullLiteral final : public Literal {
|
||||||
public:
|
public:
|
||||||
explicit NullLiteral() { }
|
explicit NullLiteral() { }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -609,7 +609,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
const String& content() const { return m_content; }
|
const String& content() const { return m_content; }
|
||||||
|
@ -631,10 +631,10 @@ public:
|
||||||
|
|
||||||
const FlyString& string() const { return m_string; }
|
const FlyString& string() const { return m_string; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual bool is_identifier() const override { return true; }
|
virtual bool is_identifier() const override { return true; }
|
||||||
virtual Reference to_reference(Interpreter&) const override;
|
virtual Reference to_reference(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "Identifier"; }
|
virtual const char* class_name() const override { return "Identifier"; }
|
||||||
|
@ -649,7 +649,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual bool is_spread_expression() const override { return true; }
|
virtual bool is_spread_expression() const override { return true; }
|
||||||
|
|
||||||
|
@ -661,7 +661,7 @@ private:
|
||||||
|
|
||||||
class ThisExpression final : public Expression {
|
class ThisExpression final : public Expression {
|
||||||
public:
|
public:
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -681,7 +681,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -692,7 +692,7 @@ private:
|
||||||
Value this_value;
|
Value this_value;
|
||||||
Value callee;
|
Value callee;
|
||||||
};
|
};
|
||||||
ThisAndCallee compute_this_and_callee(Interpreter&) const;
|
ThisAndCallee compute_this_and_callee(Interpreter&, GlobalObject&) const;
|
||||||
|
|
||||||
NonnullRefPtr<Expression> m_callee;
|
NonnullRefPtr<Expression> m_callee;
|
||||||
const Vector<Argument> m_arguments;
|
const Vector<Argument> m_arguments;
|
||||||
|
@ -736,7 +736,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -761,7 +761,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -794,7 +794,7 @@ public:
|
||||||
const Identifier& id() const { return m_id; }
|
const Identifier& id() const { return m_id; }
|
||||||
const Expression* init() const { return m_init; }
|
const Expression* init() const { return m_init; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -815,7 +815,7 @@ public:
|
||||||
virtual bool is_variable_declaration() const override { return true; }
|
virtual bool is_variable_declaration() const override { return true; }
|
||||||
DeclarationKind declaration_kind() const { return m_declaration_kind; }
|
DeclarationKind declaration_kind() const { return m_declaration_kind; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
const NonnullRefPtrVector<VariableDeclarator>& declarations() const { return m_declarations; }
|
const NonnullRefPtrVector<VariableDeclarator>& declarations() const { return m_declarations; }
|
||||||
|
@ -853,7 +853,7 @@ public:
|
||||||
Type type() const { return m_property_type; }
|
Type type() const { return m_property_type; }
|
||||||
|
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "ObjectProperty"; }
|
virtual const char* class_name() const override { return "ObjectProperty"; }
|
||||||
|
@ -870,7 +870,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -888,7 +888,7 @@ public:
|
||||||
|
|
||||||
const Vector<RefPtr<Expression>>& elements() const { return m_elements; }
|
const Vector<RefPtr<Expression>>& elements() const { return m_elements; }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -910,7 +910,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
const NonnullRefPtrVector<Expression>& expressions() const { return m_expressions; }
|
const NonnullRefPtrVector<Expression>& expressions() const { return m_expressions; }
|
||||||
|
@ -931,7 +931,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -950,15 +950,15 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Reference to_reference(Interpreter&) const override;
|
virtual Reference to_reference(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
bool is_computed() const { return m_computed; }
|
bool is_computed() const { return m_computed; }
|
||||||
const Expression& object() const { return *m_object; }
|
const Expression& object() const { return *m_object; }
|
||||||
const Expression& property() const { return *m_property; }
|
const Expression& property() const { return *m_property; }
|
||||||
|
|
||||||
PropertyName computed_property_name(Interpreter&) const;
|
PropertyName computed_property_name(Interpreter&, GlobalObject&) const;
|
||||||
|
|
||||||
String to_string_approximation() const;
|
String to_string_approximation() const;
|
||||||
|
|
||||||
|
@ -981,7 +981,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "ConditionalExpression"; }
|
virtual const char* class_name() const override { return "ConditionalExpression"; }
|
||||||
|
@ -1003,7 +1003,7 @@ public:
|
||||||
const BlockStatement& body() const { return m_body; }
|
const BlockStatement& body() const { return m_body; }
|
||||||
|
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "CatchClause"; }
|
virtual const char* class_name() const override { return "CatchClause"; }
|
||||||
|
@ -1026,7 +1026,7 @@ public:
|
||||||
const BlockStatement* finalizer() const { return m_finalizer; }
|
const BlockStatement* finalizer() const { return m_finalizer; }
|
||||||
|
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "TryStatement"; }
|
virtual const char* class_name() const override { return "TryStatement"; }
|
||||||
|
@ -1046,7 +1046,7 @@ public:
|
||||||
const Expression& argument() const { return m_argument; }
|
const Expression& argument() const { return m_argument; }
|
||||||
|
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "ThrowStatement"; }
|
virtual const char* class_name() const override { return "ThrowStatement"; }
|
||||||
|
@ -1066,7 +1066,7 @@ public:
|
||||||
const NonnullRefPtrVector<Statement>& consequent() const { return m_consequent; }
|
const NonnullRefPtrVector<Statement>& consequent() const { return m_consequent; }
|
||||||
|
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "SwitchCase"; }
|
virtual const char* class_name() const override { return "SwitchCase"; }
|
||||||
|
@ -1084,7 +1084,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void dump(int indent) const override;
|
virtual void dump(int indent) const override;
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "SwitchStatement"; }
|
virtual const char* class_name() const override { return "SwitchStatement"; }
|
||||||
|
@ -1100,7 +1100,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
const FlyString& target_label() const { return m_target_label; }
|
const FlyString& target_label() const { return m_target_label; }
|
||||||
|
|
||||||
|
@ -1117,7 +1117,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
const FlyString& target_label() const { return m_target_label; }
|
const FlyString& target_label() const { return m_target_label; }
|
||||||
|
|
||||||
|
@ -1131,7 +1131,7 @@ class DebuggerStatement final : public Statement {
|
||||||
public:
|
public:
|
||||||
DebuggerStatement() { }
|
DebuggerStatement() { }
|
||||||
|
|
||||||
virtual Value execute(Interpreter&) const override;
|
virtual Value execute(Interpreter&, GlobalObject&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual const char* class_name() const override { return "DebuggerStatement"; }
|
virtual const char* class_name() const override { return "DebuggerStatement"; }
|
||||||
|
|
|
@ -65,7 +65,7 @@ Value Interpreter::run(const Statement& statement, ArgumentVector arguments, Sco
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!statement.is_scope_node())
|
if (!statement.is_scope_node())
|
||||||
return statement.execute(*this);
|
return statement.execute(*this, global_object());
|
||||||
|
|
||||||
auto& block = static_cast<const ScopeNode&>(statement);
|
auto& block = static_cast<const ScopeNode&>(statement);
|
||||||
enter_scope(block, move(arguments), scope_type);
|
enter_scope(block, move(arguments), scope_type);
|
||||||
|
@ -74,7 +74,7 @@ Value Interpreter::run(const Statement& statement, ArgumentVector arguments, Sco
|
||||||
m_last_value = js_undefined();
|
m_last_value = js_undefined();
|
||||||
|
|
||||||
for (auto& node : block.children()) {
|
for (auto& node : block.children()) {
|
||||||
m_last_value = node.execute(*this);
|
m_last_value = node.execute(*this, global_object());
|
||||||
if (should_unwind()) {
|
if (should_unwind()) {
|
||||||
if (should_unwind_until(ScopeType::Breakable, block.label()))
|
if (should_unwind_until(ScopeType::Breakable, block.label()))
|
||||||
stop_unwind();
|
stop_unwind();
|
||||||
|
|
|
@ -82,7 +82,7 @@ Value FunctionConstructor::construct(Interpreter& interpreter)
|
||||||
interpreter.throw_exception<SyntaxError>(error.to_string());
|
interpreter.throw_exception<SyntaxError>(error.to_string());
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
return function_expression->execute(interpreter);
|
return function_expression->execute(interpreter, global_object());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,7 +112,7 @@ Value ScriptFunction::call(Interpreter& interpreter)
|
||||||
if (i < argument_values.size() && !argument_values[i].is_undefined()) {
|
if (i < argument_values.size() && !argument_values[i].is_undefined()) {
|
||||||
value = argument_values[i];
|
value = argument_values[i];
|
||||||
} else if (parameter.default_value) {
|
} else if (parameter.default_value) {
|
||||||
value = parameter.default_value->execute(interpreter);
|
value = parameter.default_value->execute(interpreter, global_object());
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue