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