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