diff --git a/src/builtins/builtins-function.cc b/src/builtins/builtins-function.cc index d93c2ee80b..7db1899b64 100644 --- a/src/builtins/builtins-function.cc +++ b/src/builtins/builtins-function.cc @@ -312,7 +312,8 @@ BUILTIN(FunctionPrototypeToString) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Function.prototype.toString"))); + "Function.prototype.toString"), + isolate->factory()->Function_string())); } } // namespace internal diff --git a/src/builtins/builtins-number.cc b/src/builtins/builtins-number.cc index 25a1bad240..346bafa1ae 100644 --- a/src/builtins/builtins-number.cc +++ b/src/builtins/builtins-number.cc @@ -29,7 +29,8 @@ BUILTIN(NumberPrototypeToExponential) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toExponential"))); + "Number.prototype.toExponential"), + isolate->factory()->Number_string())); } double const value_number = value->Number(); @@ -72,7 +73,8 @@ BUILTIN(NumberPrototypeToFixed) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toFixed"))); + "Number.prototype.toFixed"), + isolate->factory()->Number_string())); } double const value_number = value->Number(); @@ -114,7 +116,8 @@ BUILTIN(NumberPrototypeToLocaleString) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toLocaleString"))); + "Number.prototype.toLocaleString"), + isolate->factory()->Number_string())); } // Turn the {value} into a String. @@ -135,7 +138,8 @@ BUILTIN(NumberPrototypeToPrecision) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toPrecision"))); + "Number.prototype.toPrecision"), + isolate->factory()->Number_string())); } double const value_number = value->Number(); @@ -179,7 +183,8 @@ BUILTIN(NumberPrototypeToString) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toString"))); + "Number.prototype.toString"), + isolate->factory()->Number_string())); } double const value_number = value->Number(); diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc index b83ffbd53d..c4b26ef697 100644 --- a/src/code-stub-assembler.cc +++ b/src/code-stub-assembler.cc @@ -2900,10 +2900,27 @@ Node* CodeStubAssembler::ToThisValue(Node* context, Node* value, BIND(&done_throw); { + const char* primitive_name = nullptr; + switch (primitive_type) { + case PrimitiveType::kBoolean: + primitive_name = "Boolean"; + break; + case PrimitiveType::kNumber: + primitive_name = "Number"; + break; + case PrimitiveType::kString: + primitive_name = "String"; + break; + case PrimitiveType::kSymbol: + primitive_name = "Symbol"; + break; + } + CHECK_NOT_NULL(primitive_name); + // The {value} is not a compatible receiver for this method. - CallRuntime(Runtime::kThrowNotGeneric, context, - HeapConstant(factory()->NewStringFromAsciiChecked(method_name, - TENURED))); + CallRuntime(Runtime::kThrowTypeError, context, + SmiConstant(MessageTemplate::kNotGeneric), + CStringConstant(method_name), CStringConstant(primitive_name)); Unreachable(); } diff --git a/src/messages.h b/src/messages.h index 71cecb2f8f..0674b1ae30 100644 --- a/src/messages.h +++ b/src/messages.h @@ -342,7 +342,7 @@ class ErrorUtils : public AllStatic { T(NotConstructor, "% is not a constructor") \ T(NotDateObject, "this is not a Date object.") \ T(NotIntlObject, "% is not an i18n object.") \ - T(NotGeneric, "% is not generic") \ + T(NotGeneric, "% requires that 'this' be a %") \ T(NotIterable, "% is not iterable") \ T(NotPropertyName, "% is not a valid property name") \ T(NotTypedArray, "this is not a typed array.") \ diff --git a/src/runtime/runtime-internal.cc b/src/runtime/runtime-internal.cc index 3a51c0a0c1..7348d5f007 100644 --- a/src/runtime/runtime-internal.cc +++ b/src/runtime/runtime-internal.cc @@ -288,14 +288,6 @@ RUNTIME_FUNCTION(Runtime_ThrowNotConstructor) { isolate, NewTypeError(MessageTemplate::kNotConstructor, object)); } -RUNTIME_FUNCTION(Runtime_ThrowNotGeneric) { - HandleScope scope(isolate); - DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(Object, arg0, 0); - THROW_NEW_ERROR_RETURN_FAILURE( - isolate, NewTypeError(MessageTemplate::kNotGeneric, arg0)); -} - RUNTIME_FUNCTION(Runtime_ThrowGeneratorRunning) { HandleScope scope(isolate); DCHECK_EQ(0, args.length()); diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 4d9f0b39d6..5e5e95a38f 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -322,7 +322,6 @@ namespace internal { F(ThrowNonCallableInInstanceOfCheck, 0, 1) \ F(ThrowNonObjectInInstanceOfCheck, 0, 1) \ F(ThrowNotConstructor, 1, 1) \ - F(ThrowNotGeneric, 1, 1) \ F(ThrowRangeError, -1 /* >= 1 */, 1) \ F(ThrowReferenceError, 1, 1) \ F(ThrowStackOverflow, 0, 1) \ diff --git a/test/mjsunit/messages.js b/test/mjsunit/messages.js index 9c25004861..ff91185a72 100644 --- a/test/mjsunit/messages.js +++ b/test/mjsunit/messages.js @@ -192,33 +192,33 @@ test(function() { }, "this is not a Date object.", TypeError); // kNotGeneric -test(function() { - String.prototype.toString.call(1); -}, "String.prototype.toString is not generic", TypeError); +test(() => String.prototype.toString.call(1), + "String.prototype.toString requires that 'this' be a String", + TypeError); -test(function() { - String.prototype.valueOf.call(1); -}, "String.prototype.valueOf is not generic", TypeError); +test(() => String.prototype.valueOf.call(1), + "String.prototype.valueOf requires that 'this' be a String", + TypeError); -test(function() { - Boolean.prototype.toString.call(1); -}, "Boolean.prototype.toString is not generic", TypeError); +test(() => Boolean.prototype.toString.call(1), + "Boolean.prototype.toString requires that 'this' be a Boolean", + TypeError); -test(function() { - Boolean.prototype.valueOf.call(1); -}, "Boolean.prototype.valueOf is not generic", TypeError); +test(() => Boolean.prototype.valueOf.call(1), + "Boolean.prototype.valueOf requires that 'this' be a Boolean", + TypeError); -test(function() { - Number.prototype.toString.call({}); -}, "Number.prototype.toString is not generic", TypeError); +test(() => Number.prototype.toString.call({}), + "Number.prototype.toString requires that 'this' be a Number", + TypeError); -test(function() { - Number.prototype.valueOf.call({}); -}, "Number.prototype.valueOf is not generic", TypeError); +test(() => Number.prototype.valueOf.call({}), + "Number.prototype.valueOf requires that 'this' be a Number", + TypeError); -test(function() { - Function.prototype.toString.call(1); -}, "Function.prototype.toString is not generic", TypeError); +test(() => Function.prototype.toString.call(1), + "Function.prototype.toString requires that 'this' be a Function", + TypeError); // kNotTypedArray test(function() {