OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 var CallSiteStrictModeKey = %CreateSymbol("strict mode"); | 789 var CallSiteStrictModeKey = %CreateSymbol("strict mode"); |
790 | 790 |
791 function CallSite(receiver, fun, pos, strict_mode) { | 791 function CallSite(receiver, fun, pos, strict_mode) { |
792 this[CallSiteReceiverKey] = receiver; | 792 this[CallSiteReceiverKey] = receiver; |
793 this[CallSiteFunctionKey] = fun; | 793 this[CallSiteFunctionKey] = fun; |
794 this[CallSitePositionKey] = pos; | 794 this[CallSitePositionKey] = pos; |
795 this[CallSiteStrictModeKey] = strict_mode; | 795 this[CallSiteStrictModeKey] = strict_mode; |
796 } | 796 } |
797 | 797 |
798 function CallSiteGetThis() { | 798 function CallSiteGetThis() { |
799 return this[CallSiteStrictModeKey] ? void 0 : this[CallSiteReceiverKey]; | 799 return this[CallSiteStrictModeKey] ? UNDEFINED : this[CallSiteReceiverKey]; |
800 } | 800 } |
801 | 801 |
802 function CallSiteGetTypeName() { | 802 function CallSiteGetTypeName() { |
803 return GetTypeName(this[CallSiteReceiverKey], false); | 803 return GetTypeName(this[CallSiteReceiverKey], false); |
804 } | 804 } |
805 | 805 |
806 function CallSiteIsToplevel() { | 806 function CallSiteIsToplevel() { |
807 if (this[CallSiteReceiverKey] == null) { | 807 if (this[CallSiteReceiverKey] == null) { |
808 return true; | 808 return true; |
809 } | 809 } |
810 return IS_GLOBAL(this[CallSiteReceiverKey]); | 810 return IS_GLOBAL(this[CallSiteReceiverKey]); |
811 } | 811 } |
812 | 812 |
813 function CallSiteIsEval() { | 813 function CallSiteIsEval() { |
814 var script = %FunctionGetScript(this[CallSiteFunctionKey]); | 814 var script = %FunctionGetScript(this[CallSiteFunctionKey]); |
815 return script && script.compilation_type == COMPILATION_TYPE_EVAL; | 815 return script && script.compilation_type == COMPILATION_TYPE_EVAL; |
816 } | 816 } |
817 | 817 |
818 function CallSiteGetEvalOrigin() { | 818 function CallSiteGetEvalOrigin() { |
819 var script = %FunctionGetScript(this[CallSiteFunctionKey]); | 819 var script = %FunctionGetScript(this[CallSiteFunctionKey]); |
820 return FormatEvalOrigin(script); | 820 return FormatEvalOrigin(script); |
821 } | 821 } |
822 | 822 |
823 function CallSiteGetScriptNameOrSourceURL() { | 823 function CallSiteGetScriptNameOrSourceURL() { |
824 var script = %FunctionGetScript(this[CallSiteFunctionKey]); | 824 var script = %FunctionGetScript(this[CallSiteFunctionKey]); |
825 return script ? script.nameOrSourceURL() : null; | 825 return script ? script.nameOrSourceURL() : null; |
826 } | 826 } |
827 | 827 |
828 function CallSiteGetFunction() { | 828 function CallSiteGetFunction() { |
829 return this[CallSiteStrictModeKey] ? void 0 : this[CallSiteFunctionKey]; | 829 return this[CallSiteStrictModeKey] ? UNDEFINED : this[CallSiteFunctionKey]; |
830 } | 830 } |
831 | 831 |
832 function CallSiteGetFunctionName() { | 832 function CallSiteGetFunctionName() { |
833 // See if the function knows its own name | 833 // See if the function knows its own name |
834 var name = this[CallSiteFunctionKey].name; | 834 var name = this[CallSiteFunctionKey].name; |
835 if (name) { | 835 if (name) { |
836 return name; | 836 return name; |
837 } | 837 } |
838 name = %FunctionGetInferredName(this[CallSiteFunctionKey]); | 838 name = %FunctionGetInferredName(this[CallSiteFunctionKey]); |
839 if (name) { | 839 if (name) { |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1085 | 1085 |
1086 // Flag to prevent recursive call of Error.prepareStackTrace. | 1086 // Flag to prevent recursive call of Error.prepareStackTrace. |
1087 var formatting_custom_stack_trace = false; | 1087 var formatting_custom_stack_trace = false; |
1088 | 1088 |
1089 | 1089 |
1090 function FormatStackTrace(obj, error_string, frames) { | 1090 function FormatStackTrace(obj, error_string, frames) { |
1091 if (IS_FUNCTION($Error.prepareStackTrace) && !formatting_custom_stack_trace) { | 1091 if (IS_FUNCTION($Error.prepareStackTrace) && !formatting_custom_stack_trace) { |
1092 var array = []; | 1092 var array = []; |
1093 %MoveArrayContents(frames, array); | 1093 %MoveArrayContents(frames, array); |
1094 formatting_custom_stack_trace = true; | 1094 formatting_custom_stack_trace = true; |
1095 var stack_trace = void 0; | 1095 var stack_trace = UNDEFINED; |
1096 try { | 1096 try { |
1097 stack_trace = $Error.prepareStackTrace(obj, array); | 1097 stack_trace = $Error.prepareStackTrace(obj, array); |
1098 } catch (e) { | 1098 } catch (e) { |
1099 throw e; // The custom formatting function threw. Rethrow. | 1099 throw e; // The custom formatting function threw. Rethrow. |
1100 } finally { | 1100 } finally { |
1101 formatting_custom_stack_trace = false; | 1101 formatting_custom_stack_trace = false; |
1102 } | 1102 } |
1103 return stack_trace; | 1103 return stack_trace; |
1104 } | 1104 } |
1105 | 1105 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1153 // The holder of this getter ('obj') may not be the receiver ('this'). | 1153 // The holder of this getter ('obj') may not be the receiver ('this'). |
1154 // When this getter is called the first time, we use the context values to | 1154 // When this getter is called the first time, we use the context values to |
1155 // format a stack trace string and turn this accessor pair into a data | 1155 // format a stack trace string and turn this accessor pair into a data |
1156 // property (on the holder). | 1156 // property (on the holder). |
1157 var getter = function() { | 1157 var getter = function() { |
1158 // Stack is still a raw array awaiting to be formatted. | 1158 // Stack is still a raw array awaiting to be formatted. |
1159 var result = FormatStackTrace(obj, error_string, GetStackFrames(stack)); | 1159 var result = FormatStackTrace(obj, error_string, GetStackFrames(stack)); |
1160 // Turn this accessor into a data property. | 1160 // Turn this accessor into a data property. |
1161 %DefineOrRedefineDataProperty(obj, 'stack', result, NONE); | 1161 %DefineOrRedefineDataProperty(obj, 'stack', result, NONE); |
1162 // Release context values. | 1162 // Release context values. |
1163 stack = error_string = void 0; | 1163 stack = error_string = UNDEFINED; |
1164 return result; | 1164 return result; |
1165 }; | 1165 }; |
1166 | 1166 |
1167 // Set the 'stack' property on the receiver. If the receiver is the same as | 1167 // Set the 'stack' property on the receiver. If the receiver is the same as |
1168 // holder of this setter, the accessor pair is turned into a data property. | 1168 // holder of this setter, the accessor pair is turned into a data property. |
1169 var setter = function(v) { | 1169 var setter = function(v) { |
1170 // Set data property on the receiver (not necessarily holder). | 1170 // Set data property on the receiver (not necessarily holder). |
1171 %DefineOrRedefineDataProperty(this, 'stack', v, NONE); | 1171 %DefineOrRedefineDataProperty(this, 'stack', v, NONE); |
1172 if (this === obj) { | 1172 if (this === obj) { |
1173 // Release context values if holder is the same as the receiver. | 1173 // Release context values if holder is the same as the receiver. |
1174 stack = error_string = void 0; | 1174 stack = error_string = UNDEFINED; |
1175 } | 1175 } |
1176 }; | 1176 }; |
1177 | 1177 |
1178 %DefineOrRedefineAccessorProperty(obj, 'stack', getter, setter, DONT_ENUM); | 1178 %DefineOrRedefineAccessorProperty(obj, 'stack', getter, setter, DONT_ENUM); |
1179 } | 1179 } |
1180 | 1180 |
1181 | 1181 |
1182 function SetUpError() { | 1182 function SetUpError() { |
1183 // Define special error type constructors. | 1183 // Define special error type constructors. |
1184 | 1184 |
(...skipping 21 matching lines...) Expand all Loading... |
1206 %FunctionSetPrototype(f, new $Error()); | 1206 %FunctionSetPrototype(f, new $Error()); |
1207 } | 1207 } |
1208 %FunctionSetInstanceClassName(f, 'Error'); | 1208 %FunctionSetInstanceClassName(f, 'Error'); |
1209 %SetProperty(f.prototype, 'constructor', f, DONT_ENUM); | 1209 %SetProperty(f.prototype, 'constructor', f, DONT_ENUM); |
1210 %SetProperty(f.prototype, "name", name, DONT_ENUM); | 1210 %SetProperty(f.prototype, "name", name, DONT_ENUM); |
1211 %SetCode(f, function(m) { | 1211 %SetCode(f, function(m) { |
1212 if (%_IsConstructCall()) { | 1212 if (%_IsConstructCall()) { |
1213 // Define all the expected properties directly on the error | 1213 // Define all the expected properties directly on the error |
1214 // object. This avoids going through getters and setters defined | 1214 // object. This avoids going through getters and setters defined |
1215 // on prototype objects. | 1215 // on prototype objects. |
1216 %IgnoreAttributesAndSetProperty(this, 'stack', void 0, DONT_ENUM); | 1216 %IgnoreAttributesAndSetProperty(this, 'stack', UNDEFINED, DONT_ENUM); |
1217 if (!IS_UNDEFINED(m)) { | 1217 if (!IS_UNDEFINED(m)) { |
1218 %IgnoreAttributesAndSetProperty( | 1218 %IgnoreAttributesAndSetProperty( |
1219 this, 'message', ToString(m), DONT_ENUM); | 1219 this, 'message', ToString(m), DONT_ENUM); |
1220 } | 1220 } |
1221 captureStackTrace(this, f); | 1221 captureStackTrace(this, f); |
1222 } else { | 1222 } else { |
1223 return new f(m); | 1223 return new f(m); |
1224 } | 1224 } |
1225 }); | 1225 }); |
1226 %SetNativeFlag(f); | 1226 %SetNativeFlag(f); |
(...skipping 17 matching lines...) Expand all Loading... |
1244 // Global list of error objects visited during ErrorToString. This is | 1244 // Global list of error objects visited during ErrorToString. This is |
1245 // used to detect cycles in error toString formatting. | 1245 // used to detect cycles in error toString formatting. |
1246 var visited_errors = new InternalArray(); | 1246 var visited_errors = new InternalArray(); |
1247 var cyclic_error_marker = new $Object(); | 1247 var cyclic_error_marker = new $Object(); |
1248 | 1248 |
1249 function GetPropertyWithoutInvokingMonkeyGetters(error, name) { | 1249 function GetPropertyWithoutInvokingMonkeyGetters(error, name) { |
1250 // Climb the prototype chain until we find the holder. | 1250 // Climb the prototype chain until we find the holder. |
1251 while (error && !%HasLocalProperty(error, name)) { | 1251 while (error && !%HasLocalProperty(error, name)) { |
1252 error = %GetPrototype(error); | 1252 error = %GetPrototype(error); |
1253 } | 1253 } |
1254 if (error === null) return void 0; | 1254 if (IS_NULL(error)) return UNDEFINED; |
1255 if (!IS_OBJECT(error)) return error[name]; | 1255 if (!IS_OBJECT(error)) return error[name]; |
1256 // If the property is an accessor on one of the predefined errors that can be | 1256 // If the property is an accessor on one of the predefined errors that can be |
1257 // generated statically by the compiler, don't touch it. This is to address | 1257 // generated statically by the compiler, don't touch it. This is to address |
1258 // http://code.google.com/p/chromium/issues/detail?id=69187 | 1258 // http://code.google.com/p/chromium/issues/detail?id=69187 |
1259 var desc = %GetOwnProperty(error, name); | 1259 var desc = %GetOwnProperty(error, name); |
1260 if (desc && desc[IS_ACCESSOR_INDEX]) { | 1260 if (desc && desc[IS_ACCESSOR_INDEX]) { |
1261 var isName = name === "name"; | 1261 var isName = name === "name"; |
1262 if (error === $ReferenceError.prototype) | 1262 if (error === $ReferenceError.prototype) |
1263 return isName ? "ReferenceError" : void 0; | 1263 return isName ? "ReferenceError" : UNDEFINED; |
1264 if (error === $SyntaxError.prototype) | 1264 if (error === $SyntaxError.prototype) |
1265 return isName ? "SyntaxError" : void 0; | 1265 return isName ? "SyntaxError" : UNDEFINED; |
1266 if (error === $TypeError.prototype) | 1266 if (error === $TypeError.prototype) |
1267 return isName ? "TypeError" : void 0; | 1267 return isName ? "TypeError" : UNDEFINED; |
1268 } | 1268 } |
1269 // Otherwise, read normally. | 1269 // Otherwise, read normally. |
1270 return error[name]; | 1270 return error[name]; |
1271 } | 1271 } |
1272 | 1272 |
1273 function ErrorToStringDetectCycle(error) { | 1273 function ErrorToStringDetectCycle(error) { |
1274 if (!%PushIfAbsent(visited_errors, error)) throw cyclic_error_marker; | 1274 if (!%PushIfAbsent(visited_errors, error)) throw cyclic_error_marker; |
1275 try { | 1275 try { |
1276 var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name"); | 1276 var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name"); |
1277 name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name); | 1277 name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1341 %GetAndClearOverflowedStackTrace(this); | 1341 %GetAndClearOverflowedStackTrace(this); |
1342 }; | 1342 }; |
1343 | 1343 |
1344 %DefineOrRedefineAccessorProperty( | 1344 %DefineOrRedefineAccessorProperty( |
1345 boilerplate, 'stack', getter, setter, DONT_ENUM); | 1345 boilerplate, 'stack', getter, setter, DONT_ENUM); |
1346 | 1346 |
1347 return boilerplate; | 1347 return boilerplate; |
1348 } | 1348 } |
1349 | 1349 |
1350 var kStackOverflowBoilerplate = SetUpStackOverflowBoilerplate(); | 1350 var kStackOverflowBoilerplate = SetUpStackOverflowBoilerplate(); |
OLD | NEW |