| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // ------------------------------------------------------------------- | 5 // ------------------------------------------------------------------- |
| 6 | 6 |
| 7 var $errorToString; | 7 var $errorToString; |
| 8 var $getStackTraceLine; | 8 var $getStackTraceLine; |
| 9 var $internalErrorSymbol; |
| 9 var $messageGetPositionInLine; | 10 var $messageGetPositionInLine; |
| 10 var $messageGetLineNumber; | 11 var $messageGetLineNumber; |
| 11 var $messageGetSourceLine; | 12 var $messageGetSourceLine; |
| 12 var $noSideEffectToString; | 13 var $noSideEffectToString; |
| 13 var $stackOverflowBoilerplate; | 14 var $stackOverflowBoilerplate; |
| 14 var $stackTraceSymbol; | 15 var $stackTraceSymbol; |
| 15 var $toDetailString; | 16 var $toDetailString; |
| 16 var $Error; | 17 var $Error; |
| 17 var $EvalError; | 18 var $EvalError; |
| 18 var $RangeError; | 19 var $RangeError; |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 return "#<" + constructorName + ">"; | 175 return "#<" + constructorName + ">"; |
| 175 } | 176 } |
| 176 } | 177 } |
| 177 } | 178 } |
| 178 return ToStringCheckErrorObject(obj); | 179 return ToStringCheckErrorObject(obj); |
| 179 } | 180 } |
| 180 | 181 |
| 181 | 182 |
| 182 function MakeGenericError(constructor, type, arg0, arg1, arg2) { | 183 function MakeGenericError(constructor, type, arg0, arg1, arg2) { |
| 183 if (IS_UNDEFINED(arg0) && IS_STRING(type)) arg0 = []; | 184 if (IS_UNDEFINED(arg0) && IS_STRING(type)) arg0 = []; |
| 184 return new constructor(FormatMessage(type, arg0, arg1, arg2)); | 185 var error = new constructor(FormatMessage(type, arg0, arg1, arg2)); |
| 186 error[$internalErrorSymbol] = true; |
| 187 return error; |
| 185 } | 188 } |
| 186 | 189 |
| 187 | 190 |
| 188 /** | 191 /** |
| 189 * Set up the Script function and constructor. | 192 * Set up the Script function and constructor. |
| 190 */ | 193 */ |
| 191 %FunctionSetInstanceClassName(Script, 'Script'); | 194 %FunctionSetInstanceClassName(Script, 'Script'); |
| 192 %AddNamedProperty(Script.prototype, 'constructor', Script, | 195 %AddNamedProperty(Script.prototype, 'constructor', Script, |
| 193 DONT_ENUM | DONT_DELETE | READ_ONLY); | 196 DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 194 %SetCode(Script, function(x) { | 197 %SetCode(Script, function(x) { |
| (...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 GlobalError = DefineError(global, function Error() { }); | 996 GlobalError = DefineError(global, function Error() { }); |
| 994 GlobalEvalError = DefineError(global, function EvalError() { }); | 997 GlobalEvalError = DefineError(global, function EvalError() { }); |
| 995 GlobalRangeError = DefineError(global, function RangeError() { }); | 998 GlobalRangeError = DefineError(global, function RangeError() { }); |
| 996 GlobalReferenceError = DefineError(global, function ReferenceError() { }); | 999 GlobalReferenceError = DefineError(global, function ReferenceError() { }); |
| 997 GlobalSyntaxError = DefineError(global, function SyntaxError() { }); | 1000 GlobalSyntaxError = DefineError(global, function SyntaxError() { }); |
| 998 GlobalTypeError = DefineError(global, function TypeError() { }); | 1001 GlobalTypeError = DefineError(global, function TypeError() { }); |
| 999 GlobalURIError = DefineError(global, function URIError() { }); | 1002 GlobalURIError = DefineError(global, function URIError() { }); |
| 1000 | 1003 |
| 1001 %AddNamedProperty(GlobalError.prototype, 'message', '', DONT_ENUM); | 1004 %AddNamedProperty(GlobalError.prototype, 'message', '', DONT_ENUM); |
| 1002 | 1005 |
| 1003 // Global list of error objects visited during ErrorToString. This is | |
| 1004 // used to detect cycles in error toString formatting. | |
| 1005 var visited_errors = new InternalArray(); | |
| 1006 var cyclic_error_marker = new GlobalObject(); | |
| 1007 | |
| 1008 function GetPropertyWithoutInvokingMonkeyGetters(error, name) { | |
| 1009 var current = error; | |
| 1010 // Climb the prototype chain until we find the holder. | |
| 1011 while (current && !%HasOwnProperty(current, name)) { | |
| 1012 current = %_GetPrototype(current); | |
| 1013 } | |
| 1014 if (IS_NULL(current)) return UNDEFINED; | |
| 1015 if (!IS_OBJECT(current)) return error[name]; | |
| 1016 // If the property is an accessor on one of the predefined errors that can be | |
| 1017 // generated statically by the compiler, don't touch it. This is to address | |
| 1018 // http://code.google.com/p/chromium/issues/detail?id=69187 | |
| 1019 var desc = %GetOwnProperty(current, name); | |
| 1020 if (desc && desc[IS_ACCESSOR_INDEX]) { | |
| 1021 var isName = name === "name"; | |
| 1022 if (current === GlobalReferenceError.prototype) | |
| 1023 return isName ? "ReferenceError" : UNDEFINED; | |
| 1024 if (current === GlobalSyntaxError.prototype) | |
| 1025 return isName ? "SyntaxError" : UNDEFINED; | |
| 1026 if (current === GlobalTypeError.prototype) | |
| 1027 return isName ? "TypeError" : UNDEFINED; | |
| 1028 } | |
| 1029 // Otherwise, read normally. | |
| 1030 return error[name]; | |
| 1031 } | |
| 1032 | |
| 1033 function ErrorToStringDetectCycle(error) { | |
| 1034 if (!%PushIfAbsent(visited_errors, error)) throw cyclic_error_marker; | |
| 1035 try { | |
| 1036 var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name"); | |
| 1037 name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name); | |
| 1038 var message = GetPropertyWithoutInvokingMonkeyGetters(error, "message"); | |
| 1039 message = IS_UNDEFINED(message) ? "" : TO_STRING_INLINE(message); | |
| 1040 if (name === "") return message; | |
| 1041 if (message === "") return name; | |
| 1042 return name + ": " + message; | |
| 1043 } finally { | |
| 1044 visited_errors.length = visited_errors.length - 1; | |
| 1045 } | |
| 1046 } | |
| 1047 | |
| 1048 function ErrorToString() { | 1006 function ErrorToString() { |
| 1049 if (!IS_SPEC_OBJECT(this)) { | 1007 if (!IS_SPEC_OBJECT(this)) { |
| 1050 throw MakeTypeError(kCalledOnNonObject, "Error.prototype.toString"); | 1008 throw MakeTypeError(kCalledOnNonObject, "Error.prototype.toString"); |
| 1051 } | 1009 } |
| 1052 | 1010 |
| 1053 try { | 1011 return %ErrorToStringRT(this); |
| 1054 return ErrorToStringDetectCycle(this); | |
| 1055 } catch(e) { | |
| 1056 // If this error message was encountered already return the empty | |
| 1057 // string for it instead of recursively formatting it. | |
| 1058 if (e === cyclic_error_marker) { | |
| 1059 return ''; | |
| 1060 } | |
| 1061 throw e; | |
| 1062 } | |
| 1063 } | 1012 } |
| 1064 | 1013 |
| 1065 utils.InstallFunctions(GlobalError.prototype, DONT_ENUM, | 1014 utils.InstallFunctions(GlobalError.prototype, DONT_ENUM, |
| 1066 ['toString', ErrorToString]); | 1015 ['toString', ErrorToString]); |
| 1067 | 1016 |
| 1068 $errorToString = ErrorToString; | 1017 $errorToString = ErrorToString; |
| 1069 $getStackTraceLine = GetStackTraceLine; | 1018 $getStackTraceLine = GetStackTraceLine; |
| 1070 $messageGetPositionInLine = GetPositionInLine; | 1019 $messageGetPositionInLine = GetPositionInLine; |
| 1071 $messageGetLineNumber = GetLineNumber; | 1020 $messageGetLineNumber = GetLineNumber; |
| 1072 $messageGetSourceLine = GetSourceLine; | 1021 $messageGetSourceLine = GetSourceLine; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1121 // Define accessors first, as this may fail and throw. | 1070 // Define accessors first, as this may fail and throw. |
| 1122 ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter, | 1071 ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter, |
| 1123 set: StackTraceSetter, | 1072 set: StackTraceSetter, |
| 1124 configurable: true }); | 1073 configurable: true }); |
| 1125 %CollectStackTrace(obj, cons_opt ? cons_opt : captureStackTrace); | 1074 %CollectStackTrace(obj, cons_opt ? cons_opt : captureStackTrace); |
| 1126 }; | 1075 }; |
| 1127 | 1076 |
| 1128 GlobalError.captureStackTrace = captureStackTrace; | 1077 GlobalError.captureStackTrace = captureStackTrace; |
| 1129 | 1078 |
| 1130 }); | 1079 }); |
| OLD | NEW |