diff options
author | Linus Groh <mail@linusgroh.de> | 2021-06-06 16:31:03 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-06-06 19:34:43 +0200 |
commit | d255e6892b133a0a974396a07a553e9efc19f860 (patch) | |
tree | 68676afdc02e9017c9169a459aeaae07edc87412 | |
parent | 3cfd9f51f7bc0534866a1d4c624724ca0669c614 (diff) | |
download | serenity-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.
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" ); }); }); |