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