Commit 64da4755 authored by yangguo@chromium.org's avatar yangguo@chromium.org

Turn message property of the error object into a data property.

R=svenpanne@chromium.org
BUG=

Review URL: https://chromiumcodereview.appspot.com/11368142

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12908 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent e4cbac8d
......@@ -155,7 +155,9 @@ Handle<String> MessageHandler::GetMessage(Handle<Object> data) {
JSFunction::cast(
Isolate::Current()->js_builtins_object()->
GetPropertyNoExceptionThrown(*fmt_str)));
Handle<Object> argv[] = { data };
Handle<JSMessageObject> message = Handle<JSMessageObject>::cast(data);
Handle<Object> argv[] = { Handle<Object>(message->type()),
Handle<Object>(message->arguments()) };
bool caught_exception;
Handle<Object> result =
......
......@@ -26,18 +26,136 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// -------------------------------------------------------------------
//
// If this object gets passed to an error constructor the error will
// get an accessor for .message that constructs a descriptive error
// message on access.
var kAddMessageAccessorsMarker = { };
// This will be lazily initialized when first needed (and forcibly
// overwritten even though it's const).
var kMessages = 0;
function FormatString(format, message) {
var args = %MessageGetArguments(message);
var kMessages = {
// Error
cyclic_proto: ["Cyclic __proto__ value"],
code_gen_from_strings: ["%0"],
// TypeError
unexpected_token: ["Unexpected token ", "%0"],
unexpected_token_number: ["Unexpected number"],
unexpected_token_string: ["Unexpected string"],
unexpected_token_identifier: ["Unexpected identifier"],
unexpected_reserved: ["Unexpected reserved word"],
unexpected_strict_reserved: ["Unexpected strict mode reserved word"],
unexpected_eos: ["Unexpected end of input"],
malformed_regexp: ["Invalid regular expression: /", "%0", "/: ", "%1"],
unterminated_regexp: ["Invalid regular expression: missing /"],
regexp_flags: ["Cannot supply flags when constructing one RegExp from another"],
incompatible_method_receiver: ["Method ", "%0", " called on incompatible receiver ", "%1"],
invalid_lhs_in_assignment: ["Invalid left-hand side in assignment"],
invalid_lhs_in_for_in: ["Invalid left-hand side in for-in"],
invalid_lhs_in_postfix_op: ["Invalid left-hand side expression in postfix operation"],
invalid_lhs_in_prefix_op: ["Invalid left-hand side expression in prefix operation"],
multiple_defaults_in_switch: ["More than one default clause in switch statement"],
newline_after_throw: ["Illegal newline after throw"],
redeclaration: ["%0", " '", "%1", "' has already been declared"],
no_catch_or_finally: ["Missing catch or finally after try"],
unknown_label: ["Undefined label '", "%0", "'"],
uncaught_exception: ["Uncaught ", "%0"],
stack_trace: ["Stack Trace:\n", "%0"],
called_non_callable: ["%0", " is not a function"],
undefined_method: ["Object ", "%1", " has no method '", "%0", "'"],
property_not_function: ["Property '", "%0", "' of object ", "%1", " is not a function"],
cannot_convert_to_primitive: ["Cannot convert object to primitive value"],
not_constructor: ["%0", " is not a constructor"],
not_defined: ["%0", " is not defined"],
non_object_property_load: ["Cannot read property '", "%0", "' of ", "%1"],
non_object_property_store: ["Cannot set property '", "%0", "' of ", "%1"],
non_object_property_call: ["Cannot call method '", "%0", "' of ", "%1"],
with_expression: ["%0", " has no properties"],
illegal_invocation: ["Illegal invocation"],
no_setter_in_callback: ["Cannot set property ", "%0", " of ", "%1", " which has only a getter"],
apply_non_function: ["Function.prototype.apply was called on ", "%0", ", which is a ", "%1", " and not a function"],
apply_wrong_args: ["Function.prototype.apply: Arguments list has wrong type"],
invalid_in_operator_use: ["Cannot use 'in' operator to search for '", "%0", "' in ", "%1"],
instanceof_function_expected: ["Expecting a function in instanceof check, but got ", "%0"],
instanceof_nonobject_proto: ["Function has non-object prototype '", "%0", "' in instanceof check"],
null_to_object: ["Cannot convert null to object"],
reduce_no_initial: ["Reduce of empty array with no initial value"],
getter_must_be_callable: ["Getter must be a function: ", "%0"],
setter_must_be_callable: ["Setter must be a function: ", "%0"],
value_and_accessor: ["Invalid property. A property cannot both have accessors and be writable or have a value, ", "%0"],
proto_object_or_null: ["Object prototype may only be an Object or null"],
property_desc_object: ["Property description must be an object: ", "%0"],
redefine_disallowed: ["Cannot redefine property: ", "%0"],
define_disallowed: ["Cannot define property:", "%0", ", object is not extensible."],
non_extensible_proto: ["%0", " is not extensible"],
handler_non_object: ["Proxy.", "%0", " called with non-object as handler"],
proto_non_object: ["Proxy.", "%0", " called with non-object as prototype"],
trap_function_expected: ["Proxy.", "%0", " called with non-function for '", "%1", "' trap"],
handler_trap_missing: ["Proxy handler ", "%0", " has no '", "%1", "' trap"],
handler_trap_must_be_callable: ["Proxy handler ", "%0", " has non-callable '", "%1", "' trap"],
handler_returned_false: ["Proxy handler ", "%0", " returned false from '", "%1", "' trap"],
handler_returned_undefined: ["Proxy handler ", "%0", " returned undefined from '", "%1", "' trap"],
proxy_prop_not_configurable: ["Proxy handler ", "%0", " returned non-configurable descriptor for property '", "%2", "' from '", "%1", "' trap"],
proxy_non_object_prop_names: ["Trap '", "%1", "' returned non-object ", "%0"],
proxy_repeated_prop_name: ["Trap '", "%1", "' returned repeated property name '", "%2", "'"],
invalid_weakmap_key: ["Invalid value used as weak map key"],
not_date_object: ["this is not a Date object."],
observe_non_object: ["Object.", "%0", " cannot ", "%0", " non-object"],
observe_non_function: ["Object.", "%0", " cannot deliver to non-function"],
observe_callback_frozen: ["Object.observe cannot deliver to a frozen function object"],
observe_type_non_string: ["Object.notify provided changeRecord with non-string 'type' property"],
// RangeError
invalid_array_length: ["Invalid array length"],
stack_overflow: ["Maximum call stack size exceeded"],
invalid_time_value: ["Invalid time value"],
// SyntaxError
unable_to_parse: ["Parse error"],
invalid_regexp_flags: ["Invalid flags supplied to RegExp constructor '", "%0", "'"],
invalid_regexp: ["Invalid RegExp pattern /", "%0", "/"],
illegal_break: ["Illegal break statement"],
illegal_continue: ["Illegal continue statement"],
illegal_return: ["Illegal return statement"],
illegal_let: ["Illegal let declaration outside extended mode"],
error_loading_debugger: ["Error loading debugger"],
no_input_to_regexp: ["No input to ", "%0"],
invalid_json: ["String '", "%0", "' is not valid JSON"],
circular_structure: ["Converting circular structure to JSON"],
called_on_non_object: ["%0", " called on non-object"],
called_on_null_or_undefined: ["%0", " called on null or undefined"],
array_indexof_not_defined: ["Array.getIndexOf: Argument undefined"],
object_not_extensible: ["Can't add property ", "%0", ", object is not extensible"],
illegal_access: ["Illegal access"],
invalid_preparser_data: ["Invalid preparser data for function ", "%0"],
strict_mode_with: ["Strict mode code may not include a with statement"],
strict_catch_variable: ["Catch variable may not be eval or arguments in strict mode"],
too_many_arguments: ["Too many arguments in function call (only 32766 allowed)"],
too_many_parameters: ["Too many parameters in function definition (only 32766 allowed)"],
too_many_variables: ["Too many variables declared (only 131071 allowed)"],
strict_param_name: ["Parameter name eval or arguments is not allowed in strict mode"],
strict_param_dupe: ["Strict mode function may not have duplicate parameter names"],
strict_var_name: ["Variable name may not be eval or arguments in strict mode"],
strict_function_name: ["Function name may not be eval or arguments in strict mode"],
strict_octal_literal: ["Octal literals are not allowed in strict mode."],
strict_duplicate_property: ["Duplicate data property in object literal not allowed in strict mode"],
accessor_data_property: ["Object literal may not have data and accessor property with the same name"],
accessor_get_set: ["Object literal may not have multiple get/set accessors with the same name"],
strict_lhs_assignment: ["Assignment to eval or arguments is not allowed in strict mode"],
strict_lhs_postfix: ["Postfix increment/decrement may not have eval or arguments operand in strict mode"],
strict_lhs_prefix: ["Prefix increment/decrement may not have eval or arguments operand in strict mode"],
strict_reserved_word: ["Use of future reserved word in strict mode"],
strict_delete: ["Delete of an unqualified identifier in strict mode."],
strict_delete_property: ["Cannot delete property '", "%0", "' of ", "%1"],
strict_const: ["Use of const in strict mode."],
strict_function: ["In strict mode code, functions can only be declared at top level or immediately within another function." ],
strict_read_only_property: ["Cannot assign to read only property '", "%0", "' of ", "%1"],
strict_cannot_assign: ["Cannot assign to read only '", "%0", "' in strict mode"],
strict_poison_pill: ["'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them"],
strict_caller: ["Illegal access to a strict mode caller function."],
unprotected_let: ["Illegal let declaration in unprotected statement context."],
unprotected_const: ["Illegal const declaration in unprotected statement context."],
cant_prevent_ext_external_array_elements: ["Cannot prevent extension of an object with external array elements"],
redef_external_array_element: ["Cannot redefine a property of an object with external array elements"],
harmony_const_assign: ["Assignment to constant variable."],
invalid_module_path: ["Module does not export '", "%0", "', or export is not itself a module"],
module_type_error: ["Module '", "%0", "' used improperly"],
module_export_undefined: ["Export '", "%0", "' is not defined in module"],
};
function FormatString(format, args) {
var result = "";
var arg_num = 0;
for (var i = 0; i < format.length; i++) {
......@@ -115,7 +233,7 @@ function MakeGenericError(constructor, type, args) {
if (IS_UNDEFINED(args)) {
args = [];
}
var e = new constructor(kAddMessageAccessorsMarker);
var e = new constructor(FormatMessage(type, args));
e.type = type;
e.arguments = args;
return e;
......@@ -135,160 +253,10 @@ function MakeGenericError(constructor, type, args) {
// Helper functions; called from the runtime system.
function FormatMessage(message) {
if (kMessages === 0) {
var messagesDictionary = [
// Error
"cyclic_proto", ["Cyclic __proto__ value"],
"code_gen_from_strings", ["%0"],
// TypeError
"unexpected_token", ["Unexpected token ", "%0"],
"unexpected_token_number", ["Unexpected number"],
"unexpected_token_string", ["Unexpected string"],
"unexpected_token_identifier", ["Unexpected identifier"],
"unexpected_reserved", ["Unexpected reserved word"],
"unexpected_strict_reserved", ["Unexpected strict mode reserved word"],
"unexpected_eos", ["Unexpected end of input"],
"malformed_regexp", ["Invalid regular expression: /", "%0", "/: ", "%1"],
"unterminated_regexp", ["Invalid regular expression: missing /"],
"regexp_flags", ["Cannot supply flags when constructing one RegExp from another"],
"incompatible_method_receiver", ["Method ", "%0", " called on incompatible receiver ", "%1"],
"invalid_lhs_in_assignment", ["Invalid left-hand side in assignment"],
"invalid_lhs_in_for_in", ["Invalid left-hand side in for-in"],
"invalid_lhs_in_postfix_op", ["Invalid left-hand side expression in postfix operation"],
"invalid_lhs_in_prefix_op", ["Invalid left-hand side expression in prefix operation"],
"multiple_defaults_in_switch", ["More than one default clause in switch statement"],
"newline_after_throw", ["Illegal newline after throw"],
"redeclaration", ["%0", " '", "%1", "' has already been declared"],
"no_catch_or_finally", ["Missing catch or finally after try"],
"unknown_label", ["Undefined label '", "%0", "'"],
"uncaught_exception", ["Uncaught ", "%0"],
"stack_trace", ["Stack Trace:\n", "%0"],
"called_non_callable", ["%0", " is not a function"],
"undefined_method", ["Object ", "%1", " has no method '", "%0", "'"],
"property_not_function", ["Property '", "%0", "' of object ", "%1", " is not a function"],
"cannot_convert_to_primitive", ["Cannot convert object to primitive value"],
"not_constructor", ["%0", " is not a constructor"],
"not_defined", ["%0", " is not defined"],
"non_object_property_load", ["Cannot read property '", "%0", "' of ", "%1"],
"non_object_property_store", ["Cannot set property '", "%0", "' of ", "%1"],
"non_object_property_call", ["Cannot call method '", "%0", "' of ", "%1"],
"with_expression", ["%0", " has no properties"],
"illegal_invocation", ["Illegal invocation"],
"no_setter_in_callback", ["Cannot set property ", "%0", " of ", "%1", " which has only a getter"],
"apply_non_function", ["Function.prototype.apply was called on ", "%0", ", which is a ", "%1", " and not a function"],
"apply_wrong_args", ["Function.prototype.apply: Arguments list has wrong type"],
"invalid_in_operator_use", ["Cannot use 'in' operator to search for '", "%0", "' in ", "%1"],
"instanceof_function_expected", ["Expecting a function in instanceof check, but got ", "%0"],
"instanceof_nonobject_proto", ["Function has non-object prototype '", "%0", "' in instanceof check"],
"null_to_object", ["Cannot convert null to object"],
"reduce_no_initial", ["Reduce of empty array with no initial value"],
"getter_must_be_callable", ["Getter must be a function: ", "%0"],
"setter_must_be_callable", ["Setter must be a function: ", "%0"],
"value_and_accessor", ["Invalid property. A property cannot both have accessors and be writable or have a value, ", "%0"],
"proto_object_or_null", ["Object prototype may only be an Object or null"],
"property_desc_object", ["Property description must be an object: ", "%0"],
"redefine_disallowed", ["Cannot redefine property: ", "%0"],
"define_disallowed", ["Cannot define property:", "%0", ", object is not extensible."],
"non_extensible_proto", ["%0", " is not extensible"],
"handler_non_object", ["Proxy.", "%0", " called with non-object as handler"],
"proto_non_object", ["Proxy.", "%0", " called with non-object as prototype"],
"trap_function_expected", ["Proxy.", "%0", " called with non-function for '", "%1", "' trap"],
"handler_trap_missing", ["Proxy handler ", "%0", " has no '", "%1", "' trap"],
"handler_trap_must_be_callable", ["Proxy handler ", "%0", " has non-callable '", "%1", "' trap"],
"handler_returned_false", ["Proxy handler ", "%0", " returned false from '", "%1", "' trap"],
"handler_returned_undefined", ["Proxy handler ", "%0", " returned undefined from '", "%1", "' trap"],
"proxy_prop_not_configurable", ["Proxy handler ", "%0", " returned non-configurable descriptor for property '", "%2", "' from '", "%1", "' trap"],
"proxy_non_object_prop_names", ["Trap '", "%1", "' returned non-object ", "%0"],
"proxy_repeated_prop_name", ["Trap '", "%1", "' returned repeated property name '", "%2", "'"],
"invalid_weakmap_key", ["Invalid value used as weak map key"],
"not_date_object", ["this is not a Date object."],
"observe_non_object", ["Object.", "%0", " cannot ", "%0", " non-object"],
"observe_non_function", ["Object.", "%0", " cannot deliver to non-function"],
"observe_callback_frozen", ["Object.observe cannot deliver to a frozen function object"],
"observe_type_non_string", ["Object.notify provided changeRecord with non-string 'type' property"],
// RangeError
"invalid_array_length", ["Invalid array length"],
"stack_overflow", ["Maximum call stack size exceeded"],
"invalid_time_value", ["Invalid time value"],
// SyntaxError
"unable_to_parse", ["Parse error"],
"invalid_regexp_flags", ["Invalid flags supplied to RegExp constructor '", "%0", "'"],
"invalid_regexp", ["Invalid RegExp pattern /", "%0", "/"],
"illegal_break", ["Illegal break statement"],
"illegal_continue", ["Illegal continue statement"],
"illegal_return", ["Illegal return statement"],
"illegal_let", ["Illegal let declaration outside extended mode"],
"error_loading_debugger", ["Error loading debugger"],
"no_input_to_regexp", ["No input to ", "%0"],
"invalid_json", ["String '", "%0", "' is not valid JSON"],
"circular_structure", ["Converting circular structure to JSON"],
"called_on_non_object", ["%0", " called on non-object"],
"called_on_null_or_undefined", ["%0", " called on null or undefined"],
"array_indexof_not_defined", ["Array.getIndexOf: Argument undefined"],
"object_not_extensible", ["Can't add property ", "%0", ", object is not extensible"],
"illegal_access", ["Illegal access"],
"invalid_preparser_data", ["Invalid preparser data for function ", "%0"],
"strict_mode_with", ["Strict mode code may not include a with statement"],
"strict_catch_variable", ["Catch variable may not be eval or arguments in strict mode"],
"too_many_arguments", ["Too many arguments in function call (only 32766 allowed)"],
"too_many_parameters", ["Too many parameters in function definition (only 32766 allowed)"],
"too_many_variables", ["Too many variables declared (only 131071 allowed)"],
"strict_param_name", ["Parameter name eval or arguments is not allowed in strict mode"],
"strict_param_dupe", ["Strict mode function may not have duplicate parameter names"],
"strict_var_name", ["Variable name may not be eval or arguments in strict mode"],
"strict_function_name", ["Function name may not be eval or arguments in strict mode"],
"strict_octal_literal", ["Octal literals are not allowed in strict mode."],
"strict_duplicate_property", ["Duplicate data property in object literal not allowed in strict mode"],
"accessor_data_property", ["Object literal may not have data and accessor property with the same name"],
"accessor_get_set", ["Object literal may not have multiple get/set accessors with the same name"],
"strict_lhs_assignment", ["Assignment to eval or arguments is not allowed in strict mode"],
"strict_lhs_postfix", ["Postfix increment/decrement may not have eval or arguments operand in strict mode"],
"strict_lhs_prefix", ["Prefix increment/decrement may not have eval or arguments operand in strict mode"],
"strict_reserved_word", ["Use of future reserved word in strict mode"],
"strict_delete", ["Delete of an unqualified identifier in strict mode."],
"strict_delete_property", ["Cannot delete property '", "%0", "' of ", "%1"],
"strict_const", ["Use of const in strict mode."],
"strict_function", ["In strict mode code, functions can only be declared at top level or immediately within another function." ],
"strict_read_only_property", ["Cannot assign to read only property '", "%0", "' of ", "%1"],
"strict_cannot_assign", ["Cannot assign to read only '", "%0", "' in strict mode"],
"strict_poison_pill", ["'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them"],
"strict_caller", ["Illegal access to a strict mode caller function."],
"unprotected_let", ["Illegal let declaration in unprotected statement context."],
"unprotected_const", ["Illegal const declaration in unprotected statement context."],
"cant_prevent_ext_external_array_elements", ["Cannot prevent extension of an object with external array elements"],
"redef_external_array_element", ["Cannot redefine a property of an object with external array elements"],
"harmony_const_assign", ["Assignment to constant variable."],
"invalid_module_path", ["Module does not export '", "%0", "', or export is not itself a module"],
"module_type_error", ["Module '", "%0", "' used improperly"],
"module_export_undefined", ["Export '", "%0", "' is not defined in module"],
];
var messages = { __proto__ : null };
for (var i = 0; i < messagesDictionary.length; i += 2) {
var key = messagesDictionary[i];
var format = messagesDictionary[i + 1];
for (var j = 0; j < format.length; j++) {
%IgnoreAttributesAndSetProperty(format, %_NumberToString(j), format[j],
DONT_DELETE | READ_ONLY | DONT_ENUM);
}
%IgnoreAttributesAndSetProperty(format, 'length', format.length,
DONT_DELETE | READ_ONLY | DONT_ENUM);
%PreventExtensions(format);
%IgnoreAttributesAndSetProperty(messages,
key,
format,
DONT_DELETE | DONT_ENUM | READ_ONLY);
}
%PreventExtensions(messages);
%IgnoreAttributesAndSetProperty(builtins, "kMessages",
messages,
DONT_DELETE | DONT_ENUM | READ_ONLY);
}
var message_type = %MessageGetType(message);
var format = kMessages[message_type];
if (!format) return "<unknown message " + message_type + ">";
return FormatString(format, message);
function FormatMessage(type, args) {
var format = kMessages[type];
if (!format) return "<unknown message " + type + ">";
return FormatString(format, args);
}
......@@ -1166,13 +1134,7 @@ function SetUpError() {
%IgnoreAttributesAndSetProperty(this, 'stack', void 0, DONT_ENUM);
%IgnoreAttributesAndSetProperty(this, 'arguments', void 0, DONT_ENUM);
%IgnoreAttributesAndSetProperty(this, 'type', void 0, DONT_ENUM);
if (m === kAddMessageAccessorsMarker) {
// DefineOneShotAccessor always inserts a message property and
// ignores setters.
DefineOneShotAccessor(this, 'message', function (obj) {
return FormatMessage(%NewMessageObject(obj.type, obj.arguments));
});
} else if (!IS_UNDEFINED(m)) {
if (!IS_UNDEFINED(m)) {
%IgnoreAttributesAndSetProperty(
this, 'message', ToString(m), DONT_ENUM);
}
......@@ -1235,11 +1197,6 @@ function ErrorToStringDetectCycle(error) {
var name = GetPropertyWithoutInvokingMonkeyGetters(error, "name");
name = IS_UNDEFINED(name) ? "Error" : TO_STRING_INLINE(name);
var message = GetPropertyWithoutInvokingMonkeyGetters(error, "message");
var hasMessage = %_CallFunction(error, "message", ObjectHasOwnProperty);
if (type && !hasMessage) {
var args = GetPropertyWithoutInvokingMonkeyGetters(error, "arguments");
message = FormatMessage(%NewMessageObject(type, args));
}
message = IS_UNDEFINED(message) ? "" : TO_STRING_INLINE(message);
if (name === "") return message;
if (message === "") return name;
......
......@@ -13101,33 +13101,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) {
}
RUNTIME_FUNCTION(MaybeObject*, Runtime_NewMessageObject) {
HandleScope scope(isolate);
CONVERT_ARG_HANDLE_CHECKED(String, type, 0);
CONVERT_ARG_HANDLE_CHECKED(JSArray, arguments, 1);
return *isolate->factory()->NewJSMessageObject(
type,
arguments,
0,
0,
isolate->factory()->undefined_value(),
isolate->factory()->undefined_value(),
isolate->factory()->undefined_value());
}
RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetType) {
CONVERT_ARG_CHECKED(JSMessageObject, message, 0);
return message->type();
}
RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetArguments) {
CONVERT_ARG_CHECKED(JSMessageObject, message, 0);
return message->arguments();
}
RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetStartPosition) {
CONVERT_ARG_CHECKED(JSMessageObject, message, 0);
return Smi::FromInt(message->start_position());
......
......@@ -376,9 +376,6 @@ namespace internal {
F(GetFromCache, 2, 1) \
\
/* Message objects */ \
F(NewMessageObject, 2, 1) \
F(MessageGetType, 1, 1) \
F(MessageGetArguments, 1, 1) \
F(MessageGetStartPosition, 1, 1) \
F(MessageGetScript, 1, 1) \
\
......
// Copyright 2012 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Test that the message property of error objects is a data property.
var o;
// message is constructed using the constructor.
var error1 = new Error("custom message");
o = {};
o.__proto__ = error1;
assertEquals("custom message",
Object.getOwnPropertyDescriptor(error1, "message").value);
o.message = "another message";
assertEquals("another message", o.message);
assertEquals("custom message", error1.message);
// message is constructed by the runtime.
var error2;
try { x.x } catch (e) { error2 = e; }
o = {};
o.__proto__ = error2;
assertEquals("x is not defined",
Object.getOwnPropertyDescriptor(error2, "message").value);
o.message = "another message";
assertEquals("another message", o.message);
assertEquals("x is not defined", error2.message);
......@@ -649,6 +649,11 @@ function TestSetForDerived2(create, trap) {
TestSetForDerived(
function(k) {
// TODO(yangguo): issue 2398 - throwing an error causes formatting of
// the message string, which can be observable through this handler.
// We ignore keys that occur when formatting the message string.
if (k == "toString" || k == "valueOf") return;
key = k;
switch (k) {
case "p_writable": return {writable: true, configurable: true}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment