Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Unified Diff: src/messages.js

Issue 1281833002: Rewrite Error.prototype.toString in C++. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix test case Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/messages.cc ('k') | src/runtime/runtime.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/messages.js
diff --git a/src/messages.js b/src/messages.js
index ad1f4c227aeb233b193b89d67e4330a0f0511726..0f14c1ae25f2c1745b4378f35c01aa635de8034c 100644
--- a/src/messages.js
+++ b/src/messages.js
@@ -6,6 +6,7 @@
var $errorToString;
var $getStackTraceLine;
+var $internalErrorSymbol;
var $messageGetPositionInLine;
var $messageGetLineNumber;
var $messageGetSourceLine;
@@ -181,7 +182,9 @@ function ToDetailString(obj) {
function MakeGenericError(constructor, type, arg0, arg1, arg2) {
if (IS_UNDEFINED(arg0) && IS_STRING(type)) arg0 = [];
- return new constructor(FormatMessage(type, arg0, arg1, arg2));
+ var error = new constructor(FormatMessage(type, arg0, arg1, arg2));
+ error[$internalErrorSymbol] = true;
+ return error;
}
@@ -1000,66 +1003,12 @@ GlobalURIError = DefineError(global, function URIError() { });
%AddNamedProperty(GlobalError.prototype, 'message', '', DONT_ENUM);
-// Global list of error objects visited during ErrorToString. This is
-// used to detect cycles in error toString formatting.
-var visited_errors = new InternalArray();
-var cyclic_error_marker = new GlobalObject();
-
-function GetPropertyWithoutInvokingMonkeyGetters(error, name) {
- var current = error;
- // Climb the prototype chain until we find the holder.
- while (current && !%HasOwnProperty(current, name)) {
- current = %_GetPrototype(current);
- }
- if (IS_NULL(current)) return UNDEFINED;
- if (!IS_OBJECT(current)) return error[name];
- // If the property is an accessor on one of the predefined errors that can be
- // generated statically by the compiler, don't touch it. This is to address
- // http://code.google.com/p/chromium/issues/detail?id=69187
- var desc = %GetOwnProperty(current, name);
- if (desc && desc[IS_ACCESSOR_INDEX]) {
- var isName = name === "name";
- if (current === GlobalReferenceError.prototype)
- return isName ? "ReferenceError" : UNDEFINED;
- if (current === GlobalSyntaxError.prototype)
- return isName ? "SyntaxError" : UNDEFINED;
- if (current === GlobalTypeError.prototype)
- return isName ? "TypeError" : UNDEFINED;
- }
- // Otherwise, read normally.
- return error[name];
-}
-
-function ErrorToStringDetectCycle(error) {
- if (!%PushIfAbsent(visited_errors, error)) throw cyclic_error_marker;
- try {
- var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name");
- name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name);
- var message = GetPropertyWithoutInvokingMonkeyGetters(error, "message");
- message = IS_UNDEFINED(message) ? "" : TO_STRING_INLINE(message);
- if (name === "") return message;
- if (message === "") return name;
- return name + ": " + message;
- } finally {
- visited_errors.length = visited_errors.length - 1;
- }
-}
-
function ErrorToString() {
if (!IS_SPEC_OBJECT(this)) {
throw MakeTypeError(kCalledOnNonObject, "Error.prototype.toString");
}
- try {
- return ErrorToStringDetectCycle(this);
- } catch(e) {
- // If this error message was encountered already return the empty
- // string for it instead of recursively formatting it.
- if (e === cyclic_error_marker) {
- return '';
- }
- throw e;
- }
+ return %ErrorToStringRT(this);
}
utils.InstallFunctions(GlobalError.prototype, DONT_ENUM,
« no previous file with comments | « src/messages.cc ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698