From 597102335389540fa4b51c1ebc20dd4e55a88585 Mon Sep 17 00:00:00 2001 From: machenbach Date: Tue, 18 Apr 2017 12:19:53 -0700 Subject: [PATCH] Revert of [errors] Improve NotGeneric error message (patchset #3 id:40001 of https://codereview.chromium.org/2814043006/ ) Reason for revert: Please schedule rebasing layout test first: https://build.chromium.org/p/client.v8.fyi/builders/V8-Blink%20Linux%2064/builds/15036 https://github.com/v8/v8/wiki/Blink-layout-tests Original issue's description: > [errors] Improve NotGeneric error message > > This changes the message from > > "method_name is not generic" > > to > > "method_name requires that 'this' be a primitive_name object" > > BUG=v8:6206 > > Review-Url: https://codereview.chromium.org/2814043006 > Cr-Commit-Position: refs/heads/master@{#44683} > Committed: https://chromium.googlesource.com/v8/v8/+/21b104e3b83569b52539ecaa83e68a3646065101 TBR=littledan@chromium.org,yangguo@chromium.org,jgruber@chromium.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=v8:6206 Review-Url: https://codereview.chromium.org/2825123002 Cr-Commit-Position: refs/heads/master@{#44701} --- src/builtins/builtins-function.cc | 3 +-- src/builtins/builtins-number.cc | 15 ++++------- src/code-stub-assembler.cc | 23 +++-------------- src/messages.h | 2 +- src/runtime/runtime-internal.cc | 8 ++++++ src/runtime/runtime.h | 1 + test/mjsunit/messages.js | 42 +++++++++++++++---------------- 7 files changed, 40 insertions(+), 54 deletions(-) diff --git a/src/builtins/builtins-function.cc b/src/builtins/builtins-function.cc index 7db1899b64..d93c2ee80b 100644 --- a/src/builtins/builtins-function.cc +++ b/src/builtins/builtins-function.cc @@ -312,8 +312,7 @@ BUILTIN(FunctionPrototypeToString) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Function.prototype.toString"), - isolate->factory()->Function_string())); + "Function.prototype.toString"))); } } // namespace internal diff --git a/src/builtins/builtins-number.cc b/src/builtins/builtins-number.cc index 346bafa1ae..25a1bad240 100644 --- a/src/builtins/builtins-number.cc +++ b/src/builtins/builtins-number.cc @@ -29,8 +29,7 @@ BUILTIN(NumberPrototypeToExponential) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toExponential"), - isolate->factory()->Number_string())); + "Number.prototype.toExponential"))); } double const value_number = value->Number(); @@ -73,8 +72,7 @@ BUILTIN(NumberPrototypeToFixed) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toFixed"), - isolate->factory()->Number_string())); + "Number.prototype.toFixed"))); } double const value_number = value->Number(); @@ -116,8 +114,7 @@ BUILTIN(NumberPrototypeToLocaleString) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toLocaleString"), - isolate->factory()->Number_string())); + "Number.prototype.toLocaleString"))); } // Turn the {value} into a String. @@ -138,8 +135,7 @@ BUILTIN(NumberPrototypeToPrecision) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toPrecision"), - isolate->factory()->Number_string())); + "Number.prototype.toPrecision"))); } double const value_number = value->Number(); @@ -183,8 +179,7 @@ BUILTIN(NumberPrototypeToString) { THROW_NEW_ERROR_RETURN_FAILURE( isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate->factory()->NewStringFromAsciiChecked( - "Number.prototype.toString"), - isolate->factory()->Number_string())); + "Number.prototype.toString"))); } double const value_number = value->Number(); diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc index c4b26ef697..b83ffbd53d 100644 --- a/src/code-stub-assembler.cc +++ b/src/code-stub-assembler.cc @@ -2900,27 +2900,10 @@ 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::kThrowTypeError, context, - SmiConstant(MessageTemplate::kNotGeneric), - CStringConstant(method_name), CStringConstant(primitive_name)); + CallRuntime(Runtime::kThrowNotGeneric, context, + HeapConstant(factory()->NewStringFromAsciiChecked(method_name, + TENURED))); Unreachable(); } diff --git a/src/messages.h b/src/messages.h index 0674b1ae30..71cecb2f8f 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, "% requires that 'this' be a %") \ + T(NotGeneric, "% is not generic") \ 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 7348d5f007..3a51c0a0c1 100644 --- a/src/runtime/runtime-internal.cc +++ b/src/runtime/runtime-internal.cc @@ -288,6 +288,14 @@ 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 5e5e95a38f..4d9f0b39d6 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -322,6 +322,7 @@ 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 ff91185a72..9c25004861 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(() => String.prototype.toString.call(1), - "String.prototype.toString requires that 'this' be a String", - TypeError); +test(function() { + String.prototype.toString.call(1); +}, "String.prototype.toString is not generic", TypeError); -test(() => String.prototype.valueOf.call(1), - "String.prototype.valueOf requires that 'this' be a String", - TypeError); +test(function() { + String.prototype.valueOf.call(1); +}, "String.prototype.valueOf is not generic", TypeError); -test(() => Boolean.prototype.toString.call(1), - "Boolean.prototype.toString requires that 'this' be a Boolean", - TypeError); +test(function() { + Boolean.prototype.toString.call(1); +}, "Boolean.prototype.toString is not generic", TypeError); -test(() => Boolean.prototype.valueOf.call(1), - "Boolean.prototype.valueOf requires that 'this' be a Boolean", - TypeError); +test(function() { + Boolean.prototype.valueOf.call(1); +}, "Boolean.prototype.valueOf is not generic", TypeError); -test(() => Number.prototype.toString.call({}), - "Number.prototype.toString requires that 'this' be a Number", - TypeError); +test(function() { + Number.prototype.toString.call({}); +}, "Number.prototype.toString is not generic", TypeError); -test(() => Number.prototype.valueOf.call({}), - "Number.prototype.valueOf requires that 'this' be a Number", - TypeError); +test(function() { + Number.prototype.valueOf.call({}); +}, "Number.prototype.valueOf is not generic", TypeError); -test(() => Function.prototype.toString.call(1), - "Function.prototype.toString requires that 'this' be a Function", - TypeError); +test(function() { + Function.prototype.toString.call(1); +}, "Function.prototype.toString is not generic", TypeError); // kNotTypedArray test(function() {