diff options
author | Ali Ijaz Sheikh <ofrobots@google.com> | 2015-08-23 06:09:40 -0700 |
---|---|---|
committer | Rod Vagg <rod@vagg.org> | 2015-09-06 21:38:01 +1000 |
commit | 9fddd83cf9adf505bce2e2373881df0c4d41b261 (patch) | |
tree | 4272ce14c10fea496af2e78fc6debb187d613451 /deps/v8/src/messages.cc | |
parent | 46b7d151674d138e7ea4342d5f3ada1208b87ff2 (diff) | |
download | android-node-v8-9fddd83cf9adf505bce2e2373881df0c4d41b261.tar.gz android-node-v8-9fddd83cf9adf505bce2e2373881df0c4d41b261.tar.bz2 android-node-v8-9fddd83cf9adf505bce2e2373881df0c4d41b261.zip |
deps: upgrade V8 to 4.5.103.24
Upgrade to the latest branch-head for V8 4.5. For the full commit log see
https://github.com/v8/v8-git-mirror/commits/4.5.103.24
PR-URL: https://github.com/nodejs/node/pull/2509
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'deps/v8/src/messages.cc')
-rw-r--r-- | deps/v8/src/messages.cc | 147 |
1 files changed, 85 insertions, 62 deletions
diff --git a/deps/v8/src/messages.cc b/deps/v8/src/messages.cc index 81fcdec51c..7193392d9d 100644 --- a/deps/v8/src/messages.cc +++ b/deps/v8/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,21 +52,15 @@ 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; } -void MessageHandler::ReportMessage(Isolate* isolate, - MessageLocation* loc, - Handle<Object> message) { +void MessageHandler::ReportMessage(Isolate* isolate, MessageLocation* loc, + Handle<JSMessageObject> message) { // We are calling into embedder's code which can throw exceptions. // Thus we need to save current exception state, reset it to the clean one // and ignore scheduled exceptions callbacks can throw. @@ -87,14 +70,29 @@ void MessageHandler::ReportMessage(Isolate* isolate, if (isolate->has_pending_exception()) { exception_object = isolate->pending_exception(); } - Handle<Object> exception_handle(exception_object, isolate); + Handle<Object> exception(exception_object, isolate); Isolate::ExceptionScope exception_scope(isolate); isolate->clear_pending_exception(); isolate->set_external_caught_exception(false); + // Turn the exception on the message into a string if it is an object. + if (message->argument()->IsJSObject()) { + HandleScope scope(isolate); + Handle<Object> argument(message->argument(), isolate); + Handle<Object> args[] = {argument}; + MaybeHandle<Object> maybe_stringified = Execution::TryCall( + isolate->to_detail_string_fun(), isolate->js_builtins_object(), + arraysize(args), args); + Handle<Object> stringified; + if (!maybe_stringified.ToHandle(&stringified)) { + stringified = isolate->factory()->NewStringFromAsciiChecked("exception"); + } + message->set_argument(*stringified); + } + v8::Local<v8::Message> api_message_obj = v8::Utils::MessageToLocal(message); - v8::Local<v8::Value> api_exception_obj = v8::Utils::ToLocal(exception_handle); + v8::Local<v8::Value> api_exception_obj = v8::Utils::ToLocal(exception); v8::NeanderArray global_listeners(isolate->factory()->message_listeners()); int global_length = global_listeners.length(); @@ -114,7 +112,7 @@ void MessageHandler::ReportMessage(Isolate* isolate, Handle<Object> callback_data(listener.get(1), isolate); { // Do not allow exceptions to propagate. - v8::TryCatch try_catch; + v8::TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate)); callback(api_message_obj, callback_data->IsUndefined() ? api_exception_obj : v8::Utils::ToLocal(callback_data)); @@ -129,29 +127,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); } @@ -197,10 +175,11 @@ Handle<Object> CallSite::GetScriptNameOrSourceUrl(Isolate* isolate) { } -bool CheckMethodName(Handle<JSObject> obj, Handle<Name> name, +bool CheckMethodName(Isolate* isolate, Handle<JSObject> obj, Handle<Name> name, Handle<JSFunction> fun, LookupIterator::Configuration config) { - LookupIterator iter(obj, name, config); + LookupIterator iter = + LookupIterator::PropertyOrElement(isolate, obj, name, config); if (iter.state() == LookupIterator::DATA) { return iter.GetDataValue().is_identical_to(fun); } else if (iter.state() == LookupIterator::ACCESSOR) { @@ -225,7 +204,7 @@ Handle<Object> CallSite::GetMethodName(Isolate* isolate) { Handle<Object> function_name(fun_->shared()->name(), isolate); if (function_name->IsName()) { Handle<Name> name = Handle<Name>::cast(function_name); - if (CheckMethodName(obj, name, fun_, + if (CheckMethodName(isolate, obj, name, fun_, LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR)) return name; } @@ -244,7 +223,7 @@ Handle<Object> CallSite::GetMethodName(Isolate* isolate) { HandleScope inner_scope(isolate); if (!keys->get(i)->IsName()) continue; Handle<Name> name_key(Name::cast(keys->get(i)), isolate); - if (!CheckMethodName(current_obj, name_key, fun_, + if (!CheckMethodName(isolate, current_obj, name_key, fun_, LookupIterator::OWN_SKIP_INTERCEPTOR)) continue; // Return null in case of duplicates to avoid confusion. @@ -306,16 +285,54 @@ bool CallSite::IsEval(Isolate* isolate) { bool CallSite::IsConstructor(Isolate* isolate) { if (!receiver_->IsJSObject()) return false; Handle<Object> constructor = - JSObject::GetDataProperty(Handle<JSObject>::cast(receiver_), - isolate->factory()->constructor_string()); + JSReceiver::GetDataProperty(Handle<JSObject>::cast(receiver_), + isolate->factory()->constructor_string()); return constructor.is_identical_to(fun_); } +Handle<String> MessageTemplate::FormatMessage(Isolate* isolate, + int template_index, + Handle<Object> arg) { + Factory* factory = isolate->factory(); + Handle<String> result_string; + if (arg->IsString()) { + result_string = Handle<String>::cast(arg); + } else { + 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>")); + } + result_string = Handle<String>::cast(result); + } + MaybeHandle<String> maybe_result_string = MessageTemplate::FormatMessage( + template_index, result_string, factory->empty_string(), + factory->empty_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, Handle<String> arg2) { + Isolate* isolate = arg0->GetIsolate(); const char* template_string; switch (template_index) { #define CASE(NAME, STRING) \ @@ -326,20 +343,25 @@ MaybeHandle<String> MessageTemplate::FormatMessage(int template_index, #undef CASE case kLastMessage: default: - UNREACHABLE(); - template_string = ""; - break; + isolate->ThrowIllegalOperation(); + return MaybeHandle<String>(); } - Isolate* isolate = arg0->GetIsolate(); IncrementalStringBuilder builder(isolate); unsigned int i = 0; 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)); + Handle<String> arg = args[i++]; + builder.AppendString(arg); + } } else { builder.AppendCharacter(*c); } @@ -347,4 +369,5 @@ MaybeHandle<String> MessageTemplate::FormatMessage(int template_index, return builder.Finish(); } -} } // namespace v8::internal +} // namespace internal +} // namespace v8 |