From d255e6892b133a0a974396a07a553e9efc19f860 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 6 Jun 2021 16:31:03 +0100 Subject: [PATCH] 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. --- Userland/Libraries/LibJS/Runtime/ErrorTypes.h | 1 - .../LibJS/Runtime/NumberPrototype.cpp | 19 +++++++++---------- .../Number/Number.prototype.toString.js | 2 +- .../Number/Number.prototype.valueOf.js | 2 +- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/ErrorTypes.h b/Userland/Libraries/LibJS/Runtime/ErrorTypes.h index db659226262..af2b0a9d793 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 568275dee42..fcf42d87210 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(value.as_object())) + return static_cast(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(this_value.as_object())) - return static_cast(this_value.as_object()).value_of(); - vm.throw_exception(global_object, ErrorType::NumberIncompatibleThis, name); + vm.throw_exception(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 da478dcf08f..7ebc4fb748d 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 eb9cae2c59b..7871a1ed43a 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" ); }); });