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'"],
112e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // RangeError
113e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_array_length:          ["Invalid array length"],
114f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  invalid_array_buffer_length:   ["Invalid array buffer length"],
1151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_typed_array_offset:    ["Start offset is too large:"],
1161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_typed_array_length:    ["Invalid typed array length"],
117e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  invalid_typed_array_alignment: ["%0", "of", "%1", "should be a multiple of", "%3"],
11857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  typed_array_set_source_too_large:
11957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                 ["Source is too large"],
1201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  typed_array_set_negative_offset:
1211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 ["Start offset is negative"],
1221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_offset:      ["Start offset is outside the bounds of the buffer"],
1231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_length:      ["Invalid data view length"],
1241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_accessor_offset:
1251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 ["Offset is outside the bounds of the DataView"],
1261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
127e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  stack_overflow:                ["Maximum call stack size exceeded"],
128e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_time_value:            ["Invalid time value"],
129d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  invalid_count_value:           ["Invalid count value"],
130e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // SyntaxError
131f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  paren_in_arg_string:           ["Function arg string contains parenthesis"],
132f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  not_isvar:                     ["builtin %IS_VAR: not a variable"],
133f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  single_function_literal:       ["Single function literal required"],
134e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_regexp_flags:          ["Invalid flags supplied to RegExp constructor '", "%0", "'"],
135e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_regexp:                ["Invalid RegExp pattern /", "%0", "/"],
136e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_break:                 ["Illegal break statement"],
137e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_continue:              ["Illegal continue statement"],
138e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_return:                ["Illegal return statement"],
139e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_let:                   ["Illegal let declaration outside extended mode"],
140e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  error_loading_debugger:        ["Error loading debugger"],
141e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  no_input_to_regexp:            ["No input to ", "%0"],
142e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_json:                  ["String '", "%0", "' is not valid JSON"],
143e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  circular_structure:            ["Converting circular structure to JSON"],
144e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  called_on_non_object:          ["%0", " called on non-object"],
145e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  called_on_null_or_undefined:   ["%0", " called on null or undefined"],
146e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  array_indexof_not_defined:     ["Array.getIndexOf: Argument undefined"],
147e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  object_not_extensible:         ["Can't add property ", "%0", ", object is not extensible"],
148e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_access:                ["Illegal access"],
149e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_preparser_data:        ["Invalid preparser data for function ", "%0"],
150e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_mode_with:              ["Strict mode code may not include a with statement"],
151e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_catch_variable:         ["Catch variable may not be eval or arguments in strict mode"],
152e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  too_many_arguments:            ["Too many arguments in function call (only 32766 allowed)"],
153e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  too_many_parameters:           ["Too many parameters in function definition (only 32766 allowed)"],
154e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  too_many_variables:            ["Too many variables declared (only 131071 allowed)"],
155e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_param_name:             ["Parameter name eval or arguments is not allowed in strict mode"],
156e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_param_dupe:             ["Strict mode function may not have duplicate parameter names"],
157e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_var_name:               ["Variable name may not be eval or arguments in strict mode"],
158e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_function_name:          ["Function name may not be eval or arguments in strict mode"],
159e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_octal_literal:          ["Octal literals are not allowed in strict mode."],
160e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_duplicate_property:     ["Duplicate data property in object literal not allowed in strict mode"],
161e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  accessor_data_property:        ["Object literal may not have data and accessor property with the same name"],
162e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  accessor_get_set:              ["Object literal may not have multiple get/set accessors with the same name"],
163e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_lhs_assignment:         ["Assignment to eval or arguments is not allowed in strict mode"],
164e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_lhs_postfix:            ["Postfix increment/decrement may not have eval or arguments operand in strict mode"],
165e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_lhs_prefix:             ["Prefix increment/decrement may not have eval or arguments operand in strict mode"],
166e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_reserved_word:          ["Use of future reserved word in strict mode"],
167e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_delete:                 ["Delete of an unqualified identifier in strict mode."],
168e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_delete_property:        ["Cannot delete property '", "%0", "' of ", "%1"],
169e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_const:                  ["Use of const in strict mode."],
170e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_function:               ["In strict mode code, functions can only be declared at top level or immediately within another function." ],
171e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_read_only_property:     ["Cannot assign to read only property '", "%0", "' of ", "%1"],
172e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_cannot_assign:          ["Cannot assign to read only '", "%0", "' in strict mode"],
173e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@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"],
174e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_caller:                 ["Illegal access to a strict mode caller function."],
175e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unprotected_let:               ["Illegal let declaration in unprotected statement context."],
176e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unprotected_const:             ["Illegal const declaration in unprotected statement context."],
177e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  cant_prevent_ext_external_array_elements: ["Cannot prevent extension of an object with external array elements"],
178e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  redef_external_array_element:  ["Cannot redefine a property of an object with external array elements"],
179e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  harmony_const_assign:          ["Assignment to constant variable."],
180f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  symbol_to_string:              ["Conversion from symbol to string"],
181e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_module_path:           ["Module does not export '", "%0", "', or export is not itself a module"],
182e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  module_type_error:             ["Module '", "%0", "' used improperly"],
183ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  module_export_undefined:       ["Export '", "%0", "' is not defined in module"]
184e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org};
185e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
186e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
187e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction FormatString(format, args) {
18831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var result = "";
18931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var arg_num = 0;
19031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  for (var i = 0; i < format.length; i++) {
19131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    var str = format[i];
1921805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (str.length == 2 && %_StringCharCodeAt(str, 0) == 0x25) {
1931805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // Two-char string starts with "%".
1941805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      var arg_num = (%_StringCharCodeAt(str, 1) - 0x30) >>> 0;
1951805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (arg_num < 4) {
1961805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // str is one of %0, %1, %2 or %3.
197ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        try {
198e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org          str = NoSideEffectToString(args[arg_num]);
199ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        } catch (e) {
20081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          if (%IsJSModule(args[arg_num]))
20181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "module";
20281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          else if (IS_SPEC_OBJECT(args[arg_num]))
20381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "object";
20481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          else
20581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "#<error>";
206ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        }
20731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org      }
208378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    }
20931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    result += str;
21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
21241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
215e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction NoSideEffectToString(obj) {
216e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_STRING(obj)) return obj;
217e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_NUMBER(obj)) return %_NumberToString(obj);
218e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_BOOLEAN(obj)) return x ? 'true' : 'false';
219e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_UNDEFINED(obj)) return 'undefined';
220e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_NULL(obj)) return 'null';
221eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  if (IS_FUNCTION(obj)) return  %_CallFunction(obj, FunctionToString);
222e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_OBJECT(obj) && %GetDataProperty(obj, "toString") === ObjectToString) {
223a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    var constructor = %GetDataProperty(obj, "constructor");
224e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    if (typeof constructor == "function") {
225e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      var constructorName = constructor.name;
226e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      if (IS_STRING(constructorName) && constructorName !== "") {
227e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org        return "#<" + constructorName + ">";
228e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      }
229e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    }
230e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
231594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (CanBeSafelyTreatedAsAnErrorObject(obj)) {
232594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return %_CallFunction(obj, ErrorToString);
233594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
234e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return %_CallFunction(obj, ObjectToString);
235e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
236e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
237594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// To determine whether we can safely stringify an object using ErrorToString
238594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// without the risk of side-effects, we need to check whether the object is
239594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// either an instance of a native error type (via '%_ClassOf'), or has $Error
240594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// in its prototype chain and hasn't overwritten 'toString' with something
241594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// strange and unusual.
242594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfunction CanBeSafelyTreatedAsAnErrorObject(obj) {
243d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org  switch (%_ClassOf(obj)) {
244d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'Error':
245d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'EvalError':
246d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'RangeError':
247d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'ReferenceError':
248d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'SyntaxError':
249d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'TypeError':
250d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'URIError':
251d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org      return true;
252d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org  }
253594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
254594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  var objToString = %GetDataProperty(obj, "toString");
255594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return obj instanceof $Error && objToString === ErrorToString;
2560ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org}
2570ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
2580ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
2590a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// When formatting internally created error messages, do not
2600a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// invoke overwritten error toString methods but explicitly use
2610a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// the error to string method. This is to avoid leaking error
2620a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// objects between script tags in a browser setting.
2630a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgfunction ToStringCheckErrorObject(obj) {
264594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (CanBeSafelyTreatedAsAnErrorObject(obj)) {
265394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return %_CallFunction(obj, ErrorToString);
2660a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } else {
2670a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    return ToString(obj);
2680a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  }
2690a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
2700a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
2710a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToDetailString(obj) {
2731805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (obj != null && IS_OBJECT(obj) && obj.toString === ObjectToString) {
27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var constructor = obj.constructor;
2751805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (typeof constructor == "function") {
2761805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      var constructorName = constructor.name;
2771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (IS_STRING(constructorName) && constructorName !== "") {
2781805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        return "#<" + constructorName + ">";
2791805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      }
280378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    }
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
2821805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  return ToStringCheckErrorObject(obj);
28341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeGenericError(constructor, type, args) {
287fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (IS_UNDEFINED(args)) args = [];
288fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return new constructor(FormatMessage(type, args));
28941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2931805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org * Set up the Script function and constructor.
29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen%FunctionSetInstanceClassName(Script, 'Script');
2961805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org%SetProperty(Script.prototype, 'constructor', Script,
2971805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org             DONT_ENUM | DONT_DELETE | READ_ONLY);
29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen%SetCode(Script, function(x) {
29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Script objects can only be created by the VM.
30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  throw new $Error("Not supported");
30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen});
30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Helper functions; called from the runtime system.
305e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction FormatMessage(type, args) {
306e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  var format = kMessages[type];
307e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (!format) return "<unknown message " + type + ">";
308e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return FormatString(format, args);
30941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetLineNumber(message) {
31331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
31431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  if (start_position == -1) return kNoLineNumberInfo;
31531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
31631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, true);
317720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  if (location == null) return kNoLineNumberInfo;
31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return location.line + 1;
31941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the source code line containing the given source
32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// position, or the empty string if the position is invalid.
32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetSourceLine(message) {
32531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
32631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
32731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, true);
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (location == null) return "";
32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  location.restrict();
33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return location.sourceText();
33141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeTypeError(type, args) {
33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($TypeError, type, args);
33641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeRangeError(type, args) {
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($RangeError, type, args);
34141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeSyntaxError(type, args) {
34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($SyntaxError, type, args);
34641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeReferenceError(type, args) {
35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($ReferenceError, type, args);
35141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeEvalError(type, args) {
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($EvalError, type, args);
35641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeError(type, args) {
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($Error, type, args);
36141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
363eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org/**
364eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * Find a line number given a specific source position.
365eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @param {number} position The source position.
366eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @return {number} 0 if input too small, -1 if input too large,
367eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org       else the line number.
368eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org */
3691805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLineFromPosition(position) {
370eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var lower = 0;
371eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var upper = this.lineCount() - 1;
372499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
373eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
374eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // We'll never find invalid positions so bail right away.
375499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  if (position > line_ends[upper]) {
376eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return -1;
377eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
378eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
379eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // This means we don't have to safe-guard indexing line_ends[i - 1].
380499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  if (position <= line_ends[0]) {
381eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return 0;
382eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
383eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
384eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // Binary search to find line # from position range.
385eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  while (upper >= 1) {
386eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    var i = (lower + upper) >> 1;
387eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
388499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org    if (position > line_ends[i]) {
389eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      lower = i + 1;
390499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org    } else if (position <= line_ends[i - 1]) {
391eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      upper = i - 1;
392eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    } else {
393eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      return i;
394eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    }
395eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
396d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
397eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return -1;
398eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get information on a specific source position.
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} position The source position
4037be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org * @param {boolean} include_resource_offset Set to true to have the resource
4047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org *     offset added to the location
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceLocation}
40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     If line is negative or not in the source null is returned.
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4081805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLocationFromPosition(position,
4091805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org                                    include_resource_offset) {
410eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var line = this.lineFromPosition(position);
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == -1) return null;
4129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Determine start, end and column.
414499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
415499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var start = line == 0 ? 0 : line_ends[line - 1] + 1;
416499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var end = line_ends[line];
4171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (end > 0 && %_CallFunction(this.source, end - 1, StringCharAt) == '\r') {
4181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    end--;
4191805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  }
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = position - start;
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Adjust according to the offset within the resource.
4237be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (include_resource_offset) {
4247be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    line += this.line_offset;
4257be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    if (line == this.line_offset) {
4267be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      column += this.column_offset;
4277be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    }
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new SourceLocation(this, position, line, column, start, end);
4311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get information on a specific source line and column possibly offset by a
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * fixed source position. This function is used to find a source position from
43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * a line and column position. The fixed source position offset is typically
43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * used to find a source position in a function based on a line and column in
43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the source for the function alone. The offset passed will then be the
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * start position of the source for the function within the full script source.
44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_line The line within the source. Default value is 0
44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_column The column in within the line. Default value is 0
44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_offset_position The offset from the begining of the
4441805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org *     source from where the line and column calculation starts.
4451805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org *     Default value is 0
44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceLocation}
44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     If line is negative or not in the source null is returned.
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4491805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLocationFromLine(opt_line, opt_column, opt_offset_position) {
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is the first line in the script. Lines in the script is relative
45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to the offset within the resource.
45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = 0;
45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_line)) {
45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    line = opt_line - this.line_offset;
45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
4569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is first column. If on the first line add the offset within the
45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // resource.
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = opt_column || 0;
46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == 0) {
4611b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    column -= this.column_offset;
46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var offset_position = opt_offset_position || 0;
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line < 0 || column < 0 || offset_position < 0) return null;
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == 0) {
4673a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org    return this.locationFromPosition(offset_position + column, false);
46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
469eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // Find the line where the offset position is located.
470eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    var offset_line = this.lineFromPosition(offset_position);
471eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
472eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    if (offset_line == -1 || offset_line + line >= this.lineCount()) {
473eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      return null;
47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
475eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
4761b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    return this.locationFromPosition(
4771b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        this.line_ends[offset_line + line - 1] + 1 + column);  // line > 0 here.
47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get a slice of source code from the script. The boundaries for the slice is
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * specified in lines.
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_from_line The first line (zero bound) in the slice.
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Default is 0
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_to_column The last line (zero bound) in the slice (non
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     inclusive). Default is the number of lines in the script
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceSlice} The source slice or null of the parameters where
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     invalid
49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4921805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptSourceSlice(opt_from_line, opt_to_line) {
4931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var from_line = IS_UNDEFINED(opt_from_line) ? this.line_offset
4941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                                              : opt_from_line;
4951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var to_line = IS_UNDEFINED(opt_to_line) ? this.line_offset + this.lineCount()
4961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                                          : opt_to_line;
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Adjust according to the offset within the resource.
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  from_line -= this.line_offset;
50043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  to_line -= this.line_offset;
50143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (from_line < 0) from_line = 0;
50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (to_line > this.lineCount()) to_line = this.lineCount();
50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
504245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Check parameters.
50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (from_line >= this.lineCount() ||
50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      to_line < 0 ||
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      from_line > to_line) {
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return null;
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
511499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
512499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var from_position = from_line == 0 ? 0 : line_ends[from_line - 1] + 1;
513499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var to_position = to_line == 0 ? 0 : line_ends[to_line - 1] + 1;
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Return a source slice with line numbers re-adjusted to the resource.
5161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return new SourceSlice(this,
5171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         from_line + this.line_offset,
5181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         to_line + this.line_offset,
5191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                          from_position, to_position);
52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptSourceLine(opt_line) {
52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is the first line in the script. Lines in the script are relative
52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to the offset within the resource.
52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = 0;
52743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_line)) {
52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    line = opt_line - this.line_offset;
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
530245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
531245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Check parameter.
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line < 0 || this.lineCount() <= line) {
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return null;
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
536245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Return the source line.
537499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
538499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var start = line == 0 ? 0 : line_ends[line - 1] + 1;
539499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var end = line_ends[line];
5407a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  return %_CallFunction(this.source, start, end, StringSubstring);
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the number of source lines.
54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {number}
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Number of source lines.
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5491805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLineCount() {
550245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Return number of source lines.
551245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.line_ends.length;
5521b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
55633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * If sourceURL comment is available and script starts at zero returns sourceURL
55733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * comment contents. Otherwise, script name is returned. See
55825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org * http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
559b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * and Source Map Revision 3 proposal for details on using //# sourceURL and
560b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * deprecated //@ sourceURL comment to identify scripts that don't have name.
56142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org *
562b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * @return {?string} script name if present, value for //# sourceURL or
563b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * deprecated //@ sourceURL comment otherwise.
56425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org */
5651805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptNameOrSourceURL() {
56633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if (this.line_offset > 0 || this.column_offset > 0) {
56725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org    return this.name;
5681805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  }
5699a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
5709a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  // The result is cached as on long scripts it takes noticable time to search
5719a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  // for the sourceURL.
57233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if (this.hasCachedNameOrSourceURL) {
57333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return this.cachedNameOrSourceURL;
57433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
5759a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  this.hasCachedNameOrSourceURL = true;
5769a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org
57742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org  // TODO(608): the spaces in a regexp below had to be escaped as \040
57825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  // because this file is being processed by js2c whose handling of spaces
57925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  // in regexps is broken. Also, ['"] are excluded from allowed URLs to
58025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  // avoid matches against sources that invoke evals with sourceURL.
581ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // A better solution would be to detect these special comments in
582ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // the scanner/parser.
583ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var source = ToString(this.source);
584ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  var sourceUrlPos = %StringIndexOf(source, "sourceURL=", 0);
5859a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  this.cachedNameOrSourceURL = this.name;
586ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (sourceUrlPos > 4) {
587ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    var sourceUrlPattern =
588b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org        /\/\/[#@][\040\t]sourceURL=[\040\t]*([^\s\'\"]*)[\040\t]*$/gm;
589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // Don't reuse lastMatchInfo here, so we create a new array with room
590ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // for four captures (array with length one longer than the index
591ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // of the fourth capture, where the numbering is zero-based).
592ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    var matchInfo = new InternalArray(CAPTURE(3) + 1);
593ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    var match =
594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        %_RegExpExec(sourceUrlPattern, source, sourceUrlPos - 4, matchInfo);
595ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (match) {
5969a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org      this.cachedNameOrSourceURL =
5972e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          %_SubString(source, matchInfo[CAPTURE(2)], matchInfo[CAPTURE(3)]);
598ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
599ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
6009a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  return this.cachedNameOrSourceURL;
60125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org}
60225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
60325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
6041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(Script,
6059a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  $Array("source", "name", "line_ends", "line_offset", "column_offset",
6069a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org         "cachedNameOrSourceURL", "hasCachedNameOrSourceURL" ),
6071805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array(
6081805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "lineFromPosition", ScriptLineFromPosition,
6091805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "locationFromPosition", ScriptLocationFromPosition,
6101805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "locationFromLine", ScriptLocationFromLine,
6111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceSlice", ScriptSourceSlice,
6121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceLine", ScriptSourceLine,
6131805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "lineCount", ScriptLineCount,
6141805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "nameOrSourceURL", ScriptNameOrSourceURL
6151805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  )
6161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
6171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
6181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
61925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org/**
62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Class for source location. A source location is a position within some
62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * source with the following properties:
62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   script   : script object for the source
62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   line     : source line number
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   column   : source column within the line
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   position : position within the source
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   start    : position of start of source context (inclusive)
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   end      : position of end of source context (not inclusive)
6281b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * Source text for the source context is the character interval
6291b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * [start, end[. In most cases end will point to a newline character.
6301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * It might point just past the final position of the source if the last
6311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * source line does not end with a newline character.
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Script} script The Script object for which this is a location
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} position Source position for the location
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} line The line number for the location
63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} column The column within the line for the location
63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} start Source position for start of source context
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} end Source position for end of source context
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction SourceLocation(script, position, line, column, start, end) {
64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.script = script;
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.position = position;
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.line = line;
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.column = column;
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.start = start;
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.end = end;
64741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
649f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kLineLengthLimit = 78;
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Restrict source location start and end positions to make the source slice
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * no more that a certain number of characters wide.
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_limit The with limit of the source text with a default
65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     of 78
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_before The number of characters to prefer before the
65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     position with a default value of 10 less that the limit
65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
6591805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceLocationRestrict(opt_limit, opt_before) {
66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Find the actual limit to use.
66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var limit;
66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var before;
66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_limit)) {
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    limit = opt_limit;
66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    limit = kLineLengthLimit;
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_before)) {
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    before = opt_before;
67043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
67143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // If no before is specified center for small limits and perfer more source
67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // before the the position that after for longer limits.
67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (limit <= 20) {
67441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org      before = $floor(limit / 2);
67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      before = limit - 10;
67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (before >= limit) {
68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    before = limit - 1;
68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
68243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the [start, end[ interval is too big we restrict
68443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // it in one or both ends. We make sure to always produce
68543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // restricted intervals of maximum allowed size.
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.end - this.start > limit) {
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var start_limit = this.position - before;
68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var end_limit = this.position + limit - before;
68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (this.start < start_limit && end_limit < this.end) {
69043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.start = start_limit;
69143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.end = end_limit;
69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (this.start < start_limit) {
69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.start = this.end - limit;
69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.end = this.start + limit;
69643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
69743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
6981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get the source text for a SourceLocation
70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {String}
70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Source text for this location.
70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
7061805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceLocationSourceText() {
7071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return %_CallFunction(this.script.source,
7081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        this.start,
7091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        this.end,
7101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        StringSubstring);
7111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7141805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(SourceLocation,
7151805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("script", "position", "line", "column", "start", "end"),
7161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array(
7171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "restrict", SourceLocationRestrict,
7181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceText", SourceLocationSourceText
7191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org )
7201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
7211805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
7221805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
72443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Class for a source slice. A source slice is a part of a script source with
72543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the following properties:
72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   script        : script object for the source
72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   from_line     : line number for the first line in the slice
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   to_line       : source line number for the last line in the slice
72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   from_position : position of the first character in the slice
73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   to_position   : position of the last character in the slice
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The to_line and to_position are not included in the slice, that is the lines
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * in the slice are [from_line, to_line[. Likewise the characters in the slice
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * are [from_position, to_position[.
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Script} script The Script object for the source slice
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} from_line
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} to_line
73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} from_position
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} to_position
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction SourceSlice(script, from_line, to_line, from_position, to_position) {
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.script = script;
74343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.from_line = from_line;
74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.to_line = to_line;
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.from_position = from_position;
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.to_position = to_position;
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get the source text for a SourceSlice
75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {String} Source text for this slice. The last line will include
75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     the line terminating characters (if any)
75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
7541805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceSliceSourceText() {
7557a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  return %_CallFunction(this.script.source,
7567a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        this.from_position,
7577a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        this.to_position,
7587a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        StringSubstring);
7591b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7611805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(SourceSlice,
7621805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("script", "from_line", "to_line", "from_position", "to_position"),
7631805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("sourceText", SourceSliceSourceText)
7641805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
7651805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the offset of the given position within the containing
76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// line.
76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetPositionInLine(message) {
77031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
77131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
77231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, false);
77343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (location == null) return -1;
77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  location.restrict();
77531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  return start_position - location.start;
77641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetStackTraceLine(recv, fun, pos, isGlobal) {
780f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return new CallSite(recv, fun, pos, false).toString();
78141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------
78443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Error implementation
78543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
786f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvar CallSiteReceiverKey = %CreateSymbol("receiver");
787f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvar CallSiteFunctionKey = %CreateSymbol("function");
788f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvar CallSitePositionKey = %CreateSymbol("position");
789f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvar CallSiteStrictModeKey = %CreateSymbol("strict mode");
790f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
791f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgfunction CallSite(receiver, fun, pos, strict_mode) {
792f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  this[CallSiteReceiverKey] = receiver;
793f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  this[CallSiteFunctionKey] = fun;
794f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  this[CallSitePositionKey] = pos;
795f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  this[CallSiteStrictModeKey] = strict_mode;
7962abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}
7972abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
7981805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetThis() {
799f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return this[CallSiteStrictModeKey] ? void 0 : this[CallSiteReceiverKey];
8001b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8012abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8021805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetTypeName() {
803f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return GetTypeName(this[CallSiteReceiverKey], false);
8041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8052abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8061805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsToplevel() {
807f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (this[CallSiteReceiverKey] == null) {
8082abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return true;
80928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
810f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return IS_GLOBAL(this[CallSiteReceiverKey]);
8111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8122abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8131805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsEval() {
814f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var script = %FunctionGetScript(this[CallSiteFunctionKey]);
8155d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  return script && script.compilation_type == COMPILATION_TYPE_EVAL;
8161b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8172abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetEvalOrigin() {
819f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var script = %FunctionGetScript(this[CallSiteFunctionKey]);
8209818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return FormatEvalOrigin(script);
8211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8222abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetScriptNameOrSourceURL() {
824f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var script = %FunctionGetScript(this[CallSiteFunctionKey]);
825c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return script ? script.nameOrSourceURL() : null;
8261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
827c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
8281805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFunction() {
829f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return this[CallSiteStrictModeKey] ? void 0 : this[CallSiteFunctionKey];
8301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
83186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org
8321805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFunctionName() {
8332abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // See if the function knows its own name
834f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var name = this[CallSiteFunctionKey].name;
83586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  if (name) {
8362abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return name;
837830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
838f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  name = %FunctionGetInferredName(this[CallSiteFunctionKey]);
839830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (name) {
840830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return name;
84186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  }
84286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  // Maybe this is an evaluation?
843f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var script = %FunctionGetScript(this[CallSiteFunctionKey]);
84428a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (script && script.compilation_type == COMPILATION_TYPE_EVAL) {
84586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    return "eval";
84628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
84786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  return null;
8481b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
84986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org
8501805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetMethodName() {
8512abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // See if we can find a unique property on the receiver that holds
8522abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // this function.
853f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var receiver = this[CallSiteReceiverKey];
854f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var fun = this[CallSiteFunctionKey];
855f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var ownName = fun.name;
856f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (ownName && receiver &&
857f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      (%_CallFunction(receiver, ownName, ObjectLookupGetter) === fun ||
858f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org       %_CallFunction(receiver, ownName, ObjectLookupSetter) === fun ||
859f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org       (IS_OBJECT(receiver) && %GetDataProperty(receiver, ownName) === fun))) {
86086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    // To handle DontEnum properties we guess that the method has
86186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    // the same name as the function.
86286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    return ownName;
863ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  }
86486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  var name = null;
865f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (var prop in receiver) {
866f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    if (%_CallFunction(receiver, prop, ObjectLookupGetter) === fun ||
867f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, prop, ObjectLookupSetter) === fun ||
868f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        (IS_OBJECT(receiver) && %GetDataProperty(receiver, prop) === fun)) {
869ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org      // If we find more than one match bail out to avoid confusion.
87028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      if (name) {
8712abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org        return null;
87228a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      }
8732abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      name = prop;
8742abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
8752abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
87628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (name) {
8772abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return name;
87828a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
8792abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return null;
8801b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8812abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8821805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFileName() {
883f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var script = %FunctionGetScript(this[CallSiteFunctionKey]);
8842abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return script ? script.name : null;
8851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8862abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8871805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetLineNumber() {
888f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (this[CallSitePositionKey] == -1) {
8892abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return null;
89028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
891f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var script = %FunctionGetScript(this[CallSiteFunctionKey]);
8922abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  var location = null;
8932abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  if (script) {
894f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    location = script.locationFromPosition(this[CallSitePositionKey], true);
8952abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
8962abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return location ? location.line + 1 : null;
8971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8982abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8991805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetColumnNumber() {
900f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (this[CallSitePositionKey] == -1) {
9012abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return null;
90228a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
903f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var script = %FunctionGetScript(this[CallSiteFunctionKey]);
9042abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  var location = null;
9052abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  if (script) {
906f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    location = script.locationFromPosition(this[CallSitePositionKey], true);
9072abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
9089818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return location ? location.column + 1: null;
9091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9102abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsNative() {
912f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var script = %FunctionGetScript(this[CallSiteFunctionKey]);
9135d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  return script ? (script.type == TYPE_NATIVE) : false;
9141b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9152abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetPosition() {
917f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return this[CallSitePositionKey];
9181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9192abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsConstructor() {
921f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var receiver = this[CallSiteReceiverKey];
922a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  var constructor = (receiver != null && IS_OBJECT(receiver))
923a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org                        ? %GetDataProperty(receiver, "constructor") : null;
9244a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  if (!constructor) return false;
925f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return this[CallSiteFunctionKey] === constructor;
9261b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9272abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9285f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.orgfunction CallSiteToString() {
9295f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var fileName;
9305f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var fileLocation = "";
9315f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  if (this.isNative()) {
9325f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    fileLocation = "native";
9335f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else {
9345a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    if (this.isEval()) {
9355a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileName = this.getScriptNameOrSourceURL();
9365a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      if (!fileName) {
9375a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        fileLocation = this.getEvalOrigin();
9385a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org        fileLocation += ", ";  // Expecting source position to follow.
9395a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      }
9405a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    } else {
9415a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileName = this.getFileName();
9425a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    }
9435f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
9445a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    if (fileName) {
9455a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileLocation += fileName;
9465a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    } else {
9475a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // Source code does not originate from a file and is not native, but we
9485a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // can still get the source position inside the source string, e.g. in
9495a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // an eval string.
9505a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileLocation += "<anonymous>";
9515a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    }
9525f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    var lineNumber = this.getLineNumber();
9535f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    if (lineNumber != null) {
9545f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      fileLocation += ":" + lineNumber;
9555f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      var columnNumber = this.getColumnNumber();
9565f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      if (columnNumber) {
9575f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org        fileLocation += ":" + columnNumber;
9585f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      }
9595f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    }
9605f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
9615f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
9625f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var line = "";
963830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var functionName = this.getFunctionName();
964830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var addSuffix = true;
9655f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var isConstructor = this.isConstructor();
9665f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var isMethodCall = !(this.isToplevel() || isConstructor);
9675f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  if (isMethodCall) {
968f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    var typeName = GetTypeName(this[CallSiteReceiverKey], true);
9695f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    var methodName = this.getMethodName();
9705f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    if (functionName) {
97146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      if (typeName &&
97246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org          %_CallFunction(functionName, typeName, StringIndexOf) != 0) {
973830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org        line += typeName + ".";
974830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org      }
9755f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      line += functionName;
97646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      if (methodName &&
97746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org          (%_CallFunction(functionName, "." + methodName, StringIndexOf) !=
97846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org           functionName.length - methodName.length - 1)) {
9795f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org        line += " [as " + methodName + "]";
9805f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      }
9815f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    } else {
982830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org      line += typeName + "." + (methodName || "<anonymous>");
9835f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    }
9845f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else if (isConstructor) {
9855f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += "new " + (functionName || "<anonymous>");
9865f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else if (functionName) {
9875f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += functionName;
9885f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else {
9895f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += fileLocation;
990830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    addSuffix = false;
9915f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
992830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (addSuffix) {
9935f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += " (" + fileLocation + ")";
9945f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
9955f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  return line;
9965f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org}
9975f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
9981805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(CallSite, $Array("receiver", "fun", "pos"), $Array(
9991805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getThis", CallSiteGetThis,
10001805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getTypeName", CallSiteGetTypeName,
10011805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isToplevel", CallSiteIsToplevel,
10021805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isEval", CallSiteIsEval,
10031805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getEvalOrigin", CallSiteGetEvalOrigin,
10041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getScriptNameOrSourceURL", CallSiteGetScriptNameOrSourceURL,
10051805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFunction", CallSiteGetFunction,
10061805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFunctionName", CallSiteGetFunctionName,
10071805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getMethodName", CallSiteGetMethodName,
10081805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFileName", CallSiteGetFileName,
10091805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getLineNumber", CallSiteGetLineNumber,
10101805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getColumnNumber", CallSiteGetColumnNumber,
10111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isNative", CallSiteIsNative,
10121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getPosition", CallSiteGetPosition,
10135f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  "isConstructor", CallSiteIsConstructor,
10145f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  "toString", CallSiteToString
10151805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org));
10161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
10171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
10189818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.orgfunction FormatEvalOrigin(script) {
1019c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  var sourceURL = script.nameOrSourceURL();
102028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (sourceURL) {
1021c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    return sourceURL;
102228a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
1023c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
1024c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  var eval_origin = "eval at ";
10259818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  if (script.eval_from_function_name) {
10269818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    eval_origin += script.eval_from_function_name;
10279818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  } else {
10289818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    eval_origin +=  "<anonymous>";
10299818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  }
103025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
10319818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  var eval_from_script = script.eval_from_script;
10329818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  if (eval_from_script) {
10335d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    if (eval_from_script.compilation_type == COMPILATION_TYPE_EVAL) {
10349818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      // eval script originated from another eval.
1035c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      eval_origin += " (" + FormatEvalOrigin(eval_from_script) + ")";
10369818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    } else {
1037c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      // eval script originated from "real" source.
10389818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      if (eval_from_script.name) {
10399818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        eval_origin += " (" + eval_from_script.name;
10401b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        var location = eval_from_script.locationFromPosition(
10411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org            script.eval_from_script_position, true);
10429818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        if (location) {
10439818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org          eval_origin += ":" + (location.line + 1);
10449818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org          eval_origin += ":" + (location.column + 1);
10459818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        }
10461b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        eval_origin += ")";
10479818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      } else {
10489818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        eval_origin += " (unknown source)";
10499818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      }
10509818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    }
10519818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  }
105225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
10539818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return eval_origin;
10541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
10559818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org
105646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
105746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgfunction FormatErrorString(error) {
10582abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  try {
105946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    return %_CallFunction(error, ErrorToString);
10602abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  } catch (e) {
10612abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    try {
106246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      return "<error: " + e + ">";
10632abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    } catch (ee) {
106446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      return "<error>";
10652abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
10662abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
106746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
106846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
106946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
107046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgfunction GetStackFrames(raw_stack) {
107146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var frames = new InternalArray();
1072f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var non_strict_frames = raw_stack[0];
1073f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (var i = 1; i < raw_stack.length; i += 4) {
107446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var recv = raw_stack[i];
107546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var fun = raw_stack[i + 1];
107646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var code = raw_stack[i + 2];
107746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var pc = raw_stack[i + 3];
107846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var pos = %FunctionGetPositionForOffset(code, pc);
1079f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    non_strict_frames--;
1080f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    frames.push(new CallSite(recv, fun, pos, (non_strict_frames < 0)));
108146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
108246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return frames;
108346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
108446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
108546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
1086d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Flag to prevent recursive call of Error.prepareStackTrace.
1087d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvar formatting_custom_stack_trace = false;
1088d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1089d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1090d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgfunction FormatStackTrace(obj, error_string, frames) {
1091d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (IS_FUNCTION($Error.prepareStackTrace) && !formatting_custom_stack_trace) {
1092d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var array = [];
1093d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    %MoveArrayContents(frames, array);
1094d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    formatting_custom_stack_trace = true;
1095d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var stack_trace = void 0;
1096d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    try {
1097d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      stack_trace = $Error.prepareStackTrace(obj, array);
1098d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    } catch (e) {
1099d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      throw e;  // The custom formatting function threw.  Rethrow.
1100d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    } finally {
1101d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      formatting_custom_stack_trace = false;
1102d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
1103d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return stack_trace;
1104d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
1105d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
110646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var lines = new InternalArray();
110746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  lines.push(error_string);
11082abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  for (var i = 0; i < frames.length; i++) {
11092abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    var frame = frames[i];
1110c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    var line;
11112abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    try {
11125f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      line = frame.toString();
11132abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    } catch (e) {
11142abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      try {
1115c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org        line = "<error: " + e + ">";
11162abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      } catch (ee) {
11172abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org        // Any code that reaches this point is seriously nasty!
1118c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org        line = "<error>";
11192abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      }
11202abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
11212abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    lines.push("    at " + line);
11222abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
112346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return %_CallFunction(lines, "\n", ArrayJoin);
11242abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}
11252abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
11262abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
1127f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgfunction GetTypeName(receiver, requireConstructor) {
1128f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var constructor = receiver.constructor;
1129830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (!constructor) {
1130830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return requireConstructor ? null :
1131f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, ObjectToString);
1132830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
1133830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var constructorName = constructor.name;
1134830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (!constructorName) {
1135830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return requireConstructor ? null :
1136f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, ObjectToString);
1137830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
1138830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return constructorName;
1139830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org}
114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
11420b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgfunction captureStackTrace(obj, cons_opt) {
11430b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  var stackTraceLimit = $Error.stackTraceLimit;
114431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  if (!stackTraceLimit || !IS_NUMBER(stackTraceLimit)) return;
114528a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (stackTraceLimit < 0 || stackTraceLimit > 10000) {
11460b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org    stackTraceLimit = 10000;
114728a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
114846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var stack = %CollectStackTrace(obj,
114946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                 cons_opt ? cons_opt : captureStackTrace,
115046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org                                 stackTraceLimit);
115146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
115246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var error_string = FormatErrorString(obj);
1153fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // The holder of this getter ('obj') may not be the receiver ('this').
1154fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // When this getter is called the first time, we use the context values to
1155fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // format a stack trace string and turn this accessor pair into a data
1156fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // property (on the holder).
1157eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  var getter = function() {
115846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    // Stack is still a raw array awaiting to be formatted.
1159d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var result = FormatStackTrace(obj, error_string, GetStackFrames(stack));
1160fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Turn this accessor into a data property.
1161fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    %DefineOrRedefineDataProperty(obj, 'stack', result, NONE);
1162fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Release context values.
1163fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    stack = error_string = void 0;
1164fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return result;
1165eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  };
116646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
1167fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // Set the 'stack' property on the receiver.  If the receiver is the same as
1168fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // holder of this setter, the accessor pair is turned into a data property.
1169eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  var setter = function(v) {
1170fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Set data property on the receiver (not necessarily holder).
1171eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    %DefineOrRedefineDataProperty(this, 'stack', v, NONE);
1172fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (this === obj) {
1173fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      // Release context values if holder is the same as the receiver.
1174fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      stack = error_string = void 0;
1175fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
1176eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  };
1177eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1178eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  %DefineOrRedefineAccessorProperty(obj, 'stack', getter, setter, DONT_ENUM);
11791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
11800b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
118143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11821805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SetUpError() {
11831805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // Define special error type constructors.
11841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
1185f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  var DefineError = function(f) {
11861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // Store the error function in both the global object
11871805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // and the runtime object. The function is fetched
11881805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // from the runtime object when throwing errors from
11891805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // within the runtime system to avoid strange side
11901805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // effects when overwriting the error functions from
11911805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // user code.
11921805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    var name = f.name;
11931805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetProperty(global, name, f, DONT_ENUM);
11941805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetProperty(builtins, '$' + name, f, DONT_ENUM | DONT_DELETE | READ_ONLY);
11951805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // Configure the error function.
11961805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (name == 'Error') {
11971805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // The prototype of the Error object must itself be an error.
11981805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // However, it can't be an instance of the Error object because
11991805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // it hasn't been properly configured yet.  Instead we create a
12001805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // special not-a-true-error-but-close-enough object.
1201f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org      var ErrorPrototype = function() {};
12021805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(ErrorPrototype, $Object.prototype);
12031805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetInstanceClassName(ErrorPrototype, 'Error');
12041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(f, new ErrorPrototype());
12051805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    } else {
12061805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(f, new $Error());
12071805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    }
12081805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %FunctionSetInstanceClassName(f, 'Error');
12091805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetProperty(f.prototype, 'constructor', f, DONT_ENUM);
1210212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    %SetProperty(f.prototype, "name", name, DONT_ENUM);
12111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetCode(f, function(m) {
12121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (%_IsConstructCall()) {
12131805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // Define all the expected properties directly on the error
12141805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // object. This avoids going through getters and setters defined
12151805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // on prototype objects.
12161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        %IgnoreAttributesAndSetProperty(this, 'stack', void 0, DONT_ENUM);
1217e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org        if (!IS_UNDEFINED(m)) {
1218212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org          %IgnoreAttributesAndSetProperty(
1219212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org            this, 'message', ToString(m), DONT_ENUM);
12201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        }
12211805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        captureStackTrace(this, f);
12221805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      } else {
12231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        return new f(m);
12241805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      }
12251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    });
1226394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    %SetNativeFlag(f);
1227f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  };
122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12291805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function Error() { });
12301805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function TypeError() { });
12311805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function RangeError() { });
12321805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function SyntaxError() { });
12331805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function ReferenceError() { });
12341805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function EvalError() { });
12351805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function URIError() { });
12361805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org}
12370b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
12381805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpError();
12397b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
12401805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org$Error.captureStackTrace = captureStackTrace;
12417b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
12421805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org%SetProperty($Error.prototype, 'message', '', DONT_ENUM);
124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1244394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// Global list of error objects visited during ErrorToString. This is
12450a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// used to detect cycles in error toString formatting.
1246f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar visited_errors = new InternalArray();
1247f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar cyclic_error_marker = new $Object();
12480a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1249212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgfunction GetPropertyWithoutInvokingMonkeyGetters(error, name) {
1250212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // Climb the prototype chain until we find the holder.
1251212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  while (error && !%HasLocalProperty(error, name)) {
1252750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    error = %GetPrototype(error);
1253212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  }
1254212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  if (error === null) return void 0;
1255212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  if (!IS_OBJECT(error)) return error[name];
1256212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // If the property is an accessor on one of the predefined errors that can be
1257212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // generated statically by the compiler, don't touch it. This is to address
1258212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // http://code.google.com/p/chromium/issues/detail?id=69187
1259212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  var desc = %GetOwnProperty(error, name);
1260212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  if (desc && desc[IS_ACCESSOR_INDEX]) {
1261212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var isName = name === "name";
1262212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    if (error === $ReferenceError.prototype)
1263212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org      return isName ? "ReferenceError" : void 0;
1264212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    if (error === $SyntaxError.prototype)
1265212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org      return isName ? "SyntaxError" : void 0;
1266212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    if (error === $TypeError.prototype)
1267212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org      return isName ? "TypeError" : void 0;
1268212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  }
1269212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // Otherwise, read normally.
1270212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  return error[name];
1271212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org}
1272212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org
1273394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction ErrorToStringDetectCycle(error) {
12741805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (!%PushIfAbsent(visited_errors, error)) throw cyclic_error_marker;
12750a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  try {
1276212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name");
1277394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name);
1278212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var message = GetPropertyWithoutInvokingMonkeyGetters(error, "message");
1279394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    message = IS_UNDEFINED(message) ? "" : TO_STRING_INLINE(message);
1280394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (name === "") return message;
1281394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (message === "") return name;
1282394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return name + ": " + message;
12830a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } finally {
128431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    visited_errors.length = visited_errors.length - 1;
12850a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  }
12860a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
12870a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1288394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction ErrorToString() {
12899a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  if (!IS_SPEC_OBJECT(this)) {
12909a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    throw MakeTypeError("called_on_non_object", ["Error.prototype.toString"]);
12911c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
12920a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
12930a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  try {
1294394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return ErrorToStringDetectCycle(this);
12950a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } catch(e) {
12960a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    // If this error message was encountered already return the empty
12970a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    // string for it instead of recursively formatting it.
1298394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (e === cyclic_error_marker) {
129928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      return '';
130028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    }
130128a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    throw e;
130243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1303c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
1304c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
13059ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
1306394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comInstallFunctions($Error.prototype, DONT_ENUM, ['toString', ErrorToString]);
130743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Boilerplate for exceptions for stack overflows. Used from
1309ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// Isolate::StackOverflow().
1310eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgfunction SetUpStackOverflowBoilerplate() {
1311eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  var boilerplate = MakeRangeError('stack_overflow', []);
1312eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
131346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var error_string = boilerplate.name + ": " + boilerplate.message;
131446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
1315fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // The raw stack trace is stored as a hidden property on the holder of this
1316fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // getter, which may not be the same as the receiver.  Find the holder to
1317fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // retrieve the raw stack trace and then turn this accessor pair into a
1318fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // data property.
1319fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  var getter = function() {
1320eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    var holder = this;
1321eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    while (!IS_ERROR(holder)) {
1322eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      holder = %GetPrototype(holder);
1323fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      if (IS_NULL(holder)) return MakeSyntaxError('illegal_access', []);
1324eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    }
1325fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    var stack = %GetAndClearOverflowedStackTrace(holder);
1326fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // We may not have captured any stack trace.
1327fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (IS_UNDEFINED(stack)) return stack;
1328fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
1329d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var result = FormatStackTrace(holder, error_string, GetStackFrames(stack));
1330fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Replace this accessor with a data property.
1331fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    %DefineOrRedefineDataProperty(holder, 'stack', result, NONE);
1332fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return result;
1333fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  };
1334eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1335fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // Set the 'stack' property on the receiver.  If the receiver is the same as
1336fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // holder of this setter, the accessor pair is turned into a data property.
1337fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  var setter = function(v) {
1338eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org    %DefineOrRedefineDataProperty(this, 'stack', v, NONE);
1339fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // Tentatively clear the hidden property. If the receiver is the same as
1340fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // holder, we release the raw stack trace this way.
1341fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    %GetAndClearOverflowedStackTrace(this);
1342fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  };
1343eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1344eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  %DefineOrRedefineAccessorProperty(
1345eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      boilerplate, 'stack', getter, setter, DONT_ENUM);
1346eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1347eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return boilerplate;
1348eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
1349eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1350eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvar kStackOverflowBoilerplate = SetUpStackOverflowBoilerplate();
1351