Index: src/messages.cc |
diff --git a/src/messages.cc b/src/messages.cc |
index 62bcad17cfd7266e2023425e1c6c2cbc59284411..c21f96c0187a91370c44f0b948a27fbaf68b6da9 100644 |
--- a/src/messages.cc |
+++ b/src/messages.cc |
@@ -35,20 +35,9 @@ void MessageHandler::DefaultMessageReport(Isolate* isolate, |
Handle<JSMessageObject> MessageHandler::MakeMessageObject( |
- Isolate* isolate, |
- const char* type, |
- MessageLocation* loc, |
- Vector< Handle<Object> > args, |
- Handle<JSArray> stack_frames) { |
+ Isolate* isolate, MessageTemplate::Template message, MessageLocation* loc, |
+ Handle<Object> argument, Handle<JSArray> stack_frames) { |
Factory* factory = isolate->factory(); |
- Handle<String> type_handle = factory->InternalizeUtf8String(type); |
- Handle<FixedArray> arguments_elements = |
- factory->NewFixedArray(args.length()); |
- for (int i = 0; i < args.length(); i++) { |
- arguments_elements->set(i, *args[i]); |
- } |
- Handle<JSArray> arguments_handle = |
- factory->NewJSArrayWithElements(arguments_elements); |
int start = 0; |
int end = 0; |
@@ -63,15 +52,10 @@ Handle<JSMessageObject> MessageHandler::MakeMessageObject( |
? Handle<Object>::cast(factory->undefined_value()) |
: Handle<Object>::cast(stack_frames); |
- Handle<JSMessageObject> message = |
- factory->NewJSMessageObject(type_handle, |
- arguments_handle, |
- start, |
- end, |
- script_handle, |
- stack_frames_handle); |
+ Handle<JSMessageObject> message_obj = factory->NewJSMessageObject( |
+ message, argument, start, end, script_handle, stack_frames_handle); |
- return message; |
+ return message_obj; |
} |
@@ -129,29 +113,9 @@ void MessageHandler::ReportMessage(Isolate* isolate, |
Handle<String> MessageHandler::GetMessage(Isolate* isolate, |
Handle<Object> data) { |
- Factory* factory = isolate->factory(); |
- Handle<String> fmt_str = |
- factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("$formatMessage")); |
- Handle<JSFunction> fun = Handle<JSFunction>::cast(Object::GetProperty( |
- isolate->js_builtins_object(), fmt_str).ToHandleChecked()); |
Handle<JSMessageObject> message = Handle<JSMessageObject>::cast(data); |
- Handle<Object> argv[] = { Handle<Object>(message->type(), isolate), |
- Handle<Object>(message->arguments(), isolate) }; |
- |
- MaybeHandle<Object> maybe_result = Execution::TryCall( |
- fun, isolate->js_builtins_object(), arraysize(argv), argv); |
- Handle<Object> result; |
- if (!maybe_result.ToHandle(&result) || !result->IsString()) { |
- return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>")); |
- } |
- Handle<String> result_string = Handle<String>::cast(result); |
- // A string that has been obtained from JS code in this way is |
- // likely to be a complicated ConsString of some sort. We flatten it |
- // here to improve the efficiency of converting it to a C string and |
- // other operations that are likely to take place (see GetLocalizedMessage |
- // for example). |
- result_string = String::Flatten(result_string); |
- return result_string; |
+ Handle<Object> arg = Handle<Object>(message->argument(), isolate); |
+ return MessageTemplate::FormatMessage(isolate, message->type(), arg); |
} |
@@ -312,6 +276,38 @@ bool CallSite::IsConstructor(Isolate* isolate) { |
} |
+Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, |
+ int template_index, |
+ Handle<Object> arg) { |
+ Factory* factory = isolate->factory(); |
+ Handle<String> fmt_str = factory->InternalizeOneByteString( |
+ STATIC_CHAR_VECTOR("$noSideEffectToString")); |
+ Handle<JSFunction> fun = Handle<JSFunction>::cast( |
+ Object::GetProperty(isolate->js_builtins_object(), fmt_str) |
+ .ToHandleChecked()); |
+ |
+ MaybeHandle<Object> maybe_result = |
+ Execution::TryCall(fun, isolate->js_builtins_object(), 1, &arg); |
+ Handle<Object> result; |
+ if (!maybe_result.ToHandle(&result) || !result->IsString()) { |
+ return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>")); |
+ } |
+ MaybeHandle<String> maybe_result_string = MessageTemplate::FormatMessage( |
+ template_index, Handle<String>::cast(result), factory->empty_string(), |
+ factory->empty_string()); |
+ Handle<String> result_string; |
+ if (!maybe_result_string.ToHandle(&result_string)) { |
+ return factory->InternalizeOneByteString(STATIC_CHAR_VECTOR("<error>")); |
+ } |
+ // A string that has been obtained from JS code in this way is |
+ // likely to be a complicated ConsString of some sort. We flatten it |
+ // here to improve the efficiency of converting it to a C string and |
+ // other operations that are likely to take place (see GetLocalizedMessage |
+ // for example). |
+ return String::Flatten(result_string); |
+} |
+ |
+ |
MaybeHandle<String> MessageTemplate::FormatMessage(int template_index, |
Handle<String> arg0, |
Handle<String> arg1, |
@@ -338,8 +334,14 @@ MaybeHandle<String> MessageTemplate::FormatMessage(int template_index, |
Handle<String> args[] = {arg0, arg1, arg2}; |
for (const char* c = template_string; *c != '\0'; c++) { |
if (*c == '%') { |
- DCHECK(i < arraysize(args)); |
- builder.AppendString(args[i++]); |
+ // %% results in verbatim %. |
+ if (*(c + 1) == '%') { |
+ c++; |
+ builder.AppendCharacter('%'); |
+ } else { |
+ DCHECK(i < arraysize(args)); |
+ builder.AppendString(args[i++]); |
+ } |
} else { |
builder.AppendCharacter(*c); |
} |