1bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Copyright 2012 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// -------------------------------------------------------------------
2931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
30e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgvar kMessages = {
31e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Error
32e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  cyclic_proto:                  ["Cyclic __proto__ value"],
33e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  code_gen_from_strings:         ["%0"],
34ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  generator_running:             ["Generator is already running"],
35ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  generator_finished:            ["Generator has already finished"],
36e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // TypeError
37e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_token:              ["Unexpected token ", "%0"],
38e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_token_number:       ["Unexpected number"],
39e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_token_string:       ["Unexpected string"],
40e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_token_identifier:   ["Unexpected identifier"],
41e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_reserved:           ["Unexpected reserved word"],
42e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_strict_reserved:    ["Unexpected strict mode reserved word"],
43e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_eos:                ["Unexpected end of input"],
44e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  malformed_regexp:              ["Invalid regular expression: /", "%0", "/: ", "%1"],
45e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unterminated_regexp:           ["Invalid regular expression: missing /"],
46e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  regexp_flags:                  ["Cannot supply flags when constructing one RegExp from another"],
47e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  incompatible_method_receiver:  ["Method ", "%0", " called on incompatible receiver ", "%1"],
48e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_lhs_in_assignment:     ["Invalid left-hand side in assignment"],
49e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_lhs_in_for_in:         ["Invalid left-hand side in for-in"],
50e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_lhs_in_postfix_op:     ["Invalid left-hand side expression in postfix operation"],
51e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_lhs_in_prefix_op:      ["Invalid left-hand side expression in prefix operation"],
52e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  multiple_defaults_in_switch:   ["More than one default clause in switch statement"],
53e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  newline_after_throw:           ["Illegal newline after throw"],
54e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  redeclaration:                 ["%0", " '", "%1", "' has already been declared"],
55e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  no_catch_or_finally:           ["Missing catch or finally after try"],
56e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unknown_label:                 ["Undefined label '", "%0", "'"],
57e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  uncaught_exception:            ["Uncaught ", "%0"],
58e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  stack_trace:                   ["Stack Trace:\n", "%0"],
59e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  called_non_callable:           ["%0", " is not a function"],
60e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  undefined_method:              ["Object ", "%1", " has no method '", "%0", "'"],
61e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  property_not_function:         ["Property '", "%0", "' of object ", "%1", " is not a function"],
62e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  cannot_convert_to_primitive:   ["Cannot convert object to primitive value"],
63e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  not_constructor:               ["%0", " is not a constructor"],
64e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  not_defined:                   ["%0", " is not defined"],
65e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  non_object_property_load:      ["Cannot read property '", "%0", "' of ", "%1"],
66e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  non_object_property_store:     ["Cannot set property '", "%0", "' of ", "%1"],
67e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  non_object_property_call:      ["Cannot call method '", "%0", "' of ", "%1"],
68e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  with_expression:               ["%0", " has no properties"],
69e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_invocation:            ["Illegal invocation"],
70e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  no_setter_in_callback:         ["Cannot set property ", "%0", " of ", "%1", " which has only a getter"],
71e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  apply_non_function:            ["Function.prototype.apply was called on ", "%0", ", which is a ", "%1", " and not a function"],
72e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  apply_wrong_args:              ["Function.prototype.apply: Arguments list has wrong type"],
73e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_in_operator_use:       ["Cannot use 'in' operator to search for '", "%0", "' in ", "%1"],
74e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  instanceof_function_expected:  ["Expecting a function in instanceof check, but got ", "%0"],
75e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  instanceof_nonobject_proto:    ["Function has non-object prototype '", "%0", "' in instanceof check"],
76e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  undefined_or_null_to_object:   ["Cannot convert undefined or null to object"],
77e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  reduce_no_initial:             ["Reduce of empty array with no initial value"],
78e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  getter_must_be_callable:       ["Getter must be a function: ", "%0"],
79e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  setter_must_be_callable:       ["Setter must be a function: ", "%0"],
80e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  value_and_accessor:            ["Invalid property.  A property cannot both have accessors and be writable or have a value, ", "%0"],
81e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proto_object_or_null:          ["Object prototype may only be an Object or null"],
82e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  property_desc_object:          ["Property description must be an object: ", "%0"],
83e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  redefine_disallowed:           ["Cannot redefine property: ", "%0"],
84e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  define_disallowed:             ["Cannot define property:", "%0", ", object is not extensible."],
85e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  non_extensible_proto:          ["%0", " is not extensible"],
86e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_non_object:            ["Proxy.", "%0", " called with non-object as handler"],
87e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proto_non_object:              ["Proxy.", "%0", " called with non-object as prototype"],
88e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  trap_function_expected:        ["Proxy.", "%0", " called with non-function for '", "%1", "' trap"],
89e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_trap_missing:          ["Proxy handler ", "%0", " has no '", "%1", "' trap"],
90e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_trap_must_be_callable: ["Proxy handler ", "%0", " has non-callable '", "%1", "' trap"],
91e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_returned_false:        ["Proxy handler ", "%0", " returned false from '", "%1", "' trap"],
92e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_returned_undefined:    ["Proxy handler ", "%0", " returned undefined from '", "%1", "' trap"],
93e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proxy_prop_not_configurable:   ["Proxy handler ", "%0", " returned non-configurable descriptor for property '", "%2", "' from '", "%1", "' trap"],
94e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proxy_non_object_prop_names:   ["Trap '", "%1", "' returned non-object ", "%0"],
95e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proxy_repeated_prop_name:      ["Trap '", "%1", "' returned repeated property name '", "%2", "'"],
96e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_weakmap_key:           ["Invalid value used as weak map key"],
97ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  invalid_weakset_value:         ["Invalid value used in weak set"],
98e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  not_date_object:               ["this is not a Date object."],
99e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_non_object:            ["Object.", "%0", " cannot ", "%0", " non-object"],
100e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_non_function:          ["Object.", "%0", " cannot deliver to non-function"],
101e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_callback_frozen:       ["Object.observe cannot deliver to a frozen function object"],
1024e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  observe_invalid_accept:        ["Object.observe accept must be an array of strings."],
103e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_type_non_string:       ["Invalid changeRecord with non-string 'type' property"],
1044e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  observe_perform_non_string:    ["Invalid non-string changeType"],
1054e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  observe_perform_non_function:  ["Cannot perform non-function"],
106e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_notify_non_notifier:   ["notify called on non-notifier object"],
107e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  proto_poison_pill:             ["Generic use of __proto__ accessor not allowed"],
10857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  not_typed_array:               ["this is not a typed array."],
10957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  invalid_argument:              ["invalid_argument"],
1101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  data_view_not_array_buffer:    ["First argument to DataView constructor must be an ArrayBuffer"],
1111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  constructor_not_function:      ["Constructor ", "%0", " requires 'new'"],
1129f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  not_a_promise:                 ["%0", "is not a promise"],
1139f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  promise_cyclic:                ["Chaining cycle detected for promise", "%0"],
1148a58f6420f995bb19fff9babb261458d49d90cb1machenbach@chromium.org  array_functions_on_frozen:     ["Cannot modify frozen array elements"],
1158a58f6420f995bb19fff9babb261458d49d90cb1machenbach@chromium.org  array_functions_change_sealed: ["Cannot add/remove sealed array elements"],
116e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // RangeError
117e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_array_length:          ["Invalid array length"],
118f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  invalid_array_buffer_length:   ["Invalid array buffer length"],
1191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_typed_array_offset:    ["Start offset is too large:"],
1201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_typed_array_length:    ["Invalid typed array length"],
121e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  invalid_typed_array_alignment: ["%0", "of", "%1", "should be a multiple of", "%3"],
12257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  typed_array_set_source_too_large:
12357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                 ["Source is too large"],
1241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  typed_array_set_negative_offset:
1251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 ["Start offset is negative"],
1261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_offset:      ["Start offset is outside the bounds of the buffer"],
1271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_length:      ["Invalid data view length"],
1281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_accessor_offset:
1291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 ["Offset is outside the bounds of the DataView"],
1301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
131e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  stack_overflow:                ["Maximum call stack size exceeded"],
132e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_time_value:            ["Invalid time value"],
133d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  invalid_count_value:           ["Invalid count value"],
134e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // SyntaxError
135f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  paren_in_arg_string:           ["Function arg string contains parenthesis"],
136f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  not_isvar:                     ["builtin %IS_VAR: not a variable"],
137f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  single_function_literal:       ["Single function literal required"],
138e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_regexp_flags:          ["Invalid flags supplied to RegExp constructor '", "%0", "'"],
139e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_regexp:                ["Invalid RegExp pattern /", "%0", "/"],
140e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_break:                 ["Illegal break statement"],
141e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_continue:              ["Illegal continue statement"],
142e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_return:                ["Illegal return statement"],
143e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_let:                   ["Illegal let declaration outside extended mode"],
144e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  error_loading_debugger:        ["Error loading debugger"],
145e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  no_input_to_regexp:            ["No input to ", "%0"],
146e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_json:                  ["String '", "%0", "' is not valid JSON"],
147e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  circular_structure:            ["Converting circular structure to JSON"],
148e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  called_on_non_object:          ["%0", " called on non-object"],
149e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  called_on_null_or_undefined:   ["%0", " called on null or undefined"],
150e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  array_indexof_not_defined:     ["Array.getIndexOf: Argument undefined"],
151e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  object_not_extensible:         ["Can't add property ", "%0", ", object is not extensible"],
152e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_access:                ["Illegal access"],
153e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_preparser_data:        ["Invalid preparser data for function ", "%0"],
154e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_mode_with:              ["Strict mode code may not include a with statement"],
155e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_catch_variable:         ["Catch variable may not be eval or arguments in strict mode"],
156e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  too_many_arguments:            ["Too many arguments in function call (only 32766 allowed)"],
157e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  too_many_parameters:           ["Too many parameters in function definition (only 32766 allowed)"],
158e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  too_many_variables:            ["Too many variables declared (only 131071 allowed)"],
159e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_param_name:             ["Parameter name eval or arguments is not allowed in strict mode"],
160e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_param_dupe:             ["Strict mode function may not have duplicate parameter names"],
161e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_var_name:               ["Variable name may not be eval or arguments in strict mode"],
162e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_function_name:          ["Function name may not be eval or arguments in strict mode"],
163e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_octal_literal:          ["Octal literals are not allowed in strict mode."],
164e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_duplicate_property:     ["Duplicate data property in object literal not allowed in strict mode"],
165e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  accessor_data_property:        ["Object literal may not have data and accessor property with the same name"],
166e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  accessor_get_set:              ["Object literal may not have multiple get/set accessors with the same name"],
167e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_lhs_assignment:         ["Assignment to eval or arguments is not allowed in strict mode"],
168e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_lhs_postfix:            ["Postfix increment/decrement may not have eval or arguments operand in strict mode"],
169e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_lhs_prefix:             ["Prefix increment/decrement may not have eval or arguments operand in strict mode"],
170e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_reserved_word:          ["Use of future reserved word in strict mode"],
171e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_delete:                 ["Delete of an unqualified identifier in strict mode."],
172e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_delete_property:        ["Cannot delete property '", "%0", "' of ", "%1"],
173e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_const:                  ["Use of const in strict mode."],
174e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_function:               ["In strict mode code, functions can only be declared at top level or immediately within another function." ],
175e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_read_only_property:     ["Cannot assign to read only property '", "%0", "' of ", "%1"],
176e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_cannot_assign:          ["Cannot assign to read only '", "%0", "' in strict mode"],
177e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_poison_pill:            ["'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them"],
178e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_caller:                 ["Illegal access to a strict mode caller function."],
179e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unprotected_let:               ["Illegal let declaration in unprotected statement context."],
180e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unprotected_const:             ["Illegal const declaration in unprotected statement context."],
181e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  cant_prevent_ext_external_array_elements: ["Cannot prevent extension of an object with external array elements"],
182e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  redef_external_array_element:  ["Cannot redefine a property of an object with external array elements"],
183e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  harmony_const_assign:          ["Assignment to constant variable."],
184f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  symbol_to_string:              ["Conversion from symbol to string"],
185e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_module_path:           ["Module does not export '", "%0", "', or export is not itself a module"],
186e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  module_type_error:             ["Module '", "%0", "' used improperly"],
187ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  module_export_undefined:       ["Export '", "%0", "' is not defined in module"]
188e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org};
189e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
190e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
191e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction FormatString(format, args) {
19231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var result = "";
19331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var arg_num = 0;
19431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  for (var i = 0; i < format.length; i++) {
19531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    var str = format[i];
1961805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (str.length == 2 && %_StringCharCodeAt(str, 0) == 0x25) {
1971805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // Two-char string starts with "%".
1981805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      var arg_num = (%_StringCharCodeAt(str, 1) - 0x30) >>> 0;
1991805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (arg_num < 4) {
2001805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // str is one of %0, %1, %2 or %3.
201ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        try {
202e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org          str = NoSideEffectToString(args[arg_num]);
2039f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org          if (str.length > 256) {
2049f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org            str = %SubString(str, 0, 239) + "...<omitted>..." +
2059f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org                  %SubString(str, str.length - 2, str.length);
2069f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org          }
207ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        } catch (e) {
20881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          if (%IsJSModule(args[arg_num]))
20981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "module";
21081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          else if (IS_SPEC_OBJECT(args[arg_num]))
21181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "object";
21281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          else
21381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "#<error>";
214ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        }
21531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org      }
216378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    }
21731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    result += str;
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
22041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
223e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction NoSideEffectToString(obj) {
224e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_STRING(obj)) return obj;
225e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_NUMBER(obj)) return %_NumberToString(obj);
226e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_BOOLEAN(obj)) return x ? 'true' : 'false';
227e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_UNDEFINED(obj)) return 'undefined';
228e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_NULL(obj)) return 'null';
229eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  if (IS_FUNCTION(obj)) return  %_CallFunction(obj, FunctionToString);
230e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_OBJECT(obj) && %GetDataProperty(obj, "toString") === ObjectToString) {
231a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    var constructor = %GetDataProperty(obj, "constructor");
232e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    if (typeof constructor == "function") {
233e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      var constructorName = constructor.name;
234e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      if (IS_STRING(constructorName) && constructorName !== "") {
235e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org        return "#<" + constructorName + ">";
236e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      }
237e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    }
238e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
239594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (CanBeSafelyTreatedAsAnErrorObject(obj)) {
240594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return %_CallFunction(obj, ErrorToString);
241594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
242e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return %_CallFunction(obj, ObjectToString);
243e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
244e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
245594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// To determine whether we can safely stringify an object using ErrorToString
246594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// without the risk of side-effects, we need to check whether the object is
247594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// either an instance of a native error type (via '%_ClassOf'), or has $Error
248594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// in its prototype chain and hasn't overwritten 'toString' with something
249594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// strange and unusual.
250594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfunction CanBeSafelyTreatedAsAnErrorObject(obj) {
251d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org  switch (%_ClassOf(obj)) {
252d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'Error':
253d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'EvalError':
254d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'RangeError':
255d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'ReferenceError':
256d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'SyntaxError':
257d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'TypeError':
258d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'URIError':
259d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org      return true;
260d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org  }
261594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
262594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  var objToString = %GetDataProperty(obj, "toString");
263594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return obj instanceof $Error && objToString === ErrorToString;
2640ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org}
2650ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
2660ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
2670a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// When formatting internally created error messages, do not
2680a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// invoke overwritten error toString methods but explicitly use
2690a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// the error to string method. This is to avoid leaking error
2700a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// objects between script tags in a browser setting.
2710a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgfunction ToStringCheckErrorObject(obj) {
272594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (CanBeSafelyTreatedAsAnErrorObject(obj)) {
273394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return %_CallFunction(obj, ErrorToString);
2740a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } else {
2750a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    return ToString(obj);
2760a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  }
2770a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
2780a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
2790a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToDetailString(obj) {
2811805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (obj != null && IS_OBJECT(obj) && obj.toString === ObjectToString) {
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var constructor = obj.constructor;
2831805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (typeof constructor == "function") {
2841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      var constructorName = constructor.name;
2851805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (IS_STRING(constructorName) && constructorName !== "") {
2861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        return "#<" + constructorName + ">";
2871805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      }
288378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    }
28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
2901805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  return ToStringCheckErrorObject(obj);
29141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeGenericError(constructor, type, args) {
295fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (IS_UNDEFINED(args)) args = [];
296fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return new constructor(FormatMessage(type, args));
29741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
3011805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org * Set up the Script function and constructor.
30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen%FunctionSetInstanceClassName(Script, 'Script');
3041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org%SetProperty(Script.prototype, 'constructor', Script,
3051805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org             DONT_ENUM | DONT_DELETE | READ_ONLY);
30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen%SetCode(Script, function(x) {
30743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Script objects can only be created by the VM.
30843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  throw new $Error("Not supported");
30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen});
31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Helper functions; called from the runtime system.
313e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction FormatMessage(type, args) {
314e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  var format = kMessages[type];
315e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (!format) return "<unknown message " + type + ">";
316e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return FormatString(format, args);
31741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetLineNumber(message) {
32131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
32231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  if (start_position == -1) return kNoLineNumberInfo;
32331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
32431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, true);
325720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  if (location == null) return kNoLineNumberInfo;
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return location.line + 1;
32741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the source code line containing the given source
33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// position, or the empty string if the position is invalid.
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetSourceLine(message) {
33331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
33431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
33531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, true);
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (location == null) return "";
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  location.restrict();
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return location.sourceText();
33941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeTypeError(type, args) {
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($TypeError, type, args);
34441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeRangeError(type, args) {
34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($RangeError, type, args);
34941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeSyntaxError(type, args) {
35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($SyntaxError, type, args);
35441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeReferenceError(type, args) {
35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($ReferenceError, type, args);
35941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeEvalError(type, args) {
36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($EvalError, type, args);
36441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeError(type, args) {
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($Error, type, args);
36941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
371eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org/**
372eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * Find a line number given a specific source position.
373eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @param {number} position The source position.
374eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @return {number} 0 if input too small, -1 if input too large,
375eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org       else the line number.
376eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org */
3771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLineFromPosition(position) {
378eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var lower = 0;
379eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var upper = this.lineCount() - 1;
380499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
381eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
382eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // We'll never find invalid positions so bail right away.
383499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  if (position > line_ends[upper]) {
384eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return -1;
385eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
386eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
387eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // This means we don't have to safe-guard indexing line_ends[i - 1].
388499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  if (position <= line_ends[0]) {
389eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return 0;
390eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
391eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
392eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // Binary search to find line # from position range.
393eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  while (upper >= 1) {
394eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    var i = (lower + upper) >> 1;
395eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
396499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org    if (position > line_ends[i]) {
397eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      lower = i + 1;
398499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org    } else if (position <= line_ends[i - 1]) {
399eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      upper = i - 1;
400eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    } else {
401eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      return i;
402eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    }
403eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
404d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
405eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return -1;
406eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get information on a specific source position.
41043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} position The source position
4117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org * @param {boolean} include_resource_offset Set to true to have the resource
4127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org *     offset added to the location
41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceLocation}
41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     If line is negative or not in the source null is returned.
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLocationFromPosition(position,
4171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org                                    include_resource_offset) {
418eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var line = this.lineFromPosition(position);
41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == -1) return null;
4209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Determine start, end and column.
422499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
423499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var start = line == 0 ? 0 : line_ends[line - 1] + 1;
424499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var end = line_ends[line];
4251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (end > 0 && %_CallFunction(this.source, end - 1, StringCharAt) == '\r') {
4261805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    end--;
4271805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  }
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = position - start;
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Adjust according to the offset within the resource.
4317be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (include_resource_offset) {
4327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    line += this.line_offset;
4337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    if (line == this.line_offset) {
4347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      column += this.column_offset;
4357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    }
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new SourceLocation(this, position, line, column, start, end);
4391b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get information on a specific source line and column possibly offset by a
44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * fixed source position. This function is used to find a source position from
44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * a line and column position. The fixed source position offset is typically
44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * used to find a source position in a function based on a line and column in
44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the source for the function alone. The offset passed will then be the
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * start position of the source for the function within the full script source.
44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_line The line within the source. Default value is 0
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_column The column in within the line. Default value is 0
45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_offset_position The offset from the begining of the
4521805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org *     source from where the line and column calculation starts.
4531805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org *     Default value is 0
45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceLocation}
45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     If line is negative or not in the source null is returned.
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4571805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLocationFromLine(opt_line, opt_column, opt_offset_position) {
45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is the first line in the script. Lines in the script is relative
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to the offset within the resource.
46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = 0;
46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_line)) {
46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    line = opt_line - this.line_offset;
46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
4649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is first column. If on the first line add the offset within the
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // resource.
46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = opt_column || 0;
46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == 0) {
4691b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    column -= this.column_offset;
47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
47143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var offset_position = opt_offset_position || 0;
47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line < 0 || column < 0 || offset_position < 0) return null;
47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == 0) {
4753a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org    return this.locationFromPosition(offset_position + column, false);
47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
477eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // Find the line where the offset position is located.
478eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    var offset_line = this.lineFromPosition(offset_position);
479eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
480eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    if (offset_line == -1 || offset_line + line >= this.lineCount()) {
481eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      return null;
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
483eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
4841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    return this.locationFromPosition(
4851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        this.line_ends[offset_line + line - 1] + 1 + column);  // line > 0 here.
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get a slice of source code from the script. The boundaries for the slice is
49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * specified in lines.
49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_from_line The first line (zero bound) in the slice.
49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Default is 0
49543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_to_column The last line (zero bound) in the slice (non
49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     inclusive). Default is the number of lines in the script
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceSlice} The source slice or null of the parameters where
49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     invalid
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5001805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptSourceSlice(opt_from_line, opt_to_line) {
5011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var from_line = IS_UNDEFINED(opt_from_line) ? this.line_offset
5021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                                              : opt_from_line;
5031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var to_line = IS_UNDEFINED(opt_to_line) ? this.line_offset + this.lineCount()
5041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                                          : opt_to_line;
50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Adjust according to the offset within the resource.
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  from_line -= this.line_offset;
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  to_line -= this.line_offset;
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (from_line < 0) from_line = 0;
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (to_line > this.lineCount()) to_line = this.lineCount();
51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
512245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Check parameters.
51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (from_line >= this.lineCount() ||
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      to_line < 0 ||
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      from_line > to_line) {
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return null;
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
519499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
520499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var from_position = from_line == 0 ? 0 : line_ends[from_line - 1] + 1;
521499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var to_position = to_line == 0 ? 0 : line_ends[to_line - 1] + 1;
52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Return a source slice with line numbers re-adjusted to the resource.
5241b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return new SourceSlice(this,
5251b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         from_line + this.line_offset,
5261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         to_line + this.line_offset,
5271b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                          from_position, to_position);
52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5311805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptSourceLine(opt_line) {
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is the first line in the script. Lines in the script are relative
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to the offset within the resource.
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = 0;
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_line)) {
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    line = opt_line - this.line_offset;
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
538245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
539245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Check parameter.
54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line < 0 || this.lineCount() <= line) {
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return null;
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
544245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Return the source line.
545499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
546499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var start = line == 0 ? 0 : line_ends[line - 1] + 1;
547499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var end = line_ends[line];
5487a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  return %_CallFunction(this.source, start, end, StringSubstring);
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the number of source lines.
55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {number}
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Number of source lines.
55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5571805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLineCount() {
558245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Return number of source lines.
559245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.line_ends.length;
5601b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
56433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * If sourceURL comment is available and script starts at zero returns sourceURL
56533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * comment contents. Otherwise, script name is returned. See
56625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org * http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
567b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * and Source Map Revision 3 proposal for details on using //# sourceURL and
568b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * deprecated //@ sourceURL comment to identify scripts that don't have name.
56942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org *
570b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * @return {?string} script name if present, value for //# sourceURL or
571b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * deprecated //@ sourceURL comment otherwise.
57225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org */
5731805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptNameOrSourceURL() {
57433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if (this.line_offset > 0 || this.column_offset > 0) {
57525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org    return this.name;
5761805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  }
5779a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
5789a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  // The result is cached as on long scripts it takes noticable time to search
5799a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  // for the sourceURL.
58033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if (this.hasCachedNameOrSourceURL) {
58133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return this.cachedNameOrSourceURL;
58233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
5839a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  this.hasCachedNameOrSourceURL = true;
5849a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
58542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org  // TODO(608): the spaces in a regexp below had to be escaped as \040
58625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  // because this file is being processed by js2c whose handling of spaces
58725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  // in regexps is broken. Also, ['"] are excluded from allowed URLs to
58825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  // avoid matches against sources that invoke evals with sourceURL.
589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // A better solution would be to detect these special comments in
590ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // the scanner/parser.
591ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var source = ToString(this.source);
592ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var sourceUrlPos = %StringIndexOf(source, "sourceURL=", 0);
5939a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  this.cachedNameOrSourceURL = this.name;
594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (sourceUrlPos > 4) {
595ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    var sourceUrlPattern =
596b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org        /\/\/[#@][\040\t]sourceURL=[\040\t]*([^\s\'\"]*)[\040\t]*$/gm;
597ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // Don't reuse lastMatchInfo here, so we create a new array with room
598ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // for four captures (array with length one longer than the index
599ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // of the fourth capture, where the numbering is zero-based).
600ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    var matchInfo = new InternalArray(CAPTURE(3) + 1);
601ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    var match =
602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        %_RegExpExec(sourceUrlPattern, source, sourceUrlPos - 4, matchInfo);
603ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (match) {
6049a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org      this.cachedNameOrSourceURL =
6052e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          %_SubString(source, matchInfo[CAPTURE(2)], matchInfo[CAPTURE(3)]);
606ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
607ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
6089a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return this.cachedNameOrSourceURL;
60925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org}
61025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
61125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
6121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(Script,
6139a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  $Array("source", "name", "line_ends", "line_offset", "column_offset",
6149a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org         "cachedNameOrSourceURL", "hasCachedNameOrSourceURL" ),
6151805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array(
6161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "lineFromPosition", ScriptLineFromPosition,
6171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "locationFromPosition", ScriptLocationFromPosition,
6181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "locationFromLine", ScriptLocationFromLine,
6191805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceSlice", ScriptSourceSlice,
6201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceLine", ScriptSourceLine,
6211805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "lineCount", ScriptLineCount,
6221805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "nameOrSourceURL", ScriptNameOrSourceURL
6231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  )
6241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
6251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
6261805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
62725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org/**
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Class for source location. A source location is a position within some
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * source with the following properties:
63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   script   : script object for the source
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   line     : source line number
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   column   : source column within the line
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   position : position within the source
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   start    : position of start of source context (inclusive)
63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   end      : position of end of source context (not inclusive)
6361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * Source text for the source context is the character interval
6371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * [start, end[. In most cases end will point to a newline character.
6381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * It might point just past the final position of the source if the last
6391b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * source line does not end with a newline character.
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Script} script The Script object for which this is a location
64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} position Source position for the location
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} line The line number for the location
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} column The column within the line for the location
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} start Source position for start of source context
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} end Source position for end of source context
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction SourceLocation(script, position, line, column, start, end) {
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.script = script;
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.position = position;
65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.line = line;
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.column = column;
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.start = start;
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.end = end;
65541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
657f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kLineLengthLimit = 78;
65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Restrict source location start and end positions to make the source slice
66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * no more that a certain number of characters wide.
66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_limit The with limit of the source text with a default
66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     of 78
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_before The number of characters to prefer before the
66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     position with a default value of 10 less that the limit
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
6671805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceLocationRestrict(opt_limit, opt_before) {
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Find the actual limit to use.
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var limit;
67043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var before;
67143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_limit)) {
67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    limit = opt_limit;
67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    limit = kLineLengthLimit;
67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_before)) {
67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    before = opt_before;
67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // If no before is specified center for small limits and perfer more source
68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // before the the position that after for longer limits.
68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (limit <= 20) {
68241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org      before = $floor(limit / 2);
68343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
68443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      before = limit - 10;
68543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (before >= limit) {
68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    before = limit - 1;
68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
69043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the [start, end[ interval is too big we restrict
69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // it in one or both ends. We make sure to always produce
69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // restricted intervals of maximum allowed size.
69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.end - this.start > limit) {
69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var start_limit = this.position - before;
69643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var end_limit = this.position + limit - before;
69743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (this.start < start_limit && end_limit < this.end) {
69843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.start = start_limit;
69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.end = end_limit;
70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (this.start < start_limit) {
70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.start = this.end - limit;
70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.end = this.start + limit;
70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
7061b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get the source text for a SourceLocation
71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {String}
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Source text for this location.
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
7141805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceLocationSourceText() {
7151b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return %_CallFunction(this.script.source,
7161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        this.start,
7171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        this.end,
7181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        StringSubstring);
7191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7221805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(SourceLocation,
7231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("script", "position", "line", "column", "start", "end"),
7241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array(
7251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "restrict", SourceLocationRestrict,
7261805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceText", SourceLocationSourceText
7271b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org )
7281805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
7291805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
7301805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Class for a source slice. A source slice is a part of a script source with
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the following properties:
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   script        : script object for the source
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   from_line     : line number for the first line in the slice
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   to_line       : source line number for the last line in the slice
73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   from_position : position of the first character in the slice
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   to_position   : position of the last character in the slice
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The to_line and to_position are not included in the slice, that is the lines
74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * in the slice are [from_line, to_line[. Likewise the characters in the slice
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * are [from_position, to_position[.
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Script} script The Script object for the source slice
74343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} from_line
74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} to_line
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} from_position
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} to_position
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction SourceSlice(script, from_line, to_line, from_position, to_position) {
75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.script = script;
75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.from_line = from_line;
75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.to_line = to_line;
75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.from_position = from_position;
75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.to_position = to_position;
75543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
75643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get the source text for a SourceSlice
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {String} Source text for this slice. The last line will include
76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     the line terminating characters (if any)
76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
7621805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceSliceSourceText() {
7637a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  return %_CallFunction(this.script.source,
7647a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        this.from_position,
7657a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        this.to_position,
7667a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        StringSubstring);
7671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7691805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(SourceSlice,
7701805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("script", "from_line", "to_line", "from_position", "to_position"),
7711805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("sourceText", SourceSliceSourceText)
7721805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
7731805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the offset of the given position within the containing
77643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// line.
77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetPositionInLine(message) {
77831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
77931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
78031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, false);
78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (location == null) return -1;
78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  location.restrict();
78331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  return start_position - location.start;
78441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
78543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetStackTraceLine(recv, fun, pos, isGlobal) {
788f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return new CallSite(recv, fun, pos, false).toString();
78941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------
79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Error implementation
79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org//TODO(rossberg)
7950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgvar CallSiteReceiverKey = NEW_PRIVATE("receiver");
7960cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgvar CallSiteFunctionKey = NEW_PRIVATE("function");
7970cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgvar CallSitePositionKey = NEW_PRIVATE("position");
7980cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgvar CallSiteStrictModeKey = NEW_PRIVATE("strict mode");
799f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
800f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgfunction CallSite(receiver, fun, pos, strict_mode) {
8010cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  SET_PRIVATE(this, CallSiteReceiverKey, receiver);
8020cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  SET_PRIVATE(this, CallSiteFunctionKey, fun);
8030cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  SET_PRIVATE(this, CallSitePositionKey, pos);
8040cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  SET_PRIVATE(this, CallSiteStrictModeKey, strict_mode);
8052abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}
8062abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8071805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetThis() {
8080cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GET_PRIVATE(this, CallSiteStrictModeKey)
8090cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      ? UNDEFINED : GET_PRIVATE(this, CallSiteReceiverKey);
8101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8112abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetTypeName() {
8130cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GetTypeName(GET_PRIVATE(this, CallSiteReceiverKey), false);
8141b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8152abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsToplevel() {
8170cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  if (GET_PRIVATE(this, CallSiteReceiverKey) == null) {
8182abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return true;
81928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
8200cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return IS_GLOBAL(GET_PRIVATE(this, CallSiteReceiverKey));
8211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8222abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsEval() {
8240cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
8255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  return script && script.compilation_type == COMPILATION_TYPE_EVAL;
8261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8272abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8281805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetEvalOrigin() {
8290cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
8309818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return FormatEvalOrigin(script);
8311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8322abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8331805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetScriptNameOrSourceURL() {
8340cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
835c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return script ? script.nameOrSourceURL() : null;
8361b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
837c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
8381805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFunction() {
8390cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GET_PRIVATE(this, CallSiteStrictModeKey)
8400cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      ? UNDEFINED : GET_PRIVATE(this, CallSiteFunctionKey);
8411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
84286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org
8431805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFunctionName() {
8442abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // See if the function knows its own name
8450cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var name = GET_PRIVATE(this, CallSiteFunctionKey).name;
84686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  if (name) {
8472abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return name;
848830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
8490cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  name = %FunctionGetInferredName(GET_PRIVATE(this, CallSiteFunctionKey));
850830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (name) {
851830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return name;
85286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  }
85386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  // Maybe this is an evaluation?
8540cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
85528a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (script && script.compilation_type == COMPILATION_TYPE_EVAL) {
85686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    return "eval";
85728a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
85886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  return null;
8591b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
86086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org
8611805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetMethodName() {
8622abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // See if we can find a unique property on the receiver that holds
8632abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // this function.
8640cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var receiver = GET_PRIVATE(this, CallSiteReceiverKey);
8650cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var fun = GET_PRIVATE(this, CallSiteFunctionKey);
866f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var ownName = fun.name;
867f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (ownName && receiver &&
868f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      (%_CallFunction(receiver, ownName, ObjectLookupGetter) === fun ||
869f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org       %_CallFunction(receiver, ownName, ObjectLookupSetter) === fun ||
870f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org       (IS_OBJECT(receiver) && %GetDataProperty(receiver, ownName) === fun))) {
87186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    // To handle DontEnum properties we guess that the method has
87286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    // the same name as the function.
87386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    return ownName;
874ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  }
87586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  var name = null;
876f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (var prop in receiver) {
877f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    if (%_CallFunction(receiver, prop, ObjectLookupGetter) === fun ||
878f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, prop, ObjectLookupSetter) === fun ||
879f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        (IS_OBJECT(receiver) && %GetDataProperty(receiver, prop) === fun)) {
880ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org      // If we find more than one match bail out to avoid confusion.
88128a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      if (name) {
8822abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org        return null;
88328a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      }
8842abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      name = prop;
8852abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
8862abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
88728a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (name) {
8882abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return name;
88928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
8902abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return null;
8911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8922abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8931805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFileName() {
8940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
8952abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return script ? script.name : null;
8961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8972abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8981805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetLineNumber() {
8990cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  if (GET_PRIVATE(this, CallSitePositionKey) == -1) {
9002abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return null;
90128a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
9020cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
9032abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  var location = null;
9042abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  if (script) {
9050cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    location = script.locationFromPosition(
9060cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org        GET_PRIVATE(this, CallSitePositionKey), true);
9072abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
9082abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return location ? location.line + 1 : null;
9091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9102abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetColumnNumber() {
9120cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  if (GET_PRIVATE(this, CallSitePositionKey) == -1) {
9132abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return null;
91428a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
9150cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
9162abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  var location = null;
9172abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  if (script) {
9180cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    location = script.locationFromPosition(
9190cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      GET_PRIVATE(this, CallSitePositionKey), true);
9202abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
9219818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return location ? location.column + 1: null;
9221b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9232abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsNative() {
9250cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
9265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  return script ? (script.type == TYPE_NATIVE) : false;
9271b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9282abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9291805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetPosition() {
9300cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GET_PRIVATE(this, CallSitePositionKey);
9311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9322abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9331805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsConstructor() {
9340cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var receiver = GET_PRIVATE(this, CallSiteReceiverKey);
935a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  var constructor = (receiver != null && IS_OBJECT(receiver))
936a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org                        ? %GetDataProperty(receiver, "constructor") : null;
9374a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  if (!constructor) return false;
9380cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GET_PRIVATE(this, CallSiteFunctionKey) === constructor;
9391b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9402abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9415f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.orgfunction CallSiteToString() {
9425f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var fileName;
9435f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var fileLocation = "";
9445f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  if (this.isNative()) {
9455f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    fileLocation = "native";
9465f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else {
9475a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    if (this.isEval()) {
9485a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileName = this.getScriptNameOrSourceURL();
9495a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      if (!fileName) {
9505a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        fileLocation = this.getEvalOrigin();
9515a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        fileLocation += ", ";  // Expecting source position to follow.
9525a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      }
9535a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    } else {
9545a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileName = this.getFileName();
9555a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    }
9565f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
9575a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    if (fileName) {
9585a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileLocation += fileName;
9595a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    } else {
9605a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // Source code does not originate from a file and is not native, but we
9615a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // can still get the source position inside the source string, e.g. in
9625a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // an eval string.
9635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileLocation += "<anonymous>";
9645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    }
9655f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    var lineNumber = this.getLineNumber();
9665f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    if (lineNumber != null) {
9675f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      fileLocation += ":" + lineNumber;
9685f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      var columnNumber = this.getColumnNumber();
9695f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      if (columnNumber) {
9705f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org        fileLocation += ":" + columnNumber;
9715f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      }
9725f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    }
9735f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
9745f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
9755f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var line = "";
976830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var functionName = this.getFunctionName();
977830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var addSuffix = true;
9785f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var isConstructor = this.isConstructor();
9795f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var isMethodCall = !(this.isToplevel() || isConstructor);
9805f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  if (isMethodCall) {
9810cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    var typeName = GetTypeName(GET_PRIVATE(this, CallSiteReceiverKey), true);
9825f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    var methodName = this.getMethodName();
9835f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    if (functionName) {
98446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      if (typeName &&
98546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org          %_CallFunction(functionName, typeName, StringIndexOf) != 0) {
986830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org        line += typeName + ".";
987830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org      }
9885f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      line += functionName;
98946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      if (methodName &&
99046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org          (%_CallFunction(functionName, "." + methodName, StringIndexOf) !=
99146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org           functionName.length - methodName.length - 1)) {
9925f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org        line += " [as " + methodName + "]";
9935f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      }
9945f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    } else {
995830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org      line += typeName + "." + (methodName || "<anonymous>");
9965f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    }
9975f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else if (isConstructor) {
9985f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += "new " + (functionName || "<anonymous>");
9995f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else if (functionName) {
10005f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += functionName;
10015f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else {
10025f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += fileLocation;
1003830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    addSuffix = false;
10045f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
1005830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (addSuffix) {
10065f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += " (" + fileLocation + ")";
10075f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
10085f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  return line;
10095f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org}
10105f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
10111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(CallSite, $Array("receiver", "fun", "pos"), $Array(
10121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getThis", CallSiteGetThis,
10131805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getTypeName", CallSiteGetTypeName,
10141805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isToplevel", CallSiteIsToplevel,
10151805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isEval", CallSiteIsEval,
10161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getEvalOrigin", CallSiteGetEvalOrigin,
10171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getScriptNameOrSourceURL", CallSiteGetScriptNameOrSourceURL,
10181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFunction", CallSiteGetFunction,
10191805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFunctionName", CallSiteGetFunctionName,
10201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getMethodName", CallSiteGetMethodName,
10211805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFileName", CallSiteGetFileName,
10221805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getLineNumber", CallSiteGetLineNumber,
10231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getColumnNumber", CallSiteGetColumnNumber,
10241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isNative", CallSiteIsNative,
10251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getPosition", CallSiteGetPosition,
10265f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  "isConstructor", CallSiteIsConstructor,
10275f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  "toString", CallSiteToString
10281805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org));
10291805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
10301805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
10319818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.orgfunction FormatEvalOrigin(script) {
1032c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  var sourceURL = script.nameOrSourceURL();
103328a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (sourceURL) {
1034c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    return sourceURL;
103528a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
1036c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
1037c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  var eval_origin = "eval at ";
10389818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  if (script.eval_from_function_name) {
10399818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    eval_origin += script.eval_from_function_name;
10409818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  } else {
10419818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    eval_origin +=  "<anonymous>";
10429818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  }
104325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
10449818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  var eval_from_script = script.eval_from_script;
10459818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  if (eval_from_script) {
10465d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    if (eval_from_script.compilation_type == COMPILATION_TYPE_EVAL) {
10479818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      // eval script originated from another eval.
1048c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      eval_origin += " (" + FormatEvalOrigin(eval_from_script) + ")";
10499818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    } else {
1050c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      // eval script originated from "real" source.
10519818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      if (eval_from_script.name) {
10529818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        eval_origin += " (" + eval_from_script.name;
10531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        var location = eval_from_script.locationFromPosition(
10541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org            script.eval_from_script_position, true);
10559818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        if (location) {
10569818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org          eval_origin += ":" + (location.line + 1);
10579818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org          eval_origin += ":" + (location.column + 1);
10589818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        }
10591b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        eval_origin += ")";
10609818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      } else {
10619818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        eval_origin += " (unknown source)";
10629818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      }
10639818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    }
10649818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  }
106525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
10669818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return eval_origin;
10671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
10689818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org
106946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
107046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgfunction FormatErrorString(error) {
10712abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  try {
107246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    return %_CallFunction(error, ErrorToString);
10732abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  } catch (e) {
10742abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    try {
107546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      return "<error: " + e + ">";
10762abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    } catch (ee) {
107746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      return "<error>";
10782abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
10792abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
108046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
108146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
108246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
108346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgfunction GetStackFrames(raw_stack) {
108446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var frames = new InternalArray();
1085f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var non_strict_frames = raw_stack[0];
1086f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (var i = 1; i < raw_stack.length; i += 4) {
108746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var recv = raw_stack[i];
108846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var fun = raw_stack[i + 1];
108946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var code = raw_stack[i + 2];
109046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var pc = raw_stack[i + 3];
109146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var pos = %FunctionGetPositionForOffset(code, pc);
1092f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    non_strict_frames--;
1093f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    frames.push(new CallSite(recv, fun, pos, (non_strict_frames < 0)));
109446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
109546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return frames;
109646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
109746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
109846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
1099d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Flag to prevent recursive call of Error.prepareStackTrace.
1100d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvar formatting_custom_stack_trace = false;
1101d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1102d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1103d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction FormatStackTrace(obj, error_string, frames) {
1104d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (IS_FUNCTION($Error.prepareStackTrace) && !formatting_custom_stack_trace) {
1105d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var array = [];
1106d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    %MoveArrayContents(frames, array);
1107d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    formatting_custom_stack_trace = true;
1108690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    var stack_trace = UNDEFINED;
1109d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    try {
1110d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      stack_trace = $Error.prepareStackTrace(obj, array);
1111d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    } catch (e) {
1112d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      throw e;  // The custom formatting function threw.  Rethrow.
1113d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    } finally {
1114d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      formatting_custom_stack_trace = false;
1115d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
1116d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return stack_trace;
1117d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
1118d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
111946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var lines = new InternalArray();
112046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  lines.push(error_string);
11212abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  for (var i = 0; i < frames.length; i++) {
11222abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    var frame = frames[i];
1123c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    var line;
11242abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    try {
11255f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      line = frame.toString();
11262abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    } catch (e) {
11272abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      try {
1128c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org        line = "<error: " + e + ">";
11292abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      } catch (ee) {
11302abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org        // Any code that reaches this point is seriously nasty!
1131c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org        line = "<error>";
11322abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      }
11332abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
11342abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    lines.push("    at " + line);
11352abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
113646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return %_CallFunction(lines, "\n", ArrayJoin);
11372abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}
11382abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
11392abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
1140f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgfunction GetTypeName(receiver, requireConstructor) {
1141f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var constructor = receiver.constructor;
1142830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (!constructor) {
1143830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return requireConstructor ? null :
1144f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, ObjectToString);
1145830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
1146830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var constructorName = constructor.name;
1147830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (!constructorName) {
1148830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return requireConstructor ? null :
1149f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, ObjectToString);
1150830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
1151830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return constructorName;
1152830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org}
115343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
115446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
11550b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgfunction captureStackTrace(obj, cons_opt) {
11560b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  var stackTraceLimit = $Error.stackTraceLimit;
115731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  if (!stackTraceLimit || !IS_NUMBER(stackTraceLimit)) return;
115828a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (stackTraceLimit < 0 || stackTraceLimit > 10000) {
11590b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org    stackTraceLimit = 10000;
116028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
116146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var stack = %CollectStackTrace(obj,
116246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                 cons_opt ? cons_opt : captureStackTrace,
116346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                 stackTraceLimit);
116446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
116546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var error_string = FormatErrorString(obj);
1166fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // The holder of this getter ('obj') may not be the receiver ('this').
1167fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // When this getter is called the first time, we use the context values to
1168fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // format a stack trace string and turn this accessor pair into a data
1169fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // property (on the holder).
1170eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  var getter = function() {
117146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    // Stack is still a raw array awaiting to be formatted.
1172d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var result = FormatStackTrace(obj, error_string, GetStackFrames(stack));
1173fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Turn this accessor into a data property.
1174fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    %DefineOrRedefineDataProperty(obj, 'stack', result, NONE);
1175fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Release context values.
1176690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    stack = error_string = UNDEFINED;
1177fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return result;
1178eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  };
117946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
1180fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // Set the 'stack' property on the receiver.  If the receiver is the same as
1181fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // holder of this setter, the accessor pair is turned into a data property.
1182eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  var setter = function(v) {
1183fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Set data property on the receiver (not necessarily holder).
1184eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    %DefineOrRedefineDataProperty(this, 'stack', v, NONE);
1185fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (this === obj) {
1186fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      // Release context values if holder is the same as the receiver.
1187690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      stack = error_string = UNDEFINED;
1188fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
1189eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  };
1190eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1191eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  %DefineOrRedefineAccessorProperty(obj, 'stack', getter, setter, DONT_ENUM);
11921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
11930b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
119443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11951805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SetUpError() {
11961805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // Define special error type constructors.
11971805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
1198f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  var DefineError = function(f) {
11991805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // Store the error function in both the global object
12001805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // and the runtime object. The function is fetched
12011805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // from the runtime object when throwing errors from
12021805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // within the runtime system to avoid strange side
12031805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // effects when overwriting the error functions from
12041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // user code.
12051805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    var name = f.name;
12061805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetProperty(global, name, f, DONT_ENUM);
12071805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetProperty(builtins, '$' + name, f, DONT_ENUM | DONT_DELETE | READ_ONLY);
12081805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // Configure the error function.
12091805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (name == 'Error') {
12101805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // The prototype of the Error object must itself be an error.
12111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // However, it can't be an instance of the Error object because
12121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // it hasn't been properly configured yet.  Instead we create a
12131805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // special not-a-true-error-but-close-enough object.
1214f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org      var ErrorPrototype = function() {};
12151805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(ErrorPrototype, $Object.prototype);
12161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetInstanceClassName(ErrorPrototype, 'Error');
12171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(f, new ErrorPrototype());
12181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    } else {
12191805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(f, new $Error());
12201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    }
12211805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %FunctionSetInstanceClassName(f, 'Error');
12221805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetProperty(f.prototype, 'constructor', f, DONT_ENUM);
1223212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    %SetProperty(f.prototype, "name", name, DONT_ENUM);
12241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetCode(f, function(m) {
12251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (%_IsConstructCall()) {
12261805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // Define all the expected properties directly on the error
12271805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // object. This avoids going through getters and setters defined
12281805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // on prototype objects.
1229690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org        %IgnoreAttributesAndSetProperty(this, 'stack', UNDEFINED, DONT_ENUM);
1230e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org        if (!IS_UNDEFINED(m)) {
1231212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org          %IgnoreAttributesAndSetProperty(
1232212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org            this, 'message', ToString(m), DONT_ENUM);
12331805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        }
12341805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        captureStackTrace(this, f);
12351805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      } else {
12361805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        return new f(m);
12371805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      }
12381805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    });
1239394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    %SetNativeFlag(f);
1240f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  };
124143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12421805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function Error() { });
12431805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function TypeError() { });
12441805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function RangeError() { });
12451805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function SyntaxError() { });
12461805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function ReferenceError() { });
12471805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function EvalError() { });
12481805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function URIError() { });
12491805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org}
12500b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
12511805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpError();
12527b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
12531805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org$Error.captureStackTrace = captureStackTrace;
12547b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
12551805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org%SetProperty($Error.prototype, 'message', '', DONT_ENUM);
125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1257394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// Global list of error objects visited during ErrorToString. This is
12580a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// used to detect cycles in error toString formatting.
1259f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar visited_errors = new InternalArray();
1260f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar cyclic_error_marker = new $Object();
12610a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1262212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgfunction GetPropertyWithoutInvokingMonkeyGetters(error, name) {
1263057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  var current = error;
1264212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // Climb the prototype chain until we find the holder.
1265057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  while (current && !%HasLocalProperty(current, name)) {
1266057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    current = %GetPrototype(current);
1267212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  }
1268057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  if (IS_NULL(current)) return UNDEFINED;
1269057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  if (!IS_OBJECT(current)) return error[name];
1270212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // If the property is an accessor on one of the predefined errors that can be
1271212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // generated statically by the compiler, don't touch it. This is to address
1272212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // http://code.google.com/p/chromium/issues/detail?id=69187
1273057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  var desc = %GetOwnProperty(current, name);
1274212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  if (desc && desc[IS_ACCESSOR_INDEX]) {
1275212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var isName = name === "name";
1276057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    if (current === $ReferenceError.prototype)
1277690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      return isName ? "ReferenceError" : UNDEFINED;
1278057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    if (current === $SyntaxError.prototype)
1279690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      return isName ? "SyntaxError" : UNDEFINED;
1280057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    if (current === $TypeError.prototype)
1281690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      return isName ? "TypeError" : UNDEFINED;
1282212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  }
1283212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // Otherwise, read normally.
1284212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  return error[name];
1285212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org}
1286212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org
1287394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction ErrorToStringDetectCycle(error) {
12881805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (!%PushIfAbsent(visited_errors, error)) throw cyclic_error_marker;
12890a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  try {
1290212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name");
1291394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name);
1292212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var message = GetPropertyWithoutInvokingMonkeyGetters(error, "message");
1293394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    message = IS_UNDEFINED(message) ? "" : TO_STRING_INLINE(message);
1294394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (name === "") return message;
1295394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (message === "") return name;
1296394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return name + ": " + message;
12970a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } finally {
129831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    visited_errors.length = visited_errors.length - 1;
12990a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  }
13000a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
13010a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1302394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction ErrorToString() {
13039a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  if (!IS_SPEC_OBJECT(this)) {
13049a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    throw MakeTypeError("called_on_non_object", ["Error.prototype.toString"]);
13051c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
13060a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
13070a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  try {
1308394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return ErrorToStringDetectCycle(this);
13090a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } catch(e) {
13100a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    // If this error message was encountered already return the empty
13110a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    // string for it instead of recursively formatting it.
1312394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (e === cyclic_error_marker) {
131328a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      return '';
131428a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    }
131528a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    throw e;
131643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1317c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
1318c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
13199ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
1320394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comInstallFunctions($Error.prototype, DONT_ENUM, ['toString', ErrorToString]);
132143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
132243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Boilerplate for exceptions for stack overflows. Used from
1323ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// Isolate::StackOverflow().
1324eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgfunction SetUpStackOverflowBoilerplate() {
1325eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  var boilerplate = MakeRangeError('stack_overflow', []);
1326eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
132746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var error_string = boilerplate.name + ": " + boilerplate.message;
132846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
1329fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // The raw stack trace is stored as a hidden property on the holder of this
1330fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // getter, which may not be the same as the receiver.  Find the holder to
1331fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // retrieve the raw stack trace and then turn this accessor pair into a
1332fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // data property.
1333fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  var getter = function() {
1334eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    var holder = this;
1335eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    while (!IS_ERROR(holder)) {
1336eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      holder = %GetPrototype(holder);
1337fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      if (IS_NULL(holder)) return MakeSyntaxError('illegal_access', []);
1338eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    }
1339fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    var stack = %GetAndClearOverflowedStackTrace(holder);
1340fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // We may not have captured any stack trace.
1341fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (IS_UNDEFINED(stack)) return stack;
1342fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
1343d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var result = FormatStackTrace(holder, error_string, GetStackFrames(stack));
1344fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Replace this accessor with a data property.
1345fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    %DefineOrRedefineDataProperty(holder, 'stack', result, NONE);
1346fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return result;
1347fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  };
1348eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1349fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // Set the 'stack' property on the receiver.  If the receiver is the same as
1350fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // holder of this setter, the accessor pair is turned into a data property.
1351fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  var setter = function(v) {
1352eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    %DefineOrRedefineDataProperty(this, 'stack', v, NONE);
1353fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Tentatively clear the hidden property. If the receiver is the same as
1354fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // holder, we release the raw stack trace this way.
1355fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    %GetAndClearOverflowedStackTrace(this);
1356fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  };
1357eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1358eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  %DefineOrRedefineAccessorProperty(
1359eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      boilerplate, 'stack', getter, setter, DONT_ENUM);
1360eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1361eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return boilerplate;
1362eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
1363eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1364eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvar kStackOverflowBoilerplate = SetUpStackOverflowBoilerplate();
1365