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

Side by Side Diff: src/js/messages.js

Issue 2206573002: Move NoSideEffectToString to C++ (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address comments Created 4 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 unified diff | Download patch
« no previous file with comments | « src/js/harmony-simd.js ('k') | src/messages.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 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 (function(global, utils) { 7 (function(global, utils) {
8 8
9 %CheckIsBootstrapping(); 9 %CheckIsBootstrapping();
10 10
11 // ------------------------------------------------------------------- 11 // -------------------------------------------------------------------
12 // Imports 12 // Imports
13 13
14 var ArrayJoin; 14 var MakeGenericError = utils.ImportNow("make_generic_error");
15 var Bool16x8ToString;
16 var Bool32x4ToString;
17 var Bool8x16ToString;
18 var CallSite = utils.ImportNow("CallSite");
19 var Float32x4ToString;
20 var GlobalObject = global.Object;
21 var GlobalError = global.Error; 15 var GlobalError = global.Error;
22 var GlobalEvalError = global.EvalError;
23 var GlobalRangeError = global.RangeError; 16 var GlobalRangeError = global.RangeError;
24 var GlobalReferenceError = global.ReferenceError;
25 var GlobalSyntaxError = global.SyntaxError; 17 var GlobalSyntaxError = global.SyntaxError;
26 var GlobalTypeError = global.TypeError; 18 var GlobalTypeError = global.TypeError;
27 var GlobalURIError = global.URIError; 19 var GlobalURIError = global.URIError;
28 var Int16x8ToString;
29 var Int32x4ToString;
30 var Int8x16ToString;
31 var InternalArray = utils.InternalArray;
32 var internalErrorSymbol = utils.ImportNow("internal_error_symbol");
33 var ObjectHasOwnProperty;
34 var ObjectToString = utils.ImportNow("object_to_string");
35 var Script = utils.ImportNow("Script"); 20 var Script = utils.ImportNow("Script");
36 var stackTraceSymbol = utils.ImportNow("stack_trace_symbol");
37 var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
38 var Uint16x8ToString;
39 var Uint32x4ToString;
40 var Uint8x16ToString;
41
42 utils.Import(function(from) {
43 ArrayJoin = from.ArrayJoin;
44 Bool16x8ToString = from.Bool16x8ToString;
45 Bool32x4ToString = from.Bool32x4ToString;
46 Bool8x16ToString = from.Bool8x16ToString;
47 Float32x4ToString = from.Float32x4ToString;
48 Int16x8ToString = from.Int16x8ToString;
49 Int32x4ToString = from.Int32x4ToString;
50 Int8x16ToString = from.Int8x16ToString;
51 ObjectHasOwnProperty = from.ObjectHasOwnProperty;
52 Uint16x8ToString = from.Uint16x8ToString;
53 Uint32x4ToString = from.Uint32x4ToString;
54 Uint8x16ToString = from.Uint8x16ToString;
55 });
56 21
57 // ------------------------------------------------------------------- 22 // -------------------------------------------------------------------
58 23
59
60
61 function NoSideEffectsObjectToString() {
62 if (IS_UNDEFINED(this)) return "[object Undefined]";
63 if (IS_NULL(this)) return "[object Null]";
64 var O = TO_OBJECT(this);
65 var builtinTag = %_ClassOf(O);
66 var tag = %GetDataProperty(O, toStringTagSymbol);
67 if (!IS_STRING(tag)) {
68 tag = builtinTag;
69 }
70 return `[object ${tag}]`;
71 }
72
73 function IsErrorObject(obj) {
74 return HAS_PRIVATE(obj, stackTraceSymbol);
75 }
76
77 function NoSideEffectsErrorToString() {
78 var name = %GetDataProperty(this, "name");
79 var message = %GetDataProperty(this, "message");
80 name = IS_UNDEFINED(name) ? "Error" : NoSideEffectsToString(name);
81 message = IS_UNDEFINED(message) ? "" : NoSideEffectsToString(message);
82 if (name == "") return message;
83 if (message == "") return name;
84 return `${name}: ${message}`;
85 }
86
87 function NoSideEffectsToString(obj) {
88 if (IS_STRING(obj)) return obj;
89 if (IS_NUMBER(obj)) return %_NumberToString(obj);
90 if (IS_BOOLEAN(obj)) return obj ? 'true' : 'false';
91 if (IS_UNDEFINED(obj)) return 'undefined';
92 if (IS_NULL(obj)) return 'null';
93 if (IS_FUNCTION(obj)) {
94 var str = %FunctionToString(obj);
95 if (str.length > 128) {
96 str = %_SubString(str, 0, 111) + "...<omitted>..." +
97 %_SubString(str, str.length - 2, str.length);
98 }
99 return str;
100 }
101 if (IS_SYMBOL(obj)) return %SymbolDescriptiveString(obj);
102 if (IS_SIMD_VALUE(obj)) {
103 switch (typeof(obj)) {
104 case 'float32x4': return %_Call(Float32x4ToString, obj);
105 case 'int32x4': return %_Call(Int32x4ToString, obj);
106 case 'int16x8': return %_Call(Int16x8ToString, obj);
107 case 'int8x16': return %_Call(Int8x16ToString, obj);
108 case 'uint32x4': return %_Call(Uint32x4ToString, obj);
109 case 'uint16x8': return %_Call(Uint16x8ToString, obj);
110 case 'uint8x16': return %_Call(Uint8x16ToString, obj);
111 case 'bool32x4': return %_Call(Bool32x4ToString, obj);
112 case 'bool16x8': return %_Call(Bool16x8ToString, obj);
113 case 'bool8x16': return %_Call(Bool8x16ToString, obj);
114 }
115 }
116
117 if (IS_RECEIVER(obj)) {
118 // When internally formatting error objects, use a side-effects-free version
119 // of Error.prototype.toString independent of the actually installed
120 // toString method.
121 if (IsErrorObject(obj) ||
122 %GetDataProperty(obj, "toString") === ErrorToString) {
123 return %_Call(NoSideEffectsErrorToString, obj);
124 }
125
126 if (%GetDataProperty(obj, "toString") === ObjectToString) {
127 var constructor = %GetDataProperty(obj, "constructor");
128 if (IS_FUNCTION(constructor)) {
129 var constructor_name = %FunctionGetName(constructor);
130 if (constructor_name != "") return `#<${constructor_name}>`;
131 }
132 }
133 }
134
135 return %_Call(NoSideEffectsObjectToString, obj);
136 }
137
138
139 function MakeGenericError(constructor, type, arg0, arg1, arg2) {
140 var error = new constructor(FormatMessage(type, arg0, arg1, arg2));
141 error[internalErrorSymbol] = true;
142 return error;
143 }
144
145
146 /** 24 /**
147 * Set up the Script function and constructor. 25 * Set up the Script function and constructor.
148 */ 26 */
149 %FunctionSetInstanceClassName(Script, 'Script'); 27 %FunctionSetInstanceClassName(Script, 'Script');
150 %AddNamedProperty(Script.prototype, 'constructor', Script, 28 %AddNamedProperty(Script.prototype, 'constructor', Script,
151 DONT_ENUM | DONT_DELETE | READ_ONLY); 29 DONT_ENUM | DONT_DELETE | READ_ONLY);
152 %SetCode(Script, function(x) { 30 %SetCode(Script, function(x) {
153 // Script objects can only be created by the VM. 31 // Script objects can only be created by the VM.
154 throw MakeError(kUnsupported); 32 throw MakeError(kUnsupported);
155 }); 33 });
156 34
157
158 // Helper functions; called from the runtime system.
159 function FormatMessage(type, arg0, arg1, arg2) {
160 var arg0 = NoSideEffectsToString(arg0);
161 var arg1 = NoSideEffectsToString(arg1);
162 var arg2 = NoSideEffectsToString(arg2);
163 try {
164 return %FormatMessageString(type, arg0, arg1, arg2);
165 } catch (e) {
166 return "<error>";
167 }
168 }
169
170
171 function GetLineNumber(message) { 35 function GetLineNumber(message) {
172 var start_position = %MessageGetStartPosition(message); 36 var start_position = %MessageGetStartPosition(message);
173 if (start_position == -1) return kNoLineNumberInfo; 37 if (start_position == -1) return kNoLineNumberInfo;
174 var script = %MessageGetScript(message); 38 var script = %MessageGetScript(message);
175 var location = script.locationFromPosition(start_position, true); 39 var location = script.locationFromPosition(start_position, true);
176 if (location == null) return kNoLineNumberInfo; 40 if (location == null) return kNoLineNumberInfo;
177 return location.line + 1; 41 return location.line + 1;
178 } 42 }
179 43
180 44
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 145
282 function MakeTypeError(type, arg0, arg1, arg2) { 146 function MakeTypeError(type, arg0, arg1, arg2) {
283 return MakeGenericError(GlobalTypeError, type, arg0, arg1, arg2); 147 return MakeGenericError(GlobalTypeError, type, arg0, arg1, arg2);
284 } 148 }
285 149
286 function MakeURIError() { 150 function MakeURIError() {
287 return MakeGenericError(GlobalURIError, kURIMalformed); 151 return MakeGenericError(GlobalURIError, kURIMalformed);
288 } 152 }
289 153
290 %InstallToContext([ 154 %InstallToContext([
291 "make_error_function", MakeGenericError,
292 "make_range_error", MakeRangeError, 155 "make_range_error", MakeRangeError,
293 "make_type_error", MakeTypeError, 156 "make_type_error", MakeTypeError,
294 "message_get_column_number", GetColumnNumber, 157 "message_get_column_number", GetColumnNumber,
295 "message_get_line_number", GetLineNumber, 158 "message_get_line_number", GetLineNumber,
296 "message_get_source_line", GetSourceLine, 159 "message_get_source_line", GetSourceLine,
297 "no_side_effects_to_string_fun", NoSideEffectsToString,
298 ]); 160 ]);
299 161
300 utils.Export(function(to) { 162 utils.Export(function(to) {
301 to.ErrorToString = ErrorToString; 163 to.ErrorToString = ErrorToString;
302 to.MakeError = MakeError; 164 to.MakeError = MakeError;
303 to.MakeRangeError = MakeRangeError; 165 to.MakeRangeError = MakeRangeError;
304 to.MakeSyntaxError = MakeSyntaxError; 166 to.MakeSyntaxError = MakeSyntaxError;
305 to.MakeTypeError = MakeTypeError; 167 to.MakeTypeError = MakeTypeError;
306 to.MakeURIError = MakeURIError; 168 to.MakeURIError = MakeURIError;
307 }); 169 });
308 170
309 }); 171 });
OLDNEW
« no previous file with comments | « src/js/harmony-simd.js ('k') | src/messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698