1a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org// Copyright 2011 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "v8.h"
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "api.h"
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "execution.h"
32ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org#include "messages.h"
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "spaces-inl.h"
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// If no message listeners have been registered this one is called
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// by default.
41c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgvoid MessageHandler::DefaultMessageReport(Isolate* isolate,
42c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org                                          const MessageLocation* loc,
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                          Handle<Object> message_obj) {
44c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  SmartArrayPointer<char> str = GetLocalizedMessage(isolate, message_obj);
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (loc == NULL) {
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintF("%s\n", *str);
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
48c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    HandleScope scope(isolate);
4909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org    Handle<Object> data(loc->script()->name(), isolate);
5083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    SmartArrayPointer<char> data_str;
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (data->IsString())
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      data_str = Handle<String>::cast(data)->ToCString(DISALLOW_NULLS);
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintF("%s:%i: %s\n", *data_str ? *data_str : "<unknown>",
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen           loc->start_pos(), *str);
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgHandle<JSMessageObject> MessageHandler::MakeMessageObject(
60d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    Isolate* isolate,
619258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    const char* type,
629258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    MessageLocation* loc,
639258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    Vector< Handle<Object> > args,
646a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org    Handle<String> stack_trace,
656a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org    Handle<JSArray> stack_frames) {
66d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Factory* factory = isolate->factory();
67d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<String> type_handle = factory->InternalizeUtf8String(type);
68d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  Handle<FixedArray> arguments_elements =
69d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewFixedArray(args.length());
7031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  for (int i = 0; i < args.length(); i++) {
71d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com    arguments_elements->set(i, *args[i]);
7231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  }
73d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  Handle<JSArray> arguments_handle =
74d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewJSArrayWithElements(arguments_elements);
7531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
7631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  int start = 0;
7731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  int end = 0;
78d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Object> script_handle = factory->undefined_value();
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (loc) {
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    start = loc->start_pos();
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    end = loc->end_pos();
8231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    script_handle = GetScriptWrapper(loc->script());
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
8431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
8531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  Handle<Object> stack_trace_handle = stack_trace.is_null()
86d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      ? Handle<Object>::cast(factory->undefined_value())
8731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org      : Handle<Object>::cast(stack_trace);
8831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
89d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  Handle<Object> stack_frames_handle = stack_frames.is_null()
90d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      ? Handle<Object>::cast(factory->undefined_value())
9131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org      : Handle<Object>::cast(stack_frames);
9231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
9331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  Handle<JSMessageObject> message =
94d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      factory->NewJSMessageObject(type_handle,
9531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org                                  arguments_handle,
9631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org                                  start,
9731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org                                  end,
9831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org                                  script_handle,
9931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org                                  stack_trace_handle,
10031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org                                  stack_frames_handle);
10131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
10231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  return message;
1039258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org}
1049258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.orgvoid MessageHandler::ReportMessage(Isolate* isolate,
10744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                                   MessageLocation* loc,
1089258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org                                   Handle<Object> message) {
10944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  // We are calling into embedder's code which can throw exceptions.
11044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  // Thus we need to save current exception state, reset it to the clean one
11144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  // and ignore scheduled exceptions callbacks can throw.
11289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
11389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  // We pass the exception object into the message handler callback though.
11489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  Object* exception_object = isolate->heap()->undefined_value();
11589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  if (isolate->has_pending_exception()) {
11689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    isolate->pending_exception()->ToObject(&exception_object);
11789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  }
11809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> exception_handle(exception_object, isolate);
11989e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
12044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  Isolate::ExceptionScope exception_scope(isolate);
12144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  isolate->clear_pending_exception();
12244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  isolate->set_external_caught_exception(false);
12344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  v8::Local<v8::Message> api_message_obj = v8::Utils::MessageToLocal(message);
12589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  v8::Local<v8::Value> api_exception_obj = v8::Utils::ToLocal(exception_handle);
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  v8::NeanderArray global_listeners(isolate->factory()->message_listeners());
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int global_length = global_listeners.length();
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (global_length == 0) {
130c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    DefaultMessageReport(isolate, loc, message);
13144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    if (isolate->has_scheduled_exception()) {
13244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      isolate->clear_scheduled_exception();
13344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org    }
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < global_length; i++) {
136c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org      HandleScope scope(isolate);
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (global_listeners.get(i)->IsUndefined()) continue;
1388432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      v8::NeanderObject listener(JSObject::cast(global_listeners.get(i)));
1398432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      Handle<Foreign> callback_obj(Foreign::cast(listener.get(0)));
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      v8::MessageCallback callback =
141c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org          FUNCTION_CAST<v8::MessageCallback>(callback_obj->foreign_address());
1428432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org      Handle<Object> callback_data(listener.get(1), isolate);
143a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org      {
144a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org        // Do not allow exceptions to propagate.
145dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org        v8::TryCatch try_catch;
1468432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org        callback(api_message_obj, callback_data->IsUndefined()
1478432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org                                      ? api_exception_obj
1488432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org                                      : v8::Utils::ToLocal(callback_data));
149a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org      }
15044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      if (isolate->has_scheduled_exception()) {
15144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        isolate->clear_scheduled_exception();
15244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org      }
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgHandle<String> MessageHandler::GetMessage(Isolate* isolate,
15909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org                                          Handle<Object> data) {
16009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Factory* factory = isolate->factory();
161a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  Handle<String> fmt_str =
1624a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("FormatMessage"));
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<JSFunction> fun =
164ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      Handle<JSFunction>(
165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org          JSFunction::cast(
16609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org              isolate->js_builtins_object()->
167ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org              GetPropertyNoExceptionThrown(*fmt_str)));
168e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  Handle<JSMessageObject> message = Handle<JSMessageObject>::cast(data);
16909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  Handle<Object> argv[] = { Handle<Object>(message->type(), isolate),
17009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org                            Handle<Object>(message->arguments(), isolate) };
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool caught_exception;
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Object> result =
174ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      Execution::TryCall(fun,
17509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org                         isolate->js_builtins_object(),
176a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                         ARRAY_SIZE(argv),
177a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                         argv,
178a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                         &caught_exception);
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (caught_exception || !result->IsString()) {
1814a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    return factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("<error>"));
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<String> result_string = Handle<String>::cast(result);
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // A string that has been obtained from JS code in this way is
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // likely to be a complicated ConsString of some sort.  We flatten it
18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // here to improve the efficiency of converting it to a C string and
18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // other operations that are likely to take place (see GetLocalizedMessage
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // for example).
18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  FlattenString(result_string);
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result_string;
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.orgSmartArrayPointer<char> MessageHandler::GetLocalizedMessage(
195c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Isolate* isolate,
19683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    Handle<Object> data) {
197c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org  HandleScope scope(isolate);
19809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  return GetMessage(isolate, data)->ToCString(DISALLOW_NULLS);
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
203