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

Side by Side Diff: src/messages.js

Issue 6368051: A MessageObject is a purely internal object to hold information about (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address comments Created 9 years, 10 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/messages.cc ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 // If this object gets passed to an error constructor the error will 48 // If this object gets passed to an error constructor the error will
49 // get an accessor for .message that constructs a descriptive error 49 // get an accessor for .message that constructs a descriptive error
50 // message on access. 50 // message on access.
51 var kAddMessageAccessorsMarker = { }; 51 var kAddMessageAccessorsMarker = { };
52 52
53 var kMessages = 0; 53 var kMessages = 0;
54 54
55 var kReplacementMarkers = 55 var kReplacementMarkers =
56 [ "%0", "%1", "%2", "%3" ] 56 [ "%0", "%1", "%2", "%3" ]
57 57
58 function FormatString(format, args) { 58 function FormatString(format, message) {
59 var args = %MessageGetArguments(message);
59 var result = ""; 60 var result = "";
60 var arg_num = 0; 61 var arg_num = 0;
61 for (var i = 0; i < format.length; i++) { 62 for (var i = 0; i < format.length; i++) {
62 var str = format[i]; 63 var str = format[i];
63 for (arg_num = 0; arg_num < kReplacementMarkers.length; arg_num++) { 64 for (arg_num = 0; arg_num < kReplacementMarkers.length; arg_num++) {
64 if (format[i] !== kReplacementMarkers[arg_num]) continue; 65 if (format[i] !== kReplacementMarkers[arg_num]) continue;
65 try { 66 try {
66 str = ToDetailString(args[arg_num]); 67 str = ToDetailString(args[arg_num]);
67 } catch (e) { 68 } catch (e) {
68 str = "#<error>"; 69 str = "#<error>";
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 strict_function_name: ["Function name may not be eval or arguments in strict mode"], 221 strict_function_name: ["Function name may not be eval or arguments in strict mode"],
221 strict_octal_literal: ["Octal literals are not allowed in strict m ode."], 222 strict_octal_literal: ["Octal literals are not allowed in strict m ode."],
222 strict_duplicate_property: ["Duplicate data property in object literal not allowed in strict mode"], 223 strict_duplicate_property: ["Duplicate data property in object literal not allowed in strict mode"],
223 accessor_data_property: ["Object literal may not have data and acces sor property with the same name"], 224 accessor_data_property: ["Object literal may not have data and acces sor property with the same name"],
224 accessor_get_set: ["Object literal may not have multiple get/s et accessors with the same name"], 225 accessor_get_set: ["Object literal may not have multiple get/s et accessors with the same name"],
225 strict_lhs_assignment: ["Assignment to eval or arguments is not all owed in strict mode"], 226 strict_lhs_assignment: ["Assignment to eval or arguments is not all owed in strict mode"],
226 strict_lhs_postfix: ["Postfix increment/decrement may not have e val or arguments operand in strict mode"], 227 strict_lhs_postfix: ["Postfix increment/decrement may not have e val or arguments operand in strict mode"],
227 strict_lhs_prefix: ["Prefix increment/decrement may not have ev al or arguments operand in strict mode"], 228 strict_lhs_prefix: ["Prefix increment/decrement may not have ev al or arguments operand in strict mode"],
228 }; 229 };
229 } 230 }
230 var format = kMessages[message.type]; 231 var message_type = %MessageGetType(message);
231 if (!format) return "<unknown message " + message.type + ">"; 232 var format = kMessages[message_type];
232 return FormatString(format, message.args); 233 if (!format) return "<unknown message " + message_type + ">";
234 return FormatString(format, message);
233 } 235 }
234 236
235 237
236 function GetLineNumber(message) { 238 function GetLineNumber(message) {
237 if (message.startPos == -1) return kNoLineNumberInfo; 239 var start_position = %MessageGetStartPosition(message);
238 var location = message.script.locationFromPosition(message.startPos, true); 240 if (start_position == -1) return kNoLineNumberInfo;
241 var script = %MessageGetScript(message);
242 var location = script.locationFromPosition(start_position, true);
239 if (location == null) return kNoLineNumberInfo; 243 if (location == null) return kNoLineNumberInfo;
240 return location.line + 1; 244 return location.line + 1;
241 } 245 }
242 246
243 247
244 // Returns the source code line containing the given source 248 // Returns the source code line containing the given source
245 // position, or the empty string if the position is invalid. 249 // position, or the empty string if the position is invalid.
246 function GetSourceLine(message) { 250 function GetSourceLine(message) {
247 var location = message.script.locationFromPosition(message.startPos, true); 251 var script = %MessageGetScript(message);
252 var start_position = %MessageGetStartPosition(message);
253 var location = script.locationFromPosition(start_position, true);
248 if (location == null) return ""; 254 if (location == null) return "";
249 location.restrict(); 255 location.restrict();
250 return location.sourceText(); 256 return location.sourceText();
251 } 257 }
252 258
253 259
254 function MakeTypeError(type, args) { 260 function MakeTypeError(type, args) {
255 return MakeGenericError($TypeError, type, args); 261 return MakeGenericError($TypeError, type, args);
256 } 262 }
257 263
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 return %_CallFunction(this.script.source, 622 return %_CallFunction(this.script.source,
617 this.from_position, 623 this.from_position,
618 this.to_position, 624 this.to_position,
619 StringSubstring); 625 StringSubstring);
620 }; 626 };
621 627
622 628
623 // Returns the offset of the given position within the containing 629 // Returns the offset of the given position within the containing
624 // line. 630 // line.
625 function GetPositionInLine(message) { 631 function GetPositionInLine(message) {
626 var location = message.script.locationFromPosition(message.startPos, false); 632 var script = %MessageGetScript(message);
633 var start_position = %MessageGetStartPosition(message);
634 var location = script.locationFromPosition(start_position, false);
627 if (location == null) return -1; 635 if (location == null) return -1;
628 location.restrict(); 636 location.restrict();
629 return message.startPos - location.start; 637 return start_position - location.start;
630 } 638 }
631 639
632 640
633 function ErrorMessage(type, args, startPos, endPos, script, stackTrace,
634 stackFrames) {
635 this.startPos = startPos;
636 this.endPos = endPos;
637 this.type = type;
638 this.args = args;
639 this.script = script;
640 this.stackTrace = stackTrace;
641 this.stackFrames = stackFrames;
642 }
643
644
645 function MakeMessage(type, args, startPos, endPos, script, stackTrace,
646 stackFrames) {
647 return new ErrorMessage(type, args, startPos, endPos, script, stackTrace,
648 stackFrames);
649 }
650
651
652 function GetStackTraceLine(recv, fun, pos, isGlobal) { 641 function GetStackTraceLine(recv, fun, pos, isGlobal) {
653 return FormatSourcePosition(new CallSite(recv, fun, pos)); 642 return FormatSourcePosition(new CallSite(recv, fun, pos));
654 } 643 }
655 644
656 // ---------------------------------------------------------------------------- 645 // ----------------------------------------------------------------------------
657 // Error implementation 646 // Error implementation
658 647
659 // Defines accessors for a property that is calculated the first time 648 // Defines accessors for a property that is calculated the first time
660 // the property is read. 649 // the property is read.
661 function DefineOneShotAccessor(obj, name, fun) { 650 function DefineOneShotAccessor(obj, name, fun) {
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 // Define all the expected properties directly on the error 974 // Define all the expected properties directly on the error
986 // object. This avoids going through getters and setters defined 975 // object. This avoids going through getters and setters defined
987 // on prototype objects. 976 // on prototype objects.
988 %IgnoreAttributesAndSetProperty(this, 'stack', void 0); 977 %IgnoreAttributesAndSetProperty(this, 'stack', void 0);
989 %IgnoreAttributesAndSetProperty(this, 'arguments', void 0); 978 %IgnoreAttributesAndSetProperty(this, 'arguments', void 0);
990 %IgnoreAttributesAndSetProperty(this, 'type', void 0); 979 %IgnoreAttributesAndSetProperty(this, 'type', void 0);
991 if (m === kAddMessageAccessorsMarker) { 980 if (m === kAddMessageAccessorsMarker) {
992 // DefineOneShotAccessor always inserts a message property and 981 // DefineOneShotAccessor always inserts a message property and
993 // ignores setters. 982 // ignores setters.
994 DefineOneShotAccessor(this, 'message', function (obj) { 983 DefineOneShotAccessor(this, 'message', function (obj) {
995 return FormatMessage({type: obj.type, args: obj.arguments}); 984 return FormatMessage(%NewMessageObject(obj.type, obj.arguments));
996 }); 985 });
997 } else if (!IS_UNDEFINED(m)) { 986 } else if (!IS_UNDEFINED(m)) {
998 %IgnoreAttributesAndSetProperty(this, 'message', ToString(m)); 987 %IgnoreAttributesAndSetProperty(this, 'message', ToString(m));
999 } 988 }
1000 captureStackTrace(this, f); 989 captureStackTrace(this, f);
1001 } else { 990 } else {
1002 return new f(m); 991 return new f(m);
1003 } 992 }
1004 }); 993 });
1005 } 994 }
1006 995
1007 function captureStackTrace(obj, cons_opt) { 996 function captureStackTrace(obj, cons_opt) {
1008 var stackTraceLimit = $Error.stackTraceLimit; 997 var stackTraceLimit = $Error.stackTraceLimit;
1009 if (!stackTraceLimit) return; 998 if (!stackTraceLimit || !IS_NUMBER(stackTraceLimit)) return;
1010 if (stackTraceLimit < 0 || stackTraceLimit > 10000) 999 if (stackTraceLimit < 0 || stackTraceLimit > 10000)
1011 stackTraceLimit = 10000; 1000 stackTraceLimit = 10000;
1012 var raw_stack = %CollectStackTrace(cons_opt ? cons_opt : captureStackTrace, 1001 var raw_stack = %CollectStackTrace(cons_opt
1013 stackTraceLimit); 1002 ? cons_opt
1003 : captureStackTrace, stackTraceLimit);
1014 DefineOneShotAccessor(obj, 'stack', function (obj) { 1004 DefineOneShotAccessor(obj, 'stack', function (obj) {
1015 return FormatRawStackTrace(obj, raw_stack); 1005 return FormatRawStackTrace(obj, raw_stack);
1016 }); 1006 });
1017 }; 1007 };
1018 1008
1019 $Math.__proto__ = global.Object.prototype; 1009 $Math.__proto__ = global.Object.prototype;
1020 1010
1021 DefineError(function Error() { }); 1011 DefineError(function Error() { });
1022 DefineError(function TypeError() { }); 1012 DefineError(function TypeError() { });
1023 DefineError(function RangeError() { }); 1013 DefineError(function RangeError() { });
(...skipping 10 matching lines...) Expand all
1034 // Global list of error objects visited during errorToString. This is 1024 // Global list of error objects visited during errorToString. This is
1035 // used to detect cycles in error toString formatting. 1025 // used to detect cycles in error toString formatting.
1036 var visited_errors = new $Array(); 1026 var visited_errors = new $Array();
1037 var cyclic_error_marker = new $Object(); 1027 var cyclic_error_marker = new $Object();
1038 1028
1039 function errorToStringDetectCycle() { 1029 function errorToStringDetectCycle() {
1040 if (!%PushIfAbsent(visited_errors, this)) throw cyclic_error_marker; 1030 if (!%PushIfAbsent(visited_errors, this)) throw cyclic_error_marker;
1041 try { 1031 try {
1042 var type = this.type; 1032 var type = this.type;
1043 if (type && !%_CallFunction(this, "message", ObjectHasOwnProperty)) { 1033 if (type && !%_CallFunction(this, "message", ObjectHasOwnProperty)) {
1044 var formatted = FormatMessage({ type: type, args: this.arguments }); 1034 var formatted = FormatMessage(%NewMessageObject(type, this.arguments));
1045 return this.name + ": " + formatted; 1035 return this.name + ": " + formatted;
1046 } 1036 }
1047 var message = %_CallFunction(this, "message", ObjectHasOwnProperty) 1037 var message = %_CallFunction(this, "message", ObjectHasOwnProperty)
1048 ? (": " + this.message) 1038 ? (": " + this.message)
1049 : ""; 1039 : "";
1050 return this.name + message; 1040 return this.name + message;
1051 } finally { 1041 } finally {
1052 visited_errors.length = visited_errors.length - 1; 1042 visited_errors.length = visited_errors.length - 1;
1053 } 1043 }
1054 } 1044 }
(...skipping 12 matching lines...) Expand all
1067 else throw e; 1057 else throw e;
1068 } 1058 }
1069 } 1059 }
1070 1060
1071 %FunctionSetName(errorToString, 'toString'); 1061 %FunctionSetName(errorToString, 'toString');
1072 %SetProperty($Error.prototype, 'toString', errorToString, DONT_ENUM); 1062 %SetProperty($Error.prototype, 'toString', errorToString, DONT_ENUM);
1073 1063
1074 // Boilerplate for exceptions for stack overflows. Used from 1064 // Boilerplate for exceptions for stack overflows. Used from
1075 // Top::StackOverflow(). 1065 // Top::StackOverflow().
1076 const kStackOverflowBoilerplate = MakeRangeError('stack_overflow', []); 1066 const kStackOverflowBoilerplate = MakeRangeError('stack_overflow', []);
OLDNEW
« no previous file with comments | « src/messages.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698