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

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: small change Created 5 years, 6 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/messages.h ('k') | test/cctest/test-api.cc » ('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 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 ? Handle<Object>::cast(factory->undefined_value()) 52 ? Handle<Object>::cast(factory->undefined_value())
53 : Handle<Object>::cast(stack_frames); 53 : Handle<Object>::cast(stack_frames);
54 54
55 Handle<JSMessageObject> message_obj = factory->NewJSMessageObject( 55 Handle<JSMessageObject> message_obj = factory->NewJSMessageObject(
56 message, argument, start, end, script_handle, stack_frames_handle); 56 message, argument, start, end, script_handle, stack_frames_handle);
57 57
58 return message_obj; 58 return message_obj;
59 } 59 }
60 60
61 61
62 void MessageHandler::ReportMessage(Isolate* isolate, 62 void MessageHandler::ReportMessage(Isolate* isolate, MessageLocation* loc,
63 MessageLocation* loc, 63 Handle<JSMessageObject> message) {
64 Handle<Object> message) {
65 // We are calling into embedder's code which can throw exceptions. 64 // We are calling into embedder's code which can throw exceptions.
66 // Thus we need to save current exception state, reset it to the clean one 65 // Thus we need to save current exception state, reset it to the clean one
67 // and ignore scheduled exceptions callbacks can throw. 66 // and ignore scheduled exceptions callbacks can throw.
68 67
69 // We pass the exception object into the message handler callback though. 68 // We pass the exception object into the message handler callback though.
70 Object* exception_object = isolate->heap()->undefined_value(); 69 Object* exception_object = isolate->heap()->undefined_value();
71 if (isolate->has_pending_exception()) { 70 if (isolate->has_pending_exception()) {
72 exception_object = isolate->pending_exception(); 71 exception_object = isolate->pending_exception();
73 } 72 }
74 Handle<Object> exception_handle(exception_object, isolate); 73 Handle<Object> exception(exception_object, isolate);
75 74
76 Isolate::ExceptionScope exception_scope(isolate); 75 Isolate::ExceptionScope exception_scope(isolate);
77 isolate->clear_pending_exception(); 76 isolate->clear_pending_exception();
78 isolate->set_external_caught_exception(false); 77 isolate->set_external_caught_exception(false);
79 78
79 // Turn the exception on the message into a string if it is an object.
80 if (message->argument()->IsJSObject()) {
81 HandleScope scope(isolate);
82 Handle<Object> argument(message->argument(), isolate);
83 Handle<Object> args[] = {argument};
84 MaybeHandle<Object> maybe_stringified = Execution::TryCall(
85 isolate->to_detail_string_fun(), isolate->js_builtins_object(),
86 arraysize(args), args);
87 Handle<Object> stringified;
88 if (!maybe_stringified.ToHandle(&stringified)) {
89 stringified = isolate->factory()->NewStringFromAsciiChecked("exception");
90 }
91 message->set_argument(*stringified);
92 }
93
80 v8::Local<v8::Message> api_message_obj = v8::Utils::MessageToLocal(message); 94 v8::Local<v8::Message> api_message_obj = v8::Utils::MessageToLocal(message);
81 v8::Local<v8::Value> api_exception_obj = v8::Utils::ToLocal(exception_handle); 95 v8::Local<v8::Value> api_exception_obj = v8::Utils::ToLocal(exception);
82 96
83 v8::NeanderArray global_listeners(isolate->factory()->message_listeners()); 97 v8::NeanderArray global_listeners(isolate->factory()->message_listeners());
84 int global_length = global_listeners.length(); 98 int global_length = global_listeners.length();
85 if (global_length == 0) { 99 if (global_length == 0) {
86 DefaultMessageReport(isolate, loc, message); 100 DefaultMessageReport(isolate, loc, message);
87 if (isolate->has_scheduled_exception()) { 101 if (isolate->has_scheduled_exception()) {
88 isolate->clear_scheduled_exception(); 102 isolate->clear_scheduled_exception();
89 } 103 }
90 } else { 104 } else {
91 for (int i = 0; i < global_length; i++) { 105 for (int i = 0; i < global_length; i++) {
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), 287 JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_),
274 isolate->factory()->constructor_string()); 288 isolate->factory()->constructor_string());
275 return constructor.is_identical_to(fun_); 289 return constructor.is_identical_to(fun_);
276 } 290 }
277 291
278 292
279 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, 293 Handle<String> MessageTemplate::FormatMessage(Isolate* isolate,
280 int template_index, 294 int template_index,
281 Handle<Object> arg) { 295 Handle<Object> arg) {
282 Factory* factory = isolate->factory(); 296 Factory* factory = isolate->factory();
283 Handle<String> fmt_str = factory->InternalizeOneByteString( 297 Handle<String> result_string;
284 STATIC_CHAR_VECTOR("$noSideEffectToString")); 298 if (arg->IsString()) {
285 Handle<JSFunction> fun = Handle<JSFunction>::cast( 299 result_string = Handle<String>::cast(arg);
286 Object::GetProperty(isolate->js_builtins_object(), fmt_str) 300 } else {
287 .ToHandleChecked()); 301 Handle<String> fmt_str = factory->InternalizeOneByteString(
302 STATIC_CHAR_VECTOR("$noSideEffectToString"));
303 Handle<JSFunction> fun = Handle<JSFunction>::cast(
304 Object::GetProperty(isolate->js_builtins_object(), fmt_str)
305 .ToHandleChecked());
288 306
289 MaybeHandle<Object> maybe_result = 307 MaybeHandle<Object> maybe_result =
290 Execution::TryCall(fun, isolate->js_builtins_object(), 1, &arg); 308 Execution::TryCall(fun, isolate->js_builtins_object(), 1, &arg);
291 Handle<Object> result; 309 Handle<Object> result;
292 if (!maybe_result.ToHandle(&result) || !result->IsString()) { 310 if (!maybe_result.ToHandle(&result) || !result->IsString()) {
293 return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>")); 311 return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>"));
312 }
313 result_string = Handle<String>::cast(result);
294 } 314 }
295 MaybeHandle<String> maybe_result_string = MessageTemplate::FormatMessage( 315 MaybeHandle<String> maybe_result_string = MessageTemplate::FormatMessage(
296 template_index, Handle<String>::cast(result), factory->empty_string(), 316 template_index, result_string, factory->empty_string(),
297 factory->empty_string()); 317 factory->empty_string());
298 Handle<String> result_string;
299 if (!maybe_result_string.ToHandle(&result_string)) { 318 if (!maybe_result_string.ToHandle(&result_string)) {
300 return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>")); 319 return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>"));
301 } 320 }
302 // A string that has been obtained from JS code in this way is 321 // 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 322 // 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 323 // here to improve the efficiency of converting it to a C string and
305 // other operations that are likely to take place (see GetLocalizedMessage 324 // other operations that are likely to take place (see GetLocalizedMessage
306 // for example). 325 // for example).
307 return String::Flatten(result_string); 326 return String::Flatten(result_string);
308 } 327 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 builder.AppendString(args[i++]); 362 builder.AppendString(args[i++]);
344 } 363 }
345 } else { 364 } else {
346 builder.AppendCharacter(*c); 365 builder.AppendCharacter(*c);
347 } 366 }
348 } 367 }
349 368
350 return builder.Finish(); 369 return builder.Finish();
351 } 370 }
352 } } // namespace v8::internal 371 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/messages.h ('k') | test/cctest/test-api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698