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

Side by Side Diff: src/messages.cc

Issue 1157563005: Do not eagerly convert exception to string when creating a message object (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: test case Created 5 years, 7 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
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/execution.h" 8 #include "src/execution.h"
9 #include "src/heap/spaces-inl.h" 9 #include "src/heap/spaces-inl.h"
10 #include "src/messages.h" 10 #include "src/messages.h"
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), 273 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_),
274 isolate->factory()->constructor_string()); 274 isolate->factory()->constructor_string());
275 return constructor.is_identical_to(fun_); 275 return constructor.is_identical_to(fun_);
276 } 276 }
277 277
278 278
279 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, 279 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate,
280 int template_index, 280 int template_index,
281 Handle<Object> arg) { 281 Handle<Object> arg) {
282 Factory* factory = isolate->factory(); 282 Factory* factory = isolate->factory();
283 Handle<String> fmt_str = factory->InternalizeOneByteString( 283 Handle<String> result_string;
284 STATIC_CHAR_VECTOR("$noSideEffectToString")); 284 if (arg->IsString()) {
285 Handle<JSFunction> fun = Handle<JSFunction>::cast( 285 result_string = Handle<String>::cast(arg);
286 Object::GetProperty(isolate->js_builtins_object(), fmt_str) 286 } else {
287 .ToHandleChecked()); 287 Handle<String> fmt_str = factory->InternalizeOneByteString(
288 STATIC_CHAR_VECTOR("$noSideEffectToString"));
289 Handle<JSFunction> fun = Handle<JSFunction>::cast(
290 Object::GetProperty(isolate->js_builtins_object(), fmt_str)
291 .ToHandleChecked());
288 292
289 MaybeHandle<Object> maybe_result = 293 MaybeHandle<Object> maybe_result =
290 Execution::TryCall(fun, isolate->js_builtins_object(), 1, &arg); 294 Execution::TryCall(fun, isolate->js_builtins_object(), 1, &arg);
291 Handle<Object> result; 295 Handle<Object> result;
292 if (!maybe_result.ToHandle(&result) || !result->IsString()) { 296 if (!maybe_result.ToHandle(&result) || !result->IsString()) {
293 return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>")); 297 return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>"));
298 }
299 result_string = Handle<String>::cast(result);
294 } 300 }
295 MaybeHandle<String> maybe_result_string = MessageTemplate::FormatMessage( 301 MaybeHandle<String> maybe_result_string = MessageTemplate::FormatMessage(
296 template_index, Handle<String>::cast(result), factory->empty_string(), 302 template_index, result_string, factory->empty_string(),
297 factory->empty_string()); 303 factory->empty_string());
298 Handle<String> result_string;
299 if (!maybe_result_string.ToHandle(&result_string)) { 304 if (!maybe_result_string.ToHandle(&result_string)) {
300 return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>")); 305 return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>"));
301 } 306 }
302 // A string that has been obtained from JS code in this way is 307 // A string that has been obtained from JS code in this way is
303 // likely to be a complicated ConsString of some sort. We flatten it 308 // likely to be a complicated ConsString of some sort. We flatten it
304 // here to improve the efficiency of converting it to a C string and 309 // here to improve the efficiency of converting it to a C string and
305 // other operations that are likely to take place (see GetLocalizedMessage 310 // other operations that are likely to take place (see GetLocalizedMessage
306 // for example). 311 // for example).
307 return String::Flatten(result_string); 312 return String::Flatten(result_string);
308 } 313 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 builder.AppendString(args[i++]); 348 builder.AppendString(args[i++]);
344 } 349 }
345 } else { 350 } else {
346 builder.AppendCharacter(*c); 351 builder.AppendCharacter(*c);
347 } 352 }
348 } 353 }
349 354
350 return builder.Finish(); 355 return builder.Finish();
351 } 356 }
352 } } // namespace v8::internal 357 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698