summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2021-06-06 16:31:03 +0100
committerAndreas Kling <kling@serenityos.org>2021-06-06 19:34:43 +0200
commitd255e6892b133a0a974396a07a553e9efc19f860 (patch)
tree68676afdc02e9017c9169a459aeaae07edc87412
parent3cfd9f51f7bc0534866a1d4c624724ca0669c614 (diff)
downloadserenity-d255e6892b133a0a974396a07a553e9efc19f860.zip
LibJS: Update NumberPrototype's this_number_value() to take a Value
This is now about as close to the spec as it gets - instead of querying the |this| value inside of the function, we now pass it in from the outside. Also get rid of the oddly specific error messages, they're nice but pretty inconsistent with most others. Let's prefer consistency and simplicity for now. Other than that, no functionality change.
-rw-r--r--Userland/Libraries/LibJS/Runtime/ErrorTypes.h1
-rw-r--r--Userland/Libraries/LibJS/Runtime/NumberPrototype.cpp19
-rw-r--r--Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.toString.js2
-rw-r--r--Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.valueOf.js2
4 files changed, 11 insertions, 13 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/ErrorTypes.h b/Userland/Libraries/LibJS/Runtime/ErrorTypes.h
index db65922626..af2b0a9d79 100644
--- a/Userland/Libraries/LibJS/Runtime/ErrorTypes.h
+++ b/Userland/Libraries/LibJS/Runtime/ErrorTypes.h
@@ -54,7 +54,6 @@
M(NotASymbol, "{} is not a symbol") \
M(NotIterable, "{} is not iterable") \
M(NotObjectCoercible, "{} cannot be converted to an object") \
- M(NumberIncompatibleThis, "Number.prototype.{}() called with incompatible this target") \
M(ObjectDefinePropertyReturnedFalse, "Object's [[DefineProperty]] method returned false") \
M(ObjectFreezeFailed, "Could not freeze object") \
M(ObjectSealFailed, "Could not seal object") \
diff --git a/Userland/Libraries/LibJS/Runtime/NumberPrototype.cpp b/Userland/Libraries/LibJS/Runtime/NumberPrototype.cpp
index 568275dee4..fcf42d8721 100644
--- a/Userland/Libraries/LibJS/Runtime/NumberPrototype.cpp
+++ b/Userland/Libraries/LibJS/Runtime/NumberPrototype.cpp
@@ -42,22 +42,21 @@ NumberPrototype::~NumberPrototype()
{
}
-// https://tc39.es/ecma262/#thisnumbervalue
-static Value this_number_value(GlobalObject& global_object, StringView const& name)
+// thisNumberValue, https://tc39.es/ecma262/#thisnumbervalue
+static Value this_number_value(GlobalObject& global_object, Value value)
{
+ if (value.is_number())
+ return value;
+ if (value.is_object() && is<NumberObject>(value.as_object()))
+ return static_cast<NumberObject&>(value.as_object()).value_of();
auto& vm = global_object.vm();
- auto this_value = vm.this_value(global_object);
- if (this_value.is_number())
- return this_value;
- if (this_value.is_object() && is<NumberObject>(this_value.as_object()))
- return static_cast<NumberObject&>(this_value.as_object()).value_of();
- vm.throw_exception<TypeError>(global_object, ErrorType::NumberIncompatibleThis, name);
+ vm.throw_exception<TypeError>(global_object, ErrorType::NotA, "Number");
return {};
}
JS_DEFINE_NATIVE_FUNCTION(NumberPrototype::to_string)
{
- auto number_value = this_number_value(global_object, "toString");
+ auto number_value = this_number_value(global_object, vm.this_value(global_object));
if (vm.exception())
return {};
@@ -134,7 +133,7 @@ JS_DEFINE_NATIVE_FUNCTION(NumberPrototype::to_string)
JS_DEFINE_NATIVE_FUNCTION(NumberPrototype::value_of)
{
- return this_number_value(global_object, "valueOf");
+ return this_number_value(global_object, vm.this_value(global_object));
}
}
diff --git a/Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.toString.js b/Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.toString.js
index da478dcf08..7ebc4fb748 100644
--- a/Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.toString.js
+++ b/Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.toString.js
@@ -77,7 +77,7 @@ test("errors", () => {
[true, [], {}, Symbol("foo"), "bar", 1n].forEach(value => {
expect(() => Number.prototype.toString.call(value)).toThrowWithMessage(
TypeError,
- "Number.prototype.toString() called with incompatible this target"
+ "Not a Number object"
);
});
});
diff --git a/Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.valueOf.js b/Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.valueOf.js
index eb9cae2c59..7871a1ed43 100644
--- a/Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.valueOf.js
+++ b/Userland/Libraries/LibJS/Tests/builtins/Number/Number.prototype.valueOf.js
@@ -14,7 +14,7 @@ test("errors", () => {
[true, [], {}, Symbol("foo"), "bar", 1n].forEach(value => {
expect(() => Number.prototype.valueOf.call(value)).toThrowWithMessage(
TypeError,
- "Number.prototype.valueOf() called with incompatible this target"
+ "Not a Number object"
);
});
});