summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-09-27 18:36:49 +0200
committerAndreas Kling <kling@serenityos.org>2020-09-27 20:26:58 +0200
commit340a115dfe9518eae3d76154fba9092c36526430 (patch)
treeced6db98e45ce6ac110db8e6a2a8ba7d95565cea
parent1ff9d33131921d97b5de99496f933bcebeb4faaa (diff)
downloadserenity-340a115dfe9518eae3d76154fba9092c36526430.zip
LibJS: Make native function/property callbacks take VM, not Interpreter
More work on decoupling the general runtime from Interpreter. The goal is becoming clearer. Interpreter should be one possible way to execute code inside a VM. In the future we might have other ways :^)
-rw-r--r--Applications/Spreadsheet/CellType/Date.cpp4
-rw-r--r--Applications/Spreadsheet/CellType/Numeric.cpp4
-rw-r--r--Applications/Spreadsheet/JSIntegration.cpp24
-rw-r--r--Libraries/LibJS/AST.cpp69
-rw-r--r--Libraries/LibJS/Forward.h12
-rw-r--r--Libraries/LibJS/Runtime/Array.cpp16
-rw-r--r--Libraries/LibJS/Runtime/Array.h2
-rw-r--r--Libraries/LibJS/Runtime/ArrayConstructor.cpp18
-rw-r--r--Libraries/LibJS/Runtime/ArrayIteratorPrototype.cpp6
-rw-r--r--Libraries/LibJS/Runtime/ArrayPrototype.cpp339
-rw-r--r--Libraries/LibJS/Runtime/BigIntPrototype.cpp14
-rw-r--r--Libraries/LibJS/Runtime/BooleanPrototype.cpp12
-rw-r--r--Libraries/LibJS/Runtime/BoundFunction.cpp2
-rw-r--r--Libraries/LibJS/Runtime/ConsoleObject.cpp18
-rw-r--r--Libraries/LibJS/Runtime/DateConstructor.cpp26
-rw-r--r--Libraries/LibJS/Runtime/DatePrototype.cpp68
-rw-r--r--Libraries/LibJS/Runtime/ErrorConstructor.cpp52
-rw-r--r--Libraries/LibJS/Runtime/ErrorConstructor.h2
-rw-r--r--Libraries/LibJS/Runtime/ErrorPrototype.cpp44
-rw-r--r--Libraries/LibJS/Runtime/Function.cpp2
-rw-r--r--Libraries/LibJS/Runtime/FunctionConstructor.cpp21
-rw-r--r--Libraries/LibJS/Runtime/FunctionPrototype.cpp62
-rw-r--r--Libraries/LibJS/Runtime/GlobalObject.cpp20
-rw-r--r--Libraries/LibJS/Runtime/IteratorOperations.cpp2
-rw-r--r--Libraries/LibJS/Runtime/IteratorPrototype.cpp2
-rw-r--r--Libraries/LibJS/Runtime/JSONObject.cpp37
-rw-r--r--Libraries/LibJS/Runtime/MathObject.cpp104
-rw-r--r--Libraries/LibJS/Runtime/NativeFunction.cpp6
-rw-r--r--Libraries/LibJS/Runtime/NativeFunction.h6
-rw-r--r--Libraries/LibJS/Runtime/NativeProperty.cpp10
-rw-r--r--Libraries/LibJS/Runtime/NativeProperty.h10
-rw-r--r--Libraries/LibJS/Runtime/NumberConstructor.cpp20
-rw-r--r--Libraries/LibJS/Runtime/NumberPrototype.cpp22
-rw-r--r--Libraries/LibJS/Runtime/Object.cpp10
-rw-r--r--Libraries/LibJS/Runtime/Object.h4
-rw-r--r--Libraries/LibJS/Runtime/ObjectConstructor.cpp96
-rw-r--r--Libraries/LibJS/Runtime/ObjectPrototype.cpp20
-rw-r--r--Libraries/LibJS/Runtime/PrimitiveString.cpp7
-rw-r--r--Libraries/LibJS/Runtime/PrimitiveString.h1
-rw-r--r--Libraries/LibJS/Runtime/PropertyName.h4
-rw-r--r--Libraries/LibJS/Runtime/ProxyObject.cpp139
-rw-r--r--Libraries/LibJS/Runtime/Reference.cpp4
-rw-r--r--Libraries/LibJS/Runtime/ReflectObject.cpp129
-rw-r--r--Libraries/LibJS/Runtime/RegExpConstructor.cpp13
-rw-r--r--Libraries/LibJS/Runtime/ScriptFunction.cpp12
-rw-r--r--Libraries/LibJS/Runtime/StringConstructor.cpp44
-rw-r--r--Libraries/LibJS/Runtime/StringIteratorPrototype.cpp6
-rw-r--r--Libraries/LibJS/Runtime/StringOrSymbol.h4
-rw-r--r--Libraries/LibJS/Runtime/StringPrototype.cpp219
-rw-r--r--Libraries/LibJS/Runtime/SymbolConstructor.cpp12
-rw-r--r--Libraries/LibJS/Runtime/SymbolPrototype.cpp16
-rw-r--r--Libraries/LibJS/Runtime/Uint8ClampedArray.cpp6
-rw-r--r--Libraries/LibJS/Runtime/VM.cpp2
-rw-r--r--Libraries/LibJS/Runtime/VM.h27
-rw-r--r--Libraries/LibJS/Runtime/Value.cpp183
-rw-r--r--Libraries/LibJS/Runtime/Value.h30
-rw-r--r--Libraries/LibWeb/Bindings/LocationObject.cpp22
-rw-r--r--Libraries/LibWeb/Bindings/NavigatorObject.cpp2
-rw-r--r--Libraries/LibWeb/Bindings/WindowObject.cpp122
-rw-r--r--Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.cpp24
-rw-r--r--Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp38
-rw-r--r--Userland/js.cpp16
-rw-r--r--Userland/test-js.cpp2
-rw-r--r--Userland/test-web.cpp4
64 files changed, 1160 insertions, 1114 deletions
diff --git a/Applications/Spreadsheet/CellType/Date.cpp b/Applications/Spreadsheet/CellType/Date.cpp
index 75ec4d45d6..c7a4ddc06d 100644
--- a/Applications/Spreadsheet/CellType/Date.cpp
+++ b/Applications/Spreadsheet/CellType/Date.cpp
@@ -43,7 +43,7 @@ DateCell::~DateCell()
String DateCell::display(Cell& cell, const CellTypeMetadata& metadata) const
{
auto timestamp = js_value(cell, metadata);
- auto string = Core::DateTime::from_timestamp(timestamp.to_i32(cell.sheet->interpreter())).to_string(metadata.format.is_empty() ? "%Y-%m-%d %H:%M:%S" : metadata.format.characters());
+ auto string = Core::DateTime::from_timestamp(timestamp.to_i32(cell.sheet->global_object())).to_string(metadata.format.is_empty() ? "%Y-%m-%d %H:%M:%S" : metadata.format.characters());
if (metadata.length >= 0)
return string.substring(0, metadata.length);
@@ -53,7 +53,7 @@ String DateCell::display(Cell& cell, const CellTypeMetadata& metadata) const
JS::Value DateCell::js_value(Cell& cell, const CellTypeMetadata&) const
{
- auto value = cell.js_data().to_double(cell.sheet->interpreter());
+ auto value = cell.js_data().to_double(cell.sheet->global_object());
return JS::Value(value / 1000); // Turn it to seconds
}
diff --git a/Applications/Spreadsheet/CellType/Numeric.cpp b/Applications/Spreadsheet/CellType/Numeric.cpp
index ca283bd11e..1863cbf24f 100644
--- a/Applications/Spreadsheet/CellType/Numeric.cpp
+++ b/Applications/Spreadsheet/CellType/Numeric.cpp
@@ -47,7 +47,7 @@ String NumericCell::display(Cell& cell, const CellTypeMetadata& metadata) const
if (metadata.format.is_empty())
string = value.to_string_without_side_effects();
else
- string = format_double(metadata.format.characters(), value.to_double(cell.sheet->interpreter()));
+ string = format_double(metadata.format.characters(), value.to_double(cell.sheet->global_object()));
if (metadata.length >= 0)
return string.substring(0, metadata.length);
@@ -57,7 +57,7 @@ String NumericCell::display(Cell& cell, const CellTypeMetadata& metadata) const
JS::Value NumericCell::js_value(Cell& cell, const CellTypeMetadata&) const
{
- return cell.js_data().to_number(cell.sheet->interpreter());
+ return cell.js_data().to_number(cell.sheet->global_object());
}
}
diff --git a/Applications/Spreadsheet/JSIntegration.cpp b/Applications/Spreadsheet/JSIntegration.cpp
index 4ffa06308d..f393093d8e 100644
--- a/Applications/Spreadsheet/JSIntegration.cpp
+++ b/Applications/Spreadsheet/JSIntegration.cpp
@@ -86,21 +86,21 @@ void SheetGlobalObject::initialize()
JS_DEFINE_NATIVE_FUNCTION(SheetGlobalObject::parse_cell_name)
{
- if (interpreter.argument_count() != 1) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, "Expected exactly one argument to parse_cell_name()");
+ if (vm.argument_count() != 1) {
+ vm.throw_exception<JS::TypeError>(global_object, "Expected exactly one argument to parse_cell_name()");
return {};
}
- auto name_value = interpreter.argument(0);
+ auto name_value = vm.argument(0);
if (!name_value.is_string()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, "Expected a String argument to parse_cell_name()");
+ vm.throw_exception<JS::TypeError>(global_object, "Expected a String argument to parse_cell_name()");
return {};
}
auto position = Sheet::parse_cell_name(name_value.as_string().string());
if (!position.has_value())
return JS::js_undefined();
- auto object = JS::Object::create_empty(interpreter.global_object());
- object->put("column", JS::js_string(interpreter, position.value().column));
+ auto object = JS::Object::create_empty(global_object);
+ object->put("column", JS::js_string(vm, position.value().column));
object->put("row", JS::Value((unsigned)position.value().row));
return object;
@@ -124,22 +124,22 @@ void WorkbookObject::initialize(JS::GlobalObject& global_object)
JS_DEFINE_NATIVE_FUNCTION(WorkbookObject::sheet)
{
- if (interpreter.argument_count() != 1) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, "Expected exactly one argument to sheet()");
+ if (vm.argument_count() != 1) {
+ vm.throw_exception<JS::TypeError>(global_object, "Expected exactly one argument to sheet()");
return {};
}
- auto name_value = interpreter.argument(0);
+ auto name_value = vm.argument(0);
if (!name_value.is_string() && !name_value.is_number()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, "Expected a String or Number argument to sheet()");
+ vm.throw_exception<JS::TypeError>(global_object, "Expected a String or Number argument to sheet()");
return {};
}
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->inherits("WorkbookObject")) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, "WorkbookObject");
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, "WorkbookObject");
return {};
}
diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp
index fafc25def6..d1d20521b7 100644
--- a/Libraries/LibJS/AST.cpp
+++ b/Libraries/LibJS/AST.cpp
@@ -75,13 +75,13 @@ static void update_function_name(Value& value, const FlyString& name)
update_function_name(value, name, visited);
}
-static String get_function_name(Interpreter& interpreter, Value value)
+static String get_function_name(GlobalObject& global_object, Value value)
{
if (value.is_symbol())
return String::format("[%s]", value.as_symbol().description().characters());
if (value.is_string())
return value.as_string().string();
- return value.to_string(interpreter);
+ return value.to_string(global_object);
}
Value ScopeNode::execute(Interpreter& interpreter, GlobalObject& global_object) const
@@ -106,6 +106,8 @@ Value ExpressionStatement::execute(Interpreter& interpreter, GlobalObject& globa
CallExpression::ThisAndCallee CallExpression::compute_this_and_callee(Interpreter& interpreter, GlobalObject& global_object) const
{
+ auto& vm = interpreter.vm();
+
if (is_new_expression()) {
// Computing |this| is irrelevant for "new" expression.
return { js_undefined(), m_callee->execute(interpreter, global_object) };
@@ -129,13 +131,13 @@ CallExpression::ThisAndCallee CallExpression::compute_this_and_callee(Interprete
return {};
}
- auto* this_value = is_super_property_lookup ? &interpreter.this_value(global_object).as_object() : lookup_target.to_object(interpreter, global_object);
+ auto* this_value = is_super_property_lookup ? &vm.this_value(global_object).as_object() : lookup_target.to_object(global_object);
if (interpreter.exception())
return {};
auto property_name = member_expression.computed_property_name(interpreter, global_object);
if (!property_name.is_valid())
return {};
- auto callee = lookup_target.to_object(interpreter, global_object)->get(property_name).value_or(js_undefined());
+ auto callee = lookup_target.to_object(global_object)->get(property_name).value_or(js_undefined());
return { this_value, callee };
}
return { &global_object, m_callee->execute(interpreter, global_object) };
@@ -387,7 +389,7 @@ Value ForInStatement::execute(Interpreter& interpreter, GlobalObject& global_obj
auto rhs_result = m_rhs->execute(interpreter, global_object);
if (interpreter.exception())
return {};
- auto* object = rhs_result.to_object(interpreter, global_object);
+ auto* object = rhs_result.to_object(global_object);
while (object) {
auto property_names = object->get_own_properties(*object, Object::PropertyKind::Key, true);
for (auto& property_name : property_names.as_object().indexed_properties()) {
@@ -479,11 +481,11 @@ Value BinaryExpression::execute(Interpreter& interpreter, GlobalObject& global_o
case BinaryOp::Modulo:
return mod(interpreter, lhs_result, rhs_result);
case BinaryOp::Exponentiation:
- return exp(interpreter, lhs_result, rhs_result);
+ return exp(global_object, lhs_result, rhs_result);
case BinaryOp::TypedEquals:
- return Value(strict_eq(interpreter, lhs_result, rhs_result));
+ return Value(strict_eq(lhs_result, rhs_result));
case BinaryOp::TypedInequals:
- return Value(!strict_eq(interpreter, lhs_result, rhs_result));
+ return Value(!strict_eq(lhs_result, rhs_result));
case BinaryOp::AbstractEquals:
return Value(abstract_eq(interpreter, lhs_result, rhs_result));
case BinaryOp::AbstractInequals:
@@ -511,7 +513,7 @@ Value BinaryExpression::execute(Interpreter& interpreter, GlobalObject& global_o
case BinaryOp::In:
return in(interpreter, lhs_result, rhs_result);
case BinaryOp::InstanceOf:
- return instance_of(interpreter, lhs_result, rhs_result);
+ return instance_of(global_object, lhs_result, rhs_result);
}
ASSERT_NOT_REACHED();
@@ -576,6 +578,7 @@ Reference MemberExpression::to_reference(Interpreter& interpreter, GlobalObject&
Value UnaryExpression::execute(Interpreter& interpreter, GlobalObject& global_object) const
{
+ auto& vm = interpreter.vm();
if (m_op == UnaryOp::Delete) {
auto reference = m_lhs->to_reference(interpreter, global_object);
if (interpreter.exception())
@@ -586,7 +589,7 @@ Value UnaryExpression::execute(Interpreter& interpreter, GlobalObject& global_ob
ASSERT(!reference.is_local_variable());
if (reference.is_global_variable())
return global_object.delete_property(reference.name());
- auto* base_object = reference.base().to_object(interpreter, global_object);
+ auto* base_object = reference.base().to_object(global_object);
if (!base_object)
return {};
return base_object->delete_property(reference.name());
@@ -626,25 +629,25 @@ Value UnaryExpression::execute(Interpreter& interpreter, GlobalObject& global_ob
ASSERT_NOT_REACHED();
return {};
case Value::Type::Undefined:
- return js_string(interpreter, "undefined");
+ return js_string(vm, "undefined");
case Value::Type::Null:
// yes, this is on purpose. yes, this is how javascript works.
// yes, it's silly.
- return js_string(interpreter, "object");
+ return js_string(vm, "object");
case Value::Type::Number:
- return js_string(interpreter, "number");
+ return js_string(vm, "number");
case Value::Type::String:
- return js_string(interpreter, "string");
+ return js_string(vm, "string");
case Value::Type::Object:
if (lhs_result.is_function())
- return js_string(interpreter, "function");
- return js_string(interpreter, "object");
+ return js_string(vm, "function");
+ return js_string(vm, "object");
case Value::Type::Boolean:
- return js_string(interpreter, "boolean");
+ return js_string(vm, "boolean");
case Value::Type::Symbol:
- return js_string(interpreter, "symbol");
+ return js_string(vm, "symbol");
case Value::Type::BigInt:
- return js_string(interpreter, "bigint");
+ return js_string(vm, "bigint");
default:
ASSERT_NOT_REACHED();
}
@@ -730,20 +733,20 @@ Value ClassExpression::execute(Interpreter& interpreter, GlobalObject& global_ob
method_function.set_home_object(&target);
if (method.kind() == ClassMethod::Kind::Method) {
- target.define_property(StringOrSymbol::from_value(interpreter, key), method_value);
+ target.define_property(StringOrSymbol::from_value(global_object, key), method_value);
} else {
String accessor_name = [&] {
switch (method.kind()) {
case ClassMethod::Kind::Getter:
- return String::format("get %s", get_function_name(interpreter, key).characters());
+ return String::format("get %s", get_function_name(global_object, key).characters());
case ClassMethod::Kind::Setter:
- return String::format("set %s", get_function_name(interpreter, key).characters());
+ return String::format("set %s", get_function_name(global_object, key).characters());
default:
ASSERT_NOT_REACHED();
}
}();
update_function_name(method_value, accessor_name);
- target.define_accessor(StringOrSymbol::from_value(interpreter, key), method_function, method.kind() == ClassMethod::Kind::Getter, Attribute::Configurable | Attribute::Enumerable);
+ target.define_accessor(StringOrSymbol::from_value(global_object, key), method_function, method.kind() == ClassMethod::Kind::Getter, Attribute::Configurable | Attribute::Enumerable);
}
if (interpreter.exception())
return {};
@@ -1232,7 +1235,7 @@ Value AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& glob
lhs_result = m_lhs->execute(interpreter, global_object);
if (interpreter.exception())
return {};
- rhs_result = exp(interpreter, lhs_result, rhs_result);
+ rhs_result = exp(global_object, lhs_result, rhs_result);
break;
case AssignmentOp::BitwiseAndAssignment:
lhs_result = m_lhs->execute(interpreter, global_object);
@@ -1282,7 +1285,7 @@ Value AssignmentExpression::execute(Interpreter& interpreter, GlobalObject& glob
interpreter.vm().throw_exception<ReferenceError>(global_object, ErrorType::InvalidLeftHandAssignment);
return {};
}
- update_function_name(rhs_result, get_function_name(interpreter, reference.name().to_value(interpreter)));
+ update_function_name(rhs_result, get_function_name(global_object, reference.name().to_value(interpreter)));
reference.put(interpreter, global_object, rhs_result);
if (interpreter.exception())
@@ -1298,7 +1301,7 @@ Value UpdateExpression::execute(Interpreter& interpreter, GlobalObject& global_o
auto old_value = reference.get(interpreter, global_object);
if (interpreter.exception())
return {};
- old_value = old_value.to_numeric(interpreter);
+ old_value = old_value.to_numeric(global_object);
if (interpreter.exception())
return {};
@@ -1528,7 +1531,7 @@ Value ObjectExpression::execute(Interpreter& interpreter, GlobalObject& global_o
if (value.is_function() && property.is_method())
value.as_function().set_home_object(object);
- String name = get_function_name(interpreter, key);
+ String name = get_function_name(global_object, key);
if (property.type() == ObjectProperty::Type::Getter) {
name = String::format("get %s", name.characters());
} else if (property.type() == ObjectProperty::Type::Setter) {
@@ -1539,11 +1542,11 @@ Value ObjectExpression::execute(Interpreter& interpreter, GlobalObject& global_o
if (property.type() == ObjectProperty::Type::Getter || property.type() == ObjectProperty::Type::Setter) {
ASSERT(value.is_function());
- object->define_accessor(PropertyName::from_value(interpreter, key), value.as_function(), property.type() == ObjectProperty::Type::Getter, Attribute::Configurable | Attribute::Enumerable);
+ object->define_accessor(PropertyName::from_value(global_object, key), value.as_function(), property.type() == ObjectProperty::Type::Getter, Attribute::Configurable | Attribute::Enumerable);
if (interpreter.exception())
return {};
} else {
- object->define_property(PropertyName::from_value(interpreter, key), value);
+ object->define_property(PropertyName::from_value(global_object, key), value);
if (interpreter.exception())
return {};
}
@@ -1577,7 +1580,7 @@ PropertyName MemberExpression::computed_property_name(Interpreter& interpreter,
if (index.is_symbol())
return &index.as_symbol();
- auto index_string = index.to_string(interpreter);
+ auto index_string = index.to_string(global_object);
if (interpreter.exception())
return {};
return index_string;
@@ -1599,7 +1602,7 @@ Value MemberExpression::execute(Interpreter& interpreter, GlobalObject& global_o
auto object_value = m_object->execute(interpreter, global_object);
if (interpreter.exception())
return {};
- auto* object_result = object_value.to_object(interpreter, global_object);
+ auto* object_result = object_value.to_object(global_object);
if (interpreter.exception())
return {};
auto property_name = computed_property_name(interpreter, global_object);
@@ -1697,7 +1700,7 @@ Value TemplateLiteral::execute(Interpreter& interpreter, GlobalObject& global_ob
auto expr = expression.execute(interpreter, global_object);
if (interpreter.exception())
return {};
- auto string = expr.to_string(interpreter);
+ auto string = expr.to_string(global_object);
if (interpreter.exception())
return {};
string_builder.append(string);
@@ -1849,7 +1852,7 @@ Value SwitchStatement::execute(Interpreter& interpreter, GlobalObject& global_ob
auto test_result = switch_case.test()->execute(interpreter, global_object);
if (interpreter.exception())
return {};
- if (!strict_eq(interpreter, discriminant_result, test_result))
+ if (!strict_eq(discriminant_result, test_result))
continue;
}
falling_through = true;
diff --git a/Libraries/LibJS/Forward.h b/Libraries/LibJS/Forward.h
index 178dafc6a2..9426c0f9d9 100644
--- a/Libraries/LibJS/Forward.h
+++ b/Libraries/LibJS/Forward.h
@@ -27,22 +27,22 @@
#pragma once
#define JS_DECLARE_NATIVE_FUNCTION(name) \
- static JS::Value name(JS::Interpreter&, JS::GlobalObject&)
+ static JS::Value name(JS::VM&, JS::GlobalObject&)
#define JS_DECLARE_NATIVE_GETTER(name) \
- static JS::Value name(JS::Interpreter&, JS::GlobalObject&)
+ static JS::Value name(JS::VM&, JS::GlobalObject&)
#define JS_DECLARE_NATIVE_SETTER(name) \
- static void name(JS::Interpreter&, JS::GlobalObject&, JS::Value)
+ static void name(JS::VM&, JS::GlobalObject&, JS::Value)
#define JS_DEFINE_NATIVE_FUNCTION(name) \
- JS::Value name([[maybe_unused]] JS::Interpreter& interpreter, [[maybe_unused]] JS::GlobalObject& global_object)
+ JS::Value name([[maybe_unused]] JS::VM& vm, [[maybe_unused]] JS::GlobalObject& global_object)
#define JS_DEFINE_NATIVE_GETTER(name) \
- JS::Value name([[maybe_unused]] JS::Interpreter& interpreter, [[maybe_unused]] JS::GlobalObject& global_object)
+ JS::Value name([[maybe_unused]] JS::VM& vm, [[maybe_unused]] JS::GlobalObject& global_object)
#define JS_DEFINE_NATIVE_SETTER(name) \
- void name([[maybe_unused]] JS::Interpreter& interpreter, [[maybe_unused]] JS::GlobalObject& global_object, JS::Value value)
+ void name([[maybe_unused]] JS::VM& vm, [[maybe_unused]] JS::GlobalObject& global_object, JS::Value value)
#define JS_ENUMERATE_NATIVE_OBJECTS \
__JS_ENUMERATE(Array, array, ArrayPrototype, ArrayConstructor) \
diff --git a/Libraries/LibJS/Runtime/Array.cpp b/Libraries/LibJS/Runtime/Array.cpp
index 0a0ac53b63..ac915891da 100644
--- a/Libraries/LibJS/Runtime/Array.cpp
+++ b/Libraries/LibJS/Runtime/Array.cpp
@@ -49,13 +49,13 @@ Array::~Array()
{
}
-Array* Array::typed_this(Interpreter& interpreter, GlobalObject& global_object)
+Array* Array::typed_this(VM& vm, GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->is_array()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAn, "Array");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAn, "Array");
return nullptr;
}
return static_cast<Array*>(this_object);
@@ -63,7 +63,7 @@ Array* Array::typed_this(Interpreter& interpreter, GlobalObject& global_object)
JS_DEFINE_NATIVE_GETTER(Array::length_getter)
{
- auto* array = typed_this(interpreter, global_object);
+ auto* array = typed_this(vm, global_object);
if (!array)
return {};
return Value(static_cast<i32>(array->indexed_properties().array_like_size()));
@@ -71,14 +71,14 @@ JS_DEFINE_NATIVE_GETTER(Array::length_getter)
JS_DEFINE_NATIVE_SETTER(Array::length_setter)
{
- auto* array = typed_this(interpreter, global_object);
+ auto* array = typed_this(vm, global_object);
if (!array)
return;
- auto length = value.to_number(interpreter);
- if (interpreter.exception())
+ auto length = value.to_number(global_object);
+ if (vm.exception())
return;
if (length.is_nan() || length.is_infinity() || length.as_double() < 0) {
- interpreter.vm().throw_exception<RangeError>(global_object, ErrorType::ArrayInvalidLength);
+ vm.throw_exception<RangeError>(global_object, ErrorType::ArrayInvalidLength);
return;
}
array->indexed_properties().set_array_like_size(length.as_double());
diff --git a/Libraries/LibJS/Runtime/Array.h b/Libraries/LibJS/Runtime/Array.h
index 20a9ed30d9..2ee4727c35 100644
--- a/Libraries/LibJS/Runtime/Array.h
+++ b/Libraries/LibJS/Runtime/Array.h
@@ -39,7 +39,7 @@ public:
explicit Array(Object& prototype);
virtual ~Array() override;
- static Array* typed_this(Interpreter&, GlobalObject&);
+ static Array* typed_this(VM&, GlobalObject&);
private:
virtual bool is_array() const override { return true; }
diff --git a/Libraries/LibJS/Runtime/ArrayConstructor.cpp b/Libraries/LibJS/Runtime/ArrayConstructor.cpp
index cb8bb55b54..e9f10781cf 100644
--- a/Libraries/LibJS/Runtime/ArrayConstructor.cpp
+++ b/Libraries/LibJS/Runtime/ArrayConstructor.cpp
@@ -88,8 +88,8 @@ Value ArrayConstructor::construct(Interpreter&, Function&)
JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from)
{
- auto value = interpreter.argument(0);
- auto object = value.to_object(interpreter, global_object);
+ auto value = vm.argument(0);
+ auto object = value.to_object(global_object);
if (!object)
return {};
@@ -98,23 +98,23 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from)
// Array.from() lets you create Arrays from:
if (auto size = object->indexed_properties().array_like_size()) {
// * array-like objects (objects with a length property and indexed elements)
- MarkedValueList elements(interpreter.heap());
+ MarkedValueList elements(vm.heap());
elements.ensure_capacity(size);
for (size_t i = 0; i < size; ++i) {
elements.append(object->get(i));
- if (interpreter.exception())
+ if (vm.exception())
return {};
}
array->set_indexed_property_elements(move(elements));
} else {
// * iterable objects
get_iterator_values(global_object, value, [&](Value element) {
- if (interpreter.exception())
+ if (vm.exception())
return IterationDecision::Break;
array->indexed_properties().append(element);
return IterationDecision::Continue;
});
- if (interpreter.exception())
+ if (vm.exception())
return {};
}
@@ -126,15 +126,15 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from)
JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::is_array)
{
- auto value = interpreter.argument(0);
+ auto value = vm.argument(0);
return Value(value.is_array());
}
JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::of)
{
auto* array = Array::create(global_object);
- for (size_t i = 0; i < interpreter.argument_count(); ++i)
- array->indexed_properties().append(interpreter.argument(i));
+ for (size_t i = 0; i < vm.argument_count(); ++i)
+ array->indexed_properties().append(vm.argument(i));
return array;
}
diff --git a/Libraries/LibJS/Runtime/ArrayIteratorPrototype.cpp b/Libraries/LibJS/Runtime/ArrayIteratorPrototype.cpp
index 62b7400098..5e941d438b 100644
--- a/Libraries/LibJS/Runtime/ArrayIteratorPrototype.cpp
+++ b/Libraries/LibJS/Runtime/ArrayIteratorPrototype.cpp
@@ -52,9 +52,9 @@ ArrayIteratorPrototype::~ArrayIteratorPrototype()
JS_DEFINE_NATIVE_FUNCTION(ArrayIteratorPrototype::next)
{
- auto this_value = interpreter.this_value(global_object);
+ auto this_value = vm.this_value(global_object);
if (!this_value.is_object() || !this_value.as_object().is_array_iterator_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAn, "Array Iterator");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAn, "Array Iterator");
return {};
}
auto& this_object = this_value.as_object();
@@ -80,7 +80,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayIteratorPrototype::next)
return create_iterator_result_object(global_object, Value(static_cast<i32>(index)), false);
auto value = array.get(index);
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (iteration_kind == Object::PropertyKind::Value)
return create_iterator_result_object(global_object, value, false);
diff --git a/Libraries/LibJS/Runtime/ArrayPrototype.cpp b/Libraries/LibJS/Runtime/ArrayPrototype.cpp
index fac4b742c6..8021249aeb 100644
--- a/Libraries/LibJS/Runtime/ArrayPrototype.cpp
+++ b/Libraries/LibJS/Runtime/ArrayPrototype.cpp
@@ -87,47 +87,48 @@ ArrayPrototype::~ArrayPrototype()
{
}
-static Function* callback_from_args(Interpreter& interpreter, const String& name)
+static Function* callback_from_args(GlobalObject& global_object, const String& name)
{
- if (interpreter.argument_count() < 1) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::ArrayPrototypeOneArg, name.characters());
+ auto& vm = global_object.vm();
+ if (vm.argument_count() < 1) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::ArrayPrototypeOneArg, name.characters());
return nullptr;
}
- auto callback = interpreter.argument(0);
+ auto callback = vm.argument(0);
if (!callback.is_function()) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::NotAFunction, callback.to_string_without_side_effects().characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAFunction, callback.to_string_without_side_effects().characters());
return nullptr;
}
return &callback.as_function();
}
-static size_t get_length(Interpreter& interpreter, Object& object)
+static size_t get_length(VM& vm, Object& object)
{
auto length_property = object.get("length");
- if (interpreter.exception())
+ if (vm.exception())
return 0;
- return length_property.to_size_t(interpreter);
+ return length_property.to_size_t(object.global_object());
}
-static void for_each_item(Interpreter& interpreter, GlobalObject& global_object, const String& name, AK::Function<IterationDecision(size_t index, Value value, Value callback_result)> callback, bool skip_empty = true)
+static void for_each_item(VM& vm, GlobalObject& global_object, const String& name, AK::Function<IterationDecision(size_t index, Value value, Value callback_result)> callback, bool skip_empty = true)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return;
- auto initial_length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ auto initial_length = get_length(vm, *this_object);
+ if (vm.exception())
return;
- auto* callback_function = callback_from_args(interpreter, name);
+ auto* callback_function = callback_from_args(global_object, name);
if (!callback_function)
return;
- auto this_value = interpreter.argument(1);
+ auto this_value = vm.argument(1);
for (size_t i = 0; i < initial_length; ++i) {
auto value = this_object->get(i);
- if (interpreter.exception())
+ if (vm.exception())
return;
if (value.is_empty()) {
if (skip_empty)
@@ -135,8 +136,8 @@ static void for_each_item(Interpreter& interpreter, GlobalObject& global_object,
value = js_undefined();
}
- auto callback_result = interpreter.call(*callback_function, this_value, value, Value((i32)i), this_object);
- if (interpreter.exception())
+ auto callback_result = vm.call(*callback_function, this_value, value, Value((i32)i), this_object);
+ if (vm.exception())
return;
if (callback(i, value, callback_result) == IterationDecision::Break)
@@ -147,7 +148,7 @@ static void for_each_item(Interpreter& interpreter, GlobalObject& global_object,
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::filter)
{
auto* new_array = Array::create(global_object);
- for_each_item(interpreter, global_object, "filter", [&](auto, auto value, auto callback_result) {
+ for_each_item(vm, global_object, "filter", [&](auto, auto value, auto callback_result) {
if (callback_result.to_boolean())
new_array->indexed_properties().append(value);
return IterationDecision::Continue;
@@ -157,7 +158,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::filter)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::for_each)
{
- for_each_item(interpreter, global_object, "forEach", [](auto, auto, auto) {
+ for_each_item(vm, global_object, "forEach", [](auto, auto, auto) {
return IterationDecision::Continue;
});
return js_undefined();
@@ -165,16 +166,16 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::for_each)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::map)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- auto initial_length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ auto initial_length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
auto* new_array = Array::create(global_object);
new_array->indexed_properties().set_array_like_size(initial_length);
- for_each_item(interpreter, global_object, "map", [&](auto index, auto, auto callback_result) {
- if (interpreter.exception())
+ for_each_item(vm, global_object, "map", [&](auto index, auto, auto callback_result) {
+ if (vm.exception())
return IterationDecision::Break;
new_array->define_property(index, callback_result);
return IterationDecision::Continue;
@@ -184,49 +185,49 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::map)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::push)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (this_object->is_array()) {
auto* array = static_cast<Array*>(this_object);
- for (size_t i = 0; i < interpreter.argument_count(); ++i)
- array->indexed_properties().append(interpreter.argument(i));
+ for (size_t i = 0; i < vm.argument_count(); ++i)
+ array->indexed_properties().append(vm.argument(i));
return Value(static_cast<i32>(array->indexed_properties().array_like_size()));
}
- auto length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ auto length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
- auto argument_count = interpreter.argument_count();
+ auto argument_count = vm.argument_count();
auto new_length = length + argument_count;
if (new_length > MAX_ARRAY_LIKE_INDEX) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ArrayMaxSize);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ArrayMaxSize);
return {};
}
for (size_t i = 0; i < argument_count; ++i) {
- this_object->put(length + i, interpreter.argument(i));
- if (interpreter.exception())
+ this_object->put(length + i, vm.argument(i));
+ if (vm.exception())
return {};
}
auto new_length_value = Value((i32)new_length);
this_object->put("length", new_length_value);
- if (interpreter.exception())
+ if (vm.exception())
return {};
return new_length_value;
}
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::unshift)
{
- auto* array = Array::typed_this(interpreter, global_object);
+ auto* array = Array::typed_this(vm, global_object);
if (!array)
return {};
- for (size_t i = 0; i < interpreter.argument_count(); ++i)
- array->indexed_properties().insert(i, interpreter.argument(i));
+ for (size_t i = 0; i < vm.argument_count(); ++i)
+ array->indexed_properties().insert(i, vm.argument(i));
return Value(static_cast<i32>(array->indexed_properties().array_like_size()));
}
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::pop)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (this_object->is_array()) {
@@ -235,129 +236,129 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::pop)
return js_undefined();
return array->indexed_properties().take_last(array).value.value_or(js_undefined());
}
- auto length = get_length(interpreter, *this_object);
+ auto length = get_length(vm, *this_object);
if (length == 0) {
this_object->put("length", Value(0));
return js_undefined();
}
auto index = length - 1;
auto element = this_object->get(index).value_or(js_undefined());
- if (interpreter.exception())
+ if (vm.exception())
return {};
this_object->delete_property(index);
- if (interpreter.exception())
+ if (vm.exception())
return {};
this_object->put("length", Value((i32)index));
- if (interpreter.exception())
+ if (vm.exception())
return {};
return element;
}
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::shift)
{
- auto* array = Array::typed_this(interpreter, global_object);
+ auto* array = Array::typed_this(vm, global_object);
if (!array)
return {};
if (array->indexed_properties().is_empty())
return js_undefined();
auto result = array->indexed_properties().take_first(array);
- if (interpreter.exception())
+ if (vm.exception())
return {};
return result.value.value_or(js_undefined());
}
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::to_string)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
auto join_function = this_object->get("join");
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (!join_function.is_function())
- return ObjectPrototype::to_string(interpreter, global_object);
- return interpreter.call(join_function.as_function(), this_object);
+ return ObjectPrototype::to_string(vm, global_object);
+ return vm.call(join_function.as_function(), this_object);
}
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::to_locale_string)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
String separator = ","; // NOTE: This is implementation-specific.
- auto length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ auto length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
StringBuilder builder;
for (size_t i = 0; i < length; ++i) {
if (i > 0)
builder.append(separator);
auto value = this_object->get(i).value_or(js_undefined());
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (value.is_undefined() || value.is_null())
continue;
- auto* value_object = value.to_object(interpreter, global_object);
+ auto* value_object = value.to_object(global_object);
ASSERT(value_object);
auto locale_string_result = value_object->invoke("toLocaleString");
- if (interpreter.exception())
+ if (vm.exception())
return {};
- auto string = locale_string_result.to_string(interpreter);
- if (interpreter.exception())
+ auto string = locale_string_result.to_string(global_object);
+ if (vm.exception())
return {};
builder.append(string);
}
- return js_string(interpreter, builder.to_string());
+ return js_string(vm, builder.to_string());
}
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::join)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
String separator = ",";
- if (interpreter.argument_count()) {
- separator = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count()) {
+ separator = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
}
- auto length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ auto length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
StringBuilder builder;
for (size_t i = 0; i < length; ++i) {
if (i > 0)
builder.append(separator);
auto value = this_object->get(i).value_or(js_undefined());
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (value.is_undefined() || value.is_null())
continue;
- auto string = value.to_string(interpreter);
- if (interpreter.exception())
+ auto string = value.to_string(global_object);
+ if (vm.exception())
return {};
builder.append(string);
}
- return js_string(interpreter, builder.to_string());
+ return js_string(vm, builder.to_string());
}
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat)
{
- auto* array = Array::typed_this(interpreter, global_object);
+ auto* array = Array::typed_this(vm, global_object);
if (!array)
return {};
auto* new_array = Array::create(global_object);
new_array->indexed_properties().append_all(array, array->indexed_properties());
- if (interpreter.exception())
+ if (vm.exception())
return {};
- for (size_t i = 0; i < interpreter.argument_count(); ++i) {
- auto argument = interpreter.argument(i);
+ for (size_t i = 0; i < vm.argument_count(); ++i) {
+ auto argument = vm.argument(i);
if (argument.is_array()) {
auto& argument_object = argument.as_object();
new_array->indexed_properties().append_all(&argument_object, argument_object.indexed_properties());
- if (interpreter.exception())
+ if (vm.exception())
return {};
} else {
new_array->indexed_properties().append(argument);
@@ -369,21 +370,21 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::slice)
{
- auto* array = Array::typed_this(interpreter, global_object);
+ auto* array = Array::typed_this(vm, global_object);
if (!array)
return {};
auto* new_array = Array::create(global_object);
- if (interpreter.argument_count() == 0) {
+ if (vm.argument_count() == 0) {
new_array->indexed_properties().append_all(array, array->indexed_properties());
- if (interpreter.exception())
+ if (vm.exception())
return {};
return new_array;
}
ssize_t array_size = static_cast<ssize_t>(array->indexed_properties().array_like_size());
- auto start_slice = interpreter.argument(0).to_i32(interpreter);
- if (interpreter.exception())
+ auto start_slice = vm.argument(0).to_i32(global_object);
+ if (vm.exception())
return {};
auto end_slice = array_size;
@@ -393,9 +394,9 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::slice)
if (start_slice < 0)
start_slice = end_slice + start_slice;
- if (interpreter.argument_count() >= 2) {
- end_slice = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ end_slice = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
if (end_slice < 0)
end_slice = array_size + end_slice;
@@ -405,7 +406,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::slice)
for (ssize_t i = start_slice; i < end_slice; ++i) {
new_array->indexed_properties().append(array->get(i));
- if (interpreter.exception())
+ if (vm.exception())
return {};
}
@@ -414,30 +415,30 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::slice)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::index_of)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- i32 length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ i32 length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
if (length == 0)
return Value(-1);
i32 from_index = 0;
- if (interpreter.argument_count() >= 2) {
- from_index = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ from_index = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
if (from_index >= length)
return Value(-1);
if (from_index < 0)
from_index = max(length + from_index, 0);
}
- auto search_element = interpreter.argument(0);
+ auto search_element = vm.argument(0);
for (i32 i = from_index; i < length; ++i) {
auto element = this_object->get(i);
- if (interpreter.exception())
+ if (vm.exception())
return {};
- if (strict_eq(interpreter, element, search_element))
+ if (strict_eq(element, search_element))
return Value(i);
}
return Value(-1);
@@ -445,28 +446,28 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::index_of)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reduce)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- auto initial_length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ auto initial_length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
- auto* callback_function = callback_from_args(interpreter, "reduce");
+ auto* callback_function = callback_from_args(global_object, "reduce");
if (!callback_function)
return {};
size_t start = 0;
auto accumulator = js_undefined();
- if (interpreter.argument_count() > 1) {
- accumulator = interpreter.argument(1);
+ if (vm.argument_count() > 1) {
+ accumulator = vm.argument(1);
} else {
bool start_found = false;
while (!start_found && start < initial_length) {
auto value = this_object->get(start);
- if (interpreter.exception())
+ if (vm.exception())
return {};
start_found = !value.is_empty();
if (start_found)
@@ -474,7 +475,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reduce)
start += 1;
}
if (!start_found) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ReduceNoInitial);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ReduceNoInitial);
return {};
}
}
@@ -483,13 +484,13 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reduce)
for (size_t i = start; i < initial_length; ++i) {
auto value = this_object->get(i);
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (value.is_empty())
continue;
- accumulator = interpreter.call(*callback_function, this_value, accumulator, value, Value((i32)i), this_object);
- if (interpreter.exception())
+ accumulator = vm.call(*callback_function, this_value, accumulator, value, Value((i32)i), this_object);
+ if (vm.exception())
return {};
}
@@ -498,28 +499,28 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reduce)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reduce_right)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- auto initial_length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ auto initial_length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
- auto* callback_function = callback_from_args(interpreter, "reduceRight");
+ auto* callback_function = callback_from_args(global_object, "reduceRight");
if (!callback_function)
return {};
int start = initial_length - 1;
auto accumulator = js_undefined();
- if (interpreter.argument_count() > 1) {
- accumulator = interpreter.argument(1);
+ if (vm.argument_count() > 1) {
+ accumulator = vm.argument(1);
} else {
bool start_found = false;
while (!start_found && start >= 0) {
auto value = this_object->get(start);
- if (interpreter.exception())
+ if (vm.exception())
return {};
start_found = !value.is_empty();
if (start_found)
@@ -527,7 +528,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reduce_right)
start -= 1;
}
if (!start_found) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ReduceNoInitial);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ReduceNoInitial);
return {};
}
}
@@ -536,13 +537,13 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reduce_right)
for (int i = start; i >= 0; --i) {
auto value = this_object->get(i);
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (value.is_empty())
continue;
- accumulator = interpreter.call(*callback_function, this_value, accumulator, value, Value((i32)i), this_object);
- if (interpreter.exception())
+ accumulator = vm.call(*callback_function, this_value, accumulator, value, Value((i32)i), this_object);
+ if (vm.exception())
return {};
}
@@ -551,20 +552,20 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reduce_right)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reverse)
{
- auto* array = Array::typed_this(interpreter, global_object);
+ auto* array = Array::typed_this(vm, global_object);
if (!array)
return {};
if (array->indexed_properties().is_empty())
return array;
- MarkedValueList array_reverse(interpreter.heap());
+ MarkedValueList array_reverse(vm.heap());
auto size = array->indexed_properties().array_like_size();
array_reverse.ensure_capacity(size);
for (ssize_t i = size - 1; i >= 0; --i) {
array_reverse.append(array->get(i));
- if (interpreter.exception())
+ if (vm.exception())
return {};
}
@@ -575,30 +576,30 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::reverse)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::last_index_of)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- i32 length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ i32 length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
if (length == 0)
return Value(-1);
i32 from_index = length - 1;
- if (interpreter.argument_count() >= 2) {
- from_index = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ from_index = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
if (from_index >= 0)
from_index = min(from_index, length - 1);
else
from_index = length + from_index;
}
- auto search_element = interpreter.argument(0);
+ auto search_element = vm.argument(0);
for (i32 i = from_index; i >= 0; --i) {
auto element = this_object->get(i);
- if (interpreter.exception())
+ if (vm.exception())
return {};
- if (strict_eq(interpreter, element, search_element))
+ if (strict_eq(element, search_element))
return Value(i);
}
return Value(-1);
@@ -606,30 +607,30 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::last_index_of)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::includes)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- i32 length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ i32 length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
if (length == 0)
return Value(false);
i32 from_index = 0;
- if (interpreter.argument_count() >= 2) {
- from_index = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ from_index = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
if (from_index >= length)
return Value(false);
if (from_index < 0)
from_index = max(length + from_index, 0);
}
- auto value_to_find = interpreter.argument(0);
+ auto value_to_find = vm.argument(0);
for (i32 i = from_index; i < length; ++i) {
auto element = this_object->get(i).value_or(js_undefined());
- if (interpreter.exception())
+ if (vm.exception())
return {};
- if (same_value_zero(interpreter, element, value_to_find))
+ if (same_value_zero(element, value_to_find))
return Value(true);
}
return Value(false);
@@ -639,7 +640,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::find)
{
auto result = js_undefined();
for_each_item(
- interpreter, global_object, "find", [&](auto, auto value, auto callback_result) {
+ vm, global_object, "find", [&](auto, auto value, auto callback_result) {
if (callback_result.to_boolean()) {
result = value;
return IterationDecision::Break;
@@ -654,7 +655,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::find_index)
{
auto result_index = -1;
for_each_item(
- interpreter, global_object, "findIndex", [&](auto index, auto, auto callback_result) {
+ vm, global_object, "findIndex", [&](auto index, auto, auto callback_result) {
if (callback_result.to_boolean()) {
result_index = index;
return IterationDecision::Break;
@@ -668,7 +669,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::find_index)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::some)
{
auto result = false;
- for_each_item(interpreter, global_object, "some", [&](auto, auto, auto callback_result) {
+ for_each_item(vm, global_object, "some", [&](auto, auto, auto callback_result) {
if (callback_result.to_boolean()) {
result = true;
return IterationDecision::Break;
@@ -681,7 +682,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::some)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::every)
{
auto result = true;
- for_each_item(interpreter, global_object, "every", [&](auto, auto, auto callback_result) {
+ for_each_item(vm, global_object, "every", [&](auto, auto, auto callback_result) {
if (!callback_result.to_boolean()) {
result = false;
return IterationDecision::Break;
@@ -693,16 +694,16 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::every)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- auto initial_length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ auto initial_length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
- auto relative_start = interpreter.argument(0).to_i32(interpreter);
- if (interpreter.exception())
+ auto relative_start = vm.argument(0).to_i32(global_object);
+ if (vm.exception())
return {};
size_t actual_start;
@@ -715,12 +716,12 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
size_t insert_count = 0;
size_t actual_delete_count = 0;
- if (interpreter.argument_count() == 1) {
+ if (vm.argument_count() == 1) {
actual_delete_count = initial_length - actual_start;
- } else if (interpreter.argument_count() >= 2) {
- insert_count = interpreter.argument_count() - 2;
- i32 delete_count = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ } else if (vm.argument_count() >= 2) {
+ insert_count = vm.argument_count() - 2;
+ i32 delete_count = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
actual_delete_count = min((size_t)max(delete_count, 0), initial_length - actual_start);
@@ -729,7 +730,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
size_t new_length = initial_length + insert_count - actual_delete_count;
if (new_length > MAX_ARRAY_LIKE_INDEX) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ArrayMaxSize);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ArrayMaxSize);
return {};
}
@@ -737,7 +738,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
for (size_t i = 0; i < actual_delete_count; ++i) {
auto value = this_object->get(actual_start + i);
- if (interpreter.exception())
+ if (vm.exception())
return {};
removed_elements->indexed_properties().append(value);
@@ -746,7 +747,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
if (insert_count < actual_delete_count) {
for (size_t i = actual_start; i < initial_length - actual_delete_count; ++i) {
auto from = this_object->get(i + actual_delete_count);
- if (interpreter.exception())
+ if (vm.exception())
return {};
auto to = i + insert_count;
@@ -756,19 +757,19 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
} else {
this_object->delete_property(to);
}
- if (interpreter.exception())
+ if (vm.exception())
return {};
}
for (size_t i = initial_length; i > new_length; --i) {
this_object->delete_property(i - 1);
- if (interpreter.exception())
+ if (vm.exception())
return {};
}
} else if (insert_count > actual_delete_count) {
for (size_t i = initial_length - actual_delete_count; i > actual_start; --i) {
auto from = this_object->get(i + actual_delete_count - 1);
- if (interpreter.exception())
+ if (vm.exception())
return {};
auto to = i + insert_count - 1;
@@ -778,19 +779,19 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
} else {
this_object->delete_property(to);
}
- if (interpreter.exception())
+ if (vm.exception())
return {};
}
}
for (size_t i = 0; i < insert_count; ++i) {
- this_object->put(actual_start + i, interpreter.argument(i + 2));
- if (interpreter.exception())
+ this_object->put(actual_start + i, vm.argument(i + 2));
+ if (vm.exception())
return {};
}
this_object->put("length", Value((i32)new_length));
- if (interpreter.exception())
+ if (vm.exception())
return {};
return removed_elements;
@@ -798,26 +799,26 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::splice)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::fill)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- ssize_t length = get_length(interpreter, *this_object);
- if (interpreter.exception())
+ ssize_t length = get_length(vm, *this_object);
+ if (vm.exception())
return {};
ssize_t relative_start = 0;
ssize_t relative_end = length;
- if (interpreter.argument_count() >= 2) {
- relative_start = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ relative_start = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
}
- if (interpreter.argument_count() >= 3) {
- relative_end = interpreter.argument(2).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 3) {
+ relative_end = vm.argument(2).to_i32(global_object);
+ if (vm.exception())
return {};
}
@@ -834,8 +835,8 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::fill)
to = min(relative_end, length);
for (size_t i = from; i < to; i++) {
- this_object->put(i, interpreter.argument(0));
- if (interpreter.exception())
+ this_object->put(i, vm.argument(0));
+ if (vm.exception())
return {};
}
@@ -844,7 +845,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::fill)
JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::values)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
diff --git a/Libraries/LibJS/Runtime/BigIntPrototype.cpp b/Libraries/LibJS/Runtime/BigIntPrototype.cpp
index b2e28bc5ef..6c9a947060 100644
--- a/Libraries/LibJS/Runtime/BigIntPrototype.cpp
+++ b/Libraries/LibJS/Runtime/BigIntPrototype.cpp
@@ -52,13 +52,13 @@ BigIntPrototype::~BigIntPrototype()
{
}
-static BigIntObject* bigint_object_from(Interpreter& interpreter, GlobalObject& global_object)
+static BigIntObject* bigint_object_from(VM& vm, GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return nullptr;
if (!this_object->is_bigint_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "BigInt");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "BigInt");
return nullptr;
}
return static_cast<BigIntObject*>(this_object);
@@ -66,20 +66,20 @@ static BigIntObject* bigint_object_from(Interpreter& interpreter, GlobalObject&
JS_DEFINE_NATIVE_FUNCTION(BigIntPrototype::to_string)
{
- auto* bigint_object = bigint_object_from(interpreter, global_object);
+ auto* bigint_object = bigint_object_from(vm, global_object);
if (!bigint_object)
return {};
- return js_string(interpreter, bigint_object->bigint().big_integer().to_base10());
+ return js_string(vm, bigint_object->bigint().big_integer().to_base10());
}
JS_DEFINE_NATIVE_FUNCTION(BigIntPrototype::to_locale_string)
{
- return to_string(interpreter, global_object);
+ return to_string(vm, global_object);
}
JS_DEFINE_NATIVE_FUNCTION(BigIntPrototype::value_of)
{
- auto* bigint_object = bigint_object_from(interpreter, global_object);
+ auto* bigint_object = bigint_object_from(vm, global_object);
if (!bigint_object)
return {};
return bigint_object->value_of();
diff --git a/Libraries/LibJS/Runtime/BooleanPrototype.cpp b/Libraries/LibJS/Runtime/BooleanPrototype.cpp
index cadc070dfe..413ea5dbf1 100644
--- a/Libraries/LibJS/Runtime/BooleanPrototype.cpp
+++ b/Libraries/LibJS/Runtime/BooleanPrototype.cpp
@@ -50,27 +50,27 @@ BooleanPrototype::~BooleanPrototype()
JS_DEFINE_NATIVE_FUNCTION(BooleanPrototype::to_string)
{
- auto this_object = interpreter.this_value(global_object);
+ auto this_object = vm.this_value(global_object);
if (this_object.is_boolean()) {
- return js_string(interpreter.heap(), this_object.as_bool() ? "true" : "false");
+ return js_string(vm, this_object.as_bool() ? "true" : "false");
}
if (!this_object.is_object() || !this_object.as_object().is_boolean_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Boolean");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Boolean");
return {};
}
bool bool_value = static_cast<BooleanObject&>(this_object.as_object()).value_of().as_bool();
- return js_string(interpreter.heap(), bool_value ? "true" : "false");
+ return js_string(vm, bool_value ? "true" : "false");
}
JS_DEFINE_NATIVE_FUNCTION(BooleanPrototype::value_of)
{
- auto this_object = interpreter.this_value(global_object);
+ auto this_object = vm.this_value(global_object);
if (this_object.is_boolean()) {
return this_object;
}
if (!this_object.is_object() || !this_object.as_object().is_boolean_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Boolean");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Boolean");
return {};
}
diff --git a/Libraries/LibJS/Runtime/BoundFunction.cpp b/Libraries/LibJS/Runtime/BoundFunction.cpp
index d4bffba6e6..44e6b840b3 100644
--- a/Libraries/LibJS/Runtime/BoundFunction.cpp
+++ b/Libraries/LibJS/Runtime/BoundFunction.cpp
@@ -56,7 +56,7 @@ Value BoundFunction::call()
Value BoundFunction::construct(Interpreter& interpreter, Function& new_target)
{
- if (auto this_value = interpreter.this_value(global_object()); m_constructor_prototype && this_value.is_object()) {
+ if (auto this_value = vm().this_value(global_object()); m_constructor_prototype && this_value.is_object()) {
this_value.as_object().set_prototype(m_constructor_prototype);
if (interpreter.exception())
return {};
diff --git a/Libraries/LibJS/Runtime/ConsoleObject.cpp b/Libraries/LibJS/Runtime/ConsoleObject.cpp
index 3330f9d5e6..3543d32827 100644
--- a/Libraries/LibJS/Runtime/ConsoleObject.cpp
+++ b/Libraries/LibJS/Runtime/ConsoleObject.cpp
@@ -60,47 +60,47 @@ ConsoleObject::~ConsoleObject()
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::log)
{
- return interpreter.console().log();
+ return vm.interpreter().console().log();
}
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::debug)
{
- return interpreter.console().debug();
+ return vm.interpreter().console().debug();
}
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::info)
{
- return interpreter.console().info();
+ return vm.interpreter().console().info();
}
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::warn)
{
- return interpreter.console().warn();
+ return vm.interpreter().console().warn();
}
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::error)
{
- return interpreter.console().error();
+ return vm.interpreter().console().error();
}
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::trace)
{
- return interpreter.console().trace();
+ return vm.interpreter().console().trace();
}
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::count)
{
- return interpreter.console().count();
+ return vm.interpreter().console().count();
}
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::count_reset)
{
- return interpreter.console().count_reset();
+ return vm.interpreter().console().count_reset();
}
JS_DEFINE_NATIVE_FUNCTION(ConsoleObject::clear)
{
- return interpreter.console().clear();
+ return vm.interpreter().console().clear();
}
}
diff --git a/Libraries/LibJS/Runtime/DateConstructor.cpp b/Libraries/LibJS/Runtime/DateConstructor.cpp
index 17993bc1f9..83765da1ac 100644
--- a/Libraries/LibJS/Runtime/DateConstructor.cpp
+++ b/Libraries/LibJS/Runtime/DateConstructor.cpp
@@ -165,31 +165,31 @@ Value DateConstructor::call()
return js_string(heap(), static_cast<Date&>(date.as_object()).string());
}
-Value DateConstructor::construct(Interpreter& interpreter, Function&)
+Value DateConstructor::construct(Interpreter&, Function&)
{
- if (interpreter.argument_count() == 0) {
+ if (vm().argument_count() == 0) {
struct timeval tv;
gettimeofday(&tv, nullptr);
auto datetime = Core::DateTime::now();
auto milliseconds = static_cast<u16>(tv.tv_usec / 1000);
return Date::create(global_object(), datetime, milliseconds);
}
- if (interpreter.argument_count() == 1) {
- auto value = interpreter.argument(0);
+ if (vm().argument_count() == 1) {
+ auto value = vm().argument(0);
if (value.is_string())
value = parse_simplified_iso8601(value.as_string().string());
// A timestamp since the epoch, in UTC.
// FIXME: Date() probably should use a double as internal representation, so that NaN arguments and larger offsets are handled correctly.
- double value_as_double = value.to_double(interpreter);
+ double value_as_double = value.to_double(global_object());
auto datetime = Core::DateTime::from_timestamp(static_cast<time_t>(value_as_double / 1000));
auto milliseconds = static_cast<u16>(fmod(value_as_double, 1000));
return Date::create(global_object(), datetime, milliseconds);
}
// A date/time in components, in local time.
// FIXME: This doesn't construct an "Invalid Date" object if one of the parameters is NaN.
- auto arg_or = [&interpreter](size_t i, i32 fallback) { return interpreter.argument_count() > i ? interpreter.argument(i).to_i32(interpreter) : fallback; };
- int year = interpreter.argument(0).to_i32(interpreter);
- int month_index = interpreter.argument(1).to_i32(interpreter);
+ auto arg_or = [this](size_t i, i32 fallback) { return vm().argument_count() > i ? vm().argument(i).to_i32(global_object()) : fallback; };
+ int year = vm().argument(0).to_i32(global_object());
+ int month_index = vm().argument(1).to_i32(global_object());
int day = arg_or(2, 1);
int hours = arg_or(3, 0);
int minutes = arg_or(4, 0);
@@ -219,11 +219,11 @@ JS_DEFINE_NATIVE_FUNCTION(DateConstructor::now)
JS_DEFINE_NATIVE_FUNCTION(DateConstructor::parse)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return js_nan();
- auto iso_8601 = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto iso_8601 = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return js_nan();
return parse_simplified_iso8601(iso_8601);
@@ -231,8 +231,8 @@ JS_DEFINE_NATIVE_FUNCTION(DateConstructor::parse)
JS_DEFINE_NATIVE_FUNCTION(DateConstructor::utc)
{
- auto arg_or = [&interpreter](size_t i, i32 fallback) { return interpreter.argument_count() > i ? interpreter.argument(i).to_i32(interpreter) : fallback; };
- int year = interpreter.argument(0).to_i32(interpreter);
+ auto arg_or = [&vm, &global_object](size_t i, i32 fallback) { return vm.argument_count() > i ? vm.argument(i).to_i32(global_object) : fallback; };
+ int year = vm.argument(0).to_i32(global_object);
if (year >= 0 && year <= 99)
year += 1900;
diff --git a/Libraries/LibJS/Runtime/DatePrototype.cpp b/Libraries/LibJS/Runtime/DatePrototype.cpp
index e3c54e24df..4f0be8fdec 100644
--- a/Libraries/LibJS/Runtime/DatePrototype.cpp
+++ b/Libraries/LibJS/Runtime/DatePrototype.cpp
@@ -36,13 +36,13 @@
namespace JS {
-static Date* typed_this(Interpreter& interpreter, GlobalObject& global_object)
+static Date* typed_this(VM& vm, GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return nullptr;
if (!this_object->is_date()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Date");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Date");
return nullptr;
}
return static_cast<Date*>(this_object);
@@ -96,7 +96,7 @@ DatePrototype::~DatePrototype()
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_date)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->date()));
@@ -104,7 +104,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_date)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_day)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->day()));
@@ -112,7 +112,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_day)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_full_year)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->full_year()));
@@ -120,7 +120,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_full_year)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_hours)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->hours()));
@@ -128,7 +128,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_hours)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_milliseconds)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->milliseconds()));
@@ -136,7 +136,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_milliseconds)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_minutes)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->minutes()));
@@ -144,7 +144,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_minutes)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_month)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->month()));
@@ -152,7 +152,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_month)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_seconds)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->seconds()));
@@ -160,7 +160,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_seconds)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_time)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(this_object->time());
@@ -168,7 +168,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_time)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_date)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->utc_date()));
@@ -176,7 +176,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_date)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_day)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->utc_day()));
@@ -184,7 +184,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_day)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_full_year)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->utc_full_year()));
@@ -192,7 +192,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_full_year)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_hours)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->utc_hours()));
@@ -200,7 +200,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_hours)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_milliseconds)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->utc_milliseconds()));
@@ -208,7 +208,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_milliseconds)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_month)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->utc_month()));
@@ -216,7 +216,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_month)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_minutes)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->utc_minutes()));
@@ -224,7 +224,7 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_minutes)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_seconds)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return Value(static_cast<double>(this_object->utc_seconds()));
@@ -232,68 +232,68 @@ JS_DEFINE_NATIVE_FUNCTION(DatePrototype::get_utc_seconds)
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::to_date_string)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
auto string = this_object->date_string();
- return js_string(interpreter, move(string));
+ return js_string(vm, move(string));
}
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::to_iso_string)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
auto string = this_object->iso_date_string();
- return js_string(interpreter, move(string));
+ return js_string(vm, move(string));
}
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::to_locale_date_string)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
// FIXME: Optional locales, options params.
auto string = this_object->locale_date_string();
- return js_string(interpreter, move(string));
+ return js_string(vm, move(string));
}
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::to_locale_string)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
// FIXME: Optional locales, options params.
auto string = this_object->locale_string();
- return js_string(interpreter, move(string));
+ return js_string(vm, move(string));
}
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::to_locale_time_string)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
// FIXME: Optional locales, options params.
auto string = this_object->locale_time_string();
- return js_string(interpreter, move(string));
+ return js_string(vm, move(string));
}
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::to_time_string)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
auto string = this_object->time_string();
- return js_string(interpreter, move(string));
+ return js_string(vm, move(string));
}
JS_DEFINE_NATIVE_FUNCTION(DatePrototype::to_string)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
auto string = this_object->string();
- return js_string(interpreter, move(string));
+ return js_string(vm, move(string));
}
}
diff --git a/Libraries/LibJS/Runtime/ErrorConstructor.cpp b/Libraries/LibJS/Runtime/ErrorConstructor.cpp
index 93915f0f58..939e1294e9 100644
--- a/Libraries/LibJS/Runtime/ErrorConstructor.cpp
+++ b/Libraries/LibJS/Runtime/ErrorConstructor.cpp
@@ -56,38 +56,38 @@ Value ErrorConstructor::construct(Interpreter& interpreter, Function&)
{
String message = "";
if (!interpreter.call_frame().arguments.is_empty() && !interpreter.call_frame().arguments[0].is_undefined()) {
- message = interpreter.call_frame().arguments[0].to_string(interpreter);
+ message = interpreter.call_frame().arguments[0].to_string(global_object());
if (interpreter.exception())
return {};
}
return Error::create(global_object(), "Error", message);
}
-#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
- ConstructorName::ConstructorName(GlobalObject& global_object) \
- : NativeFunction(*global_object.function_prototype()) \
- { \
- } \
- void ConstructorName::initialize(GlobalObject& global_object) \
- { \
- NativeFunction::initialize(global_object); \
- define_property("prototype", global_object.snake_name##_prototype(), 0); \
- define_property("length", Value(1), Attribute::Configurable); \
- } \
- ConstructorName::~ConstructorName() { } \
- Value ConstructorName::call() \
- { \
- return construct(interpreter(), *this); \
- } \
- Value ConstructorName::construct(Interpreter& interpreter, Function&) \
- { \
- String message = ""; \
- if (!interpreter.call_frame().arguments.is_empty() && !interpreter.call_frame().arguments[0].is_undefined()) { \
- message = interpreter.call_frame().arguments[0].to_string(interpreter); \
- if (interpreter.exception()) \
- return {}; \
- } \
- return ClassName::create(global_object(), message); \
+#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
+ ConstructorName::ConstructorName(GlobalObject& global_object) \
+ : NativeFunction(*global_object.function_prototype()) \
+ { \
+ } \
+ void ConstructorName::initialize(GlobalObject& global_object) \
+ { \
+ NativeFunction::initialize(global_object); \
+ define_property("prototype", global_object.snake_name##_prototype(), 0); \
+ define_property("length", Value(1), Attribute::Configurable); \
+ } \
+ ConstructorName::~ConstructorName() { } \
+ Value ConstructorName::call() \
+ { \
+ return construct(interpreter(), *this); \
+ } \
+ Value ConstructorName::construct(Interpreter&, Function&) \
+ { \
+ String message = ""; \
+ if (!vm().call_frame().arguments.is_empty() && !vm().call_frame().arguments[0].is_undefined()) { \
+ message = vm().call_frame().arguments[0].to_string(global_object()); \
+ if (vm().exception()) \
+ return {}; \
+ } \
+ return ClassName::create(global_object(), message); \
}
JS_ENUMERATE_ERROR_SUBCLASSES
diff --git a/Libraries/LibJS/Runtime/ErrorConstructor.h b/Libraries/LibJS/Runtime/ErrorConstructor.h
index 169d9d1aea..40a413a63a 100644
--- a/Libraries/LibJS/Runtime/ErrorConstructor.h
+++ b/Libraries/LibJS/Runtime/ErrorConstructor.h
@@ -54,7 +54,7 @@ private:
explicit ConstructorName(GlobalObject&); \
virtual void initialize(GlobalObject&) override; \
virtual ~ConstructorName() override; \
- virtual Value call() override; \
+ virtual Value call() override; \
virtual Value construct(Interpreter&, Function& new_target) override; \
\
private: \
diff --git a/Libraries/LibJS/Runtime/ErrorPrototype.cpp b/Libraries/LibJS/Runtime/ErrorPrototype.cpp
index baf213f224..c28eaa0094 100644
--- a/Libraries/LibJS/Runtime/ErrorPrototype.cpp
+++ b/Libraries/LibJS/Runtime/ErrorPrototype.cpp
@@ -55,76 +55,76 @@ ErrorPrototype::~ErrorPrototype()
JS_DEFINE_NATIVE_GETTER(ErrorPrototype::name_getter)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->is_error()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAn, "Error");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAn, "Error");
return {};
}
- return js_string(interpreter, static_cast<const Error*>(this_object)->name());
+ return js_string(vm, static_cast<const Error*>(this_object)->name());
}
JS_DEFINE_NATIVE_SETTER(ErrorPrototype::name_setter)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return;
if (!this_object->is_error()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAn, "Error");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAn, "Error");
return;
}
- auto name = value.to_string(interpreter);
- if (interpreter.exception())
+ auto name = value.to_string(global_object);
+ if (vm.exception())
return;
static_cast<Error*>(this_object)->set_name(name);
}
JS_DEFINE_NATIVE_GETTER(ErrorPrototype::message_getter)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->is_error()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAn, "Error");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAn, "Error");
return {};
}
- return js_string(interpreter, static_cast<const Error*>(this_object)->message());
+ return js_string(vm, static_cast<const Error*>(this_object)->message());
}
JS_DEFINE_NATIVE_FUNCTION(ErrorPrototype::to_string)
{
- if (!interpreter.this_value(global_object).is_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAnObject, interpreter.this_value(global_object).to_string_without_side_effects().characters());
+ if (!vm.this_value(global_object).is_object()) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAnObject, vm.this_value(global_object).to_string_without_side_effects().characters());
return {};
}
- auto& this_object = interpreter.this_value(global_object).as_object();
+ auto& this_object = vm.this_value(global_object).as_object();
String name = "Error";
auto name_property = this_object.get("name");
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (!name_property.is_empty() && !name_property.is_undefined()) {
- name = name_property.to_string(interpreter);
- if (interpreter.exception())
+ name = name_property.to_string(global_object);
+ if (vm.exception())
return {};
}
String message = "";
auto message_property = this_object.get("message");
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (!message_property.is_empty() && !message_property.is_undefined()) {
- message = message_property.to_string(interpreter);
- if (interpreter.exception())
+ message = message_property.to_string(global_object);
+ if (vm.exception())
return {};
}
if (name.length() == 0)
- return js_string(interpreter, message);
+ return js_string(vm, message);
if (message.length() == 0)
- return js_string(interpreter, name);
- return js_string(interpreter, String::format("%s: %s", name.characters(), message.characters()));
+ return js_string(vm, name);
+ return js_string(vm, String::format("%s: %s", name.characters(), message.characters()));
}
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName) \
diff --git a/Libraries/LibJS/Runtime/Function.cpp b/Libraries/LibJS/Runtime/Function.cpp
index 1f8266b3c1..86851e1603 100644
--- a/Libraries/LibJS/Runtime/Function.cpp
+++ b/Libraries/LibJS/Runtime/Function.cpp
@@ -61,7 +61,7 @@ BoundFunction* Function::bind(Value bound_this_value, Vector<Value> arguments)
return bound_this_value;
return &global_object();
default:
- return bound_this_value.to_object(interpreter(), global_object());
+ return bound_this_value.to_object(global_object());
}
}();
diff --git a/Libraries/LibJS/Runtime/FunctionConstructor.cpp b/Libraries/LibJS/Runtime/FunctionConstructor.cpp
index 4e3397e30c..6ae2923308 100644
--- a/Libraries/LibJS/Runtime/FunctionConstructor.cpp
+++ b/Libraries/LibJS/Runtime/FunctionConstructor.cpp
@@ -58,25 +58,26 @@ Value FunctionConstructor::call()
Value FunctionConstructor::construct(Interpreter& interpreter, Function&)
{
+ auto& vm = this->vm();
String parameters_source = "";
String body_source = "";
- if (interpreter.argument_count() == 1) {
- body_source = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() == 1) {
+ body_source = vm.argument(0).to_string(global_object());
+ if (vm.exception())
return {};
}
- if (interpreter.argument_count() > 1) {
+ if (vm.argument_count() > 1) {
Vector<String> parameters;
- for (size_t i = 0; i < interpreter.argument_count() - 1; ++i) {
- parameters.append(interpreter.argument(i).to_string(interpreter));
- if (interpreter.exception())
+ for (size_t i = 0; i < vm.argument_count() - 1; ++i) {
+ parameters.append(vm.argument(i).to_string(global_object()));
+ if (vm.exception())
return {};
}
StringBuilder parameters_builder;
parameters_builder.join(',', parameters);
parameters_source = parameters_builder.build();
- body_source = interpreter.argument(interpreter.argument_count() - 1).to_string(interpreter);
- if (interpreter.exception())
+ body_source = vm.argument(vm.argument_count() - 1).to_string(global_object());
+ if (vm.exception())
return {};
}
auto source = String::format("function anonymous(%s) { %s }", parameters_source.characters(), body_source.characters());
@@ -84,7 +85,7 @@ Value FunctionConstructor::construct(Interpreter& interpreter, Function&)
auto function_expression = parser.parse_function_node<FunctionExpression>();
if (parser.has_errors()) {
auto error = parser.errors()[0];
- interpreter.vm().throw_exception<SyntaxError>(global_object(), error.to_string());
+ vm.throw_exception<SyntaxError>(global_object(), error.to_string());
return {};
}
return function_expression->execute(interpreter, global_object());
diff --git a/Libraries/LibJS/Runtime/FunctionPrototype.cpp b/Libraries/LibJS/Runtime/FunctionPrototype.cpp
index dc3d5f5489..625acd06ec 100644
--- a/Libraries/LibJS/Runtime/FunctionPrototype.cpp
+++ b/Libraries/LibJS/Runtime/FunctionPrototype.cpp
@@ -62,53 +62,53 @@ FunctionPrototype::~FunctionPrototype()
JS_DEFINE_NATIVE_FUNCTION(FunctionPrototype::apply)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->is_function()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
return {};
}
auto& function = static_cast<Function&>(*this_object);
- auto this_arg = interpreter.argument(0);
- auto arg_array = interpreter.argument(1);
+ auto this_arg = vm.argument(0);
+ auto arg_array = vm.argument(1);
if (arg_array.is_null() || arg_array.is_undefined())
- return interpreter.call(function, this_arg);
+ return vm.call(function, this_arg);
if (!arg_array.is_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::FunctionArgsNotObject);
+ vm.throw_exception<TypeError>(global_object, ErrorType::FunctionArgsNotObject);
return {};
}
auto length_property = arg_array.as_object().get("length");
- if (interpreter.exception())
+ if (vm.exception())
return {};
- auto length = length_property.to_size_t(interpreter);
- if (interpreter.exception())
+ auto length = length_property.to_size_t(global_object);
+ if (vm.exception())
return {};
- MarkedValueList arguments(interpreter.heap());
+ MarkedValueList arguments(vm.heap());
for (size_t i = 0; i < length; ++i) {
auto element = arg_array.as_object().get(i);
- if (interpreter.exception())
+ if (vm.exception())
return {};
arguments.append(element.value_or(js_undefined()));
}
- return interpreter.call(function, this_arg, move(arguments));
+ return vm.call(function, this_arg, move(arguments));
}
JS_DEFINE_NATIVE_FUNCTION(FunctionPrototype::bind)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->is_function()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
return {};
}
auto& this_function = static_cast<Function&>(*this_object);
- auto bound_this_arg = interpreter.argument(0);
+ auto bound_this_arg = vm.argument(0);
Vector<Value> arguments;
- if (interpreter.argument_count() > 1) {
- arguments = interpreter.call_frame().arguments;
+ if (vm.argument_count() > 1) {
+ arguments = vm.call_frame().arguments;
arguments.remove(0);
}
@@ -117,30 +117,30 @@ JS_DEFINE_NATIVE_FUNCTION(FunctionPrototype::bind)
JS_DEFINE_NATIVE_FUNCTION(FunctionPrototype::call)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->is_function()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
return {};
}
auto& function = static_cast<Function&>(*this_object);
- auto this_arg = interpreter.argument(0);
- MarkedValueList arguments(interpreter.heap());
- if (interpreter.argument_count() > 1) {
- for (size_t i = 1; i < interpreter.argument_count(); ++i)
- arguments.append(interpreter.argument(i));
+ auto this_arg = vm.argument(0);
+ MarkedValueList arguments(vm.heap());
+ if (vm.argument_count() > 1) {
+ for (size_t i = 1; i < vm.argument_count(); ++i)
+ arguments.append(vm.argument(i));
}
- return interpreter.call(function, this_arg, move(arguments));
+ return vm.call(function, this_arg, move(arguments));
}
JS_DEFINE_NATIVE_FUNCTION(FunctionPrototype::to_string)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->is_function()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
return {};
}
String function_name = static_cast<Function*>(this_object)->name();
@@ -173,19 +173,19 @@ JS_DEFINE_NATIVE_FUNCTION(FunctionPrototype::to_string)
function_name.is_null() ? "" : function_name.characters(),
function_parameters.characters(),
function_body.characters());
- return js_string(interpreter, function_source);
+ return js_string(vm, function_source);
}
JS_DEFINE_NATIVE_FUNCTION(FunctionPrototype::symbol_has_instance)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (!this_object->is_function()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Function");
return {};
}
- return ordinary_has_instance(interpreter, interpreter.argument(0), this_object);
+ return ordinary_has_instance(global_object, vm.argument(0), this_object);
}
}
diff --git a/Libraries/LibJS/Runtime/GlobalObject.cpp b/Libraries/LibJS/Runtime/GlobalObject.cpp
index da2024b4a5..38d96ba86e 100644
--- a/Libraries/LibJS/Runtime/GlobalObject.cpp
+++ b/Libraries/LibJS/Runtime/GlobalObject.cpp
@@ -153,36 +153,36 @@ void GlobalObject::visit_children(Visitor& visitor)
JS_DEFINE_NATIVE_FUNCTION(GlobalObject::gc)
{
dbg() << "Forced garbage collection requested!";
- interpreter.heap().collect_garbage();
+ vm.heap().collect_garbage();
return js_undefined();
}
JS_DEFINE_NATIVE_FUNCTION(GlobalObject::is_nan)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
return Value(number.is_nan());
}
JS_DEFINE_NATIVE_FUNCTION(GlobalObject::is_finite)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
return Value(number.is_finite_number());
}
JS_DEFINE_NATIVE_FUNCTION(GlobalObject::parse_float)
{
- if (interpreter.argument(0).is_number())
- return interpreter.argument(0);
- auto string = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ if (vm.argument(0).is_number())
+ return vm.argument(0);
+ auto string = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
for (size_t length = string.length(); length > 0; --length) {
// This can't throw, so no exception check is fine.
- auto number = Value(js_string(interpreter, string.substring(0, length))).to_number(interpreter);
+ auto number = Value(js_string(vm, string.substring(0, length))).to_number(global_object);
if (!number.is_nan())
return number;
}
diff --git a/Libraries/LibJS/Runtime/IteratorOperations.cpp b/Libraries/LibJS/Runtime/IteratorOperations.cpp
index c662521add..91bc9db5a1 100644
--- a/Libraries/LibJS/Runtime/IteratorOperations.cpp
+++ b/Libraries/LibJS/Runtime/IteratorOperations.cpp
@@ -38,7 +38,7 @@ Object* get_iterator(GlobalObject& global_object, Value value, String hint, Valu
if (method.is_empty()) {
if (hint == "async")
TODO();
- auto object = value.to_object(interpreter, global_object);
+ auto object = value.to_object(global_object);
if (!object)
return {};
method = object->get(global_object.vm().well_known_symbol_iterator());
diff --git a/Libraries/LibJS/Runtime/IteratorPrototype.cpp b/Libraries/LibJS/Runtime/IteratorPrototype.cpp
index 56e275aece..a40d022fa8 100644
--- a/Libraries/LibJS/Runtime/IteratorPrototype.cpp
+++ b/Libraries/LibJS/Runtime/IteratorPrototype.cpp
@@ -46,7 +46,7 @@ IteratorPrototype::~IteratorPrototype()
JS_DEFINE_NATIVE_FUNCTION(IteratorPrototype::symbol_iterator)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
return this_object;
diff --git a/Libraries/LibJS/Runtime/JSONObject.cpp b/Libraries/LibJS/Runtime/JSONObject.cpp
index 38120be3eb..7043a07dc3 100644
--- a/Libraries/LibJS/Runtime/JSONObject.cpp
+++ b/Libraries/LibJS/Runtime/JSONObject.cpp
@@ -76,13 +76,13 @@ String JSONObject::stringify_impl(Interpreter& interpreter, GlobalObject& global
return {};
String item;
if (replacer_value.is_string() || replacer_value.is_number()) {
- item = replacer_value.to_string(interpreter);
+ item = replacer_value.to_string(global_object);
if (interpreter.exception())
return {};
} else if (replacer_value.is_object()) {
auto& value_object = replacer_value.as_object();
if (value_object.is_string_object() || value_object.is_number_object()) {
- item = value_object.value_of().to_string(interpreter);
+ item = value_object.value_of().to_string(global_object);
if (interpreter.exception())
return {};
}
@@ -133,22 +133,23 @@ String JSONObject::stringify_impl(Interpreter& interpreter, GlobalObject& global
JS_DEFINE_NATIVE_FUNCTION(JSONObject::stringify)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return js_undefined();
- auto value = interpreter.argument(0);
- auto replacer = interpreter.argument(1);
- auto space = interpreter.argument(2);
+ auto value = vm.argument(0);
+ auto replacer = vm.argument(1);
+ auto space = vm.argument(2);
- auto string = stringify_impl(interpreter, global_object, value, replacer, space);
+ auto string = stringify_impl(vm.interpreter(), global_object, value, replacer, space);
if (string.is_null())
return js_undefined();
- return js_string(interpreter, string);
+ return js_string(vm, string);
}
String JSONObject::serialize_json_property(Interpreter& interpreter, StringifyState& state, const PropertyName& key, Object* holder)
{
+ auto& global_object = interpreter.global_object();
auto value = holder->get(key);
if (interpreter.exception())
return {};
@@ -183,7 +184,7 @@ String JSONObject::serialize_json_property(Interpreter& interpreter, StringifySt
return quote_json_string(value.as_string().string());
if (value.is_number()) {
if (value.is_finite_number())
- return value.to_string(interpreter);
+ return value.to_string(global_object);
return "null";
}
if (value.is_object() && !value.is_function()) {
@@ -192,7 +193,7 @@ String JSONObject::serialize_json_property(Interpreter& interpreter, StringifySt
return serialize_json_object(interpreter, state, value.as_object());
}
if (value.is_bigint())
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::JsonBigInt);
+ interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::JsonBigInt);
return {};
}
@@ -385,25 +386,25 @@ String JSONObject::quote_json_string(String string)
JS_DEFINE_NATIVE_FUNCTION(JSONObject::parse)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return js_undefined();
- auto string = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto string = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
- auto reviver = interpreter.argument(1);
+ auto reviver = vm.argument(1);
auto json = JsonValue::from_string(string);
if (!json.has_value()) {
- interpreter.vm().throw_exception<SyntaxError>(global_object, ErrorType::JsonMalformed);
+ vm.throw_exception<SyntaxError>(global_object, ErrorType::JsonMalformed);
return {};
}
- Value result = parse_json_value(interpreter, global_object, json.value());
+ Value result = parse_json_value(vm.interpreter(), global_object, json.value());
if (reviver.is_function()) {
auto* holder_object = Object::create_empty(global_object);
holder_object->define_property(String::empty(), result);
- if (interpreter.exception())
+ if (vm.exception())
return {};
- return internalize_json_property(interpreter, holder_object, String::empty(), reviver.as_function());
+ return internalize_json_property(vm.interpreter(), holder_object, String::empty(), reviver.as_function());
}
return result;
}
diff --git a/Libraries/LibJS/Runtime/MathObject.cpp b/Libraries/LibJS/Runtime/MathObject.cpp
index afc9f1ea6f..27b32fbe31 100644
--- a/Libraries/LibJS/Runtime/MathObject.cpp
+++ b/Libraries/LibJS/Runtime/MathObject.cpp
@@ -84,15 +84,15 @@ MathObject::~MathObject()
JS_DEFINE_NATIVE_FUNCTION(MathObject::abs)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
return Value(number.as_double() >= 0 ? number.as_double() : -number.as_double());
}
-Value MathObject::random(Interpreter&, GlobalObject&)
+JS_DEFINE_NATIVE_FUNCTION(MathObject::random)
{
#ifdef __serenity__
double r = (double)arc4random() / (double)UINT32_MAX;
@@ -104,8 +104,8 @@ Value MathObject::random(Interpreter&, GlobalObject&)
JS_DEFINE_NATIVE_FUNCTION(MathObject::sqrt)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -114,8 +114,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::sqrt)
JS_DEFINE_NATIVE_FUNCTION(MathObject::floor)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -124,8 +124,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::floor)
JS_DEFINE_NATIVE_FUNCTION(MathObject::ceil)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -137,8 +137,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::ceil)
JS_DEFINE_NATIVE_FUNCTION(MathObject::round)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -147,15 +147,15 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::round)
JS_DEFINE_NATIVE_FUNCTION(MathObject::max)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return js_negative_infinity();
- auto max = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto max = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
- for (size_t i = 1; i < interpreter.argument_count(); ++i) {
- auto cur = interpreter.argument(i).to_number(interpreter);
- if (interpreter.exception())
+ for (size_t i = 1; i < vm.argument_count(); ++i) {
+ auto cur = vm.argument(i).to_number(global_object);
+ if (vm.exception())
return {};
max = Value(cur.as_double() > max.as_double() ? cur : max);
}
@@ -164,15 +164,15 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::max)
JS_DEFINE_NATIVE_FUNCTION(MathObject::min)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return js_infinity();
- auto min = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto min = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
- for (size_t i = 1; i < interpreter.argument_count(); ++i) {
- auto cur = interpreter.argument(i).to_number(interpreter);
- if (interpreter.exception())
+ for (size_t i = 1; i < vm.argument_count(); ++i) {
+ auto cur = vm.argument(i).to_number(global_object);
+ if (vm.exception())
return {};
min = Value(cur.as_double() < min.as_double() ? cur : min);
}
@@ -181,20 +181,20 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::min)
JS_DEFINE_NATIVE_FUNCTION(MathObject::trunc)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
if (number.as_double() < 0)
- return MathObject::ceil(interpreter, global_object);
- return MathObject::floor(interpreter, global_object);
+ return MathObject::ceil(vm, global_object);
+ return MathObject::floor(vm, global_object);
}
JS_DEFINE_NATIVE_FUNCTION(MathObject::sin)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -203,8 +203,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::sin)
JS_DEFINE_NATIVE_FUNCTION(MathObject::cos)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -213,8 +213,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::cos)
JS_DEFINE_NATIVE_FUNCTION(MathObject::tan)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -223,13 +223,13 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::tan)
JS_DEFINE_NATIVE_FUNCTION(MathObject::pow)
{
- return JS::exp(interpreter, interpreter.argument(0), interpreter.argument(1));
+ return JS::exp(global_object, vm.argument(0), vm.argument(1));
}
JS_DEFINE_NATIVE_FUNCTION(MathObject::exp)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -238,8 +238,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::exp)
JS_DEFINE_NATIVE_FUNCTION(MathObject::expm1)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_nan())
return js_nan();
@@ -248,8 +248,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::expm1)
JS_DEFINE_NATIVE_FUNCTION(MathObject::sign)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.is_positive_zero())
return Value(0);
@@ -264,8 +264,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::sign)
JS_DEFINE_NATIVE_FUNCTION(MathObject::clz32)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (!number.is_finite_number() || (unsigned)number.as_double() == 0)
return Value(32);
@@ -274,8 +274,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::clz32)
JS_DEFINE_NATIVE_FUNCTION(MathObject::acosh)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.as_double() < 1)
return JS::js_nan();
@@ -284,16 +284,16 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::acosh)
JS_DEFINE_NATIVE_FUNCTION(MathObject::asinh)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
return Value(::asinh(number.as_double()));
}
JS_DEFINE_NATIVE_FUNCTION(MathObject::atanh)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.as_double() > 1 || number.as_double() < -1)
return JS::js_nan();
@@ -302,8 +302,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::atanh)
JS_DEFINE_NATIVE_FUNCTION(MathObject::log1p)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (number.as_double() < -1)
return JS::js_nan();
@@ -312,8 +312,8 @@ JS_DEFINE_NATIVE_FUNCTION(MathObject::log1p)
JS_DEFINE_NATIVE_FUNCTION(MathObject::cbrt)
{
- auto number = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ auto number = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
return Value(::cbrt(number.as_double()));
}
diff --git a/Libraries/LibJS/Runtime/NativeFunction.cpp b/Libraries/LibJS/Runtime/NativeFunction.cpp
index 6703f90e02..3785b4865b 100644
--- a/Libraries/LibJS/Runtime/NativeFunction.cpp
+++ b/Libraries/LibJS/Runtime/NativeFunction.cpp
@@ -31,7 +31,7 @@
namespace JS {
-NativeFunction* NativeFunction::create(GlobalObject& global_object, const FlyString& name, AK::Function<Value(Interpreter&, GlobalObject&)> function)
+NativeFunction* NativeFunction::create(GlobalObject& global_object, const FlyString& name, AK::Function<Value(VM&, GlobalObject&)> function)
{
return global_object.heap().allocate<NativeFunction>(global_object, name, move(function), *global_object.function_prototype());
}
@@ -41,7 +41,7 @@ NativeFunction::NativeFunction(Object& prototype)
{
}
-NativeFunction::NativeFunction(const FlyString& name, AK::Function<Value(Interpreter&, GlobalObject&)> native_function, Object& prototype)
+NativeFunction::NativeFunction(const FlyString& name, AK::Function<Value(VM&, GlobalObject&)> native_function, Object& prototype)
: Function(prototype)
, m_name(name)
, m_native_function(move(native_function))
@@ -60,7 +60,7 @@ NativeFunction::~NativeFunction()
Value NativeFunction::call()
{
- return m_native_function(interpreter(), global_object());
+ return m_native_function(vm(), global_object());
}
Value NativeFunction::construct(Interpreter&, Function&)
diff --git a/Libraries/LibJS/Runtime/NativeFunction.h b/Libraries/LibJS/Runtime/NativeFunction.h
index 32b6a74855..6e2d818901 100644
--- a/Libraries/LibJS/Runtime/NativeFunction.h
+++ b/Libraries/LibJS/Runtime/NativeFunction.h
@@ -35,9 +35,9 @@ class NativeFunction : public Function {
JS_OBJECT(NativeFunction, Function);
public:
- static NativeFunction* create(GlobalObject&, const FlyString& name, AK::Function<Value(Interpreter&, GlobalObject&)>);
+ static NativeFunction* create(GlobalObject&, const FlyString& name, AK::Function<Value(VM&, GlobalObject&)>);
- explicit NativeFunction(const FlyString& name, AK::Function<Value(Interpreter&, GlobalObject&)>, Object& prototype);
+ explicit NativeFunction(const FlyString& name, AK::Function<Value(VM&, GlobalObject&)>, Object& prototype);
virtual void initialize(GlobalObject&) override { }
virtual ~NativeFunction() override;
@@ -56,7 +56,7 @@ private:
virtual LexicalEnvironment* create_environment() override final;
FlyString m_name;
- AK::Function<Value(Interpreter&, GlobalObject&)> m_native_function;
+ AK::Function<Value(VM&, GlobalObject&)> m_native_function;
};
}
diff --git a/Libraries/LibJS/Runtime/NativeProperty.cpp b/Libraries/LibJS/Runtime/NativeProperty.cpp
index 86a19d6579..d52e7995fa 100644
--- a/Libraries/LibJS/Runtime/NativeProperty.cpp
+++ b/Libraries/LibJS/Runtime/NativeProperty.cpp
@@ -29,7 +29,7 @@
namespace JS {
-NativeProperty::NativeProperty(AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter)
+NativeProperty::NativeProperty(AK::Function<Value(VM&, GlobalObject&)> getter, AK::Function<void(VM&, GlobalObject&, Value)> setter)
: m_getter(move(getter))
, m_setter(move(setter))
{
@@ -39,18 +39,18 @@ NativeProperty::~NativeProperty()
{
}
-Value NativeProperty::get(Interpreter& interpreter, GlobalObject& global_object) const
+Value NativeProperty::get(VM& vm, GlobalObject& global_object) const
{
if (!m_getter)
return js_undefined();
- return m_getter(interpreter, global_object);
+ return m_getter(vm, global_object);
}
-void NativeProperty::set(Interpreter& interpreter, GlobalObject& global_object, Value value)
+void NativeProperty::set(VM& vm, GlobalObject& global_object, Value value)
{
if (!m_setter)
return;
- m_setter(interpreter, global_object, move(value));
+ m_setter(vm, global_object, move(value));
}
}
diff --git a/Libraries/LibJS/Runtime/NativeProperty.h b/Libraries/LibJS/Runtime/NativeProperty.h
index b3474bfe67..e0bb4140b7 100644
--- a/Libraries/LibJS/Runtime/NativeProperty.h
+++ b/Libraries/LibJS/Runtime/NativeProperty.h
@@ -33,17 +33,17 @@ namespace JS {
class NativeProperty final : public Cell {
public:
- NativeProperty(AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter);
+ NativeProperty(AK::Function<Value(VM&, GlobalObject&)> getter, AK::Function<void(VM&, GlobalObject&, Value)> setter);
virtual ~NativeProperty() override;
- Value get(Interpreter&, GlobalObject&) const;
- void set(Interpreter&, GlobalObject&, Value);
+ Value get(VM&, GlobalObject&) const;
+ void set(VM&, GlobalObject&, Value);
private:
virtual const char* class_name() const override { return "NativeProperty"; }
- AK::Function<Value(Interpreter&, GlobalObject&)> m_getter;
- AK::Function<void(Interpreter&, GlobalObject&, Value)> m_setter;
+ AK::Function<Value(VM&, GlobalObject&)> m_getter;
+ AK::Function<void(VM&, GlobalObject&, Value)> m_setter;
};
}
diff --git a/Libraries/LibJS/Runtime/NumberConstructor.cpp b/Libraries/LibJS/Runtime/NumberConstructor.cpp
index dcd9187c37..1770472081 100644
--- a/Libraries/LibJS/Runtime/NumberConstructor.cpp
+++ b/Libraries/LibJS/Runtime/NumberConstructor.cpp
@@ -69,15 +69,15 @@ Value NumberConstructor::call()
{
if (!vm().argument_count())
return Value(0);
- return vm().argument(0).to_number(interpreter());
+ return vm().argument(0).to_number(global_object());
}
-Value NumberConstructor::construct(Interpreter& interpreter, Function&)
+Value NumberConstructor::construct(Interpreter&, Function&)
{
double number = 0;
- if (interpreter.argument_count()) {
- number = interpreter.argument(0).to_double(interpreter);
- if (interpreter.exception())
+ if (vm().argument_count()) {
+ number = vm().argument(0).to_double(global_object());
+ if (vm().exception())
return {};
}
return NumberObject::create(global_object(), number);
@@ -85,24 +85,24 @@ Value NumberConstructor::construct(Interpreter& interpreter, Function&)
JS_DEFINE_NATIVE_FUNCTION(NumberConstructor::is_finite)
{
- return Value(interpreter.argument(0).is_finite_number());
+ return Value(vm.argument(0).is_finite_number());
}
JS_DEFINE_NATIVE_FUNCTION(NumberConstructor::is_integer)
{
- return Value(interpreter.argument(0).is_integer());
+ return Value(vm.argument(0).is_integer());
}
JS_DEFINE_NATIVE_FUNCTION(NumberConstructor::is_nan)
{
- return Value(interpreter.argument(0).is_nan());
+ return Value(vm.argument(0).is_nan());
}
JS_DEFINE_NATIVE_FUNCTION(NumberConstructor::is_safe_integer)
{
- if (!interpreter.argument(0).is_number())
+ if (!vm.argument(0).is_number())
return Value(false);
- auto value = interpreter.argument(0).as_double();
+ auto value = vm.argument(0).as_double();
return Value((int64_t)value == value && value >= MIN_SAFE_INTEGER && value <= MAX_SAFE_INTEGER);
}
diff --git a/Libraries/LibJS/Runtime/NumberPrototype.cpp b/Libraries/LibJS/Runtime/NumberPrototype.cpp
index dad115c058..2b8c25ee61 100644
--- a/Libraries/LibJS/Runtime/NumberPrototype.cpp
+++ b/Libraries/LibJS/Runtime/NumberPrototype.cpp
@@ -63,37 +63,37 @@ JS_DEFINE_NATIVE_FUNCTION(NumberPrototype::to_string)
{
Value number_value;
- auto this_value = interpreter.this_value(global_object);
+ auto this_value = vm.this_value(global_object);
if (this_value.is_number()) {
number_value = this_value;
} else if (this_value.is_object() && this_value.as_object().is_number_object()) {
number_value = static_cast<NumberObject&>(this_value.as_object()).value_of();
} else {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NumberIncompatibleThis, "toString");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NumberIncompatibleThis, "toString");
return {};
}
int radix;
- auto argument = interpreter.argument(0);
+ auto argument = vm.argument(0);
if (argument.is_undefined()) {
radix = 10;
} else {
- radix = argument.to_i32(interpreter);
+ radix = argument.to_i32(global_object);
}
- if (interpreter.exception() || radix < 2 || radix > 36) {
- interpreter.vm().throw_exception<RangeError>(global_object, ErrorType::InvalidRadix);
+ if (vm.exception() || radix < 2 || radix > 36) {
+ vm.throw_exception<RangeError>(global_object, ErrorType::InvalidRadix);
return {};
}
if (number_value.is_positive_infinity())
- return js_string(interpreter, "Infinity");
+ return js_string(vm, "Infinity");
if (number_value.is_negative_infinity())
- return js_string(interpreter, "-Infinity");
+ return js_string(vm, "-Infinity");
if (number_value.is_nan())
- return js_string(interpreter, "NaN");
+ return js_string(vm, "NaN");
if (number_value.is_positive_zero() || number_value.is_negative_zero())
- return js_string(interpreter, "0");
+ return js_string(vm, "0");
double number = number_value.as_double();
bool negative = number < 0;
@@ -140,7 +140,7 @@ JS_DEFINE_NATIVE_FUNCTION(NumberPrototype::to_string)
characters.take_last();
}
- return js_string(interpreter, String(characters.data(), characters.size()));
+ return js_string(vm, String(characters.data(), characters.size()));
}
}
diff --git a/Libraries/LibJS/Runtime/Object.cpp b/Libraries/LibJS/Runtime/Object.cpp
index e90a1acb33..0e1f02babd 100644
--- a/Libraries/LibJS/Runtime/Object.cpp
+++ b/Libraries/LibJS/Runtime/Object.cpp
@@ -742,7 +742,7 @@ bool Object::put(const PropertyName& property_name, Value value, Value receiver)
return put_own_property(*this, string_or_symbol, value, default_attributes, PutOwnPropertyMode::Put);
}
-bool Object::define_native_function(const StringOrSymbol& property_name, AK::Function<Value(Interpreter&, GlobalObject&)> native_function, i32 length, PropertyAttributes attribute)
+bool Object::define_native_function(const StringOrSymbol& property_name, AK::Function<Value(VM&, GlobalObject&)> native_function, i32 length, PropertyAttributes attribute)
{
String function_name;
if (property_name.is_string()) {
@@ -760,7 +760,7 @@ bool Object::define_native_function(const StringOrSymbol& property_name, AK::Fun
return define_property(property_name, function, attribute);
}
-bool Object::define_native_property(const StringOrSymbol& property_name, AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter, PropertyAttributes attribute)
+bool Object::define_native_property(const StringOrSymbol& property_name, AK::Function<Value(VM&, GlobalObject&)> getter, AK::Function<void(VM&, GlobalObject&, Value)> setter, PropertyAttributes attribute)
{
return define_property(property_name, heap().allocate_without_global_object<NativeProperty>(move(getter), move(setter)), attribute);
}
@@ -846,7 +846,7 @@ Value Object::to_string() const
interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::Convert, "object", "string");
if (interpreter.exception())
return {};
- auto* string = to_string_result.to_primitive_string(interpreter);
+ auto* string = to_string_result.to_primitive_string(global_object());
if (interpreter.exception())
return {};
return string;
@@ -872,7 +872,7 @@ Value Object::call_native_property_getter(Object* this_object, Value property) c
ASSERT(property.is_native_property());
auto& call_frame = vm().push_call_frame();
call_frame.this_value = this_object;
- auto result = property.as_native_property().get(interpreter(), global_object());
+ auto result = property.as_native_property().get(vm(), global_object());
vm().pop_call_frame();
return result;
}
@@ -882,7 +882,7 @@ void Object::call_native_property_setter(Object* this_object, Value property, Va
ASSERT(property.is_native_property());
auto& call_frame = vm().push_call_frame();
call_frame.this_value = this_object;
- property.as_native_property().set(interpreter(), global_object(), value);
+ property.as_native_property().set(vm(), global_object(), value);
vm().pop_call_frame();
}
diff --git a/Libraries/LibJS/Runtime/Object.h b/Libraries/LibJS/Runtime/Object.h
index 85fa50acc5..e8e4b78301 100644
--- a/Libraries/LibJS/Runtime/Object.h
+++ b/Libraries/LibJS/Runtime/Object.h
@@ -105,8 +105,8 @@ public:
bool define_property(const PropertyName&, Value value, PropertyAttributes attributes = default_attributes, bool throw_exceptions = true);
bool define_accessor(const PropertyName&, Function& getter_or_setter, bool is_getter, PropertyAttributes attributes = default_attributes, bool throw_exceptions = true);
- bool define_native_function(const StringOrSymbol& property_name, AK::Function<Value(Interpreter&, GlobalObject&)>, i32 length = 0, PropertyAttributes attributes = default_attributes);
- bool define_native_property(const StringOrSymbol& property_name, AK::Function<Value(Interpreter&, GlobalObject&)> getter, AK::Function<void(Interpreter&, GlobalObject&, Value)> setter, PropertyAttributes attributes = default_attributes);
+ bool define_native_function(const StringOrSymbol& property_name, AK::Function<Value(VM&, GlobalObject&)>, i32 length = 0, PropertyAttributes attributes = default_attributes);
+ bool define_native_property(const StringOrSymbol& property_name, AK::Function<Value(VM&, GlobalObject&)> getter, AK::Function<void(VM&, GlobalObject&, Value)> setter, PropertyAttributes attributes = default_attributes);
virtual Value delete_property(const PropertyName&);
diff --git a/Libraries/LibJS/Runtime/ObjectConstructor.cpp b/Libraries/LibJS/Runtime/ObjectConstructor.cpp
index 9352640920..c97b8bfbbb 100644
--- a/Libraries/LibJS/Runtime/ObjectConstructor.cpp
+++ b/Libraries/LibJS/Runtime/ObjectConstructor.cpp
@@ -76,18 +76,18 @@ Value ObjectConstructor::construct(Interpreter&, Function&)
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::get_own_property_names)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return {};
- auto* object = interpreter.argument(0).to_object(interpreter, global_object);
- if (interpreter.exception())
+ auto* object = vm.argument(0).to_object(global_object);
+ if (vm.exception())
return {};
auto* result = Array::create(global_object);
for (auto& entry : object->indexed_properties())
- result->indexed_properties().append(js_string(interpreter, String::number(entry.index())));
+ result->indexed_properties().append(js_string(vm, String::number(entry.index())));
for (auto& it : object->shape().property_table_ordered()) {
if (!it.key.is_string())
continue;
- result->indexed_properties().append(js_string(interpreter, it.key.as_string()));
+ result->indexed_properties().append(js_string(vm, it.key.as_string()));
}
return result;
@@ -95,36 +95,36 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::get_own_property_names)
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::get_prototype_of)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return {};
- auto* object = interpreter.argument(0).to_object(interpreter, global_object);
- if (interpreter.exception())
+ auto* object = vm.argument(0).to_object(global_object);
+ if (vm.exception())
return {};
return object->prototype();
}
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::set_prototype_of)
{
- if (interpreter.argument_count() < 2) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ObjectSetPrototypeOfTwoArgs);
+ if (vm.argument_count() < 2) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::ObjectSetPrototypeOfTwoArgs);
return {};
}
- auto* object = interpreter.argument(0).to_object(interpreter, global_object);
- if (interpreter.exception())
+ auto* object = vm.argument(0).to_object(global_object);
+ if (vm.exception())
return {};
- auto prototype_value = interpreter.argument(1);
+ auto prototype_value = vm.argument(1);
Object* prototype;
if (prototype_value.is_null()) {
prototype = nullptr;
} else if (prototype_value.is_object()) {
prototype = &prototype_value.as_object();
} else {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ObjectPrototypeWrongType);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ObjectPrototypeWrongType);
return {};
}
if (!object->set_prototype(prototype)) {
- if (!interpreter.exception())
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ObjectSetPrototypeOfReturnedFalse);
+ if (!vm.exception())
+ vm.throw_exception<TypeError>(global_object, ErrorType::ObjectSetPrototypeOfReturnedFalse);
return {};
}
return object;
@@ -132,7 +132,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::set_prototype_of)
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::is_extensible)
{
- auto argument = interpreter.argument(0);
+ auto argument = vm.argument(0);
if (!argument.is_object())
return Value(false);
return Value(argument.as_object().is_extensible());
@@ -140,12 +140,12 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::is_extensible)
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::prevent_extensions)
{
- auto argument = interpreter.argument(0);
+ auto argument = vm.argument(0);
if (!argument.is_object())
return argument;
if (!argument.as_object().prevent_extensions()) {
- if (!interpreter.exception())
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ObjectPreventExtensionsReturnedFalse);
+ if (!vm.exception())
+ vm.throw_exception<TypeError>(global_object, ErrorType::ObjectPreventExtensionsReturnedFalse);
return {};
}
return argument;
@@ -153,36 +153,36 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::prevent_extensions)
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::get_own_property_descriptor)
{
- auto* object = interpreter.argument(0).to_object(interpreter, global_object);
- if (interpreter.exception())
+ auto* object = vm.argument(0).to_object(global_object);
+ if (vm.exception())
return {};
- auto property_key = PropertyName::from_value(interpreter, interpreter.argument(1));
- if (interpreter.exception())
+ auto property_key = PropertyName::from_value(global_object, vm.argument(1));
+ if (vm.exception())
return {};
return object->get_own_property_descriptor_object(property_key);
}
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::define_property_)
{
- if (!interpreter.argument(0).is_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAnObject, "Object argument");
+ if (!vm.argument(0).is_object()) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAnObject, "Object argument");
return {};
}
- if (!interpreter.argument(2).is_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAnObject, "Descriptor argument");
+ if (!vm.argument(2).is_object()) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAnObject, "Descriptor argument");
return {};
}
- auto& object = interpreter.argument(0).as_object();
- auto property_key = StringOrSymbol::from_value(interpreter, interpreter.argument(1));
- if (interpreter.exception())
+ auto& object = vm.argument(0).as_object();
+ auto property_key = StringOrSymbol::from_value(global_object, vm.argument(1));
+ if (vm.exception())
return {};
- auto& descriptor = interpreter.argument(2).as_object();
+ auto& descriptor = vm.argument(2).as_object();
if (!object.define_property(property_key, descriptor)) {
- if (!interpreter.exception()) {
+ if (!vm.exception()) {
if (object.is_proxy_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ObjectDefinePropertyReturnedFalse);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ObjectDefinePropertyReturnedFalse);
} else {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NonExtensibleDefine, property_key.to_display_string().characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::NonExtensibleDefine, property_key.to_display_string().characters());
}
}
return {};
@@ -192,18 +192,18 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::define_property_)
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::is)
{
- return Value(same_value(interpreter, interpreter.argument(0), interpreter.argument(1)));
+ return Value(same_value(vm.argument(0), vm.argument(1)));
}
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::keys)
{
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ConvertUndefinedToObject);
+ if (!vm.argument_count()) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::ConvertUndefinedToObject);
return {};
}
- auto* obj_arg = interpreter.argument(0).to_object(interpreter, global_object);
- if (interpreter.exception())
+ auto* obj_arg = vm.argument(0).to_object(global_object);
+ if (vm.exception())
return {};
return obj_arg->get_own_properties(*obj_arg, PropertyKind::Key, true);
@@ -211,12 +211,12 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::keys)
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::values)
{
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ConvertUndefinedToObject);
+ if (!vm.argument_count()) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::ConvertUndefinedToObject);
return {};
}
- auto* obj_arg = interpreter.argument(0).to_object(interpreter, global_object);
- if (interpreter.exception())
+ auto* obj_arg = vm.argument(0).to_object(global_object);
+ if (vm.exception())
return {};
return obj_arg->get_own_properties(*obj_arg, PropertyKind::Value, true);
@@ -224,12 +224,12 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::values)
JS_DEFINE_NATIVE_FUNCTION(ObjectConstructor::entries)
{
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ConvertUndefinedToObject);
+ if (!vm.argument_count()) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::ConvertUndefinedToObject);
return {};
}
- auto* obj_arg = interpreter.argument(0).to_object(interpreter, global_object);
- if (interpreter.exception())
+ auto* obj_arg = vm.argument(0).to_object(global_object);
+ if (vm.exception())
return {};
return obj_arg->get_own_properties(*obj_arg, PropertyKind::KeyAndValue, true);
diff --git a/Libraries/LibJS/Runtime/ObjectPrototype.cpp b/Libraries/LibJS/Runtime/ObjectPrototype.cpp
index 7885561c61..99f68810bf 100644
--- a/Libraries/LibJS/Runtime/ObjectPrototype.cpp
+++ b/Libraries/LibJS/Runtime/ObjectPrototype.cpp
@@ -57,25 +57,25 @@ ObjectPrototype::~ObjectPrototype()
JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::has_own_property)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- auto name = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto name = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
return Value(this_object->has_own_property(name));
}
JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::to_string)
{
- auto this_value = interpreter.this_value(global_object);
+ auto this_value = vm.this_value(global_object);
if (this_value.is_undefined())
- return js_string(interpreter, "[object Undefined]");
+ return js_string(vm, "[object Undefined]");
if (this_value.is_null())
- return js_string(interpreter, "[object Null]");
+ return js_string(vm, "[object Null]");
- auto* this_object = this_value.to_object(interpreter, global_object);
+ auto* this_object = this_value.to_object(global_object);
if (!this_object)
return {};
@@ -104,12 +104,12 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::to_string)
tag = "Object";
}
- return js_string(interpreter, String::format("[object %s]", tag.characters()));
+ return js_string(vm, String::format("[object %s]", tag.characters()));
}
JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::to_locale_string)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
return this_object->invoke("toString");
@@ -117,7 +117,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::to_locale_string)
JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::value_of)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
return this_object->value_of();
diff --git a/Libraries/LibJS/Runtime/PrimitiveString.cpp b/Libraries/LibJS/Runtime/PrimitiveString.cpp
index 6325a91232..e4cfa1aea6 100644
--- a/Libraries/LibJS/Runtime/PrimitiveString.cpp
+++ b/Libraries/LibJS/Runtime/PrimitiveString.cpp
@@ -48,7 +48,12 @@ PrimitiveString* js_string(Heap& heap, String string)
PrimitiveString* js_string(Interpreter& interpreter, String string)
{
- return js_string(interpreter.heap(), string);
+ return js_string(interpreter.heap(), move(string));
+}
+
+PrimitiveString* js_string(VM& vm, String string)
+{
+ return js_string(vm.heap(), move(string));
}
}
diff --git a/Libraries/LibJS/Runtime/PrimitiveString.h b/Libraries/LibJS/Runtime/PrimitiveString.h
index 7ee314103f..0ed7e86a67 100644
--- a/Libraries/LibJS/Runtime/PrimitiveString.h
+++ b/Libraries/LibJS/Runtime/PrimitiveString.h
@@ -46,5 +46,6 @@ private:
PrimitiveString* js_string(Heap&, String);
PrimitiveString* js_string(Interpreter&, String);
+PrimitiveString* js_string(VM&, String);
}
diff --git a/Libraries/LibJS/Runtime/PropertyName.h b/Libraries/LibJS/Runtime/PropertyName.h
index 9627f2db88..76c25eb9d0 100644
--- a/Libraries/LibJS/Runtime/PropertyName.h
+++ b/Libraries/LibJS/Runtime/PropertyName.h
@@ -40,14 +40,14 @@ public:
Symbol,
};
- static PropertyName from_value(Interpreter& interpreter, Value value)
+ static PropertyName from_value(GlobalObject& global_object, Value value)
{
if (value.is_symbol())
return &value.as_symbol();
if (value.is_number())
return value.as_i32();
if (!value.is_empty())
- return value.to_string(interpreter);
+ return value.to_string(global_object);
return {};
}
diff --git a/Libraries/LibJS/Runtime/ProxyObject.cpp b/Libraries/LibJS/Runtime/ProxyObject.cpp
index 52086a8c5b..ea435c7ec1 100644
--- a/Libraries/LibJS/Runtime/ProxyObject.cpp
+++ b/Libraries/LibJS/Runtime/ProxyObject.cpp
@@ -33,7 +33,7 @@
namespace JS {
-bool static is_compatible_property_descriptor(Interpreter& interpreter, bool is_extensible, PropertyDescriptor new_descriptor, Optional<PropertyDescriptor> current_descriptor_optional)
+bool static is_compatible_property_descriptor(bool is_extensible, PropertyDescriptor new_descriptor, Optional<PropertyDescriptor> current_descriptor_optional)
{
if (!current_descriptor_optional.has_value())
return is_extensible;
@@ -53,7 +53,7 @@ bool static is_compatible_property_descriptor(Interpreter& interpreter, bool is_
if (current_descriptor.is_data_descriptor() && new_descriptor.is_data_descriptor() && !current_descriptor.attributes.is_configurable() && !current_descriptor.attributes.is_writable()) {
if (new_descriptor.attributes.is_writable())
return false;
- return new_descriptor.value.is_empty() && same_value(interpreter, new_descriptor.value, current_descriptor.value);
+ return new_descriptor.value.is_empty() && same_value(new_descriptor.value, current_descriptor.value);
}
return true;
}
@@ -77,7 +77,7 @@ ProxyObject::~ProxyObject()
Object* ProxyObject::prototype()
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return nullptr;
}
auto trap = m_handler.get("getPrototypeOf");
@@ -86,15 +86,15 @@ Object* ProxyObject::prototype()
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.prototype();
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "getPrototypeOf");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "getPrototypeOf");
return nullptr;
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target));
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target));
if (vm().exception())
return nullptr;
if (!trap_result.is_object() && !trap_result.is_null()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetPrototypeOfReturn);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetPrototypeOfReturn);
return nullptr;
}
if (m_target.is_extensible()) {
@@ -107,8 +107,8 @@ Object* ProxyObject::prototype()
auto target_proto = m_target.prototype();
if (vm().exception())
return nullptr;
- if (!same_value(interpreter(), trap_result, Value(target_proto))) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetPrototypeOfNonExtensible);
+ if (!same_value(trap_result, Value(target_proto))) {
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetPrototypeOfNonExtensible);
return nullptr;
}
return &trap_result.as_object();
@@ -117,7 +117,7 @@ Object* ProxyObject::prototype()
const Object* ProxyObject::prototype() const
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return nullptr;
}
return const_cast<const Object*>(const_cast<ProxyObject*>(this)->prototype());
@@ -126,7 +126,7 @@ const Object* ProxyObject::prototype() const
bool ProxyObject::set_prototype(Object* object)
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return false;
}
auto trap = m_handler.get("setPrototypeOf");
@@ -135,11 +135,11 @@ bool ProxyObject::set_prototype(Object* object)
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.set_prototype(object);
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "setPrototypeOf");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "setPrototypeOf");
return false;
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target), Value(object)).to_boolean();
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target), Value(object)).to_boolean();
if (vm().exception() || !trap_result)
return false;
if (m_target.is_extensible())
@@ -147,8 +147,8 @@ bool ProxyObject::set_prototype(Object* object)
auto* target_proto = m_target.prototype();
if (vm().exception())
return false;
- if (!same_value(interpreter(), Value(object), Value(target_proto))) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxySetPrototypeOfNonExtensible);
+ if (!same_value(Value(object), Value(target_proto))) {
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxySetPrototypeOfNonExtensible);
return false;
}
return true;
@@ -157,7 +157,7 @@ bool ProxyObject::set_prototype(Object* object)
bool ProxyObject::is_extensible() const
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return false;
}
auto trap = m_handler.get("isExtensible");
@@ -166,16 +166,16 @@ bool ProxyObject::is_extensible() const
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.is_extensible();
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "isExtensible");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "isExtensible");
return {};
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target)).to_boolean();
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target)).to_boolean();
if (vm().exception())
return false;
if (trap_result != m_target.is_extensible()) {
if (!vm().exception())
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyIsExtensibleReturn);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyIsExtensibleReturn);
return false;
}
return trap_result;
@@ -184,7 +184,7 @@ bool ProxyObject::is_extensible() const
bool ProxyObject::prevent_extensions()
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return false;
}
auto trap = m_handler.get("preventExtensions");
@@ -193,16 +193,16 @@ bool ProxyObject::prevent_extensions()
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.prevent_extensions();
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "preventExtensions");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "preventExtensions");
return {};
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target)).to_boolean();
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target)).to_boolean();
if (vm().exception())
return false;
if (trap_result && m_target.is_extensible()) {
if (!vm().exception())
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyPreventExtensionsReturn);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyPreventExtensionsReturn);
return false;
}
return trap_result;
@@ -211,7 +211,7 @@ bool ProxyObject::prevent_extensions()
Optional<PropertyDescriptor> ProxyObject::get_own_property_descriptor(const PropertyName& name) const
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return {};
}
auto trap = m_handler.get("getOwnPropertyDescriptor");
@@ -220,15 +220,15 @@ Optional<PropertyDescriptor> ProxyObject::get_own_property_descriptor(const Prop
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.get_own_property_descriptor(name);
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "getOwnPropertyDescriptor");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "getOwnPropertyDescriptor");
return {};
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(interpreter(), name.to_string()));
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm(), name.to_string()));
if (vm().exception())
return {};
if (!trap_result.is_object() && !trap_result.is_undefined()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorReturn);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorReturn);
return {};
}
auto target_desc = m_target.get_own_property_descriptor(name);
@@ -238,12 +238,12 @@ Optional<PropertyDescriptor> ProxyObject::get_own_property_descriptor(const Prop
if (!target_desc.has_value())
return {};
if (!target_desc.value().attributes.is_configurable()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorNonConfigurable);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorNonConfigurable);
return {};
}
if (!m_target.is_extensible()) {
if (!vm().exception())
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorUndefReturn);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorUndefReturn);
return {};
}
return {};
@@ -251,13 +251,13 @@ Optional<PropertyDescriptor> ProxyObject::get_own_property_descriptor(const Prop
auto result_desc = PropertyDescriptor::from_dictionary(vm(), trap_result.as_object());
if (vm().exception())
return {};
- if (!is_compatible_property_descriptor(interpreter(), m_target.is_extensible(), result_desc, target_desc)) {
+ if (!is_compatible_property_descriptor(m_target.is_extensible(), result_desc, target_desc)) {
if (!vm().exception())
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorInvalidDescriptor);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorInvalidDescriptor);
return {};
}
if (!result_desc.attributes.is_configurable() && (!target_desc.has_value() || target_desc.value().attributes.is_configurable())) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorInvalidNonConfig);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetOwnDescriptorInvalidNonConfig);
return {};
}
return result_desc;
@@ -266,7 +266,7 @@ Optional<PropertyDescriptor> ProxyObject::get_own_property_descriptor(const Prop
bool ProxyObject::define_property(const StringOrSymbol& property_name, const Object& descriptor, bool throw_exceptions)
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return false;
}
auto trap = m_handler.get("defineProperty");
@@ -275,11 +275,11 @@ bool ProxyObject::define_property(const StringOrSymbol& property_name, const Obj
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.define_property(property_name, descriptor, throw_exceptions);
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "defineProperty");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "defineProperty");
return false;
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target), property_name.to_value(interpreter()), Value(const_cast<Object*>(&descriptor))).to_boolean();
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target), property_name.to_value(interpreter()), Value(const_cast<Object*>(&descriptor))).to_boolean();
if (vm().exception() || !trap_result)
return false;
auto target_desc = m_target.get_own_property_descriptor(property_name);
@@ -293,21 +293,21 @@ bool ProxyObject::define_property(const StringOrSymbol& property_name, const Obj
if (!target_desc.has_value()) {
if (!m_target.is_extensible()) {
if (!vm().exception())
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDefinePropNonExtensible);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDefinePropNonExtensible);
return false;
}
if (setting_config_false) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDefinePropNonConfigurableNonExisting);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDefinePropNonConfigurableNonExisting);
return false;
}
} else {
- if (!is_compatible_property_descriptor(interpreter(), m_target.is_extensible(), PropertyDescriptor::from_dictionary(vm(), descriptor), target_desc)) {
+ if (!is_compatible_property_descriptor(m_target.is_extensible(), PropertyDescriptor::from_dictionary(vm(), descriptor), target_desc)) {
if (!vm().exception())
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDefinePropIncompatibleDescriptor);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDefinePropIncompatibleDescriptor);
return false;
}
if (setting_config_false && target_desc.value().attributes.is_configurable()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDefinePropExistingConfigurable);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDefinePropExistingConfigurable);
return false;
}
}
@@ -317,7 +317,7 @@ bool ProxyObject::define_property(const StringOrSymbol& property_name, const Obj
bool ProxyObject::has_property(const PropertyName& name) const
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return false;
}
auto trap = m_handler.get("has");
@@ -326,11 +326,11 @@ bool ProxyObject::has_property(const PropertyName& name) const
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.has_property(name);
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "has");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "has");
return false;
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(interpreter(), name.to_string())).to_boolean();
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm(), name.to_string())).to_boolean();
if (vm().exception())
return false;
if (!trap_result) {
@@ -339,12 +339,12 @@ bool ProxyObject::has_property(const PropertyName& name) const
return false;
if (target_desc.has_value()) {
if (!target_desc.value().attributes.is_configurable()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyHasExistingNonConfigurable);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyHasExistingNonConfigurable);
return false;
}
if (!m_target.is_extensible()) {
if (!vm().exception())
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyHasExistingNonExtensible);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyHasExistingNonExtensible);
return false;
}
}
@@ -355,7 +355,7 @@ bool ProxyObject::has_property(const PropertyName& name) const
Value ProxyObject::get(const PropertyName& name, Value) const
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return {};
}
auto trap = m_handler.get("get");
@@ -364,23 +364,23 @@ Value ProxyObject::get(const PropertyName& name, Value) const
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.get(name);
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "get");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "get");
return {};
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(interpreter(), name.to_string()), Value(const_cast<ProxyObject*>(this)));
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm(), name.to_string()), Value(const_cast<ProxyObject*>(this)));
if (vm().exception())
return {};
auto target_desc = m_target.get_own_property_descriptor(name);
if (target_desc.has_value()) {
if (vm().exception())
return {};
- if (target_desc.value().is_data_descriptor() && !target_desc.value().attributes.is_writable() && !same_value(interpreter(), trap_result, target_desc.value().value)) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetImmutableDataProperty);
+ if (target_desc.value().is_data_descriptor() && !target_desc.value().attributes.is_writable() && !same_value(trap_result, target_desc.value().value)) {
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetImmutableDataProperty);
return {};
}
if (target_desc.value().is_accessor_descriptor() && target_desc.value().getter == nullptr && !trap_result.is_undefined()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetNonConfigurableAccessor);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyGetNonConfigurableAccessor);
return {};
}
}
@@ -390,7 +390,7 @@ Value ProxyObject::get(const PropertyName& name, Value) const
bool ProxyObject::put(const PropertyName& name, Value value, Value)
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return false;
}
auto trap = m_handler.get("set");
@@ -399,22 +399,22 @@ bool ProxyObject::put(const PropertyName& name, Value value, Value)
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.put(name, value);
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "set");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "set");
return false;
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(interpreter(), name.to_string()), value, Value(const_cast<ProxyObject*>(this))).to_boolean();
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm(), name.to_string()), value, Value(const_cast<ProxyObject*>(this))).to_boolean();
if (vm().exception() || !trap_result)
return false;
auto target_desc = m_target.get_own_property_descriptor(name);
if (vm().exception())
return false;
if (target_desc.has_value() && !target_desc.value().attributes.is_configurable()) {
- if (target_desc.value().is_data_descriptor() && !target_desc.value().attributes.is_writable() && !same_value(interpreter(), value, target_desc.value().value)) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxySetImmutableDataProperty);
+ if (target_desc.value().is_data_descriptor() && !target_desc.value().attributes.is_writable() && !same_value(value, target_desc.value().value)) {
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxySetImmutableDataProperty);
return false;
}
if (target_desc.value().is_accessor_descriptor() && !target_desc.value().setter) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxySetNonConfigurableAccessor);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxySetNonConfigurableAccessor);
}
}
return true;
@@ -423,7 +423,7 @@ bool ProxyObject::put(const PropertyName& name, Value value, Value)
Value ProxyObject::delete_property(const PropertyName& name)
{
if (m_is_revoked) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return {};
}
auto trap = m_handler.get("deleteProperty");
@@ -432,11 +432,11 @@ Value ProxyObject::delete_property(const PropertyName& name)
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return m_target.delete_property(name);
if (!trap.is_function()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "deleteProperty");
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "deleteProperty");
return {};
}
- auto trap_result = interpreter().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(interpreter(), name.to_string())).to_boolean();
+ auto trap_result = vm().call(trap.as_function(), Value(&m_handler), Value(&m_target), js_string(vm(), name.to_string())).to_boolean();
if (vm().exception())
return {};
if (!trap_result)
@@ -447,7 +447,7 @@ Value ProxyObject::delete_property(const PropertyName& name)
if (!target_desc.has_value())
return Value(true);
if (!target_desc.value().attributes.is_configurable()) {
- interpreter().vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDeleteNonConfigurable);
+ vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyDeleteNonConfigurable);
return {};
}
return Value(true);
@@ -494,35 +494,36 @@ Value ProxyObject::call()
Value ProxyObject::construct(Interpreter& interpreter, Function& new_target)
{
+ auto& vm = this->vm();
if (!is_function()) {
- interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::NotAConstructor, Value(this).to_string_without_side_effects().characters());
+ vm.throw_exception<TypeError>(global_object(), ErrorType::NotAConstructor, Value(this).to_string_without_side_effects().characters());
return {};
}
if (m_is_revoked) {
- interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
+ vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyRevoked);
return {};
}
auto trap = m_handler.get("construct");
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (trap.is_empty() || trap.is_undefined() || trap.is_null())
return static_cast<Function&>(m_target).construct(interpreter, new_target);
if (!trap.is_function()) {
- interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "construct");
+ vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyInvalidTrap, "construct");
return {};
}
- MarkedValueList arguments(interpreter.heap());
+ MarkedValueList arguments(vm.heap());
arguments.append(Value(&m_target));
- auto arguments_array = Array::create(interpreter.global_object());
- interpreter.vm().for_each_argument([&](auto& argument) {
+ auto arguments_array = Array::create(global_object());
+ vm.for_each_argument([&](auto& argument) {
arguments_array->indexed_properties().append(argument);
});
arguments.append(arguments_array);
arguments.append(Value(&new_target));
- auto result = interpreter.call(trap.as_function(), Value(&m_handler), move(arguments));
+ auto result = vm.call(trap.as_function(), Value(&m_handler), move(arguments));
if (!result.is_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object(), ErrorType::ProxyConstructBadReturnType);
+ vm.throw_exception<TypeError>(global_object(), ErrorType::ProxyConstructBadReturnType);
return {};
}
return result;
diff --git a/Libraries/LibJS/Runtime/Reference.cpp b/Libraries/LibJS/Runtime/Reference.cpp
index 1d21b4a380..488e22a966 100644
--- a/Libraries/LibJS/Runtime/Reference.cpp
+++ b/Libraries/LibJS/Runtime/Reference.cpp
@@ -55,7 +55,7 @@ void Reference::put(Interpreter& interpreter, GlobalObject& global_object, Value
return;
}
- auto* object = base().to_object(interpreter, global_object);
+ auto* object = base().to_object(global_object);
if (!object)
return;
@@ -97,7 +97,7 @@ Value Reference::get(Interpreter& interpreter, GlobalObject& global_object)
return value;
}
- auto* object = base().to_object(interpreter, global_object);
+ auto* object = base().to_object(global_object);
if (!object)
return {};
diff --git a/Libraries/LibJS/Runtime/ReflectObject.cpp b/Libraries/LibJS/Runtime/ReflectObject.cpp
index 4c08a8d7ec..65e73419ce 100644
--- a/Libraries/LibJS/Runtime/ReflectObject.cpp
+++ b/Libraries/LibJS/Runtime/ReflectObject.cpp
@@ -34,42 +34,45 @@
namespace JS {
-static Object* get_target_object_from(Interpreter& interpreter, const String& name)
+static Object* get_target_object_from(GlobalObject& global_object, const String& name)
{
- auto target = interpreter.argument(0);
+ auto& vm = global_object.vm();
+ auto target = vm.argument(0);
if (!target.is_object()) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::ReflectArgumentMustBeAnObject, name.characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::ReflectArgumentMustBeAnObject, name.characters());
return nullptr;
}
return static_cast<Object*>(&target.as_object());
}
-static Function* get_target_function_from(Interpreter& interpreter, const String& name)
+static Function* get_target_function_from(GlobalObject& global_object, const String& name)
{
- auto target = interpreter.argument(0);
+ auto& vm = global_object.vm();
+ auto target = vm.argument(0);
if (!target.is_function()) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::ReflectArgumentMustBeAFunction, name.characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::ReflectArgumentMustBeAFunction, name.characters());
return nullptr;
}
return &target.as_function();
}
-static void prepare_arguments_list(Interpreter& interpreter, Value value, MarkedValueList* arguments)
+static void prepare_arguments_list(GlobalObject& global_object, Value value, MarkedValueList* arguments)
{
+ auto& vm = global_object.vm();
if (!value.is_object()) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::ReflectBadArgumentsList);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ReflectBadArgumentsList);
return;
}
auto& arguments_list = value.as_object();
auto length_property = arguments_list.get("length");
- if (interpreter.exception())
+ if (vm.exception())
return;
- auto length = length_property.to_size_t(interpreter);
- if (interpreter.exception())
+ auto length = length_property.to_size_t(global_object);
+ if (vm.exception())
return;
for (size_t i = 0; i < length; ++i) {
auto element = arguments_list.get(String::number(i));
- if (interpreter.exception())
+ if (vm.exception())
return;
arguments->append(element.value_or(js_undefined()));
}
@@ -105,70 +108,70 @@ ReflectObject::~ReflectObject()
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::apply)
{
- auto* target = get_target_function_from(interpreter, "apply");
+ auto* target = get_target_function_from(global_object, "apply");
if (!target)
return {};
- auto this_arg = interpreter.argument(1);
- MarkedValueList arguments(interpreter.heap());
- prepare_arguments_list(interpreter, interpreter.argument(2), &arguments);
- if (interpreter.exception())
+ auto this_arg = vm.argument(1);
+ MarkedValueList arguments(vm.heap());
+ prepare_arguments_list(global_object, vm.argument(2), &arguments);
+ if (vm.exception())
return {};
- return interpreter.call(*target, this_arg, move(arguments));
+ return vm.call(*target, this_arg, move(arguments));
}
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::construct)
{
- auto* target = get_target_function_from(interpreter, "construct");
+ auto* target = get_target_function_from(global_object, "construct");
if (!target)
return {};
- MarkedValueList arguments(interpreter.heap());
- prepare_arguments_list(interpreter, interpreter.argument(1), &arguments);
- if (interpreter.exception())
+ MarkedValueList arguments(vm.heap());
+ prepare_arguments_list(global_object, vm.argument(1), &arguments);
+ if (vm.exception())
return {};
auto* new_target = target;
- if (interpreter.argument_count() > 2) {
- auto new_target_value = interpreter.argument(2);
+ if (vm.argument_count() > 2) {
+ auto new_target_value = vm.argument(2);
if (!new_target_value.is_function()
|| (new_target_value.as_object().is_native_function() && !static_cast<NativeFunction&>(new_target_value.as_object()).has_constructor())) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ReflectBadNewTarget);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ReflectBadNewTarget);
return {};
}
new_target = &new_target_value.as_function();
}
- return interpreter.vm().construct(*target, *new_target, move(arguments), global_object);
+ return vm.construct(*target, *new_target, move(arguments), global_object);
}
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::define_property)
{
- auto* target = get_target_object_from(interpreter, "defineProperty");
+ auto* target = get_target_object_from(global_object, "defineProperty");
if (!target)
return {};
- if (!interpreter.argument(2).is_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ReflectBadDescriptorArgument);
+ if (!vm.argument(2).is_object()) {
+ vm.throw_exception<TypeError>(global_object, ErrorType::ReflectBadDescriptorArgument);
return {};
}
- auto property_key = StringOrSymbol::from_value(interpreter, interpreter.argument(1));
- if (interpreter.exception())
+ auto property_key = StringOrSymbol::from_value(global_object, vm.argument(1));
+ if (vm.exception())
return {};
- auto& descriptor = interpreter.argument(2).as_object();
+ auto& descriptor = vm.argument(2).as_object();
auto success = target->define_property(property_key, descriptor, false);
- if (interpreter.exception())
+ if (vm.exception())
return {};
return Value(success);
}
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::delete_property)
{
- auto* target = get_target_object_from(interpreter, "deleteProperty");
+ auto* target = get_target_object_from(global_object, "deleteProperty");
if (!target)
return {};
- auto property_key = interpreter.argument(1);
- auto property_name = PropertyName::from_value(interpreter, property_key);
- if (interpreter.exception())
+ auto property_key = vm.argument(1);
+ auto property_name = PropertyName::from_value(global_object, property_key);
+ if (vm.exception())
return {};
- auto property_key_number = property_key.to_number(interpreter);
- if (interpreter.exception())
+ auto property_key_number = property_key.to_number(global_object);
+ if (vm.exception())
return {};
if (property_key_number.is_finite_number()) {
auto property_key_as_double = property_key_number.as_double();
@@ -180,32 +183,32 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::delete_property)
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::get)
{
- auto* target = get_target_object_from(interpreter, "get");
+ auto* target = get_target_object_from(global_object, "get");
if (!target)
return {};
- auto property_key = PropertyName::from_value(interpreter, interpreter.argument(1));
- if (interpreter.exception())
+ auto property_key = PropertyName::from_value(global_object, vm.argument(1));
+ if (vm.exception())
return {};
Value receiver = {};
- if (interpreter.argument_count() > 2)
- receiver = interpreter.argument(2);
+ if (vm.argument_count() > 2)
+ receiver = vm.argument(2);
return target->get(property_key, receiver).value_or(js_undefined());
}
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::get_own_property_descriptor)
{
- auto* target = get_target_object_from(interpreter, "getOwnPropertyDescriptor");
+ auto* target = get_target_object_from(global_object, "getOwnPropertyDescriptor");
if (!target)
return {};
- auto property_key = PropertyName::from_value(interpreter, interpreter.argument(1));
- if (interpreter.exception())
+ auto property_key = PropertyName::from_value(global_object, vm.argument(1));
+ if (vm.exception())
return {};
return target->get_own_property_descriptor_object(property_key);
}
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::get_prototype_of)
{
- auto* target = get_target_object_from(interpreter, "getPrototypeOf");
+ auto* target = get_target_object_from(global_object, "getPrototypeOf");
if (!target)
return {};
return target->prototype();
@@ -213,18 +216,18 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::get_prototype_of)
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::has)
{
- auto* target = get_target_object_from(interpreter, "has");
+ auto* target = get_target_object_from(global_object, "has");
if (!target)
return {};
- auto property_key = PropertyName::from_value(interpreter, interpreter.argument(1));
- if (interpreter.exception())
+ auto property_key = PropertyName::from_value(global_object, vm.argument(1));
+ if (vm.exception())
return {};
return Value(target->has_property(property_key));
}
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::is_extensible)
{
- auto* target = get_target_object_from(interpreter, "isExtensible");
+ auto* target = get_target_object_from(global_object, "isExtensible");
if (!target)
return {};
return Value(target->is_extensible());
@@ -232,7 +235,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::is_extensible)
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::own_keys)
{
- auto* target = get_target_object_from(interpreter, "ownKeys");
+ auto* target = get_target_object_from(global_object, "ownKeys");
if (!target)
return {};
return target->get_own_properties(*target, PropertyKind::Key);
@@ -240,7 +243,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::own_keys)
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::prevent_extensions)
{
- auto* target = get_target_object_from(interpreter, "preventExtensions");
+ auto* target = get_target_object_from(global_object, "preventExtensions");
if (!target)
return {};
return Value(target->prevent_extensions());
@@ -248,27 +251,27 @@ JS_DEFINE_NATIVE_FUNCTION(ReflectObject::prevent_extensions)
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::set)
{
- auto* target = get_target_object_from(interpreter, "set");
+ auto* target = get_target_object_from(global_object, "set");
if (!target)
return {};
- auto property_key = interpreter.argument(1).to_string(interpreter);
- if (interpreter.exception())
+ auto property_key = vm.argument(1).to_string(global_object);
+ if (vm.exception())
return {};
- auto value = interpreter.argument(2);
+ auto value = vm.argument(2);
Value receiver = {};
- if (interpreter.argument_count() > 3)
- receiver = interpreter.argument(3);
+ if (vm.argument_count() > 3)
+ receiver = vm.argument(3);
return Value(target->put(property_key, value, receiver));
}
JS_DEFINE_NATIVE_FUNCTION(ReflectObject::set_prototype_of)
{
- auto* target = get_target_object_from(interpreter, "setPrototypeOf");
+ auto* target = get_target_object_from(global_object, "setPrototypeOf");
if (!target)
return {};
- auto prototype_value = interpreter.argument(1);
+ auto prototype_value = vm.argument(1);
if (!prototype_value.is_object() && !prototype_value.is_null()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ObjectPrototypeWrongType);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ObjectPrototypeWrongType);
return {};
}
Object* prototype = nullptr;
diff --git a/Libraries/LibJS/Runtime/RegExpConstructor.cpp b/Libraries/LibJS/Runtime/RegExpConstructor.cpp
index e64c709903..82ae584e01 100644
--- a/Libraries/LibJS/Runtime/RegExpConstructor.cpp
+++ b/Libraries/LibJS/Runtime/RegExpConstructor.cpp
@@ -53,15 +53,16 @@ Value RegExpConstructor::call()
return construct(interpreter(), *this);
}
-Value RegExpConstructor::construct(Interpreter& interpreter, Function&)
+Value RegExpConstructor::construct(Interpreter&, Function&)
{
- if (!interpreter.argument_count())
+ auto& vm = this->vm();
+ if (!vm.argument_count())
return RegExpObject::create(global_object(), "(?:)", "");
- auto contents = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto contents = vm.argument(0).to_string(global_object());
+ if (vm.exception())
return {};
- auto flags = interpreter.argument_count() > 1 ? interpreter.argument(1).to_string(interpreter) : "";
- if (interpreter.exception())
+ auto flags = vm.argument_count() > 1 ? vm.argument(1).to_string(global_object()) : "";
+ if (vm.exception())
return {};
return RegExpObject::create(global_object(), contents, flags);
}
diff --git a/Libraries/LibJS/Runtime/ScriptFunction.cpp b/Libraries/LibJS/Runtime/ScriptFunction.cpp
index bad20ee5e9..ccc524eb6b 100644
--- a/Libraries/LibJS/Runtime/ScriptFunction.cpp
+++ b/Libraries/LibJS/Runtime/ScriptFunction.cpp
@@ -35,13 +35,13 @@
namespace JS {
-static ScriptFunction* typed_this(Interpreter& interpreter, GlobalObject& global_object)
+static ScriptFunction* typed_this(VM& vm, GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return nullptr;
if (!this_object->is_function()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotAFunctionNoParam);
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAFunctionNoParam);
return nullptr;
}
return static_cast<ScriptFunction*>(this_object);
@@ -154,7 +154,7 @@ Value ScriptFunction::construct(Interpreter&, Function&)
JS_DEFINE_NATIVE_GETTER(ScriptFunction::length_getter)
{
- auto* function = typed_this(interpreter, global_object);
+ auto* function = typed_this(vm, global_object);
if (!function)
return {};
return Value(static_cast<i32>(function->m_function_length));
@@ -162,10 +162,10 @@ JS_DEFINE_NATIVE_GETTER(ScriptFunction::length_getter)
JS_DEFINE_NATIVE_GETTER(ScriptFunction::name_getter)
{
- auto* function = typed_this(interpreter, global_object);
+ auto* function = typed_this(vm, global_object);
if (!function)
return {};
- return js_string(interpreter, function->name().is_null() ? "" : function->name());
+ return js_string(vm, function->name().is_null() ? "" : function->name());
}
}
diff --git a/Libraries/LibJS/Runtime/StringConstructor.cpp b/Libraries/LibJS/Runtime/StringConstructor.cpp
index a6a72f81e6..d5afc9eeff 100644
--- a/Libraries/LibJS/Runtime/StringConstructor.cpp
+++ b/Libraries/LibJS/Runtime/StringConstructor.cpp
@@ -61,19 +61,19 @@ Value StringConstructor::call()
return js_string(heap(), "");
if (vm().argument(0).is_symbol())
return js_string(heap(), vm().argument(0).as_symbol().to_string());
- auto* string = vm().argument(0).to_primitive_string(interpreter());
+ auto* string = vm().argument(0).to_primitive_string(global_object());
if (vm().exception())
return {};
return string;
}
-Value StringConstructor::construct(Interpreter& interpreter, Function&)
+Value StringConstructor::construct(Interpreter&, Function&)
{
PrimitiveString* primitive_string = nullptr;
- if (!interpreter.argument_count())
- primitive_string = js_string(interpreter, "");
+ if (!vm().argument_count())
+ primitive_string = js_string(vm(), "");
else
- primitive_string = interpreter.argument(0).to_primitive_string(interpreter);
+ primitive_string = vm().argument(0).to_primitive_string(global_object());
if (!primitive_string)
return {};
return StringObject::create(global_object(), *primitive_string);
@@ -81,55 +81,55 @@ Value StringConstructor::construct(Interpreter& interpreter, Function&)
JS_DEFINE_NATIVE_FUNCTION(StringConstructor::raw)
{
- auto* template_object = interpreter.argument(0).to_object(interpreter, global_object);
- if (interpreter.exception())
+ auto* template_object = vm.argument(0).to_object(global_object);
+ if (vm.exception())
return {};
auto raw = template_object->get("raw");
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (raw.is_empty() || raw.is_undefined() || raw.is_null()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::StringRawCannotConvert, raw.is_null() ? "null" : "undefined");
+ vm.throw_exception<TypeError>(global_object, ErrorType::StringRawCannotConvert, raw.is_null() ? "null" : "undefined");
return {};
}
if (!raw.is_array())
- return js_string(interpreter, "");
+ return js_string(vm, "");
- auto* array = static_cast<Array*>(raw.to_object(interpreter, global_object));
+ auto* array = static_cast<Array*>(raw.to_object(global_object));
auto& raw_array_elements = array->indexed_properties();
StringBuilder builder;
for (size_t i = 0; i < raw_array_elements.array_like_size(); ++i) {
auto result = raw_array_elements.get(array, i);
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (!result.has_value())
continue;
- builder.append(result.value().value.to_string(interpreter));
- if (interpreter.exception())
+ builder.append(result.value().value.to_string(global_object));
+ if (vm.exception())
return {};
- if (i + 1 < interpreter.argument_count() && i < raw_array_elements.array_like_size() - 1) {
- builder.append(interpreter.argument(i + 1).to_string(interpreter));
- if (interpreter.exception())
+ if (i + 1 < vm.argument_count() && i < raw_array_elements.array_like_size() - 1) {
+ builder.append(vm.argument(i + 1).to_string(global_object));
+ if (vm.exception())
return {};
}
}
- return js_string(interpreter, builder.build());
+ return js_string(vm, builder.build());
}
JS_DEFINE_NATIVE_FUNCTION(StringConstructor::from_char_code)
{
StringBuilder builder;
- for (size_t i = 0; i < interpreter.argument_count(); ++i) {
- auto char_code = interpreter.argument(i).to_i32(interpreter);
- if (interpreter.exception())
+ for (size_t i = 0; i < vm.argument_count(); ++i) {
+ auto char_code = vm.argument(i).to_i32(global_object);
+ if (vm.exception())
return {};
auto truncated = char_code & 0xffff;
// FIXME: We need an Utf16View :^)
builder.append(Utf32View((u32*)&truncated, 1));
}
- return js_string(interpreter, builder.build());
+ return js_string(vm, builder.build());
}
}
diff --git a/Libraries/LibJS/Runtime/StringIteratorPrototype.cpp b/Libraries/LibJS/Runtime/StringIteratorPrototype.cpp
index 29d3d2fd1a..31f1a4a226 100644
--- a/Libraries/LibJS/Runtime/StringIteratorPrototype.cpp
+++ b/Libraries/LibJS/Runtime/StringIteratorPrototype.cpp
@@ -52,9 +52,9 @@ StringIteratorPrototype::~StringIteratorPrototype()
JS_DEFINE_NATIVE_FUNCTION(StringIteratorPrototype::next)
{
- auto this_value = interpreter.this_value(global_object);
+ auto this_value = vm.this_value(global_object);
if (!this_value.is_object() || !this_value.as_object().is_string_iterator_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "String Iterator");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "String Iterator");
return {};
}
@@ -74,7 +74,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringIteratorPrototype::next)
builder.append_code_point(*utf8_iterator);
++utf8_iterator;
- return create_iterator_result_object(global_object, js_string(interpreter, builder.to_string()), false);
+ return create_iterator_result_object(global_object, js_string(vm, builder.to_string()), false);
}
}
diff --git a/Libraries/LibJS/Runtime/StringOrSymbol.h b/Libraries/LibJS/Runtime/StringOrSymbol.h
index 2ebc189023..3027aca0cd 100644
--- a/Libraries/LibJS/Runtime/StringOrSymbol.h
+++ b/Libraries/LibJS/Runtime/StringOrSymbol.h
@@ -34,12 +34,12 @@ namespace JS {
class StringOrSymbol {
public:
- static StringOrSymbol from_value(Interpreter& interpreter, Value value)
+ static StringOrSymbol from_value(GlobalObject& global_object, Value value)
{
if (value.is_symbol())
return &value.as_symbol();
if (!value.is_empty())
- return value.to_string(interpreter);
+ return value.to_string(global_object);
return {};
}
diff --git a/Libraries/LibJS/Runtime/StringPrototype.cpp b/Libraries/LibJS/Runtime/StringPrototype.cpp
index 441a82f424..4b4e8c211f 100644
--- a/Libraries/LibJS/Runtime/StringPrototype.cpp
+++ b/Libraries/LibJS/Runtime/StringPrototype.cpp
@@ -40,24 +40,24 @@
namespace JS {
-static StringObject* typed_this(Interpreter& interpreter, GlobalObject& global_object)
+static StringObject* typed_this(VM& vm, GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return nullptr;
if (!this_object->is_string_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "String");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "String");
return nullptr;
}
return static_cast<StringObject*>(this_object);
}
-static String ak_string_from(Interpreter& interpreter, GlobalObject& global_object)
+static String ak_string_from(VM& vm, GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
- return Value(this_object).to_string(interpreter);
+ return Value(this_object).to_string(global_object);
}
StringPrototype::StringPrototype(GlobalObject& global_object)
@@ -98,30 +98,30 @@ StringPrototype::~StringPrototype()
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::char_at)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
i32 index = 0;
- if (interpreter.argument_count()) {
- index = interpreter.argument(0).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count()) {
+ index = vm.argument(0).to_i32(global_object);
+ if (vm.exception())
return {};
}
if (index < 0 || index >= static_cast<i32>(string.length()))
- return js_string(interpreter, String::empty());
+ return js_string(vm, String::empty());
// FIXME: This should return a character corresponding to the i'th UTF-16 code point.
- return js_string(interpreter, string.substring(index, 1));
+ return js_string(vm, string.substring(index, 1));
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::char_code_at)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
i32 index = 0;
- if (interpreter.argument_count()) {
- index = interpreter.argument(0).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count()) {
+ index = vm.argument(0).to_i32(global_object);
+ if (vm.exception())
return {};
}
if (index < 0 || index >= static_cast<i32>(string.length()))
@@ -132,50 +132,50 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::char_code_at)
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::repeat)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- if (!interpreter.argument_count())
- return js_string(interpreter, String::empty());
- auto count_value = interpreter.argument(0).to_number(interpreter);
- if (interpreter.exception())
+ if (!vm.argument_count())
+ return js_string(vm, String::empty());
+ auto count_value = vm.argument(0).to_number(global_object);
+ if (vm.exception())
return {};
if (count_value.as_double() < 0) {
- interpreter.vm().throw_exception<RangeError>(global_object, ErrorType::StringRepeatCountMustBe, "positive");
+ vm.throw_exception<RangeError>(global_object, ErrorType::StringRepeatCountMustBe, "positive");
return {};
}
if (count_value.is_infinity()) {
- interpreter.vm().throw_exception<RangeError>(global_object, ErrorType::StringRepeatCountMustBe, "finite");
+ vm.throw_exception<RangeError>(global_object, ErrorType::StringRepeatCountMustBe, "finite");
return {};
}
- auto count = count_value.to_size_t(interpreter);
- if (interpreter.exception())
+ auto count = count_value.to_size_t(global_object);
+ if (vm.exception())
return {};
StringBuilder builder;
for (size_t i = 0; i < count; ++i)
builder.append(string);
- return js_string(interpreter, builder.to_string());
+ return js_string(vm, builder.to_string());
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::starts_with)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return Value(false);
- auto search_string = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto search_string = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
auto string_length = string.length();
auto search_string_length = search_string.length();
size_t start = 0;
- if (interpreter.argument_count() > 1) {
- auto number = interpreter.argument(1).to_number(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() > 1) {
+ auto number = vm.argument(1).to_number(global_object);
+ if (vm.exception())
return {};
if (!number.is_nan())
- start = min(number.to_size_t(interpreter), string_length);
+ start = min(number.to_size_t(global_object), string_length);
}
if (start + search_string_length > string_length)
return Value(false);
@@ -186,34 +186,34 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::starts_with)
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::index_of)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- auto needle = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto needle = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
return Value((i32)string.index_of(needle).value_or(-1));
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::to_lowercase)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- return js_string(interpreter, string.to_lowercase());
+ return js_string(vm, string.to_lowercase());
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::to_uppercase)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- return js_string(interpreter, string.to_uppercase());
+ return js_string(vm, string.to_uppercase());
}
JS_DEFINE_NATIVE_GETTER(StringPrototype::length_getter)
{
- auto* string_object = typed_this(interpreter, global_object);
+ auto* string_object = typed_this(vm, global_object);
if (!string_object)
return {};
return Value((i32)string_object->primitive_string().string().length());
@@ -221,10 +221,10 @@ JS_DEFINE_NATIVE_GETTER(StringPrototype::length_getter)
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::to_string)
{
- auto* string_object = typed_this(interpreter, global_object);
+ auto* string_object = typed_this(vm, global_object);
if (!string_object)
return {};
- return js_string(interpreter, string_object->primitive_string().string());
+ return js_string(vm, string_object->primitive_string().string());
}
enum class PadPlacement {
@@ -232,21 +232,22 @@ enum class PadPlacement {
End,
};
-static Value pad_string(Interpreter& interpreter, const String& string, PadPlacement placement)
+static Value pad_string(GlobalObject& global_object, const String& string, PadPlacement placement)
{
- auto max_length = interpreter.argument(0).to_size_t(interpreter);
- if (interpreter.exception())
+ auto& vm = global_object.vm();
+ auto max_length = vm.argument(0).to_size_t(global_object);
+ if (vm.exception())
return {};
if (max_length <= string.length())
- return js_string(interpreter, string);
+ return js_string(vm, string);
String fill_string = " ";
- if (!interpreter.argument(1).is_undefined()) {
- fill_string = interpreter.argument(1).to_string(interpreter);
- if (interpreter.exception())
+ if (!vm.argument(1).is_undefined()) {
+ fill_string = vm.argument(1).to_string(global_object);
+ if (vm.exception())
return {};
if (fill_string.is_empty())
- return js_string(interpreter, string);
+ return js_string(vm, string);
}
auto fill_length = max_length - string.length();
@@ -257,92 +258,92 @@ static Value pad_string(Interpreter& interpreter, const String& string, PadPlace
auto filler = filler_builder.build().substring(0, fill_length);
if (placement == PadPlacement::Start)
- return js_string(interpreter, String::format("%s%s", filler.characters(), string.characters()));
- return js_string(interpreter, String::format("%s%s", string.characters(), filler.characters()));
+ return js_string(vm, String::format("%s%s", filler.characters(), string.characters()));
+ return js_string(vm, String::format("%s%s", string.characters(), filler.characters()));
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::pad_start)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- return pad_string(interpreter, string, PadPlacement::Start);
+ return pad_string(global_object, string, PadPlacement::Start);
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::pad_end)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- return pad_string(interpreter, string, PadPlacement::End);
+ return pad_string(global_object, string, PadPlacement::End);
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::trim)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- return js_string(interpreter, string.trim_whitespace(String::TrimMode::Both));
+ return js_string(vm, string.trim_whitespace(String::TrimMode::Both));
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::trim_start)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- return js_string(interpreter, string.trim_whitespace(String::TrimMode::Left));
+ return js_string(vm, string.trim_whitespace(String::TrimMode::Left));
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::trim_end)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- return js_string(interpreter, string.trim_whitespace(String::TrimMode::Right));
+ return js_string(vm, string.trim_whitespace(String::TrimMode::Right));
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::concat)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
StringBuilder builder;
builder.append(string);
- for (size_t i = 0; i < interpreter.argument_count(); ++i) {
- auto string_argument = interpreter.argument(i).to_string(interpreter);
- if (interpreter.exception())
+ for (size_t i = 0; i < vm.argument_count(); ++i) {
+ auto string_argument = vm.argument(i).to_string(global_object);
+ if (vm.exception())
return {};
builder.append(string_argument);
}
- return js_string(interpreter, builder.to_string());
+ return js_string(vm, builder.to_string());
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::substring)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- if (interpreter.argument_count() == 0)
- return js_string(interpreter, string);
+ if (vm.argument_count() == 0)
+ return js_string(vm, string);
// FIXME: index_start and index_end should index a UTF-16 code_point view of the string.
auto string_length = string.length();
- auto index_start = min(interpreter.argument(0).to_size_t(interpreter), string_length);
- if (interpreter.exception())
+ auto index_start = min(vm.argument(0).to_size_t(global_object), string_length);
+ if (vm.exception())
return {};
auto index_end = string_length;
- if (interpreter.argument_count() >= 2) {
- index_end = min(interpreter.argument(1).to_size_t(interpreter), string_length);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ index_end = min(vm.argument(1).to_size_t(global_object), string_length);
+ if (vm.exception())
return {};
}
if (index_start == index_end)
- return js_string(interpreter, String(""));
+ return js_string(vm, String(""));
if (index_start > index_end) {
- if (interpreter.argument_count() == 1)
- return js_string(interpreter, String(""));
+ if (vm.argument_count() == 1)
+ return js_string(vm, String(""));
auto temp_index_start = index_start;
index_start = index_end;
index_end = temp_index_start;
@@ -350,23 +351,23 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::substring)
auto part_length = index_end - index_start;
auto string_part = string.substring(index_start, part_length);
- return js_string(interpreter, string_part);
+ return js_string(vm, string_part);
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::includes)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- auto search_string = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto search_string = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
// FIXME: position should index a UTF-16 code_point view of the string.
size_t position = 0;
- if (interpreter.argument_count() >= 2) {
- position = interpreter.argument(1).to_size_t(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ position = vm.argument(1).to_size_t(global_object);
+ if (vm.exception())
return {};
if (position >= string.length())
return Value(false);
@@ -382,17 +383,17 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::includes)
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::slice)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- if (interpreter.argument_count() == 0)
- return js_string(interpreter, string);
+ if (vm.argument_count() == 0)
+ return js_string(vm, string);
// FIXME: index_start and index_end should index a UTF-16 code_point view of the string.
auto string_length = static_cast<i32>(string.length());
- auto index_start = interpreter.argument(0).to_i32(interpreter);
- if (interpreter.exception())
+ auto index_start = vm.argument(0).to_i32(global_object);
+ if (vm.exception())
return {};
auto index_end = string_length;
@@ -402,13 +403,13 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::slice)
else if (index_start < 0)
index_start = string_length + index_start;
- if (interpreter.argument_count() >= 2) {
- index_end = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ index_end = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
if (index_end < negative_min_index)
- return js_string(interpreter, String::empty());
+ return js_string(vm, String::empty());
if (index_end > string_length)
index_end = string_length;
@@ -417,33 +418,33 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::slice)
}
if (index_start >= index_end)
- return js_string(interpreter, String::empty());
+ return js_string(vm, String::empty());
auto part_length = index_end - index_start;
auto string_part = string.substring(index_start, part_length);
- return js_string(interpreter, string_part);
+ return js_string(vm, string_part);
}
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::last_index_of)
{
- auto string = ak_string_from(interpreter, global_object);
+ auto string = ak_string_from(vm, global_object);
if (string.is_null())
return {};
- if (interpreter.argument_count() == 0)
+ if (vm.argument_count() == 0)
return Value(-1);
- auto search_string = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto search_string = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
if (search_string.length() > string.length())
return Value(-1);
auto max_index = string.length() - search_string.length();
auto from_index = max_index;
- if (interpreter.argument_count() >= 2) {
+ if (vm.argument_count() >= 2) {
// FIXME: from_index should index a UTF-16 code_point view of the string.
- from_index = min(interpreter.argument(1).to_size_t(interpreter), max_index);
- if (interpreter.exception())
+ from_index = min(vm.argument(1).to_size_t(global_object), max_index);
+ if (vm.exception())
return {};
}
@@ -458,14 +459,14 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::last_index_of)
JS_DEFINE_NATIVE_FUNCTION(StringPrototype::symbol_iterator)
{
- auto this_object = interpreter.this_value(global_object);
+ auto this_object = vm.this_value(global_object);
if (this_object.is_undefined() || this_object.is_null()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ToObjectNullOrUndef);
+ vm.throw_exception<TypeError>(global_object, ErrorType::ToObjectNullOrUndef);
return {};
}
- auto string = this_object.to_string(interpreter);
- if (interpreter.exception())
+ auto string = this_object.to_string(global_object);
+ if (vm.exception())
return {};
return StringIterator::create(global_object, string);
}
diff --git a/Libraries/LibJS/Runtime/SymbolConstructor.cpp b/Libraries/LibJS/Runtime/SymbolConstructor.cpp
index 3c40c0f55e..2135b41917 100644
--- a/Libraries/LibJS/Runtime/SymbolConstructor.cpp
+++ b/Libraries/LibJS/Runtime/SymbolConstructor.cpp
@@ -60,7 +60,7 @@ Value SymbolConstructor::call()
{
if (!vm().argument_count())
return js_symbol(heap(), "", false);
- return js_symbol(heap(), vm().argument(0).to_string(interpreter()), false);
+ return js_symbol(heap(), vm().argument(0).to_string(global_object()), false);
}
Value SymbolConstructor::construct(Interpreter& interpreter, Function&)
@@ -72,10 +72,10 @@ Value SymbolConstructor::construct(Interpreter& interpreter, Function&)
JS_DEFINE_NATIVE_FUNCTION(SymbolConstructor::for_)
{
String description;
- if (!interpreter.argument_count()) {
+ if (!vm.argument_count()) {
description = "undefined";
} else {
- description = interpreter.argument(0).to_string(interpreter);
+ description = vm.argument(0).to_string(global_object);
}
return global_object.vm().get_global_symbol(description);
@@ -83,15 +83,15 @@ JS_DEFINE_NATIVE_FUNCTION(SymbolConstructor::for_)
JS_DEFINE_NATIVE_FUNCTION(SymbolConstructor::key_for)
{
- auto argument = interpreter.argument(0);
+ auto argument = vm.argument(0);
if (!argument.is_symbol()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotASymbol, argument.to_string_without_side_effects().characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotASymbol, argument.to_string_without_side_effects().characters());
return {};
}
auto& symbol = argument.as_symbol();
if (symbol.is_global())
- return js_string(interpreter, symbol.description());
+ return js_string(vm, symbol.description());
return js_undefined();
}
diff --git a/Libraries/LibJS/Runtime/SymbolPrototype.cpp b/Libraries/LibJS/Runtime/SymbolPrototype.cpp
index b13faa7c78..655f4f8620 100644
--- a/Libraries/LibJS/Runtime/SymbolPrototype.cpp
+++ b/Libraries/LibJS/Runtime/SymbolPrototype.cpp
@@ -58,13 +58,13 @@ SymbolPrototype::~SymbolPrototype()
{
}
-static SymbolObject* typed_this(Interpreter& interpreter, GlobalObject& global_object)
+static SymbolObject* typed_this(VM& vm, GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return nullptr;
if (!this_object->is_symbol_object()) {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Symbol");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Symbol");
return nullptr;
}
return static_cast<SymbolObject*>(this_object);
@@ -72,24 +72,24 @@ static SymbolObject* typed_this(Interpreter& interpreter, GlobalObject& global_o
JS_DEFINE_NATIVE_GETTER(SymbolPrototype::description_getter)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
- return js_string(interpreter, this_object->description());
+ return js_string(vm, this_object->description());
}
JS_DEFINE_NATIVE_FUNCTION(SymbolPrototype::to_string)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
auto string = this_object->primitive_symbol().to_string();
- return js_string(interpreter, move(string));
+ return js_string(vm, move(string));
}
JS_DEFINE_NATIVE_FUNCTION(SymbolPrototype::value_of)
{
- auto* this_object = typed_this(interpreter, global_object);
+ auto* this_object = typed_this(vm, global_object);
if (!this_object)
return {};
return this_object->value_of();
diff --git a/Libraries/LibJS/Runtime/Uint8ClampedArray.cpp b/Libraries/LibJS/Runtime/Uint8ClampedArray.cpp
index d16bed089f..ba8b8ba2b0 100644
--- a/Libraries/LibJS/Runtime/Uint8ClampedArray.cpp
+++ b/Libraries/LibJS/Runtime/Uint8ClampedArray.cpp
@@ -55,11 +55,11 @@ Uint8ClampedArray::~Uint8ClampedArray()
JS_DEFINE_NATIVE_GETTER(Uint8ClampedArray::length_getter)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return {};
if (StringView(this_object->class_name()) != "Uint8ClampedArray") {
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::NotA, "Uint8ClampedArray");
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Uint8ClampedArray");
return {};
}
return Value(static_cast<const Uint8ClampedArray*>(this_object)->length());
@@ -69,7 +69,7 @@ bool Uint8ClampedArray::put_by_index(u32 property_index, Value value)
{
// FIXME: Use attributes
ASSERT(property_index < m_length);
- auto number = value.to_i32(interpreter());
+ auto number = value.to_i32(global_object());
if (vm().exception())
return {};
m_data[property_index] = clamp(number, 0, 255);
diff --git a/Libraries/LibJS/Runtime/VM.cpp b/Libraries/LibJS/Runtime/VM.cpp
index 90a64e7384..8b3d16c357 100644
--- a/Libraries/LibJS/Runtime/VM.cpp
+++ b/Libraries/LibJS/Runtime/VM.cpp
@@ -300,7 +300,7 @@ Value VM::get_new_target() const
return get_this_environment()->new_target();
}
-Value VM::call(Function& function, Value this_value, Optional<MarkedValueList> arguments)
+Value VM::call_internal(Function& function, Value this_value, Optional<MarkedValueList> arguments)
{
ASSERT(!exception());
diff --git a/Libraries/LibJS/Runtime/VM.h b/Libraries/LibJS/Runtime/VM.h
index a1ef23eaee..0fe2de9ef6 100644
--- a/Libraries/LibJS/Runtime/VM.h
+++ b/Libraries/LibJS/Runtime/VM.h
@@ -32,6 +32,7 @@
#include <LibJS/Heap/Heap.h>
#include <LibJS/Runtime/ErrorTypes.h>
#include <LibJS/Runtime/Exception.h>
+#include <LibJS/Runtime/MarkedValueList.h>
#include <LibJS/Runtime/Value.h>
namespace JS {
@@ -206,11 +207,26 @@ public:
const LexicalEnvironment* get_this_environment() const;
Value get_new_target() const;
- [[nodiscard]] Value call(Function&, Value this_value, Optional<MarkedValueList> arguments);
+ template<typename... Args>
+ [[nodiscard]] ALWAYS_INLINE Value call(Function& function, Value this_value, Args... args)
+ {
+ // Are there any values in this argpack?
+ // args = [] -> if constexpr (false)
+ // args = [x, y, z] -> if constexpr ((void)x, true || ...)
+ if constexpr ((((void)args, true) || ...)) {
+ MarkedValueList arglist { heap() };
+ (..., arglist.append(move(args)));
+ return call(function, this_value, move(arglist));
+ }
+
+ return call(function, this_value);
+ }
private:
VM();
+ [[nodiscard]] Value call_internal(Function&, Value this_value, Optional<MarkedValueList> arguments);
+
Exception* m_exception { nullptr };
Heap m_heap;
@@ -234,4 +250,13 @@ private:
#undef __JS_ENUMERATE
};
+template<>
+[[nodiscard]] ALWAYS_INLINE Value VM::call(Function& function, Value this_value, MarkedValueList arguments) { return call_internal(function, this_value, move(arguments)); }
+
+template<>
+[[nodiscard]] ALWAYS_INLINE Value VM::call(Function& function, Value this_value, Optional<MarkedValueList> arguments) { return call_internal(function, this_value, move(arguments)); }
+
+template<>
+[[nodiscard]] ALWAYS_INLINE Value VM::call(Function& function, Value this_value) { return call(function, this_value, Optional<MarkedValueList> {}); }
+
}
diff --git a/Libraries/LibJS/Runtime/Value.cpp b/Libraries/LibJS/Runtime/Value.cpp
index 49461bb700..0d3ecfa8ec 100644
--- a/Libraries/LibJS/Runtime/Value.cpp
+++ b/Libraries/LibJS/Runtime/Value.cpp
@@ -134,17 +134,17 @@ String Value::to_string_without_side_effects() const
}
}
-PrimitiveString* Value::to_primitive_string(Interpreter& interpreter)
+PrimitiveString* Value::to_primitive_string(GlobalObject& global_object)
{
if (is_string())
return &as_string();
- auto string = to_string(interpreter);
- if (interpreter.exception())
+ auto string = to_string(global_object);
+ if (global_object.vm().exception())
return nullptr;
- return js_string(interpreter, string);
+ return js_string(global_object.heap(), string);
}
-String Value::to_string(Interpreter& interpreter) const
+String Value::to_string(GlobalObject& global_object) const
{
switch (m_type) {
case Type::Undefined:
@@ -164,15 +164,15 @@ String Value::to_string(Interpreter& interpreter) const
case Type::String:
return m_value.as_string->string();
case Type::Symbol:
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::Convert, "symbol", "string");
+ global_object.vm().throw_exception<TypeError>(global_object, ErrorType::Convert, "symbol", "string");
return {};
case Type::BigInt:
return m_value.as_bigint->big_integer().to_base10();
case Type::Object: {
auto primitive_value = as_object().to_primitive(PreferredType::String);
- if (interpreter.exception())
+ if (global_object.vm().exception())
return {};
- return primitive_value.to_string(interpreter);
+ return primitive_value.to_string(global_object);
}
default:
ASSERT_NOT_REACHED();
@@ -211,12 +211,12 @@ Value Value::to_primitive(PreferredType preferred_type) const
return *this;
}
-Object* Value::to_object(Interpreter& interpreter, GlobalObject& global_object) const
+Object* Value::to_object(GlobalObject& global_object) const
{
switch (m_type) {
case Type::Undefined:
case Type::Null:
- interpreter.vm().throw_exception<TypeError>(global_object, ErrorType::ToObjectNullOrUndef);
+ global_object.vm().throw_exception<TypeError>(global_object, ErrorType::ToObjectNullOrUndef);
return nullptr;
case Type::Boolean:
return BooleanObject::create(global_object, m_value.as_bool);
@@ -236,17 +236,17 @@ Object* Value::to_object(Interpreter& interpreter, GlobalObject& global_object)
}
}
-Value Value::to_numeric(Interpreter& interpreter) const
+Value Value::to_numeric(GlobalObject& global_object) const
{
auto primitive = to_primitive(Value::PreferredType::Number);
- if (interpreter.exception())
+ if (global_object.vm().exception())
return {};
if (primitive.is_bigint())
return primitive;
- return primitive.to_number(interpreter);
+ return primitive.to_number(global_object);
}
-Value Value::to_number(Interpreter& interpreter) const
+Value Value::to_number(GlobalObject& global_object) const
{
switch (m_type) {
case Type::Undefined:
@@ -272,16 +272,16 @@ Value Value::to_number(Interpreter& interpreter) const
return Value(parsed_double);
}
case Type::Symbol:
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::Convert, "symbol", "number");
+ global_object.vm().throw_exception<TypeError>(global_object, ErrorType::Convert, "symbol", "number");
return {};
case Type::BigInt:
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::Convert, "BigInt", "number");
+ global_object.vm().throw_exception<TypeError>(global_object, ErrorType::Convert, "BigInt", "number");
return {};
case Type::Object: {
auto primitive = m_value.as_object->to_primitive(PreferredType::Number);
- if (interpreter.exception())
+ if (global_object.vm().exception())
return {};
- return primitive.to_number(interpreter);
+ return primitive.to_number(global_object);
}
default:
ASSERT_NOT_REACHED();
@@ -337,18 +337,18 @@ size_t Value::as_size_t() const
return min((double)as_i32(), MAX_ARRAY_LIKE_INDEX);
}
-double Value::to_double(Interpreter& interpreter) const
+double Value::to_double(GlobalObject& global_object) const
{
- auto number = to_number(interpreter);
- if (interpreter.exception())
+ auto number = to_number(global_object);
+ if (global_object.vm().exception())
return 0;
return number.as_double();
}
-i32 Value::to_i32(Interpreter& interpreter) const
+i32 Value::to_i32(GlobalObject& global_object) const
{
- auto number = to_number(interpreter);
- if (interpreter.exception())
+ auto number = to_number(global_object);
+ if (global_object.vm().exception())
return 0;
if (number.is_nan())
return 0;
@@ -357,12 +357,12 @@ i32 Value::to_i32(Interpreter& interpreter) const
return number.as_i32();
}
-size_t Value::to_size_t(Interpreter& interpreter) const
+size_t Value::to_size_t(GlobalObject& global_object) const
{
if (is_empty())
return 0;
- auto number = to_number(interpreter);
- if (interpreter.exception())
+ auto number = to_number(global_object);
+ if (global_object.vm().exception())
return 0;
if (number.is_nan())
return 0;
@@ -405,10 +405,10 @@ Value less_than_equals(Interpreter& interpreter, Value lhs, Value rhs)
Value bitwise_and(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric)) {
@@ -424,10 +424,10 @@ Value bitwise_and(Interpreter& interpreter, Value lhs, Value rhs)
Value bitwise_or(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric)) {
@@ -447,10 +447,10 @@ Value bitwise_or(Interpreter& interpreter, Value lhs, Value rhs)
Value bitwise_xor(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric)) {
@@ -470,7 +470,7 @@ Value bitwise_xor(Interpreter& interpreter, Value lhs, Value rhs)
Value bitwise_not(Interpreter& interpreter, Value lhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (lhs_numeric.is_number())
@@ -483,12 +483,12 @@ Value bitwise_not(Interpreter& interpreter, Value lhs)
Value unary_plus(Interpreter& interpreter, Value lhs)
{
- return lhs.to_number(interpreter);
+ return lhs.to_number(interpreter.global_object());
}
Value unary_minus(Interpreter& interpreter, Value lhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (lhs_numeric.is_number()) {
@@ -505,10 +505,10 @@ Value unary_minus(Interpreter& interpreter, Value lhs)
Value left_shift(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric)) {
@@ -526,10 +526,10 @@ Value left_shift(Interpreter& interpreter, Value lhs, Value rhs)
Value right_shift(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric)) {
@@ -547,10 +547,10 @@ Value right_shift(Interpreter& interpreter, Value lhs, Value rhs)
Value unsigned_right_shift(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric)) {
@@ -574,10 +574,10 @@ Value add(Interpreter& interpreter, Value lhs, Value rhs)
return {};
if (lhs_primitive.is_string() || rhs_primitive.is_string()) {
- auto lhs_string = lhs_primitive.to_string(interpreter);
+ auto lhs_string = lhs_primitive.to_string(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_string = rhs_primitive.to_string(interpreter);
+ auto rhs_string = rhs_primitive.to_string(interpreter.global_object());
if (interpreter.exception())
return {};
StringBuilder builder(lhs_string.length() + rhs_string.length());
@@ -586,10 +586,10 @@ Value add(Interpreter& interpreter, Value lhs, Value rhs)
return js_string(interpreter, builder.to_string());
}
- auto lhs_numeric = lhs_primitive.to_numeric(interpreter);
+ auto lhs_numeric = lhs_primitive.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs_primitive.to_numeric(interpreter);
+ auto rhs_numeric = rhs_primitive.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric))
@@ -602,10 +602,10 @@ Value add(Interpreter& interpreter, Value lhs, Value rhs)
Value sub(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric))
@@ -618,10 +618,10 @@ Value sub(Interpreter& interpreter, Value lhs, Value rhs)
Value mul(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric))
@@ -634,10 +634,10 @@ Value mul(Interpreter& interpreter, Value lhs, Value rhs)
Value div(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric))
@@ -650,10 +650,10 @@ Value div(Interpreter& interpreter, Value lhs, Value rhs)
Value mod(Interpreter& interpreter, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
+ auto lhs_numeric = lhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
+ auto rhs_numeric = rhs.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric)) {
@@ -670,19 +670,20 @@ Value mod(Interpreter& interpreter, Value lhs, Value rhs)
return {};
}
-Value exp(Interpreter& interpreter, Value lhs, Value rhs)
+Value exp(GlobalObject& global_object, Value lhs, Value rhs)
{
- auto lhs_numeric = lhs.to_numeric(interpreter);
- if (interpreter.exception())
+ auto& vm = global_object.vm();
+ auto lhs_numeric = lhs.to_numeric(global_object);
+ if (vm.exception())
return {};
- auto rhs_numeric = rhs.to_numeric(interpreter);
- if (interpreter.exception())
+ auto rhs_numeric = rhs.to_numeric(global_object);
+ if (vm.exception())
return {};
if (both_number(lhs_numeric, rhs_numeric))
return Value(pow(lhs_numeric.as_double(), rhs_numeric.as_double()));
if (both_bigint(lhs_numeric, rhs_numeric))
- return js_bigint(interpreter, Crypto::NumberTheory::Power(lhs_numeric.as_bigint().big_integer(), rhs_numeric.as_bigint().big_integer()));
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::BigIntBadOperatorOtherType, "exponentiation");
+ return js_bigint(vm.heap(), Crypto::NumberTheory::Power(lhs_numeric.as_bigint().big_integer(), rhs_numeric.as_bigint().big_integer()));
+ vm.throw_exception<TypeError>(global_object, ErrorType::BigIntBadOperatorOtherType, "exponentiation");
return {};
}
@@ -692,44 +693,46 @@ Value in(Interpreter& interpreter, Value lhs, Value rhs)
interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::InOperatorWithObject);
return {};
}
- auto lhs_string = lhs.to_string(interpreter);
+ auto lhs_string = lhs.to_string(interpreter.global_object());
if (interpreter.exception())
return {};
return Value(rhs.as_object().has_property(lhs_string));
}
-Value instance_of(Interpreter& interpreter, Value lhs, Value rhs)
+Value instance_of(GlobalObject& global_object, Value lhs, Value rhs)
{
+ auto& vm = global_object.vm();
if (!rhs.is_object()) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::NotAnObject, rhs.to_string_without_side_effects().characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAnObject, rhs.to_string_without_side_effects().characters());
return {};
}
- auto has_instance_method = rhs.as_object().get(interpreter.vm().well_known_symbol_has_instance());
+ auto has_instance_method = rhs.as_object().get(vm.well_known_symbol_has_instance());
if (!has_instance_method.is_empty()) {
if (!has_instance_method.is_function()) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::NotAFunction, has_instance_method.to_string_without_side_effects().characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAFunction, has_instance_method.to_string_without_side_effects().characters());
return {};
}
- return Value(interpreter.call(has_instance_method.as_function(), rhs, lhs).to_boolean());
+ return Value(vm.call(has_instance_method.as_function(), rhs, lhs).to_boolean());
}
if (!rhs.is_function()) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::NotAFunction, rhs.to_string_without_side_effects().characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotAFunction, rhs.to_string_without_side_effects().characters());
return {};
}
- return ordinary_has_instance(interpreter, lhs, rhs);
+ return ordinary_has_instance(global_object, lhs, rhs);
}
-Value ordinary_has_instance(Interpreter& interpreter, Value lhs, Value rhs)
+Value ordinary_has_instance(GlobalObject& global_object, Value lhs, Value rhs)
{
+ auto& vm = global_object.vm();
if (!rhs.is_function())
return Value(false);
auto& rhs_function = rhs.as_function();
if (rhs_function.is_bound_function()) {
auto& bound_target = static_cast<BoundFunction&>(rhs_function);
- return instance_of(interpreter, lhs, Value(&bound_target.target_function()));
+ return instance_of(global_object, lhs, Value(&bound_target.target_function()));
}
if (!lhs.is_object())
@@ -737,20 +740,20 @@ Value ordinary_has_instance(Interpreter& interpreter, Value lhs, Value rhs)
Object* lhs_object = &lhs.as_object();
auto rhs_prototype = rhs_function.get("prototype");
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (!rhs_prototype.is_object()) {
- interpreter.vm().throw_exception<TypeError>(interpreter.global_object(), ErrorType::InstanceOfOperatorBadPrototype, rhs_prototype.to_string_without_side_effects().characters());
+ vm.throw_exception<TypeError>(global_object, ErrorType::InstanceOfOperatorBadPrototype, rhs_prototype.to_string_without_side_effects().characters());
return {};
}
while (true) {
lhs_object = lhs_object->prototype();
- if (interpreter.exception())
+ if (vm.exception())
return {};
if (!lhs_object)
return Value(false);
- if (same_value(interpreter, rhs_prototype, lhs_object))
+ if (same_value(rhs_prototype, lhs_object))
return Value(true);
}
}
@@ -760,7 +763,7 @@ const LogStream& operator<<(const LogStream& stream, const Value& value)
return stream << (value.is_empty() ? "<empty>" : value.to_string_without_side_effects());
}
-bool same_value(Interpreter& interpreter, Value lhs, Value rhs)
+bool same_value(Value lhs, Value rhs)
{
if (lhs.type() != rhs.type())
return false;
@@ -783,10 +786,10 @@ bool same_value(Interpreter& interpreter, Value lhs, Value rhs)
return lhs_big_integer == rhs_big_integer;
}
- return same_value_non_numeric(interpreter, lhs, rhs);
+ return same_value_non_numeric(lhs, rhs);
}
-bool same_value_zero(Interpreter& interpreter, Value lhs, Value rhs)
+bool same_value_zero(Value lhs, Value rhs)
{
if (lhs.type() != rhs.type())
return false;
@@ -800,10 +803,10 @@ bool same_value_zero(Interpreter& interpreter, Value lhs, Value rhs)
if (lhs.is_bigint())
return lhs.as_bigint().big_integer() == rhs.as_bigint().big_integer();
- return same_value_non_numeric(interpreter, lhs, rhs);
+ return same_value_non_numeric(lhs, rhs);
}
-bool same_value_non_numeric(Interpreter&, Value lhs, Value rhs)
+bool same_value_non_numeric(Value lhs, Value rhs)
{
ASSERT(!lhs.is_number() && !lhs.is_bigint());
ASSERT(lhs.type() == rhs.type());
@@ -825,7 +828,7 @@ bool same_value_non_numeric(Interpreter&, Value lhs, Value rhs)
}
}
-bool strict_eq(Interpreter& interpreter, Value lhs, Value rhs)
+bool strict_eq(Value lhs, Value rhs)
{
if (lhs.type() != rhs.type())
return false;
@@ -841,22 +844,22 @@ bool strict_eq(Interpreter& interpreter, Value lhs, Value rhs)
if (lhs.is_bigint())
return lhs.as_bigint().big_integer() == rhs.as_bigint().big_integer();
- return same_value_non_numeric(interpreter, lhs, rhs);
+ return same_value_non_numeric(lhs, rhs);
}
bool abstract_eq(Interpreter& interpreter, Value lhs, Value rhs)
{
if (lhs.type() == rhs.type())
- return strict_eq(interpreter, lhs, rhs);
+ return strict_eq(lhs, rhs);
if ((lhs.is_undefined() || lhs.is_null()) && (rhs.is_undefined() || rhs.is_null()))
return true;
if (lhs.is_number() && rhs.is_string())
- return abstract_eq(interpreter, lhs, rhs.to_number(interpreter));
+ return abstract_eq(interpreter, lhs, rhs.to_number(interpreter.global_object()));
if (lhs.is_string() && rhs.is_number())
- return abstract_eq(interpreter, lhs.to_number(interpreter), rhs);
+ return abstract_eq(interpreter, lhs.to_number(interpreter.global_object()), rhs);
if (lhs.is_bigint() && rhs.is_string()) {
auto& rhs_string = rhs.as_string().string();
@@ -869,10 +872,10 @@ bool abstract_eq(Interpreter& interpreter, Value lhs, Value rhs)
return abstract_eq(interpreter, rhs, lhs);
if (lhs.is_boolean())
- return abstract_eq(interpreter, lhs.to_number(interpreter), rhs);
+ return abstract_eq(interpreter, lhs.to_number(interpreter.global_object()), rhs);
if (rhs.is_boolean())
- return abstract_eq(interpreter, lhs, rhs.to_number(interpreter));
+ return abstract_eq(interpreter, lhs, rhs.to_number(interpreter.global_object()));
if ((lhs.is_string() || lhs.is_number() || lhs.is_bigint() || lhs.is_symbol()) && rhs.is_object())
return abstract_eq(interpreter, lhs, rhs.to_primitive());
@@ -960,10 +963,10 @@ TriState abstract_relation(Interpreter& interpreter, bool left_first, Value lhs,
return TriState::False;
}
- auto x_numeric = x_primitive.to_numeric(interpreter);
+ auto x_numeric = x_primitive.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
- auto y_numeric = y_primitive.to_numeric(interpreter);
+ auto y_numeric = y_primitive.to_numeric(interpreter.global_object());
if (interpreter.exception())
return {};
@@ -1014,7 +1017,7 @@ size_t length_of_array_like(Interpreter& interpreter, Value value)
auto result = value.as_object().get("length");
if (interpreter.exception())
return 0;
- return result.to_size_t(interpreter);
+ return result.to_size_t(interpreter.global_object());
}
}
diff --git a/Libraries/LibJS/Runtime/Value.h b/Libraries/LibJS/Runtime/Value.h
index fc65d82630..ca6f3be91c 100644
--- a/Libraries/LibJS/Runtime/Value.h
+++ b/Libraries/LibJS/Runtime/Value.h
@@ -240,16 +240,16 @@ public:
i32 as_i32() const;
size_t as_size_t() const;
- String to_string(Interpreter&) const;
- PrimitiveString* to_primitive_string(Interpreter&);
+ String to_string(GlobalObject&) const;
+ PrimitiveString* to_primitive_string(GlobalObject&);
Value to_primitive(PreferredType preferred_type = PreferredType::Default) const;
- Object* to_object(Interpreter&, GlobalObject&) const;
- Value to_numeric(Interpreter&) const;
- Value to_number(Interpreter&) const;
+ Object* to_object(GlobalObject&) const;
+ Value to_numeric(GlobalObject&) const;
+ Value to_number(GlobalObject&) const;
BigInt* to_bigint(GlobalObject&) const;
- double to_double(Interpreter&) const;
- i32 to_i32(Interpreter&) const;
- size_t to_size_t(Interpreter&) const;
+ double to_double(GlobalObject&) const;
+ i32 to_i32(GlobalObject&) const;
+ size_t to_size_t(GlobalObject&) const;
bool to_boolean() const;
String to_string_without_side_effects() const;
@@ -320,16 +320,16 @@ Value sub(Interpreter&, Value lhs, Value rhs);
Value mul(Interpreter&, Value lhs, Value rhs);
Value div(Interpreter&, Value lhs, Value rhs);
Value mod(Interpreter&, Value lhs, Value rhs);
-Value exp(Interpreter&, Value lhs, Value rhs);
+Value exp(GlobalObject&, Value lhs, Value rhs);
Value in(Interpreter&, Value lhs, Value rhs);
-Value instance_of(Interpreter&, Value lhs, Value rhs);
-Value ordinary_has_instance(Interpreter& interpreter, Value lhs, Value rhs);
+Value instance_of(GlobalObject&, Value lhs, Value rhs);
+Value ordinary_has_instance(GlobalObject&, Value lhs, Value rhs);
bool abstract_eq(Interpreter&, Value lhs, Value rhs);
-bool strict_eq(Interpreter&, Value lhs, Value rhs);
-bool same_value(Interpreter&, Value lhs, Value rhs);
-bool same_value_zero(Interpreter&, Value lhs, Value rhs);
-bool same_value_non_numeric(Interpreter&, Value lhs, Value rhs);
+bool strict_eq(Value lhs, Value rhs);
+bool same_value(Value lhs, Value rhs);
+bool same_value_zero(Value lhs, Value rhs);
+bool same_value_non_numeric(Value lhs, Value rhs);
TriState abstract_relation(Interpreter&, bool left_first, Value lhs, Value rhs);
size_t length_of_array_like(Interpreter&, Value);
diff --git a/Libraries/LibWeb/Bindings/LocationObject.cpp b/Libraries/LibWeb/Bindings/LocationObject.cpp
index c457e4decd..6d9234fa2f 100644
--- a/Libraries/LibWeb/Bindings/LocationObject.cpp
+++ b/Libraries/LibWeb/Bindings/LocationObject.cpp
@@ -62,14 +62,14 @@ LocationObject::~LocationObject()
JS_DEFINE_NATIVE_GETTER(LocationObject::href_getter)
{
auto& window = static_cast<WindowObject&>(global_object);
- return JS::js_string(interpreter, window.impl().document().url().to_string());
+ return JS::js_string(vm, window.impl().document().url().to_string());
}
JS_DEFINE_NATIVE_SETTER(LocationObject::href_setter)
{
auto& window = static_cast<WindowObject&>(global_object);
- auto new_href = value.to_string(interpreter);
- if (interpreter.exception())
+ auto new_href = value.to_string(global_object);
+ if (vm.exception())
return;
window.impl().did_set_location_href({}, new_href);
}
@@ -77,13 +77,13 @@ JS_DEFINE_NATIVE_SETTER(LocationObject::href_setter)
JS_DEFINE_NATIVE_GETTER(LocationObject::pathname_getter)
{
auto& window = static_cast<WindowObject&>(global_object);
- return JS::js_string(interpreter, window.impl().document().url().path());
+ return JS::js_string(vm, window.impl().document().url().path());
}
JS_DEFINE_NATIVE_GETTER(LocationObject::hostname_getter)
{
auto& window = static_cast<WindowObject&>(global_object);
- return JS::js_string(interpreter, window.impl().document().url().host());
+ return JS::js_string(vm, window.impl().document().url().host());
}
JS_DEFINE_NATIVE_GETTER(LocationObject::host_getter)
@@ -94,7 +94,7 @@ JS_DEFINE_NATIVE_GETTER(LocationObject::host_getter)
builder.append(url.host());
builder.append(':');
builder.appendf("%u", url.port());
- return JS::js_string(interpreter, builder.to_string());
+ return JS::js_string(vm, builder.to_string());
}
JS_DEFINE_NATIVE_GETTER(LocationObject::hash_getter)
@@ -102,11 +102,11 @@ JS_DEFINE_NATIVE_GETTER(LocationObject::hash_getter)
auto& window = static_cast<WindowObject&>(global_object);
auto fragment = window.impl().document().url().fragment();
if (!fragment.length())
- return JS::js_string(interpreter, "");
+ return JS::js_string(vm, "");
StringBuilder builder;
builder.append('#');
builder.append(fragment);
- return JS::js_string(interpreter, builder.to_string());
+ return JS::js_string(vm, builder.to_string());
}
JS_DEFINE_NATIVE_GETTER(LocationObject::search_getter)
@@ -114,11 +114,11 @@ JS_DEFINE_NATIVE_GETTER(LocationObject::search_getter)
auto& window = static_cast<WindowObject&>(global_object);
auto query = window.impl().document().url().query();
if (!query.length())
- return JS::js_string(interpreter, "");
+ return JS::js_string(vm, "");
StringBuilder builder;
builder.append('?');
builder.append(query);
- return JS::js_string(interpreter, builder.to_string());
+ return JS::js_string(vm, builder.to_string());
}
JS_DEFINE_NATIVE_GETTER(LocationObject::protocol_getter)
@@ -127,7 +127,7 @@ JS_DEFINE_NATIVE_GETTER(LocationObject::protocol_getter)
StringBuilder builder;
builder.append(window.impl().document().url().protocol());
builder.append(':');
- return JS::js_string(interpreter, builder.to_string());
+ return JS::js_string(vm, builder.to_string());
}
JS_DEFINE_NATIVE_FUNCTION(LocationObject::reload)
diff --git a/Libraries/LibWeb/Bindings/NavigatorObject.cpp b/Libraries/LibWeb/Bindings/NavigatorObject.cpp
index 9b6432d9de..33e7ab0a21 100644
--- a/Libraries/LibWeb/Bindings/NavigatorObject.cpp
+++ b/Libraries/LibWeb/Bindings/NavigatorObject.cpp
@@ -62,7 +62,7 @@ NavigatorObject::~NavigatorObject()
JS_DEFINE_NATIVE_GETTER(NavigatorObject::user_agent_getter)
{
- return JS::js_string(interpreter, ResourceLoader::the().user_agent());
+ return JS::js_string(vm, ResourceLoader::the().user_agent());
}
}
diff --git a/Libraries/LibWeb/Bindings/WindowObject.cpp b/Libraries/LibWeb/Bindings/WindowObject.cpp
index 25540e6293..77178514b2 100644
--- a/Libraries/LibWeb/Bindings/WindowObject.cpp
+++ b/Libraries/LibWeb/Bindings/WindowObject.cpp
@@ -99,15 +99,15 @@ Origin WindowObject::origin() const
return impl().document().origin();
}
-static DOM::Window* impl_from(JS::Interpreter& interpreter, JS::GlobalObject& global_object)
+static DOM::Window* impl_from(JS::VM& vm, JS::GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object) {
ASSERT_NOT_REACHED();
return nullptr;
}
if (StringView("WindowObject") != this_object->class_name()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, "WindowObject");
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, "WindowObject");
return nullptr;
}
return &static_cast<WindowObject*>(this_object)->impl();
@@ -115,13 +115,13 @@ static DOM::Window* impl_from(JS::Interpreter& interpreter, JS::GlobalObject& gl
JS_DEFINE_NATIVE_FUNCTION(WindowObject::alert)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
String message = "";
- if (interpreter.argument_count()) {
- message = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count()) {
+ message = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
}
impl->alert(message);
@@ -130,13 +130,13 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::alert)
JS_DEFINE_NATIVE_FUNCTION(WindowObject::confirm)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
String message = "";
- if (interpreter.argument_count()) {
- message = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count()) {
+ message = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
}
return JS::Value(impl->confirm(message));
@@ -144,24 +144,24 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::confirm)
JS_DEFINE_NATIVE_FUNCTION(WindowObject::set_interval)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountAtLeastOne, "setInterval");
+ if (!vm.argument_count()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountAtLeastOne, "setInterval");
return {};
}
- auto* callback_object = interpreter.argument(0).to_object(interpreter, global_object);
+ auto* callback_object = vm.argument(0).to_object(global_object);
if (!callback_object)
return {};
if (!callback_object->is_function()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotAFunctionNoParam);
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotAFunctionNoParam);
return {};
}
i32 interval = 0;
- if (interpreter.argument_count() >= 2) {
- interval = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ interval = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
if (interval < 0)
interval = 0;
@@ -173,24 +173,24 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::set_interval)
JS_DEFINE_NATIVE_FUNCTION(WindowObject::set_timeout)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountAtLeastOne, "setTimeout");
+ if (!vm.argument_count()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountAtLeastOne, "setTimeout");
return {};
}
- auto* callback_object = interpreter.argument(0).to_object(interpreter, global_object);
+ auto* callback_object = vm.argument(0).to_object(global_object);
if (!callback_object)
return {};
if (!callback_object->is_function()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotAFunctionNoParam);
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotAFunctionNoParam);
return {};
}
i32 interval = 0;
- if (interpreter.argument_count() >= 2) {
- interval = interpreter.argument(1).to_i32(interpreter);
- if (interpreter.exception())
+ if (vm.argument_count() >= 2) {
+ interval = vm.argument(1).to_i32(global_object);
+ if (vm.exception())
return {};
if (interval < 0)
interval = 0;
@@ -202,15 +202,15 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::set_timeout)
JS_DEFINE_NATIVE_FUNCTION(WindowObject::clear_timeout)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountAtLeastOne, "clearTimeout");
+ if (!vm.argument_count()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountAtLeastOne, "clearTimeout");
return {};
}
- i32 timer_id = interpreter.argument(0).to_i32(interpreter);
- if (interpreter.exception())
+ i32 timer_id = vm.argument(0).to_i32(global_object);
+ if (vm.exception())
return {};
impl->clear_timeout(timer_id);
return JS::js_undefined();
@@ -218,15 +218,15 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::clear_timeout)
JS_DEFINE_NATIVE_FUNCTION(WindowObject::clear_interval)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountAtLeastOne, "clearInterval");
+ if (!vm.argument_count()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountAtLeastOne, "clearInterval");
return {};
}
- i32 timer_id = interpreter.argument(0).to_i32(interpreter);
- if (interpreter.exception())
+ i32 timer_id = vm.argument(0).to_i32(global_object);
+ if (vm.exception())
return {};
impl->clear_timeout(timer_id);
return JS::js_undefined();
@@ -234,18 +234,18 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::clear_interval)
JS_DEFINE_NATIVE_FUNCTION(WindowObject::request_animation_frame)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, "requestAnimationFrame");
+ if (!vm.argument_count()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, "requestAnimationFrame");
return {};
}
- auto* callback_object = interpreter.argument(0).to_object(interpreter, global_object);
+ auto* callback_object = vm.argument(0).to_object(global_object);
if (!callback_object)
return {};
if (!callback_object->is_function()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotAFunctionNoParam);
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotAFunctionNoParam);
return {};
}
return JS::Value(impl->request_animation_frame(*static_cast<JS::Function*>(callback_object)));
@@ -253,15 +253,15 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::request_animation_frame)
JS_DEFINE_NATIVE_FUNCTION(WindowObject::cancel_animation_frame)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, "cancelAnimationFrame");
+ if (!vm.argument_count()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, "cancelAnimationFrame");
return {};
}
- auto id = interpreter.argument(0).to_i32(interpreter);
- if (interpreter.exception())
+ auto id = vm.argument(0).to_i32(global_object);
+ if (vm.exception())
return {};
impl->cancel_animation_frame(id);
return JS::js_undefined();
@@ -269,52 +269,52 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::cancel_animation_frame)
JS_DEFINE_NATIVE_FUNCTION(WindowObject::atob)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, "atob");
+ if (!vm.argument_count()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, "atob");
return {};
}
- auto string = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto string = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
auto decoded = decode_base64(StringView(string));
// decode_base64() returns a byte string. LibJS uses UTF-8 for strings. Use Latin1Decoder to convert bytes 128-255 to UTF-8.
- return JS::js_string(interpreter, TextCodec::decoder_for("iso-8859-1")->to_utf8(decoded));
+ return JS::js_string(vm, TextCodec::decoder_for("iso-8859-1")->to_utf8(decoded));
}
JS_DEFINE_NATIVE_FUNCTION(WindowObject::btoa)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- if (!interpreter.argument_count()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, "btoa");
+ if (!vm.argument_count()) {
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, "btoa");
return {};
}
- auto string = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto string = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
Vector<u8> byte_string;
byte_string.ensure_capacity(string.length());
for (u32 code_point : Utf8View(string)) {
if (code_point > 0xff) {
- interpreter.vm().throw_exception<JS::InvalidCharacterError>(global_object, JS::ErrorType::NotAByteString, "btoa");
+ vm.throw_exception<JS::InvalidCharacterError>(global_object, JS::ErrorType::NotAByteString, "btoa");
return {};
}
byte_string.append(code_point);
}
auto encoded = encode_base64(byte_string.span());
- return JS::js_string(interpreter, move(encoded));
+ return JS::js_string(vm, move(encoded));
}
JS_DEFINE_NATIVE_GETTER(WindowObject::document_getter)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
return wrap(global_object, impl->document());
diff --git a/Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.cpp b/Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.cpp
index d9e3310e1e..7286d10f50 100644
--- a/Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.cpp
+++ b/Libraries/LibWeb/Bindings/XMLHttpRequestPrototype.cpp
@@ -58,13 +58,13 @@ XMLHttpRequestPrototype::~XMLHttpRequestPrototype()
{
}
-static XMLHttpRequest* impl_from(JS::Interpreter& interpreter, JS::GlobalObject& global_object)
+static XMLHttpRequest* impl_from(JS::VM& vm, JS::GlobalObject& global_object)
{
- auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);
+ auto* this_object = vm.this_value(global_object).to_object(global_object);
if (!this_object)
return nullptr;
if (StringView("XMLHttpRequestWrapper") != this_object->class_name()) {
- interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, "XMLHttpRequest");
+ vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, "XMLHttpRequest");
return nullptr;
}
return &static_cast<XMLHttpRequestWrapper*>(this_object)->impl();
@@ -72,14 +72,14 @@ static XMLHttpRequest* impl_from(JS::Interpreter& interpreter, JS::GlobalObject&
JS_DEFINE_NATIVE_FUNCTION(XMLHttpRequestPrototype::open)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- auto arg0 = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto arg0 = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
- auto arg1 = interpreter.argument(1).to_string(interpreter);
- if (interpreter.exception())
+ auto arg1 = vm.argument(1).to_string(global_object);
+ if (vm.exception())
return {};
impl->open(arg0, arg1);
return JS::js_undefined();
@@ -87,7 +87,7 @@ JS_DEFINE_NATIVE_FUNCTION(XMLHttpRequestPrototype::open)
JS_DEFINE_NATIVE_FUNCTION(XMLHttpRequestPrototype::send)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
impl->send();
@@ -96,7 +96,7 @@ JS_DEFINE_NATIVE_FUNCTION(XMLHttpRequestPrototype::send)
JS_DEFINE_NATIVE_GETTER(XMLHttpRequestPrototype::ready_state_getter)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
return JS::Value((i32)impl->ready_state());
@@ -104,10 +104,10 @@ JS_DEFINE_NATIVE_GETTER(XMLHttpRequestPrototype::ready_state_getter)
JS_DEFINE_NATIVE_GETTER(XMLHttpRequestPrototype::response_text_getter)
{
- auto* impl = impl_from(interpreter, global_object);
+ auto* impl = impl_from(vm, global_object);
if (!impl)
return {};
- return JS::js_string(interpreter, impl->response_text());
+ return JS::js_string(vm, impl->response_text());
}
}
diff --git a/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp b/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp
index 65cd7f3838..22e4075d33 100644
--- a/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp
+++ b/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp
@@ -500,13 +500,13 @@ void generate_implementation(const IDL::Interface& interface)
// Implementation: impl_from()
if (!interface.attributes.is_empty() || !interface.functions.is_empty()) {
- out() << "static " << interface.fully_qualified_name << "* impl_from(JS::Interpreter& interpreter, JS::GlobalObject& global_object)";
+ out() << "static " << interface.fully_qualified_name << "* impl_from(JS::VM& vm, JS::GlobalObject& global_object)";
out() << "{";
- out() << " auto* this_object = interpreter.this_value(global_object).to_object(interpreter, global_object);";
+ out() << " auto* this_object = vm.this_value(global_object).to_object(global_object);";
out() << " if (!this_object)";
out() << " return {};";
out() << " if (!this_object->inherits(\"" << wrapper_class << "\")) {";
- out() << " interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, \"" << interface.fully_qualified_name << "\");";
+ out() << " vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, \"" << interface.fully_qualified_name << "\");";
out() << " return nullptr;";
out() << " }";
out() << " return &static_cast<" << wrapper_class << "*>(this_object)->impl();";
@@ -521,27 +521,27 @@ void generate_implementation(const IDL::Interface& interface)
out() << " return {};";
};
if (parameter.type.name == "DOMString") {
- out() << " auto " << cpp_name << " = " << js_name << js_suffix << ".to_string(interpreter);";
- out() << " if (interpreter.exception())";
+ out() << " auto " << cpp_name << " = " << js_name << js_suffix << ".to_string(global_object);";
+ out() << " if (vm.exception())";
generate_return();
} else if (parameter.type.name == "EventListener") {
out() << " if (!" << js_name << js_suffix << ".is_function()) {";
- out() << " interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, \"Function\");";
+ out() << " vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, \"Function\");";
generate_return();
out() << " }";
out() << " auto " << cpp_name << " = adopt(*new EventListener(JS::make_handle(&" << js_name << js_suffix << ".as_function())));";
} else if (is_wrappable_type(parameter.type)) {
- out() << " auto " << cpp_name << "_object = " << js_name << js_suffix << ".to_object(interpreter, global_object);";
- out() << " if (interpreter.exception())";
+ out() << " auto " << cpp_name << "_object = " << js_name << js_suffix << ".to_object(global_object);";
+ out() << " if (vm.exception())";
generate_return();
out() << " if (!" << cpp_name << "_object->inherits(\"" << parameter.type.name << "Wrapper\")) {";
- out() << " interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, \"" << parameter.type.name << "\");";
+ out() << " vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, \"" << parameter.type.name << "\");";
generate_return();
out() << " }";
out() << " auto& " << cpp_name << " = static_cast<" << parameter.type.name << "Wrapper*>(" << cpp_name << "_object)->impl();";
} else if (parameter.type.name == "double") {
- out() << " auto " << cpp_name << " = " << js_name << js_suffix << ".to_double(interpreter);";
- out() << " if (interpreter.exception())";
+ out() << " auto " << cpp_name << " = " << js_name << js_suffix << ".to_double(global_object);";
+ out() << " if (vm.exception())";
generate_return();
} else if (parameter.type.name == "boolean") {
out() << " auto " << cpp_name << " = " << js_name << js_suffix << ".to_boolean();";
@@ -556,7 +556,7 @@ void generate_implementation(const IDL::Interface& interface)
size_t argument_index = 0;
for (auto& parameter : parameters) {
parameter_names.append(snake_name(parameter.name));
- out() << " auto arg" << argument_index << " = interpreter.argument(" << argument_index << ");";
+ out() << " auto arg" << argument_index << " = vm.argument(" << argument_index << ");";
generate_to_cpp(parameter, "arg", argument_index, snake_name(parameter.name), return_void);
++argument_index;
}
@@ -580,7 +580,7 @@ void generate_implementation(const IDL::Interface& interface)
}
if (return_type.name == "DOMString") {
- out() << " return JS::js_string(interpreter, retval);";
+ out() << " return JS::js_string(vm, retval);";
} else if (return_type.name == "ArrayFromVector") {
// FIXME: Remove this fake type hack once it's no longer needed.
// Basically once we have NodeList we can throw this out.
@@ -604,7 +604,7 @@ void generate_implementation(const IDL::Interface& interface)
for (auto& attribute : interface.attributes) {
out() << "JS_DEFINE_NATIVE_GETTER(" << wrapper_class << "::" << attribute.getter_callback_name << ")";
out() << "{";
- out() << " auto* impl = impl_from(interpreter, global_object);";
+ out() << " auto* impl = impl_from(vm, global_object);";
out() << " if (!impl)";
out() << " return {};";
@@ -629,7 +629,7 @@ void generate_implementation(const IDL::Interface& interface)
if (!attribute.readonly) {
out() << "JS_DEFINE_NATIVE_SETTER(" << wrapper_class << "::" << attribute.setter_callback_name << ")";
out() << "{";
- out() << " auto* impl = impl_from(interpreter, global_object);";
+ out() << " auto* impl = impl_from(vm, global_object);";
out() << " if (!impl)";
out() << " return;";
@@ -652,15 +652,15 @@ void generate_implementation(const IDL::Interface& interface)
for (auto& function : interface.functions) {
out() << "JS_DEFINE_NATIVE_FUNCTION(" << wrapper_class << "::" << snake_name(function.name) << ")";
out() << "{";
- out() << " auto* impl = impl_from(interpreter, global_object);";
+ out() << " auto* impl = impl_from(vm, global_object);";
out() << " if (!impl)";
out() << " return {};";
if (function.length() > 0) {
- out() << " if (interpreter.argument_count() < " << function.length() << ") {";
+ out() << " if (vm.argument_count() < " << function.length() << ") {";
if (function.length() == 1)
- out() << " interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, \"" << function.name << "\");";
+ out() << " vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountOne, \"" << function.name << "\");";
else
- out() << " interpreter.vm().throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountMany, \"" << function.name << "\", \"" << function.length() << "\");";
+ out() << " vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::BadArgCountMany, \"" << function.name << "\", \"" << function.length() << "\");";
out() << " return {};";
out() << " }";
}
diff --git a/Userland/js.cpp b/Userland/js.cpp
index 24b0d05e1e..c455ead699 100644
--- a/Userland/js.cpp
+++ b/Userland/js.cpp
@@ -390,9 +390,9 @@ ReplObject::~ReplObject()
JS_DEFINE_NATIVE_FUNCTION(ReplObject::save_to_file)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return JS::Value(false);
- String save_path = interpreter.argument(0).to_string_without_side_effects();
+ String save_path = vm.argument(0).to_string_without_side_effects();
StringView path = StringView(save_path.characters());
if (write_to_file(path)) {
return JS::Value(true);
@@ -402,9 +402,9 @@ JS_DEFINE_NATIVE_FUNCTION(ReplObject::save_to_file)
JS_DEFINE_NATIVE_FUNCTION(ReplObject::exit_interpreter)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
exit(0);
- auto exit_code = interpreter.argument(0).to_number(interpreter);
+ auto exit_code = vm.argument(0).to_number(global_object);
if (::vm->exception())
return {};
exit(exit_code.as_double());
@@ -422,10 +422,10 @@ JS_DEFINE_NATIVE_FUNCTION(ReplObject::repl_help)
JS_DEFINE_NATIVE_FUNCTION(ReplObject::load_file)
{
- if (!interpreter.argument_count())
+ if (!vm.argument_count())
return JS::Value(false);
- for (auto& file : interpreter.call_frame().arguments) {
+ for (auto& file : vm.call_frame().arguments) {
String file_name = file.as_string().string();
auto js_file = Core::File::construct(file_name);
if (!js_file->open(Core::IODevice::ReadOnly)) {
@@ -439,7 +439,7 @@ JS_DEFINE_NATIVE_FUNCTION(ReplObject::load_file)
} else {
source = file_contents;
}
- parse_and_run(interpreter, source);
+ parse_and_run(vm.interpreter(), source);
}
return JS::Value(true);
}
@@ -822,7 +822,7 @@ int main(int argc, char** argv)
if (!variable.is_object())
break;
- const auto* object = variable.to_object(*interpreter, interpreter->global_object());
+ const auto* object = variable.to_object(interpreter->global_object());
const auto& shape = object->shape();
list_all_properties(shape, property_name);
if (results.size())
diff --git a/Userland/test-js.cpp b/Userland/test-js.cpp
index 6c4b1e056c..ff30d99d42 100644
--- a/Userland/test-js.cpp
+++ b/Userland/test-js.cpp
@@ -160,7 +160,7 @@ void TestRunnerGlobalObject::initialize()
JS_DEFINE_NATIVE_FUNCTION(TestRunnerGlobalObject::is_strict_mode)
{
- return JS::Value(interpreter.in_strict_mode());
+ return JS::Value(vm.interpreter().in_strict_mode());
}
static void cleanup_and_exit()
diff --git a/Userland/test-web.cpp b/Userland/test-web.cpp
index 49f77668e5..aaaae3a9ce 100644
--- a/Userland/test-web.cpp
+++ b/Userland/test-web.cpp
@@ -125,8 +125,8 @@ TestRunnerObject::~TestRunnerObject()
JS_DEFINE_NATIVE_FUNCTION(TestRunnerObject::change_page)
{
- auto url = interpreter.argument(0).to_string(interpreter);
- if (interpreter.exception())
+ auto url = vm.argument(0).to_string(global_object);
+ if (vm.exception())
return {};
if (g_on_page_change)