1bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// -------------------------------------------------------------------
631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
7e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgvar kMessages = {
8e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // Error
9e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  cyclic_proto:                  ["Cyclic __proto__ value"],
10e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  code_gen_from_strings:         ["%0"],
11a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  constructor_special_method:    ["Class constructor may not be an accessor"],
12ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  generator_running:             ["Generator is already running"],
13ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  generator_finished:            ["Generator has already finished"],
14e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // TypeError
15e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_token:              ["Unexpected token ", "%0"],
16e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_token_number:       ["Unexpected number"],
17e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_token_string:       ["Unexpected string"],
18e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_token_identifier:   ["Unexpected identifier"],
19e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_reserved:           ["Unexpected reserved word"],
20e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_strict_reserved:    ["Unexpected strict mode reserved word"],
21e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unexpected_eos:                ["Unexpected end of input"],
22e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  malformed_regexp:              ["Invalid regular expression: /", "%0", "/: ", "%1"],
23e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unterminated_regexp:           ["Invalid regular expression: missing /"],
24e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  regexp_flags:                  ["Cannot supply flags when constructing one RegExp from another"],
25e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  incompatible_method_receiver:  ["Method ", "%0", " called on incompatible receiver ", "%1"],
26e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  multiple_defaults_in_switch:   ["More than one default clause in switch statement"],
27e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  newline_after_throw:           ["Illegal newline after throw"],
284edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  label_redeclaration:           ["Label '", "%0", "' has already been declared"],
294edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  var_redeclaration:             ["Identifier '", "%0", "' has already been declared"],
305de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  duplicate_template_property:   ["Object template has duplicate property '", "%0", "'"],
31e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  no_catch_or_finally:           ["Missing catch or finally after try"],
32e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unknown_label:                 ["Undefined label '", "%0", "'"],
33e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  uncaught_exception:            ["Uncaught ", "%0"],
34e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  stack_trace:                   ["Stack Trace:\n", "%0"],
35e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  called_non_callable:           ["%0", " is not a function"],
36e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  undefined_method:              ["Object ", "%1", " has no method '", "%0", "'"],
37e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  property_not_function:         ["Property '", "%0", "' of object ", "%1", " is not a function"],
38e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  cannot_convert_to_primitive:   ["Cannot convert object to primitive value"],
39e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  not_constructor:               ["%0", " is not a constructor"],
40e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  not_defined:                   ["%0", " is not defined"],
41a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  non_method:                    ["'super' is referenced from non-method"],
42a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  unsupported_super:             ["Unsupported reference to 'super'"],
43e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  non_object_property_load:      ["Cannot read property '", "%0", "' of ", "%1"],
44e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  non_object_property_store:     ["Cannot set property '", "%0", "' of ", "%1"],
45e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  with_expression:               ["%0", " has no properties"],
46e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_invocation:            ["Illegal invocation"],
47e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  no_setter_in_callback:         ["Cannot set property ", "%0", " of ", "%1", " which has only a getter"],
48e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  apply_non_function:            ["Function.prototype.apply was called on ", "%0", ", which is a ", "%1", " and not a function"],
49e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  apply_wrong_args:              ["Function.prototype.apply: Arguments list has wrong type"],
50a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  toMethod_non_function:         ["Function.prototype.toMethod was called on ", "%0", ", which is a ", "%1", " and not a function"],
51a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  toMethod_non_object:           ["Function.prototype.toMethod: home object ", "%0", " is not an object"],
52e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_in_operator_use:       ["Cannot use 'in' operator to search for '", "%0", "' in ", "%1"],
53e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  instanceof_function_expected:  ["Expecting a function in instanceof check, but got ", "%0"],
54e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  instanceof_nonobject_proto:    ["Function has non-object prototype '", "%0", "' in instanceof check"],
55e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  undefined_or_null_to_object:   ["Cannot convert undefined or null to object"],
56e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  reduce_no_initial:             ["Reduce of empty array with no initial value"],
57e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  getter_must_be_callable:       ["Getter must be a function: ", "%0"],
58e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  setter_must_be_callable:       ["Setter must be a function: ", "%0"],
59e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  value_and_accessor:            ["Invalid property.  A property cannot both have accessors and be writable or have a value, ", "%0"],
60bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org  proto_object_or_null:          ["Object prototype may only be an Object or null: ", "%0"],
61e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  property_desc_object:          ["Property description must be an object: ", "%0"],
62e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  redefine_disallowed:           ["Cannot redefine property: ", "%0"],
63e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  define_disallowed:             ["Cannot define property:", "%0", ", object is not extensible."],
64e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  non_extensible_proto:          ["%0", " is not extensible"],
65e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_non_object:            ["Proxy.", "%0", " called with non-object as handler"],
66e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proto_non_object:              ["Proxy.", "%0", " called with non-object as prototype"],
67e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  trap_function_expected:        ["Proxy.", "%0", " called with non-function for '", "%1", "' trap"],
68e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_trap_missing:          ["Proxy handler ", "%0", " has no '", "%1", "' trap"],
69e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_trap_must_be_callable: ["Proxy handler ", "%0", " has non-callable '", "%1", "' trap"],
70e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_returned_false:        ["Proxy handler ", "%0", " returned false from '", "%1", "' trap"],
71e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  handler_returned_undefined:    ["Proxy handler ", "%0", " returned undefined from '", "%1", "' trap"],
72e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proxy_prop_not_configurable:   ["Proxy handler ", "%0", " returned non-configurable descriptor for property '", "%2", "' from '", "%1", "' trap"],
73e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proxy_non_object_prop_names:   ["Trap '", "%1", "' returned non-object ", "%0"],
74e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  proxy_repeated_prop_name:      ["Trap '", "%1", "' returned repeated property name '", "%2", "'"],
75e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_weakmap_key:           ["Invalid value used as weak map key"],
76ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  invalid_weakset_value:         ["Invalid value used in weak set"],
77e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  not_date_object:               ["this is not a Date object."],
78e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_non_object:            ["Object.", "%0", " cannot ", "%0", " non-object"],
79e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_non_function:          ["Object.", "%0", " cannot deliver to non-function"],
80e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_callback_frozen:       ["Object.observe cannot deliver to a frozen function object"],
814e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  observe_invalid_accept:        ["Object.observe accept must be an array of strings."],
82e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_type_non_string:       ["Invalid changeRecord with non-string 'type' property"],
834e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  observe_perform_non_string:    ["Invalid non-string changeType"],
844e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  observe_perform_non_function:  ["Cannot perform non-function"],
85e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  observe_notify_non_notifier:   ["notify called on non-notifier object"],
86c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  observe_global_proxy:          ["%0", " cannot be called on the global proxy object"],
8757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  not_typed_array:               ["this is not a typed array."],
8857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  invalid_argument:              ["invalid_argument"],
891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  data_view_not_array_buffer:    ["First argument to DataView constructor must be an ArrayBuffer"],
901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  constructor_not_function:      ["Constructor ", "%0", " requires 'new'"],
91fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  not_a_symbol:                  ["%0", " is not a symbol"],
92034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  not_a_promise:                 ["%0", " is not a promise"],
93034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  resolver_not_a_function:       ["Promise resolver ", "%0", " is not a function"],
94034539689f9600e463cd5273725c6269d0f3b8cbmachenbach@chromium.org  promise_cyclic:                ["Chaining cycle detected for promise ", "%0"],
958a58f6420f995bb19fff9babb261458d49d90cb1machenbach@chromium.org  array_functions_on_frozen:     ["Cannot modify frozen array elements"],
968a58f6420f995bb19fff9babb261458d49d90cb1machenbach@chromium.org  array_functions_change_sealed: ["Cannot add/remove sealed array elements"],
9705150ab746caefd8e734c394ecc7863200ca04cfmachenbach@chromium.org  first_argument_not_regexp:     ["First argument to ", "%0", " must not be a regular expression"],
9808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  not_iterable:                  ["%0", " is not iterable"],
9908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  not_an_iterator:               ["%0", " is not an iterator"],
10008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  iterator_result_not_an_object: ["Iterator result ", "%0", " is not an object"],
10108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  iterator_value_not_an_object:  ["Iterator value ", "%0", " is not an entry object"],
102e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // RangeError
103e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_array_length:          ["Invalid array length"],
104f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  invalid_array_buffer_length:   ["Invalid array buffer length"],
10557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  invalid_string_length:         ["Invalid string length"],
1061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_typed_array_offset:    ["Start offset is too large:"],
1071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_typed_array_length:    ["Invalid typed array length"],
108f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  invalid_typed_array_alignment: ["%0", " of ", "%1", " should be a multiple of ", "%2"],
10957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  typed_array_set_source_too_large:
11057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                                 ["Source is too large"],
1111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  typed_array_set_negative_offset:
1121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 ["Start offset is negative"],
1131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_offset:      ["Start offset is outside the bounds of the buffer"],
1141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_length:      ["Invalid data view length"],
1151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  invalid_data_view_accessor_offset:
1161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                 ["Offset is outside the bounds of the DataView"],
1171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
118e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  stack_overflow:                ["Maximum call stack size exceeded"],
119e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_time_value:            ["Invalid time value"],
120d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  invalid_count_value:           ["Invalid count value"],
1219d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  invalid_code_point:            ["Invalid code point ", "%0"],
1222904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  // ReferenceError
1232904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  invalid_lhs_in_assignment:     ["Invalid left-hand side in assignment"],
1242904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  invalid_lhs_in_for:            ["Invalid left-hand side in for-loop"],
1252904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  invalid_lhs_in_postfix_op:     ["Invalid left-hand side expression in postfix operation"],
1262904d1a42292be3056c2dd3f98822f8e1470fa72machenbach@chromium.org  invalid_lhs_in_prefix_op:      ["Invalid left-hand side expression in prefix operation"],
127e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  // SyntaxError
128f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  paren_in_arg_string:           ["Function arg string contains parenthesis"],
129f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  not_isvar:                     ["builtin %IS_VAR: not a variable"],
130f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  single_function_literal:       ["Single function literal required"],
131e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_regexp_flags:          ["Invalid flags supplied to RegExp constructor '", "%0", "'"],
132e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_regexp:                ["Invalid RegExp pattern /", "%0", "/"],
133e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_break:                 ["Illegal break statement"],
134e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_continue:              ["Illegal continue statement"],
135e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_return:                ["Illegal return statement"],
136e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  error_loading_debugger:        ["Error loading debugger"],
137e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  no_input_to_regexp:            ["No input to ", "%0"],
138e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_json:                  ["String '", "%0", "' is not valid JSON"],
139e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  circular_structure:            ["Converting circular structure to JSON"],
140e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  called_on_non_object:          ["%0", " called on non-object"],
141e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  called_on_null_or_undefined:   ["%0", " called on null or undefined"],
142e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  array_indexof_not_defined:     ["Array.getIndexOf: Argument undefined"],
143e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  object_not_extensible:         ["Can't add property ", "%0", ", object is not extensible"],
144e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  illegal_access:                ["Illegal access"],
145a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  static_prototype:              ["Classes may not have static property named prototype"],
146e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_mode_with:              ["Strict mode code may not include a with statement"],
1478297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org  strict_eval_arguments:         ["Unexpected eval or arguments in strict mode"],
148486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  too_many_arguments:            ["Too many arguments in function call (only 65535 allowed)"],
149486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  too_many_parameters:           ["Too many parameters in function definition (only 65535 allowed)"],
1507010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  too_many_variables:            ["Too many variables declared (only 4194303 allowed)"],
151e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_param_dupe:             ["Strict mode function may not have duplicate parameter names"],
152e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_octal_literal:          ["Octal literals are not allowed in strict mode."],
153e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_duplicate_property:     ["Duplicate data property in object literal not allowed in strict mode"],
154e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  accessor_data_property:        ["Object literal may not have data and accessor property with the same name"],
155e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  accessor_get_set:              ["Object literal may not have multiple get/set accessors with the same name"],
156e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_delete:                 ["Delete of an unqualified identifier in strict mode."],
157e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_delete_property:        ["Cannot delete property '", "%0", "' of ", "%1"],
158e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_const:                  ["Use of const in strict mode."],
159e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_function:               ["In strict mode code, functions can only be declared at top level or immediately within another function." ],
160e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_read_only_property:     ["Cannot assign to read only property '", "%0", "' of ", "%1"],
161e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_cannot_assign:          ["Cannot assign to read only '", "%0", "' in strict mode"],
162e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@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"],
163e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  strict_caller:                 ["Illegal access to a strict mode caller function."],
1649bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  malformed_arrow_function_parameter_list: ["Malformed arrow function parameter list"],
16554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org  generator_poison_pill:         ["'caller' and 'arguments' properties may not be accessed on generator functions."],
166e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unprotected_let:               ["Illegal let declaration in unprotected statement context."],
167e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  unprotected_const:             ["Illegal const declaration in unprotected statement context."],
168e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  cant_prevent_ext_external_array_elements: ["Cannot prevent extension of an object with external array elements"],
169e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  redef_external_array_element:  ["Cannot redefine a property of an object with external array elements"],
170e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  harmony_const_assign:          ["Assignment to constant variable."],
171f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  symbol_to_string:              ["Cannot convert a Symbol value to a string"],
172f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  symbol_to_primitive:           ["Cannot convert a Symbol wrapper object to a primitive value"],
17331c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org  symbol_to_number:              ["Cannot convert a Symbol value to a number"],
174e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  invalid_module_path:           ["Module does not export '", "%0", "', or export is not itself a module"],
175e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  module_type_error:             ["Module '", "%0", "' used improperly"],
1765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  module_export_undefined:       ["Export '", "%0", "' is not defined in module"],
1775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  unexpected_super:              ["'super' keyword unexpected here"]
178e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org};
179e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
180e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
181e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction FormatString(format, args) {
18231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var result = "";
18331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var arg_num = 0;
18431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  for (var i = 0; i < format.length; i++) {
18531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    var str = format[i];
1861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (str.length == 2 && %_StringCharCodeAt(str, 0) == 0x25) {
1871805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // Two-char string starts with "%".
1881805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      var arg_num = (%_StringCharCodeAt(str, 1) - 0x30) >>> 0;
1891805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (arg_num < 4) {
1901805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // str is one of %0, %1, %2 or %3.
191ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        try {
192e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org          str = NoSideEffectToString(args[arg_num]);
193ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        } catch (e) {
19481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          if (%IsJSModule(args[arg_num]))
19581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "module";
19681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          else if (IS_SPEC_OBJECT(args[arg_num]))
19781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "object";
19881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org          else
19981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org            str = "#<error>";
200ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org        }
20131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org      }
202378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    }
20331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    result += str;
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
20641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
209e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction NoSideEffectToString(obj) {
210e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_STRING(obj)) return obj;
211e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_NUMBER(obj)) return %_NumberToString(obj);
2123c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  if (IS_BOOLEAN(obj)) return obj ? 'true' : 'false';
213e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_UNDEFINED(obj)) return 'undefined';
214e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_NULL(obj)) return 'null';
2153c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  if (IS_FUNCTION(obj)) {
2163c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    var str = %_CallFunction(obj, FunctionToString);
2173c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    if (str.length > 128) {
2183c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org      str = %_SubString(str, 0, 111) + "...<omitted>..." +
2193c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org            %_SubString(str, str.length - 2, str.length);
2203c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    }
2213c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    return str;
2223c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  }
2239bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  if (IS_SYMBOL(obj)) return %_CallFunction(obj, SymbolToString);
224e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (IS_OBJECT(obj) && %GetDataProperty(obj, "toString") === ObjectToString) {
225a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    var constructor = %GetDataProperty(obj, "constructor");
226e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    if (typeof constructor == "function") {
227e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      var constructorName = constructor.name;
228e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      if (IS_STRING(constructorName) && constructorName !== "") {
229e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org        return "#<" + constructorName + ">";
230e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org      }
231e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    }
232e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
233594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (CanBeSafelyTreatedAsAnErrorObject(obj)) {
234594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return %_CallFunction(obj, ErrorToString);
235594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
236e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return %_CallFunction(obj, ObjectToString);
237e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
238e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
239594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// To determine whether we can safely stringify an object using ErrorToString
240594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// without the risk of side-effects, we need to check whether the object is
241594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// either an instance of a native error type (via '%_ClassOf'), or has $Error
242594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// in its prototype chain and hasn't overwritten 'toString' with something
243594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org// strange and unusual.
244594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfunction CanBeSafelyTreatedAsAnErrorObject(obj) {
245d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org  switch (%_ClassOf(obj)) {
246d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'Error':
247d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'EvalError':
248d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'RangeError':
249d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'ReferenceError':
250d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'SyntaxError':
251d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'TypeError':
252d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org    case 'URIError':
253d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org      return true;
254d6899c3545b051ec84363203d4235f883b4981bfulan@chromium.org  }
255594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
256594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  var objToString = %GetDataProperty(obj, "toString");
257594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return obj instanceof $Error && objToString === ErrorToString;
2580ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org}
2590ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
2600ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org
2610a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// When formatting internally created error messages, do not
2620a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// invoke overwritten error toString methods but explicitly use
2630a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// the error to string method. This is to avoid leaking error
2640a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// objects between script tags in a browser setting.
2650a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgfunction ToStringCheckErrorObject(obj) {
266594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (CanBeSafelyTreatedAsAnErrorObject(obj)) {
267394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return %_CallFunction(obj, ErrorToString);
2680a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } else {
2690a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    return ToString(obj);
2700a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  }
2710a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
2720a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
2730a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToDetailString(obj) {
2751805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (obj != null && IS_OBJECT(obj) && obj.toString === ObjectToString) {
27643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var constructor = obj.constructor;
2771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (typeof constructor == "function") {
2781805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      var constructorName = constructor.name;
2791805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (IS_STRING(constructorName) && constructorName !== "") {
2801805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        return "#<" + constructorName + ">";
2811805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      }
282378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org    }
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
2841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  return ToStringCheckErrorObject(obj);
28541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeGenericError(constructor, type, args) {
289fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (IS_UNDEFINED(args)) args = [];
290fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return new constructor(FormatMessage(type, args));
29141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
2951805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org * Set up the Script function and constructor.
29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
29743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen%FunctionSetInstanceClassName(Script, 'Script');
2989bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org%AddNamedProperty(Script.prototype, 'constructor', Script,
2999bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org                  DONT_ENUM | DONT_DELETE | READ_ONLY);
30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen%SetCode(Script, function(x) {
30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Script objects can only be created by the VM.
30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  throw new $Error("Not supported");
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen});
30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Helper functions; called from the runtime system.
307e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgfunction FormatMessage(type, args) {
308e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  var format = kMessages[type];
309e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  if (!format) return "<unknown message " + type + ">";
310e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return FormatString(format, args);
31141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetLineNumber(message) {
31531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
31631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  if (start_position == -1) return kNoLineNumberInfo;
31731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
31831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, true);
319720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  if (location == null) return kNoLineNumberInfo;
32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return location.line + 1;
32141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the source code line containing the given source
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// position, or the empty string if the position is invalid.
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetSourceLine(message) {
32731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
32831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
32931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, true);
33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (location == null) return "";
33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  location.restrict();
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return location.sourceText();
33341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeTypeError(type, args) {
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($TypeError, type, args);
33841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeRangeError(type, args) {
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($RangeError, type, args);
34341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeSyntaxError(type, args) {
34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($SyntaxError, type, args);
34841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeReferenceError(type, args) {
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($ReferenceError, type, args);
35341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeEvalError(type, args) {
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($EvalError, type, args);
35841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction MakeError(type, args) {
36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return MakeGenericError($Error, type, args);
36341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
365eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org/**
366eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * Find a line number given a specific source position.
367eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @param {number} position The source position.
368eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @return {number} 0 if input too small, -1 if input too large,
369eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org       else the line number.
370eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org */
3711805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLineFromPosition(position) {
372eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var lower = 0;
373eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var upper = this.lineCount() - 1;
374499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
375eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
376eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // We'll never find invalid positions so bail right away.
377499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  if (position > line_ends[upper]) {
378eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return -1;
379eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
380eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
381eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // This means we don't have to safe-guard indexing line_ends[i - 1].
382499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  if (position <= line_ends[0]) {
383eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    return 0;
384eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
385eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
386eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // Binary search to find line # from position range.
387eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  while (upper >= 1) {
388eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    var i = (lower + upper) >> 1;
389eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
390499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org    if (position > line_ends[i]) {
391eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      lower = i + 1;
392499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org    } else if (position <= line_ends[i - 1]) {
393eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      upper = i - 1;
394eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    } else {
395eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      return i;
396eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    }
397eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  }
398d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
399eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  return -1;
400eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get information on a specific source position.
40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} position The source position
4057be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org * @param {boolean} include_resource_offset Set to true to have the resource
4067be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org *     offset added to the location
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceLocation}
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     If line is negative or not in the source null is returned.
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4101805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLocationFromPosition(position,
4111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org                                    include_resource_offset) {
412eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  var line = this.lineFromPosition(position);
41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == -1) return null;
4149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Determine start, end and column.
416499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
417499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var start = line == 0 ? 0 : line_ends[line - 1] + 1;
418499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var end = line_ends[line];
4191805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (end > 0 && %_CallFunction(this.source, end - 1, StringCharAt) == '\r') {
4201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    end--;
4211805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  }
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = position - start;
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Adjust according to the offset within the resource.
4257be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  if (include_resource_offset) {
4267be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    line += this.line_offset;
4277be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    if (line == this.line_offset) {
4287be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org      column += this.column_offset;
4297be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    }
43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return new SourceLocation(this, position, line, column, start, end);
4331b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get information on a specific source line and column possibly offset by a
43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * fixed source position. This function is used to find a source position from
43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * a line and column position. The fixed source position offset is typically
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * used to find a source position in a function based on a line and column in
44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the source for the function alone. The offset passed will then be the
44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * start position of the source for the function within the full script source.
44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_line The line within the source. Default value is 0
44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_column The column in within the line. Default value is 0
44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_offset_position The offset from the begining of the
4461805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org *     source from where the line and column calculation starts.
4471805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org *     Default value is 0
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceLocation}
44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     If line is negative or not in the source null is returned.
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4511805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLocationFromLine(opt_line, opt_column, opt_offset_position) {
45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is the first line in the script. Lines in the script is relative
45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to the offset within the resource.
45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = 0;
45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_line)) {
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    line = opt_line - this.line_offset;
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
4589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is first column. If on the first line add the offset within the
46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // resource.
46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var column = opt_column || 0;
46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == 0) {
4631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    column -= this.column_offset;
46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var offset_position = opt_offset_position || 0;
46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line < 0 || column < 0 || offset_position < 0) return null;
46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line == 0) {
4693a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org    return this.locationFromPosition(offset_position + column, false);
47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
471eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    // Find the line where the offset position is located.
472eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    var offset_line = this.lineFromPosition(offset_position);
473eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
474eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    if (offset_line == -1 || offset_line + line >= this.lineCount()) {
475eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      return null;
47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
477eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
4781b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org    return this.locationFromPosition(
4791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        this.line_ends[offset_line + line - 1] + 1 + column);  // line > 0 here.
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get a slice of source code from the script. The boundaries for the slice is
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * specified in lines.
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_from_line The first line (zero bound) in the slice.
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Default is 0
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_to_column The last line (zero bound) in the slice (non
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     inclusive). Default is the number of lines in the script
49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {SourceSlice} The source slice or null of the parameters where
49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     invalid
49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
4941805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptSourceSlice(opt_from_line, opt_to_line) {
4951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var from_line = IS_UNDEFINED(opt_from_line) ? this.line_offset
4961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                                              : opt_from_line;
4971b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  var to_line = IS_UNDEFINED(opt_to_line) ? this.line_offset + this.lineCount()
4981b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                                          : opt_to_line;
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Adjust according to the offset within the resource.
50143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  from_line -= this.line_offset;
50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  to_line -= this.line_offset;
50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (from_line < 0) from_line = 0;
50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (to_line > this.lineCount()) to_line = this.lineCount();
50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
506245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Check parameters.
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (from_line >= this.lineCount() ||
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      to_line < 0 ||
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      from_line > to_line) {
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return null;
51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
513499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
514499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var from_position = from_line == 0 ? 0 : line_ends[from_line - 1] + 1;
515499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var to_position = to_line == 0 ? 0 : line_ends[to_line - 1] + 1;
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Return a source slice with line numbers re-adjusted to the resource.
5181b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return new SourceSlice(this,
5191b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         from_line + this.line_offset,
5201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                         to_line + this.line_offset,
5211b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                          from_position, to_position);
52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptSourceLine(opt_line) {
52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Default is the first line in the script. Lines in the script are relative
52743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // to the offset within the resource.
52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var line = 0;
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_line)) {
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    line = opt_line - this.line_offset;
53143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
532245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
533245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Check parameter.
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (line < 0 || this.lineCount() <= line) {
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return null;
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
538245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Return the source line.
539499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var line_ends = this.line_ends;
540499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var start = line == 0 ? 0 : line_ends[line - 1] + 1;
541499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org  var end = line_ends[line];
5427a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  return %_CallFunction(this.source, start, end, StringSubstring);
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Returns the number of source lines.
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {number}
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Number of source lines.
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
5511805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptLineCount() {
552245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  // Return number of source lines.
553245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return this.line_ends.length;
5541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
55833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * If sourceURL comment is available and script starts at zero returns sourceURL
55933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * comment contents. Otherwise, script name is returned. See
56025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org * http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
561b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * and Source Map Revision 3 proposal for details on using //# sourceURL and
562b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * deprecated //@ sourceURL comment to identify scripts that don't have name.
56342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org *
564b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * @return {?string} script name if present, value for //# sourceURL or
565b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org * deprecated //@ sourceURL comment otherwise.
56625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org */
5671805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction ScriptNameOrSourceURL() {
56833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if (this.line_offset > 0 || this.column_offset > 0) {
56925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org    return this.name;
5701805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  }
571d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  if (this.source_url) {
572d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org    return this.source_url;
573ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
574d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  return this.name;
57525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org}
57625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
57725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
5781805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(Script,
579d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  $Array("source", "name", "source_url", "source_mapping_url", "line_ends",
580d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org         "line_offset", "column_offset"),
5811805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array(
5821805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "lineFromPosition", ScriptLineFromPosition,
5831805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "locationFromPosition", ScriptLocationFromPosition,
5841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "locationFromLine", ScriptLocationFromLine,
5851805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceSlice", ScriptSourceSlice,
5861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceLine", ScriptSourceLine,
5871805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "lineCount", ScriptLineCount,
5881805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "nameOrSourceURL", ScriptNameOrSourceURL
5891805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  )
5901805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
5911805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
5921805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
59325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org/**
59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Class for source location. A source location is a position within some
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * source with the following properties:
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   script   : script object for the source
59743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   line     : source line number
59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   column   : source column within the line
59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   position : position within the source
60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   start    : position of start of source context (inclusive)
60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   end      : position of end of source context (not inclusive)
6021b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * Source text for the source context is the character interval
6031b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * [start, end[. In most cases end will point to a newline character.
6041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * It might point just past the final position of the source if the last
6051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org * source line does not end with a newline character.
60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Script} script The Script object for which this is a location
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} position Source position for the location
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} line The line number for the location
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} column The column within the line for the location
61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} start Source position for start of source context
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} end Source position for end of source context
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
61343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction SourceLocation(script, position, line, column, start, end) {
61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.script = script;
61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.position = position;
61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.line = line;
61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.column = column;
61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.start = start;
62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.end = end;
62141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
623f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar kLineLengthLimit = 78;
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Restrict source location start and end positions to make the source slice
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * no more that a certain number of characters wide.
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_limit The with limit of the source text with a default
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     of 78
63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} opt_before The number of characters to prefer before the
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     position with a default value of 10 less that the limit
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
6331805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceLocationRestrict(opt_limit, opt_before) {
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Find the actual limit to use.
63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var limit;
63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var before;
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_limit)) {
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    limit = opt_limit;
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    limit = kLineLengthLimit;
64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IS_UNDEFINED(opt_before)) {
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    before = opt_before;
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // If no before is specified center for small limits and perfer more source
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // before the the position that after for longer limits.
64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (limit <= 20) {
64841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org      before = $floor(limit / 2);
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      before = limit - 10;
65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (before >= limit) {
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    before = limit - 1;
65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the [start, end[ interval is too big we restrict
65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // it in one or both ends. We make sure to always produce
65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // restricted intervals of maximum allowed size.
66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (this.end - this.start > limit) {
66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var start_limit = this.position - before;
66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    var end_limit = this.position + limit - before;
66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (this.start < start_limit && end_limit < this.end) {
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.start = start_limit;
66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.end = end_limit;
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (this.start < start_limit) {
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.start = this.end - limit;
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      this.end = this.start + limit;
67043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
67143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
6721b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get the source text for a SourceLocation
67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {String}
67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     Source text for this location.
67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
6801805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceLocationSourceText() {
6811b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return %_CallFunction(this.script.source,
6821b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        this.start,
6831b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        this.end,
6841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org                        StringSubstring);
6851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6881805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(SourceLocation,
6891805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("script", "position", "line", "column", "start", "end"),
6901805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array(
6911805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "restrict", SourceLocationRestrict,
6921805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    "sourceText", SourceLocationSourceText
6931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org )
6941805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
6951805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
6961805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
69743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
69843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Class for a source slice. A source slice is a part of a script source with
69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * the following properties:
70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   script        : script object for the source
70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   from_line     : line number for the first line in the slice
70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   to_line       : source line number for the last line in the slice
70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   from_position : position of the first character in the slice
70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *   to_position   : position of the last character in the slice
70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The to_line and to_position are not included in the slice, that is the lines
70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * in the slice are [from_line, to_line[. Likewise the characters in the slice
70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * are [from_position, to_position[.
70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {Script} script The Script object for the source slice
70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} from_line
71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} to_line
71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} from_position
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param {number} to_position
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @constructor
71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction SourceSlice(script, from_line, to_line, from_position, to_position) {
71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.script = script;
71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.from_line = from_line;
71843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.to_line = to_line;
71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.from_position = from_position;
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  this.to_position = to_position;
72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/**
72443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Get the source text for a SourceSlice
72543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return {String} Source text for this slice. The last line will include
72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *     the line terminating characters (if any)
72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */
7281805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SourceSliceSourceText() {
7297a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org  return %_CallFunction(this.script.source,
7307a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        this.from_position,
7317a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        this.to_position,
7327a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org                        StringSubstring);
7331b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7351805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(SourceSlice,
7361805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("script", "from_line", "to_line", "from_position", "to_position"),
7371805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  $Array("sourceText", SourceSliceSourceText)
7381805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org);
7391805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the offset of the given position within the containing
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// line.
74343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetPositionInLine(message) {
74431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var script = %MessageGetScript(message);
74531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var start_position = %MessageGetStartPosition(message);
74631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  var location = script.locationFromPosition(start_position, false);
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (location == null) return -1;
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  location.restrict();
74931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  return start_position - location.start;
75041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction GetStackTraceLine(recv, fun, pos, isGlobal) {
754f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return new CallSite(recv, fun, pos, false).toString();
75541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org}
75643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------
75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Error implementation
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
760b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgvar CallSiteReceiverKey = NEW_PRIVATE_OWN("CallSite#receiver");
761b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgvar CallSiteFunctionKey = NEW_PRIVATE_OWN("CallSite#function");
762b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgvar CallSitePositionKey = NEW_PRIVATE_OWN("CallSite#position");
763b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgvar CallSiteStrictModeKey = NEW_PRIVATE_OWN("CallSite#strict_mode");
764f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
765f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgfunction CallSite(receiver, fun, pos, strict_mode) {
7660cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  SET_PRIVATE(this, CallSiteReceiverKey, receiver);
7670cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  SET_PRIVATE(this, CallSiteFunctionKey, fun);
7680cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  SET_PRIVATE(this, CallSitePositionKey, pos);
7690cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  SET_PRIVATE(this, CallSiteStrictModeKey, strict_mode);
7702abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}
7712abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
7721805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetThis() {
7730cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GET_PRIVATE(this, CallSiteStrictModeKey)
7740cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      ? UNDEFINED : GET_PRIVATE(this, CallSiteReceiverKey);
7751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
7762abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
7771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetTypeName() {
7780cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GetTypeName(GET_PRIVATE(this, CallSiteReceiverKey), false);
7791b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
7802abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
7811805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsToplevel() {
7820cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  if (GET_PRIVATE(this, CallSiteReceiverKey) == null) {
7832abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return true;
78428a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
7850cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return IS_GLOBAL(GET_PRIVATE(this, CallSiteReceiverKey));
7861b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
7872abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
7881805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsEval() {
7890cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
7905d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  return script && script.compilation_type == COMPILATION_TYPE_EVAL;
7911b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
7922abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
7931805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetEvalOrigin() {
7940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
7959818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return FormatEvalOrigin(script);
7961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
7972abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
7981805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetScriptNameOrSourceURL() {
7990cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
800c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  return script ? script.nameOrSourceURL() : null;
8011b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
802c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
8031805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFunction() {
8040cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GET_PRIVATE(this, CallSiteStrictModeKey)
8050cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      ? UNDEFINED : GET_PRIVATE(this, CallSiteFunctionKey);
8061b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
80786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org
8081805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFunctionName() {
8092abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // See if the function knows its own name
8100cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var name = GET_PRIVATE(this, CallSiteFunctionKey).name;
81186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  if (name) {
8122abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return name;
813830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
8140cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  name = %FunctionGetInferredName(GET_PRIVATE(this, CallSiteFunctionKey));
815830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (name) {
816830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return name;
81786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  }
81886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  // Maybe this is an evaluation?
8190cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
82028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (script && script.compilation_type == COMPILATION_TYPE_EVAL) {
82186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    return "eval";
82228a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
82386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  return null;
8241b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
82586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org
8261805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetMethodName() {
8272abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // See if we can find a unique property on the receiver that holds
8282abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  // this function.
8290cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var receiver = GET_PRIVATE(this, CallSiteReceiverKey);
8300cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var fun = GET_PRIVATE(this, CallSiteFunctionKey);
831f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var ownName = fun.name;
832f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (ownName && receiver &&
833f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      (%_CallFunction(receiver, ownName, ObjectLookupGetter) === fun ||
834f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org       %_CallFunction(receiver, ownName, ObjectLookupSetter) === fun ||
835f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org       (IS_OBJECT(receiver) && %GetDataProperty(receiver, ownName) === fun))) {
83686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    // To handle DontEnum properties we guess that the method has
83786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    // the same name as the function.
83886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org    return ownName;
839ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  }
84086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org  var name = null;
841f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (var prop in receiver) {
842f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    if (%_CallFunction(receiver, prop, ObjectLookupGetter) === fun ||
843f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, prop, ObjectLookupSetter) === fun ||
844f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        (IS_OBJECT(receiver) && %GetDataProperty(receiver, prop) === fun)) {
845ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org      // If we find more than one match bail out to avoid confusion.
84628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      if (name) {
8472abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org        return null;
84828a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      }
8492abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      name = prop;
8502abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
8512abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
85228a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (name) {
8532abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return name;
85428a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
8552abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return null;
8561b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8572abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8581805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetFileName() {
8590cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
8602abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return script ? script.name : null;
8611b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8622abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8631805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetLineNumber() {
8640cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  if (GET_PRIVATE(this, CallSitePositionKey) == -1) {
8652abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return null;
86628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
8670cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
8682abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  var location = null;
8692abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  if (script) {
8700cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    location = script.locationFromPosition(
8710cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org        GET_PRIVATE(this, CallSitePositionKey), true);
8722abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
8732abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return location ? location.line + 1 : null;
8741b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8752abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8761805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetColumnNumber() {
8770cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  if (GET_PRIVATE(this, CallSitePositionKey) == -1) {
8782abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    return null;
87928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
8800cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
8812abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  var location = null;
8822abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  if (script) {
8830cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    location = script.locationFromPosition(
8840cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org      GET_PRIVATE(this, CallSitePositionKey), true);
8852abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
8869818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return location ? location.column + 1: null;
8871b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8882abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8891805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsNative() {
8900cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var script = %FunctionGetScript(GET_PRIVATE(this, CallSiteFunctionKey));
8915d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  return script ? (script.type == TYPE_NATIVE) : false;
8921b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8932abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8941805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteGetPosition() {
8950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GET_PRIVATE(this, CallSitePositionKey);
8961b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
8972abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
8981805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction CallSiteIsConstructor() {
8990cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  var receiver = GET_PRIVATE(this, CallSiteReceiverKey);
900a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  var constructor = (receiver != null && IS_OBJECT(receiver))
901a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org                        ? %GetDataProperty(receiver, "constructor") : null;
9024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  if (!constructor) return false;
9030cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return GET_PRIVATE(this, CallSiteFunctionKey) === constructor;
9041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
9052abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
9065f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.orgfunction CallSiteToString() {
9075f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var fileName;
9085f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var fileLocation = "";
9095f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  if (this.isNative()) {
9105f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    fileLocation = "native";
9115f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else {
912f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    fileName = this.getScriptNameOrSourceURL();
913f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (!fileName && this.isEval()) {
914f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      fileLocation = this.getEvalOrigin();
915f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      fileLocation += ", ";  // Expecting source position to follow.
9165a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    }
9175f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
9185a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    if (fileName) {
9195a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileLocation += fileName;
9205a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    } else {
9215a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // Source code does not originate from a file and is not native, but we
9225a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // can still get the source position inside the source string, e.g. in
9235a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      // an eval string.
9245a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org      fileLocation += "<anonymous>";
9255a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org    }
9265f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    var lineNumber = this.getLineNumber();
9275f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    if (lineNumber != null) {
9285f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      fileLocation += ":" + lineNumber;
9295f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      var columnNumber = this.getColumnNumber();
9305f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      if (columnNumber) {
9315f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org        fileLocation += ":" + columnNumber;
9325f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      }
9335f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    }
9345f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
9355f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
9365f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var line = "";
937830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var functionName = this.getFunctionName();
938830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var addSuffix = true;
9395f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var isConstructor = this.isConstructor();
9405f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  var isMethodCall = !(this.isToplevel() || isConstructor);
9415f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  if (isMethodCall) {
9420cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    var typeName = GetTypeName(GET_PRIVATE(this, CallSiteReceiverKey), true);
9435f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    var methodName = this.getMethodName();
9445f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    if (functionName) {
94546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      if (typeName &&
946aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org          %_CallFunction(functionName, typeName, StringIndexOfJS) != 0) {
947830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org        line += typeName + ".";
948830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org      }
9495f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      line += functionName;
95046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      if (methodName &&
951aa107b240dc43417fae8469b5c1b0f1ec9f98400machenbach@chromium.org          (%_CallFunction(functionName, "." + methodName, StringIndexOfJS) !=
95246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org           functionName.length - methodName.length - 1)) {
9535f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org        line += " [as " + methodName + "]";
9545f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      }
9555f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    } else {
956830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org      line += typeName + "." + (methodName || "<anonymous>");
9575f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    }
9585f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else if (isConstructor) {
9595f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += "new " + (functionName || "<anonymous>");
9605f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else if (functionName) {
9615f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += functionName;
9625f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  } else {
9635f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += fileLocation;
964830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    addSuffix = false;
9655f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
966830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (addSuffix) {
9675f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org    line += " (" + fileLocation + ")";
9685f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  }
9695f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  return line;
9705f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org}
9715f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org
9721805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpLockedPrototype(CallSite, $Array("receiver", "fun", "pos"), $Array(
9731805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getThis", CallSiteGetThis,
9741805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getTypeName", CallSiteGetTypeName,
9751805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isToplevel", CallSiteIsToplevel,
9761805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isEval", CallSiteIsEval,
9771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getEvalOrigin", CallSiteGetEvalOrigin,
9781805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getScriptNameOrSourceURL", CallSiteGetScriptNameOrSourceURL,
9791805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFunction", CallSiteGetFunction,
9801805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFunctionName", CallSiteGetFunctionName,
9811805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getMethodName", CallSiteGetMethodName,
9821805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getFileName", CallSiteGetFileName,
9831805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getLineNumber", CallSiteGetLineNumber,
9841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getColumnNumber", CallSiteGetColumnNumber,
9851805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "isNative", CallSiteIsNative,
9861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  "getPosition", CallSiteGetPosition,
9875f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  "isConstructor", CallSiteIsConstructor,
9885f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org  "toString", CallSiteToString
9891805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org));
9901805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
9911805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
9929818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.orgfunction FormatEvalOrigin(script) {
993c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  var sourceURL = script.nameOrSourceURL();
99428a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  if (sourceURL) {
995c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org    return sourceURL;
99628a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org  }
997c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
998c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  var eval_origin = "eval at ";
9999818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  if (script.eval_from_function_name) {
10009818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    eval_origin += script.eval_from_function_name;
10019818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  } else {
10029818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    eval_origin +=  "<anonymous>";
10039818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  }
100425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
10059818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  var eval_from_script = script.eval_from_script;
10069818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  if (eval_from_script) {
10075d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    if (eval_from_script.compilation_type == COMPILATION_TYPE_EVAL) {
10089818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      // eval script originated from another eval.
1009c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      eval_origin += " (" + FormatEvalOrigin(eval_from_script) + ")";
10109818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    } else {
1011c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org      // eval script originated from "real" source.
10129818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      if (eval_from_script.name) {
10139818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        eval_origin += " (" + eval_from_script.name;
10141b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        var location = eval_from_script.locationFromPosition(
10151b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org            script.eval_from_script_position, true);
10169818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        if (location) {
10179818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org          eval_origin += ":" + (location.line + 1);
10189818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org          eval_origin += ":" + (location.column + 1);
10199818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        }
10201b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org        eval_origin += ")";
10219818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      } else {
10229818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org        eval_origin += " (unknown source)";
10239818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org      }
10249818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org    }
10259818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  }
102625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
10279818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  return eval_origin;
10281b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
10299818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org
103046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
103146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgfunction FormatErrorString(error) {
10322abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  try {
103346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    return %_CallFunction(error, ErrorToString);
10342abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  } catch (e) {
10352abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    try {
103646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      return "<error: " + e + ">";
10372abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    } catch (ee) {
103846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org      return "<error>";
10392abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
10402abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
104146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
104246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
104346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
104446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgfunction GetStackFrames(raw_stack) {
104546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var frames = new InternalArray();
1046486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  var sloppy_frames = raw_stack[0];
1047f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (var i = 1; i < raw_stack.length; i += 4) {
104846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var recv = raw_stack[i];
104946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var fun = raw_stack[i + 1];
105046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var code = raw_stack[i + 2];
105146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var pc = raw_stack[i + 3];
105246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    var pos = %FunctionGetPositionForOffset(code, pc);
1053486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    sloppy_frames--;
1054486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    frames.push(new CallSite(recv, fun, pos, (sloppy_frames < 0)));
105546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
105646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return frames;
105746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
105846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
105946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
1060d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org// Flag to prevent recursive call of Error.prepareStackTrace.
1061d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvar formatting_custom_stack_trace = false;
1062d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1063d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1064d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgfunction FormatStackTrace(obj, raw_stack) {
1065d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  var frames = GetStackFrames(raw_stack);
1066d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (IS_FUNCTION($Error.prepareStackTrace) && !formatting_custom_stack_trace) {
1067d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    var array = [];
1068d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    %MoveArrayContents(frames, array);
1069d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    formatting_custom_stack_trace = true;
1070690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    var stack_trace = UNDEFINED;
1071d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    try {
1072d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      stack_trace = $Error.prepareStackTrace(obj, array);
1073d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    } catch (e) {
1074d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      throw e;  // The custom formatting function threw.  Rethrow.
1075d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    } finally {
1076d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      formatting_custom_stack_trace = false;
1077d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
1078d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return stack_trace;
1079d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
1080d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
108146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  var lines = new InternalArray();
1082d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  lines.push(FormatErrorString(obj));
10832abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  for (var i = 0; i < frames.length; i++) {
10842abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    var frame = frames[i];
1085c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    var line;
10862abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    try {
10875f0b8ea679aeeacddb5e475301e6aad026ff8b4byangguo@chromium.org      line = frame.toString();
10882abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    } catch (e) {
10892abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      try {
1090c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org        line = "<error: " + e + ">";
10912abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      } catch (ee) {
10922abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org        // Any code that reaches this point is seriously nasty!
1093c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org        line = "<error>";
10942abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org      }
10952abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    }
10962abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org    lines.push("    at " + line);
10972abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  }
109846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  return %_CallFunction(lines, "\n", ArrayJoin);
10992abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}
11002abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
11012abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
1102f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgfunction GetTypeName(receiver, requireConstructor) {
1103f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  var constructor = receiver.constructor;
1104830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (!constructor) {
1105830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return requireConstructor ? null :
1106f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, ObjectToString);
1107830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
1108830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  var constructorName = constructor.name;
1109830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (!constructorName) {
1110830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    return requireConstructor ? null :
1111f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        %_CallFunction(receiver, ObjectToString);
1112830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  }
1113830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return constructorName;
1114830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org}
111543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
1117d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgvar stack_trace_symbol;  // Set during bootstrapping.
1118b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgvar formatted_stack_trace_symbol = NEW_PRIVATE_OWN("formatted stack trace");
1119d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1120d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1121d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org// Format the stack trace if not yet done, and return it.
1122d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org// Cache the formatted stack trace on the holder.
1123d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgvar StackTraceGetter = function() {
1124b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  var formatted_stack_trace = UNDEFINED;
1125b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  var holder = this;
1126b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  while (holder) {
1127b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    var formatted_stack_trace =
1128b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      GET_PRIVATE(holder, formatted_stack_trace_symbol);
1129b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    if (IS_UNDEFINED(formatted_stack_trace)) {
1130b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      // No formatted stack trace available.
1131b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      var stack_trace = GET_PRIVATE(holder, stack_trace_symbol);
1132b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      if (IS_UNDEFINED(stack_trace)) {
1133b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        // Neither formatted nor structured stack trace available.
1134b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        // Look further up the prototype chain.
1135b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        holder = %GetPrototype(holder);
1136b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        continue;
1137b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
1138b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      formatted_stack_trace = FormatStackTrace(holder, stack_trace);
1139b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      SET_PRIVATE(holder, stack_trace_symbol, UNDEFINED);
1140b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      SET_PRIVATE(holder, formatted_stack_trace_symbol, formatted_stack_trace);
1141d574d98bea4e0a0bee2d1d2d858bf6d24c873d7eyangguo@chromium.org    }
1142b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    return formatted_stack_trace;
1143d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  }
1144b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  return UNDEFINED;
1145d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org};
1146c8649191518197c09ce0938f4567dd62e670ff30machenbach@chromium.org
1147c8649191518197c09ce0938f4567dd62e670ff30machenbach@chromium.org
1148d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org// If the receiver equals the holder, set the formatted stack trace that the
1149d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org// getter returns.
1150d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgvar StackTraceSetter = function(v) {
1151d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  if (HAS_PRIVATE(this, stack_trace_symbol)) {
1152d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org    SET_PRIVATE(this, stack_trace_symbol, UNDEFINED);
1153d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org    SET_PRIVATE(this, formatted_stack_trace_symbol, v);
1154d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  }
1155d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org};
1156d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1157d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
1158d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org// Use a dummy function since we do not actually want to capture a stack trace
1159d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org// when constructing the initial Error prototytpes.
1160d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgvar captureStackTrace = function captureStackTrace(obj, cons_opt) {
1161d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  // Define accessors first, as this may fail and throw.
1162d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter,
11634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                       set: StackTraceSetter,
11644c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                       configurable: true });
1165d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org  %CollectStackTrace(obj, cons_opt ? cons_opt : captureStackTrace);
11661b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
11670b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
116843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11691805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgfunction SetUpError() {
11701805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  // Define special error type constructors.
11711805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
1172f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  var DefineError = function(f) {
11731805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // Store the error function in both the global object
11741805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // and the runtime object. The function is fetched
11751805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // from the runtime object when throwing errors from
11761805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // within the runtime system to avoid strange side
11771805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // effects when overwriting the error functions from
11781805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // user code.
11791805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    var name = f.name;
11809bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    %AddNamedProperty(global, name, f, DONT_ENUM);
11819bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    %AddNamedProperty(builtins, '$' + name, f,
11829bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org                      DONT_ENUM | DONT_DELETE | READ_ONLY);
11831805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    // Configure the error function.
11841805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    if (name == 'Error') {
11851805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // The prototype of the Error object must itself be an error.
11861805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // However, it can't be an instance of the Error object because
11871805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // it hasn't been properly configured yet.  Instead we create a
11881805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      // special not-a-true-error-but-close-enough object.
1189f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org      var ErrorPrototype = function() {};
11901805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(ErrorPrototype, $Object.prototype);
11911805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetInstanceClassName(ErrorPrototype, 'Error');
11921805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(f, new ErrorPrototype());
11931805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    } else {
11941805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      %FunctionSetPrototype(f, new $Error());
11951805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    }
11961805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %FunctionSetInstanceClassName(f, 'Error');
11979bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    %AddNamedProperty(f.prototype, 'constructor', f, DONT_ENUM);
11989bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    %AddNamedProperty(f.prototype, "name", name, DONT_ENUM);
11991805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    %SetCode(f, function(m) {
12001805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      if (%_IsConstructCall()) {
12011805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // Define all the expected properties directly on the error
12021805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // object. This avoids going through getters and setters defined
12031805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        // on prototype objects.
12049bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org        %AddNamedProperty(this, 'stack', UNDEFINED, DONT_ENUM);
1205e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org        if (!IS_UNDEFINED(m)) {
12069bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org          %AddNamedProperty(this, 'message', ToString(m), DONT_ENUM);
12071805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        }
12086b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org        try { captureStackTrace(this, f); } catch (e) { }
12091805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      } else {
12101805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org        return new f(m);
12111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org      }
12121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org    });
1213394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    %SetNativeFlag(f);
1214f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  };
121543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12161805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function Error() { });
12171805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function TypeError() { });
12181805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function RangeError() { });
12191805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function SyntaxError() { });
12201805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function ReferenceError() { });
12211805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function EvalError() { });
12221805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  DefineError(function URIError() { });
12231805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org}
12240b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
12251805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.orgSetUpError();
12267b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
12271805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org$Error.captureStackTrace = captureStackTrace;
12287b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org
12299bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org%AddNamedProperty($Error.prototype, 'message', '', DONT_ENUM);
123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1231394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com// Global list of error objects visited during ErrorToString. This is
12320a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// used to detect cycles in error toString formatting.
1233f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar visited_errors = new InternalArray();
1234f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar cyclic_error_marker = new $Object();
12350a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1236212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgfunction GetPropertyWithoutInvokingMonkeyGetters(error, name) {
1237057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  var current = error;
1238212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // Climb the prototype chain until we find the holder.
1239fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  while (current && !%HasOwnProperty(current, name)) {
1240057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    current = %GetPrototype(current);
1241212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  }
1242057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  if (IS_NULL(current)) return UNDEFINED;
1243057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  if (!IS_OBJECT(current)) return error[name];
1244212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // If the property is an accessor on one of the predefined errors that can be
1245212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // generated statically by the compiler, don't touch it. This is to address
1246212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // http://code.google.com/p/chromium/issues/detail?id=69187
1247057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  var desc = %GetOwnProperty(current, name);
1248212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  if (desc && desc[IS_ACCESSOR_INDEX]) {
1249212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var isName = name === "name";
1250057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    if (current === $ReferenceError.prototype)
1251690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      return isName ? "ReferenceError" : UNDEFINED;
1252057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    if (current === $SyntaxError.prototype)
1253690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      return isName ? "SyntaxError" : UNDEFINED;
1254057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    if (current === $TypeError.prototype)
1255690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org      return isName ? "TypeError" : UNDEFINED;
1256212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  }
1257212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  // Otherwise, read normally.
1258212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  return error[name];
1259212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org}
1260212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org
1261394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction ErrorToStringDetectCycle(error) {
12621805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org  if (!%PushIfAbsent(visited_errors, error)) throw cyclic_error_marker;
12630a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  try {
1264212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name");
1265394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name);
1266212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    var message = GetPropertyWithoutInvokingMonkeyGetters(error, "message");
1267394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    message = IS_UNDEFINED(message) ? "" : TO_STRING_INLINE(message);
1268394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (name === "") return message;
1269394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (message === "") return name;
1270394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return name + ": " + message;
12710a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } finally {
127231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    visited_errors.length = visited_errors.length - 1;
12730a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  }
12740a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org}
12750a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
1276394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comfunction ErrorToString() {
12779a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  if (!IS_SPEC_OBJECT(this)) {
12789a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    throw MakeTypeError("called_on_non_object", ["Error.prototype.toString"]);
12791c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
12800a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
12810a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  try {
1282394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    return ErrorToStringDetectCycle(this);
12830a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  } catch(e) {
12840a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    // If this error message was encountered already return the empty
12850a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org    // string for it instead of recursively formatting it.
1286394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    if (e === cyclic_error_marker) {
128728a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org      return '';
128828a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    }
128928a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org    throw e;
129043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
1291c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
1292c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
12939ee27ae43ab88e9bb6417ff9e27af64e0cf13729ager@chromium.org
1294394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comInstallFunctions($Error.prototype, DONT_ENUM, ['toString', ErrorToString]);
129543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
129643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Boilerplate for exceptions for stack overflows. Used from
1297ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// Isolate::StackOverflow().
1298eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgfunction SetUpStackOverflowBoilerplate() {
1299eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  var boilerplate = MakeRangeError('stack_overflow', []);
1300eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1301248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  %DefineAccessorPropertyUnchecked(
1302d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org      boilerplate, 'stack', StackTraceGetter, StackTraceSetter, DONT_ENUM);
1303eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1304eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return boilerplate;
1305eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
1306eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1307eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvar kStackOverflowBoilerplate = SetUpStackOverflowBoilerplate();
1308