| 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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 return "#<" + constructorName + ">"; | 159 return "#<" + constructorName + ">"; |
| 159 } | 160 } |
| 160 } | 161 } |
| 161 } | 162 } |
| 162 return ToStringCheckErrorObject(obj); | 163 return ToStringCheckErrorObject(obj); |
| 163 } | 164 } |
| 164 | 165 |
| 165 | 166 |
| 166 function MakeGenericError(constructor, type, arg0, arg1, arg2) { | 167 function MakeGenericError(constructor, type, arg0, arg1, arg2) { |
| 167 if (IS_UNDEFINED(arg0) && IS_STRING(type)) arg0 = []; | 168 if (IS_UNDEFINED(arg0) && IS_STRING(type)) arg0 = []; |
| 168 return new constructor(FormatMessage(type, arg0, arg1, arg2)); | 169 var error = new constructor(FormatMessage(type, arg0, arg1, arg2)); |
| 170 error[$internalErrorSymbol] = true; |
| 171 return error; |
| 169 } | 172 } |
| 170 | 173 |
| 171 | 174 |
| 172 /** | 175 /** |
| 173 * Set up the Script function and constructor. | 176 * Set up the Script function and constructor. |
| 174 */ | 177 */ |
| 175 %FunctionSetInstanceClassName(Script, 'Script'); | 178 %FunctionSetInstanceClassName(Script, 'Script'); |
| 176 %AddNamedProperty(Script.prototype, 'constructor', Script, | 179 %AddNamedProperty(Script.prototype, 'constructor', Script, |
| 177 DONT_ENUM | DONT_DELETE | READ_ONLY); | 180 DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 178 %SetCode(Script, function(x) { | 181 %SetCode(Script, function(x) { |
| (...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 977 GlobalError = DefineError(global, function Error() { }); | 980 GlobalError = DefineError(global, function Error() { }); |
| 978 GlobalEvalError = DefineError(global, function EvalError() { }); | 981 GlobalEvalError = DefineError(global, function EvalError() { }); |
| 979 GlobalRangeError = DefineError(global, function RangeError() { }); | 982 GlobalRangeError = DefineError(global, function RangeError() { }); |
| 980 GlobalReferenceError = DefineError(global, function ReferenceError() { }); | 983 GlobalReferenceError = DefineError(global, function ReferenceError() { }); |
| 981 GlobalSyntaxError = DefineError(global, function SyntaxError() { }); | 984 GlobalSyntaxError = DefineError(global, function SyntaxError() { }); |
| 982 GlobalTypeError = DefineError(global, function TypeError() { }); | 985 GlobalTypeError = DefineError(global, function TypeError() { }); |
| 983 GlobalURIError = DefineError(global, function URIError() { }); | 986 GlobalURIError = DefineError(global, function URIError() { }); |
| 984 | 987 |
| 985 %AddNamedProperty(GlobalError.prototype, 'message', '', DONT_ENUM); | 988 %AddNamedProperty(GlobalError.prototype, 'message', '', DONT_ENUM); |
| 986 | 989 |
| 987 // Global list of error objects visited during ErrorToString. This is | |
| 988 // used to detect cycles in error toString formatting. | |
| 989 var visited_errors = new InternalArray(); | |
| 990 var cyclic_error_marker = new GlobalObject(); | |
| 991 | |
| 992 function GetPropertyWithoutInvokingMonkeyGetters(error, name) { | |
| 993 var current = error; | |
| 994 // Climb the prototype chain until we find the holder. | |
| 995 while (current && !%HasOwnProperty(current, name)) { | |
| 996 current = %_GetPrototype(current); | |
| 997 } | |
| 998 if (IS_NULL(current)) return UNDEFINED; | |
| 999 if (!IS_OBJECT(current)) return error[name]; | |
| 1000 // If the property is an accessor on one of the predefined errors that can be | |
| 1001 // generated statically by the compiler, don't touch it. This is to address | |
| 1002 // http://code.google.com/p/chromium/issues/detail?id=69187 | |
| 1003 var desc = %GetOwnProperty(current, name); | |
| 1004 if (desc && desc[IS_ACCESSOR_INDEX]) { | |
| 1005 var isName = name === "name"; | |
| 1006 if (current === GlobalReferenceError.prototype) | |
| 1007 return isName ? "ReferenceError" : UNDEFINED; | |
| 1008 if (current === GlobalSyntaxError.prototype) | |
| 1009 return isName ? "SyntaxError" : UNDEFINED; | |
| 1010 if (current === GlobalTypeError.prototype) | |
| 1011 return isName ? "TypeError" : UNDEFINED; | |
| 1012 } | |
| 1013 // Otherwise, read normally. | |
| 1014 return error[name]; | |
| 1015 } | |
| 1016 | |
| 1017 function ErrorToStringDetectCycle(error) { | |
| 1018 if (!%PushIfAbsent(visited_errors, error)) throw cyclic_error_marker; | |
| 1019 try { | |
| 1020 var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name"); | |
| 1021 name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name); | |
| 1022 var message = GetPropertyWithoutInvokingMonkeyGetters(error, "message"); | |
| 1023 message = IS_UNDEFINED(message) ? "" : TO_STRING_INLINE(message); | |
| 1024 if (name === "") return message; | |
| 1025 if (message === "") return name; | |
| 1026 return name + ": " + message; | |
| 1027 } finally { | |
| 1028 visited_errors.length = visited_errors.length - 1; | |
| 1029 } | |
| 1030 } | |
| 1031 | |
| 1032 function ErrorToString() { | 990 function ErrorToString() { |
| 1033 if (!IS_SPEC_OBJECT(this)) { | 991 if (!IS_SPEC_OBJECT(this)) { |
| 1034 throw MakeTypeError(kCalledOnNonObject, "Error.prototype.toString"); | 992 throw MakeTypeError(kCalledOnNonObject, "Error.prototype.toString"); |
| 1035 } | 993 } |
| 1036 | 994 |
| 1037 try { | 995 return %ErrorToStringRT(this); |
| 1038 return ErrorToStringDetectCycle(this); | |
| 1039 } catch(e) { | |
| 1040 // If this error message was encountered already return the empty | |
| 1041 // string for it instead of recursively formatting it. | |
| 1042 if (e === cyclic_error_marker) { | |
| 1043 return ''; | |
| 1044 } | |
| 1045 throw e; | |
| 1046 } | |
| 1047 } | 996 } |
| 1048 | 997 |
| 1049 utils.InstallFunctions(GlobalError.prototype, DONT_ENUM, | 998 utils.InstallFunctions(GlobalError.prototype, DONT_ENUM, |
| 1050 ['toString', ErrorToString]); | 999 ['toString', ErrorToString]); |
| 1051 | 1000 |
| 1052 $errorToString = ErrorToString; | 1001 $errorToString = ErrorToString; |
| 1053 $getStackTraceLine = GetStackTraceLine; | 1002 $getStackTraceLine = GetStackTraceLine; |
| 1054 $messageGetPositionInLine = GetPositionInLine; | 1003 $messageGetPositionInLine = GetPositionInLine; |
| 1055 $messageGetLineNumber = GetLineNumber; | 1004 $messageGetLineNumber = GetLineNumber; |
| 1056 $messageGetSourceLine = GetSourceLine; | 1005 $messageGetSourceLine = GetSourceLine; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 // Define accessors first, as this may fail and throw. | 1054 // Define accessors first, as this may fail and throw. |
| 1106 ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter, | 1055 ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter, |
| 1107 set: StackTraceSetter, | 1056 set: StackTraceSetter, |
| 1108 configurable: true }); | 1057 configurable: true }); |
| 1109 %CollectStackTrace(obj, cons_opt ? cons_opt : captureStackTrace); | 1058 %CollectStackTrace(obj, cons_opt ? cons_opt : captureStackTrace); |
| 1110 }; | 1059 }; |
| 1111 | 1060 |
| 1112 GlobalError.captureStackTrace = captureStackTrace; | 1061 GlobalError.captureStackTrace = captureStackTrace; |
| 1113 | 1062 |
| 1114 }); | 1063 }); |
| OLD | NEW |