From 9b2fe70d93d5956c5731b6c84f65ad8bc0077a77 Mon Sep 17 00:00:00 2001 From: yangguo Date: Tue, 21 Apr 2015 02:03:24 -0700 Subject: [PATCH] Migrate error messages, part 4 (v8natives.js). Goal is to reduce native context size. R=mvstanton@chromium.org Review URL: https://codereview.chromium.org/1099573002 Cr-Commit-Position: refs/heads/master@{#27953} --- src/harmony-spread.js | 2 +- src/messages.cc | 2 +- src/messages.h | 88 +++++++++++++++++++++----------- src/messages.js | 19 +------ src/object-observe.js | 4 +- src/objects.cc | 19 +++---- src/proxy.js | 4 +- src/string.js | 4 +- src/v8natives.js | 106 +++++++++++++++++++-------------------- test/mjsunit/messages.js | 127 +++++++++++++++++++++++++++++++++++++++++++++-- 10 files changed, 251 insertions(+), 124 deletions(-) diff --git a/src/harmony-spread.js b/src/harmony-spread.js index 48972fa..8bf47e3 100644 --- a/src/harmony-spread.js +++ b/src/harmony-spread.js @@ -22,7 +22,7 @@ function SpreadArguments() { function SpreadIterable(collection) { if (IS_NULL_OR_UNDEFINED(collection)) { - throw MakeTypeError("not_iterable", [collection]); + throw MakeTypeError(kNotIterable, collection); } var args = new InternalArray(); diff --git a/src/messages.cc b/src/messages.cc index c39f4e6..bdfc518 100644 --- a/src/messages.cc +++ b/src/messages.cc @@ -189,8 +189,8 @@ MaybeHandle MessageTemplate::FormatMessage(int template_index, Handle args[] = {arg0, arg1, arg2}; for (const char* c = template_string; *c != '\0'; c++) { if (*c == '%') { - builder.AppendString(args[i++]); DCHECK(i < arraysize(args)); + builder.AppendString(args[i++]); } else { builder.AppendCharacter(*c); } diff --git a/src/messages.h b/src/messages.h index 9a31a2d..132df76 100644 --- a/src/messages.h +++ b/src/messages.h @@ -88,34 +88,66 @@ class MessageHandler { }; -#define MESSAGE_TEMPLATES(T) \ - /* Error */ \ - T(CyclicProto, "Cyclic __proto__ value") \ - /* TypeError */ \ - T(ApplyNonFunction, \ - "Function.prototype.apply was called on %, which is a % and not a " \ - "function") \ - T(CalledNonCallable, "% is not a function") \ - T(CannotConvertToPrimitive, "Cannot convert object to primitive value") \ - T(GeneratorRunning, "Generator is already running") \ - T(IncompatibleMethodReceiver, "Method % called on incompatible receiver %") \ - T(InstanceofFunctionExpected, \ - "Expecting a function in instanceof check, but got %") \ - T(InstanceofNonobjectProto, \ - "Function has non-object prototype '%' in instanceof check") \ - T(InvalidInOperatorUse, "Cannot use 'in' operator to search for '%' in %") \ - T(NotConstructor, "% is not a constructor") \ - T(PropertyNotFunction, "Property '%' of object % is not a function") \ - T(SymbolToPrimitive, \ - "Cannot convert a Symbol wrapper object to a primitive value") \ - T(SymbolToNumber, "Cannot convert a Symbol value to a number") \ - T(SymbolToString, "Cannot convert a Symbol value to a string") \ - T(UndefinedOrNullToObject, "Cannot convert undefined or null to object") \ - T(WithExpression, "% has no properties") \ - T(WrongArgs, "%: Arguments list has wrong type") \ - /* RangeError */ \ - T(StackOverflow, "Maximum call stack size exceeded") \ - /* EvalError */ \ +#define MESSAGE_TEMPLATES(T) \ + /* Error */ \ + T(CyclicProto, "Cyclic __proto__ value") \ + /* TypeError */ \ + T(ApplyNonFunction, \ + "Function.prototype.apply was called on %, which is a % and not a " \ + "function") \ + T(CalledNonCallable, "% is not a function") \ + T(CalledOnNonObject, "% called on non-object") \ + T(CannotConvertToPrimitive, "Cannot convert object to primitive value") \ + T(DefineDisallowed, "Cannot define property:%, object is not extensible.") \ + T(GeneratorRunning, "Generator is already running") \ + T(FunctionBind, "Bind must be called on a function") \ + T(IncompatibleMethodReceiver, "Method % called on incompatible receiver %") \ + T(InstanceofFunctionExpected, \ + "Expecting a function in instanceof check, but got %") \ + T(InstanceofNonobjectProto, \ + "Function has non-object prototype '%' in instanceof check") \ + T(InvalidInOperatorUse, "Cannot use 'in' operator to search for '%' in %") \ + T(NotAnIterator, "% is not an iterator") \ + T(NotConstructor, "% is not a constructor") \ + T(NotGeneric, "% is not generic") \ + T(NotIterable, "% is not iterable") \ + T(ObjectGetterExpectingFunction, \ + "Object.prototype.__defineGetter__: Expecting function") \ + T(ObjectGetterCallable, "Getter must be a function: %") \ + T(ObjectSetterExpectingFunction, \ + "Object.prototype.__defineSetter__: Expecting function") \ + T(ObjectSetterCallable, "Setter must be a function: %") \ + T(PropertyDescObject, "Property description must be an object: %") \ + T(PropertyNotFunction, "Property '%' of object % is not a function") \ + T(ProtoObjectOrNull, "Object prototype may only be an Object or null: %") \ + T(ProxyHandlerReturned, "Proxy handler % returned % from '%' trap") \ + T(ProxyHandlerTrapMissing, "Proxy handler % has no '%' trap") \ + T(ProxyHandlerTrapMustBeCallable, \ + "Proxy handler %0 has non-callable '%' trap") \ + T(ProxyNonObjectPropNames, "Trap '%' returned non-object %") \ + T(ProxyRepeatedPropName, "Trap '%' returned repeated property name '%'") \ + T(ProxyPropNotConfigurable, \ + "Proxy handler % returned non-configurable descriptor for property '%' " \ + "from '%' trap") \ + T(RedefineDisallowed, "Cannot redefine property: %") \ + T(SymbolToPrimitive, \ + "Cannot convert a Symbol wrapper object to a primitive value") \ + T(SymbolToNumber, "Cannot convert a Symbol value to a number") \ + T(SymbolToString, "Cannot convert a Symbol value to a string") \ + T(UndefinedOrNullToObject, "Cannot convert undefined or null to object") \ + T(ValueAndAccessor, \ + "Invalid property. A property cannot both have accessors and be " \ + "writable or have a value, %") \ + T(WithExpression, "% has no properties") \ + T(WrongArgs, "%: Arguments list has wrong type") \ + /* RangeError */ \ + T(ArrayLengthOutOfRange, "defineProperty() array length out of range") \ + T(NumberFormatRange, "% argument must be between 0 and 20") \ + T(StackOverflow, "Maximum call stack size exceeded") \ + T(ToPrecisionFormatRange, "toPrecision() argument must be between 1 and 21") \ + /* SyntaxError */ \ + T(ParenthesisInArgString, "Function arg string contains parenthesis") \ + /* EvalError */ \ T(CodeGenFromStrings, "%") class MessageTemplate { diff --git a/src/messages.js b/src/messages.js index 0080d6a..6dece2e 100644 --- a/src/messages.js +++ b/src/messages.js @@ -42,23 +42,12 @@ var kMessages = { no_setter_in_callback: ["Cannot set property ", "%0", " of ", "%1", " which has only a getter"], flags_getter_non_object: ["RegExp.prototype.flags getter called on non-object ", "%0"], 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: ", "%0"], - 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"], invalid_weakset_value: ["Invalid value used in weak set"], @@ -83,8 +72,6 @@ var kMessages = { array_functions_on_frozen: ["Cannot modify frozen array elements"], array_functions_change_sealed: ["Cannot add/remove sealed array elements"], first_argument_not_regexp: ["First argument to ", "%0", " must not be a regular expression"], - not_iterable: ["%0", " is not iterable"], - not_an_iterator: ["%0", " is not an iterator"], iterator_result_not_an_object: ["Iterator result ", "%0", " is not an object"], iterator_value_not_an_object: ["Iterator value ", "%0", " is not an entry object"], // RangeError @@ -112,7 +99,6 @@ var kMessages = { 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"], // SyntaxError - paren_in_arg_string: ["Function arg string contains parenthesis"], not_isvar: ["builtin %IS_VAR: not a variable"], single_function_literal: ["Single function literal required"], invalid_regexp_flags: ["Invalid flags supplied to RegExp constructor '", "%0", "'"], @@ -121,10 +107,7 @@ var kMessages = { illegal_continue: ["Illegal continue statement"], illegal_return: ["Illegal return statement"], 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"], @@ -1252,7 +1235,7 @@ function ErrorToStringDetectCycle(error) { function ErrorToString() { if (!IS_SPEC_OBJECT(this)) { - throw MakeTypeError("called_on_non_object", ["Error.prototype.toString"]); + throw MakeTypeError(kCalledOnNonObject, "Error.prototype.toString"); } try { diff --git a/src/object-observe.js b/src/object-observe.js index 5e41c1e..11562cb 100644 --- a/src/object-observe.js +++ b/src/object-observe.js @@ -554,7 +554,7 @@ function NotifyChange(type, object, name, oldValue) { function ObjectNotifierNotify(changeRecord) { if (!IS_SPEC_OBJECT(this)) - throw MakeTypeError("called_on_non_object", ["notify"]); + throw MakeTypeError(kCalledOnNonObject, "notify"); var objectInfo = ObjectInfoGetFromNotifier(this); if (IS_UNDEFINED(objectInfo)) @@ -568,7 +568,7 @@ function ObjectNotifierNotify(changeRecord) { function ObjectNotifierPerformChange(changeType, changeFn) { if (!IS_SPEC_OBJECT(this)) - throw MakeTypeError("called_on_non_object", ["performChange"]); + throw MakeTypeError(kCalledOnNonObject, "performChange"); var objectInfo = ObjectInfoGetFromNotifier(this); if (IS_UNDEFINED(objectInfo)) diff --git a/src/objects.cc b/src/objects.cc index 2816366..74886c9 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -3315,9 +3315,8 @@ MaybeHandle Object::RedefineNonconfigurableProperty( Isolate* isolate, Handle name, Handle value, LanguageMode language_mode) { if (is_sloppy(language_mode)) return value; - Handle args[] = {name}; - THROW_NEW_ERROR(isolate, NewTypeError("redefine_disallowed", - HandleVector(args, arraysize(args))), + THROW_NEW_ERROR(isolate, + NewTypeError(MessageTemplate::kRedefineDisallowed, name), Object); } @@ -3904,9 +3903,9 @@ MaybeHandle JSProxy::SetPropertyViaPrototypesWithHandler( if (configurable->IsFalse()) { Handle trap = isolate->factory()->InternalizeOneByteString( STATIC_CHAR_VECTOR("getPropertyDescriptor")); - Handle args[] = { handler, trap, name }; - THROW_NEW_ERROR(isolate, NewTypeError("proxy_prop_not_configurable", - HandleVector(args, arraysize(args))), + THROW_NEW_ERROR(isolate, + NewTypeError(MessageTemplate::kProxyPropNotConfigurable, + handler, name, trap), Object); } DCHECK(configurable->IsTrue()); @@ -4046,9 +4045,8 @@ Maybe JSProxy::GetPropertyAttributesWithHandler( Handle handler(proxy->handler(), isolate); Handle trap = isolate->factory()->InternalizeOneByteString( STATIC_CHAR_VECTOR("getPropertyDescriptor")); - Handle args[] = { handler, trap, name }; Handle error = isolate->factory()->NewTypeError( - "proxy_prop_not_configurable", HandleVector(args, arraysize(args))); + MessageTemplate::kProxyPropNotConfigurable, handler, name, trap); isolate->Throw(*error); return Just(NONE); } @@ -4108,10 +4106,9 @@ MaybeHandle JSProxy::CallTrap(Handle proxy, if (trap->IsUndefined()) { if (derived.is_null()) { - Handle args[] = { handler, trap_name }; THROW_NEW_ERROR(isolate, - NewTypeError("handler_trap_missing", - HandleVector(args, arraysize(args))), + NewTypeError(MessageTemplate::kProxyHandlerTrapMissing, + handler, trap_name), Object); } trap = Handle(derived); diff --git a/src/proxy.js b/src/proxy.js index 61b5e8f..03f4cde 100644 --- a/src/proxy.js +++ b/src/proxy.js @@ -162,8 +162,8 @@ function DerivedEnumerateTrap() { var desc = this.getPropertyDescriptor(TO_STRING_INLINE(name)) if (!IS_UNDEFINED(desc)) { if (!desc.configurable) { - throw MakeTypeError("proxy_prop_not_configurable", - [this, "getPropertyDescriptor", name]) + throw MakeTypeError(kProxyPropNotConfigurable, + this, name, "getPropertyDescriptor") } if (desc.enumerable) enumerableNames[count++] = names[i] } diff --git a/src/string.js b/src/string.js index 030d507..3da316d 100644 --- a/src/string.js +++ b/src/string.js @@ -29,7 +29,7 @@ function StringConstructor(x) { // ECMA-262 section 15.5.4.2 function StringToString() { if (!IS_STRING(this) && !IS_STRING_WRAPPER(this)) { - throw new $TypeError('String.prototype.toString is not generic'); + throw MakeTypeError(kNotGeneric, 'String.prototype.toString'); } return %_ValueOf(this); } @@ -38,7 +38,7 @@ function StringToString() { // ECMA-262 section 15.5.4.3 function StringValueOf() { if (!IS_STRING(this) && !IS_STRING_WRAPPER(this)) { - throw new $TypeError('String.prototype.valueOf is not generic'); + throw MakeTypeError(kNotGeneric, 'String.prototype.valueOf'); } return %_ValueOf(this); } diff --git a/src/v8natives.js b/src/v8natives.js index 8c9732e..8ff6f40 100644 --- a/src/v8natives.js +++ b/src/v8natives.js @@ -300,8 +300,7 @@ function ObjectDefineGetter(name, fun) { receiver = %GlobalProxy(global); } if (!IS_SPEC_FUNCTION(fun)) { - throw new $TypeError( - 'Object.prototype.__defineGetter__: Expecting function'); + throw MakeTypeError(kObjectGetterExpectingFunction); } var desc = new PropertyDescriptor(); desc.setGet(fun); @@ -326,8 +325,7 @@ function ObjectDefineSetter(name, fun) { receiver = %GlobalProxy(global); } if (!IS_SPEC_FUNCTION(fun)) { - throw new $TypeError( - 'Object.prototype.__defineSetter__: Expecting function'); + throw MakeTypeError(kObjectSetterExpectingFunction); } var desc = new PropertyDescriptor(); desc.setSet(fun); @@ -430,9 +428,8 @@ function FromGenericPropertyDescriptor(desc) { // ES5 8.10.5. function ToPropertyDescriptor(obj) { - if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("property_desc_object", [obj]); - } + if (!IS_SPEC_OBJECT(obj)) throw MakeTypeError(kPropertyDescObject, obj); + var desc = new PropertyDescriptor(); if ("enumerable" in obj) { @@ -454,7 +451,7 @@ function ToPropertyDescriptor(obj) { if ("get" in obj) { var get = obj.get; if (!IS_UNDEFINED(get) && !IS_SPEC_FUNCTION(get)) { - throw MakeTypeError("getter_must_be_callable", [get]); + throw MakeTypeError(kObjectGetterCallable, get); } desc.setGet(get); } @@ -462,13 +459,13 @@ function ToPropertyDescriptor(obj) { if ("set" in obj) { var set = obj.set; if (!IS_UNDEFINED(set) && !IS_SPEC_FUNCTION(set)) { - throw MakeTypeError("setter_must_be_callable", [set]); + throw MakeTypeError(kObjectSetterCallable, set); } desc.setSet(set); } if (IsInconsistentDescriptor(desc)) { - throw MakeTypeError("value_and_accessor", [obj]); + throw MakeTypeError(kValueAndAccessor, obj); } return desc; } @@ -618,11 +615,11 @@ function GetTrap(handler, name, defaultTrap) { var trap = handler[name]; if (IS_UNDEFINED(trap)) { if (IS_UNDEFINED(defaultTrap)) { - throw MakeTypeError("handler_trap_missing", [handler, name]); + throw MakeTypeError(kProxyHandlerTrapMissing, handler, name); } trap = defaultTrap; } else if (!IS_SPEC_FUNCTION(trap)) { - throw MakeTypeError("handler_trap_must_be_callable", [handler, name]); + throw MakeTypeError(kProxyHandlerTrapMustBeCallable, handler, name); } return trap; } @@ -656,8 +653,8 @@ function GetOwnPropertyJS(obj, v) { if (IS_UNDEFINED(descriptor)) return descriptor; var desc = ToCompletePropertyDescriptor(descriptor); if (!desc.isConfigurable()) { - throw MakeTypeError("proxy_prop_not_configurable", - [handler, "getOwnPropertyDescriptor", p, descriptor]); + throw MakeTypeError(kProxyPropNotConfigurable, + handler, p, "getOwnPropertyDescriptor"); } return desc; } @@ -679,7 +676,7 @@ function Delete(obj, p, should_throw) { %DeleteProperty(obj, p, 0); return true; } else if (should_throw) { - throw MakeTypeError("define_disallowed", [p]); + throw MakeTypeError(kDefineDisallowed, p); } else { return; } @@ -704,8 +701,8 @@ function DefineProxyProperty(obj, p, attributes, should_throw) { var result = CallTrap2(handler, "defineProperty", UNDEFINED, p, attributes); if (!ToBoolean(result)) { if (should_throw) { - throw MakeTypeError("handler_returned_false", - [handler, "defineProperty"]); + throw MakeTypeError(kProxyHandlerReturned, + handler, "false", "defineProperty"); } else { return false; } @@ -724,7 +721,7 @@ function DefineObjectProperty(obj, p, desc, should_throw) { // Step 3 if (IS_UNDEFINED(current) && !extensible) { if (should_throw) { - throw MakeTypeError("define_disallowed", [p]); + throw MakeTypeError(kDefineDisallowed, p); } else { return false; } @@ -754,7 +751,7 @@ function DefineObjectProperty(obj, p, desc, should_throw) { (desc.hasEnumerable() && desc.isEnumerable() != current.isEnumerable())) { if (should_throw) { - throw MakeTypeError("redefine_disallowed", [p]); + throw MakeTypeError(kRedefineDisallowed, p); } else { return false; } @@ -764,7 +761,7 @@ function DefineObjectProperty(obj, p, desc, should_throw) { // Step 9a if (IsDataDescriptor(current) != IsDataDescriptor(desc)) { if (should_throw) { - throw MakeTypeError("redefine_disallowed", [p]); + throw MakeTypeError(kRedefineDisallowed, p); } else { return false; } @@ -773,7 +770,7 @@ function DefineObjectProperty(obj, p, desc, should_throw) { if (IsDataDescriptor(current) && IsDataDescriptor(desc)) { if (!current.isWritable() && desc.isWritable()) { if (should_throw) { - throw MakeTypeError("redefine_disallowed", [p]); + throw MakeTypeError(kRedefineDisallowed, p); } else { return false; } @@ -781,7 +778,7 @@ function DefineObjectProperty(obj, p, desc, should_throw) { if (!current.isWritable() && desc.hasValue() && !SameValue(desc.getValue(), current.getValue())) { if (should_throw) { - throw MakeTypeError("redefine_disallowed", [p]); + throw MakeTypeError(kRedefineDisallowed, p); } else { return false; } @@ -791,14 +788,14 @@ function DefineObjectProperty(obj, p, desc, should_throw) { if (IsAccessorDescriptor(desc) && IsAccessorDescriptor(current)) { if (desc.hasSetter() && !SameValue(desc.getSet(), current.getSet())) { if (should_throw) { - throw MakeTypeError("redefine_disallowed", [p]); + throw MakeTypeError(kRedefineDisallowed, p); } else { return false; } } if (desc.hasGetter() && !SameValue(desc.getGet(),current.getGet())) { if (should_throw) { - throw MakeTypeError("redefine_disallowed", [p]); + throw MakeTypeError(kRedefineDisallowed, p); } else { return false; } @@ -894,12 +891,12 @@ function DefineArrayProperty(obj, p, desc, should_throw) { } var new_length = ToUint32(desc.getValue()); if (new_length != ToNumber(desc.getValue())) { - throw new $RangeError('defineProperty() array length out of range'); + throw MakeRangeError(kArrayLengthOutOfRange); } var length_desc = GetOwnPropertyJS(obj, "length"); if (new_length != length && !length_desc.isWritable()) { if (should_throw) { - throw MakeTypeError("redefine_disallowed", [p]); + throw MakeTypeError(kRedefineDisallowed, p); } else { return false; } @@ -938,7 +935,7 @@ function DefineArrayProperty(obj, p, desc, should_throw) { } if (threw) { if (should_throw) { - throw MakeTypeError("redefine_disallowed", [p]); + throw MakeTypeError(kRedefineDisallowed, p); } else { return false; } @@ -963,7 +960,7 @@ function DefineArrayProperty(obj, p, desc, should_throw) { if (emit_splice) $observeEndPerformSplice(obj); if (should_throw) { - throw MakeTypeError("define_disallowed", [p]); + throw MakeTypeError(kDefineDisallowed, p); } else { return false; } @@ -1010,7 +1007,7 @@ function ObjectSetPrototypeOf(obj, proto) { CHECK_OBJECT_COERCIBLE(obj, "Object.setPrototypeOf"); if (proto !== null && !IS_SPEC_OBJECT(proto)) { - throw MakeTypeError("proto_object_or_null", [proto]); + throw MakeTypeError(kProtoObjectOrNull, proto); } if (IS_SPEC_OBJECT(obj)) { @@ -1031,7 +1028,7 @@ function ObjectGetOwnPropertyDescriptor(obj, p) { // For Harmony proxies function ToNameArray(obj, trap, includeSymbols) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("proxy_non_object_prop_names", [obj, trap]); + throw MakeTypeError(kProxyNonObjectPropNames, trap, obj); } var n = ToUint32(obj.length); var array = new $Array(n); @@ -1042,7 +1039,7 @@ function ToNameArray(obj, trap, includeSymbols) { // TODO(rossberg): adjust once there is a story for symbols vs proxies. if (IS_SYMBOL(s) && !includeSymbols) continue; if (%HasOwnProperty(names, s)) { - throw MakeTypeError("proxy_repeated_prop_name", [obj, trap, s]); + throw MakeTypeError(kProxyRepeatedPropName, trap, s); } array[index] = s; ++realLength; @@ -1137,7 +1134,7 @@ function ObjectGetOwnPropertyNames(obj) { // ES5 section 15.2.3.5. function ObjectCreate(proto, properties) { if (!IS_SPEC_OBJECT(proto) && proto !== null) { - throw MakeTypeError("proto_object_or_null", [proto]); + throw MakeTypeError(kProtoObjectOrNull, proto); } var obj = {}; %InternalSetPrototype(obj, proto); @@ -1149,7 +1146,7 @@ function ObjectCreate(proto, properties) { // ES5 section 15.2.3.6. function ObjectDefineProperty(obj, p, attributes) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("called_on_non_object", ["Object.defineProperty"]); + throw MakeTypeError(kCalledOnNonObject, "Object.defineProperty"); } var name = ToName(p); if (%_IsJSProxy(obj)) { @@ -1212,7 +1209,7 @@ function GetOwnEnumerablePropertyNames(object) { // ES5 section 15.2.3.7. function ObjectDefineProperties(obj, properties) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("called_on_non_object", ["Object.defineProperties"]); + throw MakeTypeError(kCalledOnNonObject, "Object.defineProperties"); } var props = TO_OBJECT_INLINE(properties); var names = GetOwnEnumerablePropertyNames(props); @@ -1232,7 +1229,7 @@ function ProxyFix(obj) { var handler = %GetHandler(obj); var props = CallTrap0(handler, "fix", UNDEFINED); if (IS_UNDEFINED(props)) { - throw MakeTypeError("handler_returned_undefined", [handler, "fix"]); + throw MakeTypeError(kProxyHandlerReturned, handler, "undefined", "fix"); } if (%IsJSFunctionProxy(obj)) { @@ -1259,7 +1256,7 @@ function ProxyFix(obj) { // ES5 section 15.2.3.8. function ObjectSealJS(obj) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("called_on_non_object", ["Object.seal"]); + throw MakeTypeError(kCalledOnNonObject, "Object.seal"); } var isProxy = %_IsJSProxy(obj); if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) { @@ -1288,7 +1285,7 @@ function ObjectSealJS(obj) { // ES5 section 15.2.3.9. function ObjectFreezeJS(obj) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("called_on_non_object", ["Object.freeze"]); + throw MakeTypeError(kCalledOnNonObject, "Object.freeze"); } var isProxy = %_IsJSProxy(obj); if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) { @@ -1318,7 +1315,7 @@ function ObjectFreezeJS(obj) { // ES5 section 15.2.3.10 function ObjectPreventExtension(obj) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("called_on_non_object", ["Object.preventExtension"]); + throw MakeTypeError(kCalledOnNonObject, "Object.preventExtension"); } if (%_IsJSProxy(obj)) { ProxyFix(obj); @@ -1331,7 +1328,7 @@ function ObjectPreventExtension(obj) { // ES5 section 15.2.3.11 function ObjectIsSealed(obj) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("called_on_non_object", ["Object.isSealed"]); + throw MakeTypeError(kCalledOnNonObject, "Object.isSealed"); } if (%_IsJSProxy(obj)) { return false; @@ -1354,7 +1351,7 @@ function ObjectIsSealed(obj) { // ES5 section 15.2.3.12 function ObjectIsFrozen(obj) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("called_on_non_object", ["Object.isFrozen"]); + throw MakeTypeError(kCalledOnNonObject, "Object.isFrozen"); } if (%_IsJSProxy(obj)) { return false; @@ -1376,7 +1373,7 @@ function ObjectIsFrozen(obj) { // ES5 section 15.2.3.13 function ObjectIsExtensible(obj) { if (!IS_SPEC_OBJECT(obj)) { - throw MakeTypeError("called_on_non_object", ["Object.isExtensible"]); + throw MakeTypeError(kCalledOnNonObject, "Object.isExtensible"); } if (%_IsJSProxy(obj)) { return true; @@ -1489,7 +1486,7 @@ function BooleanToString() { var b = this; if (!IS_BOOLEAN(b)) { if (!IS_BOOLEAN_WRAPPER(b)) { - throw new $TypeError('Boolean.prototype.toString is not generic'); + throw MakeTypeError(kNotGeneric, 'Boolean.prototype.toString'); } b = %_ValueOf(b); } @@ -1501,7 +1498,7 @@ function BooleanValueOf() { // NOTE: Both Boolean objects and values can enter here as // 'this'. This is not as dictated by ECMA-262. if (!IS_BOOLEAN(this) && !IS_BOOLEAN_WRAPPER(this)) { - throw new $TypeError('Boolean.prototype.valueOf is not generic'); + throw MakeTypeError(kNotGeneric, 'Boolean.prototype.valueOf'); } return %_ValueOf(this); } @@ -1545,7 +1542,7 @@ function NumberToStringJS(radix) { var number = this; if (!IS_NUMBER(this)) { if (!IS_NUMBER_WRAPPER(this)) { - throw new $TypeError('Number.prototype.toString is not generic'); + throw MakeTypeError(kNotGeneric, 'Number.prototype.toString'); } // Get the value of this number in case it's an object. number = %_ValueOf(this); @@ -1576,7 +1573,7 @@ function NumberValueOf() { // NOTE: Both Number objects and values can enter here as // 'this'. This is not as dictated by ECMA-262. if (!IS_NUMBER(this) && !IS_NUMBER_WRAPPER(this)) { - throw new $TypeError('Number.prototype.valueOf is not generic'); + throw MakeTypeError(kNotGeneric, 'Number.prototype.valueOf'); } return %_ValueOf(this); } @@ -1596,7 +1593,7 @@ function NumberToFixedJS(fractionDigits) { var f = TO_INTEGER(fractionDigits); if (f < 0 || f > 20) { - throw new $RangeError("toFixed() digits argument must be between 0 and 20"); + throw MakeRangeError(kNumberFormatRange, "toFixed() digits"); } if (NUMBER_IS_NAN(x)) return "NaN"; @@ -1627,7 +1624,7 @@ function NumberToExponentialJS(fractionDigits) { if (IS_UNDEFINED(f)) { f = -1; // Signal for runtime function that f is not defined. } else if (f < 0 || f > 20) { - throw new $RangeError("toExponential() argument must be between 0 and 20"); + throw MakeRangeError(kNumberFormatRange, "toExponential()"); } return %NumberToExponential(x, f); } @@ -1652,7 +1649,7 @@ function NumberToPrecisionJS(precision) { if (x == -INFINITY) return "-Infinity"; if (p < 1 || p > 21) { - throw new $RangeError("toPrecision() argument must be between 1 and 21"); + throw MakeRangeError(kToPrecisionFormatRange); } return %NumberToPrecision(x, p); } @@ -1752,7 +1749,7 @@ function FunctionSourceString(func) { } if (!IS_FUNCTION(func)) { - throw new $TypeError('Function.prototype.toString is not generic'); + throw MakeTypeError(kNotGeneric, 'Function.prototype.toString'); } var classSource = %ClassGetSourceCode(func); @@ -1794,9 +1791,8 @@ function FunctionToString() { // ES5 15.3.4.5 function FunctionBind(this_arg) { // Length is 1. - if (!IS_SPEC_FUNCTION(this)) { - throw new $TypeError('Bind must be called on a function'); - } + if (!IS_SPEC_FUNCTION(this)) throw MakeTypeError(kFunctionBind); + var boundFunction = function () { // Poison .arguments and .caller, but is otherwise not detectable. "use strict"; @@ -1863,7 +1859,7 @@ function NewFunctionString(arguments, function_token) { // character - it may make the combined function expression // compile. We avoid this problem by checking for this early on. if (%_CallFunction(p, ')', $stringIndexOf) != -1) { - throw MakeSyntaxError('paren_in_arg_string', []); + throw MakeSyntaxError(kParenthesisInArgString); } // If the formal parameters include an unbalanced block comment, the // function must be rejected. Since JavaScript does not allow nested @@ -1913,11 +1909,11 @@ function GetIterator(obj, method) { method = obj[symbolIterator]; } if (!IS_SPEC_FUNCTION(method)) { - throw MakeTypeError('not_iterable', [obj]); + throw MakeTypeError(kNotIterable, obj); } var iterator = %_CallFunction(obj, method); if (!IS_SPEC_OBJECT(iterator)) { - throw MakeTypeError('not_an_iterator', [iterator]); + throw MakeTypeError(kNotAnIterator, iterator); } return iterator; } diff --git a/test/mjsunit/messages.js b/test/mjsunit/messages.js index 4162255..d148063 100644 --- a/test/mjsunit/messages.js +++ b/test/mjsunit/messages.js @@ -12,7 +12,7 @@ function test(f, expected, type) { assertEquals(expected, e.message); return; } - assertUnreachable(); + assertUnreachable("Exception expected"); } // === Error === @@ -32,11 +32,29 @@ test(function() { }, "Function.prototype.apply was called on 1, which is a number " + "and not a function", TypeError); +// kCalledNonCallable +test(function() { + [].forEach(1); +}, "1 is not a function", TypeError); + +// kCalledOnNonObject +test(function() { + Object.freeze(1) +}, "Object.freeze called on non-object", TypeError); + // kCannotConvertToPrimitive test(function() { [].join(Object(Symbol(1))); }, "Cannot convert object to primitive value", TypeError); +// kDefineDisallowed +test(function() { + "use strict"; + var o = {}; + Object.preventExtensions(o); + Object.defineProperty(o, "x", { value: 1 }); +}, "Cannot define property:x, object is not extensible.", TypeError); + // kGeneratorRunning test(function() { var iter; @@ -45,10 +63,10 @@ test(function() { iter.next(); }, "Generator is already running", TypeError); -// kCalledNonCallable +// kFunctionBind test(function() { - [].forEach(1); -}, "1 is not a function", TypeError); + Function.prototype.bind.call(1); +}, "Bind must be called on a function", TypeError); // kIncompatibleMethodReceiver test(function() { @@ -79,12 +97,80 @@ test(function() { new Symbol(); }, "Symbol is not a constructor", TypeError); +// kNotGeneric +test(function() { + String.prototype.toString.call(1); +}, "String.prototype.toString is not generic", TypeError); + +test(function() { + String.prototype.valueOf.call(1); +}, "String.prototype.valueOf is not generic", TypeError); + +test(function() { + Boolean.prototype.toString.call(1); +}, "Boolean.prototype.toString is not generic", TypeError); + +test(function() { + Boolean.prototype.valueOf.call(1); +}, "Boolean.prototype.valueOf is not generic", TypeError); + +test(function() { + Number.prototype.toString.call({}); +}, "Number.prototype.toString is not generic", TypeError); + +test(function() { + Number.prototype.valueOf.call({}); +}, "Number.prototype.valueOf is not generic", TypeError); + +test(function() { + Function.prototype.toString.call(1); +}, "Function.prototype.toString is not generic", TypeError); + + +// kObjectGetterExpectingFunction +test(function() { + ({}).__defineGetter__("x", 0); +}, "Object.prototype.__defineGetter__: Expecting function", TypeError); + +// kObjectGetterCallable +test(function() { + Object.defineProperty({}, "x", { get: 1 }); +}, "Getter must be a function: 1", TypeError); + +// kObjectSetterExpectingFunction +test(function() { + ({}).__defineSetter__("x", 0); +}, "Object.prototype.__defineSetter__: Expecting function", TypeError); + +// kObjectSetterCallable +test(function() { + Object.defineProperty({}, "x", { set: 1 }); +}, "Setter must be a function: 1", TypeError); + +// kPropertyDescObject +test(function() { + Object.defineProperty({}, "x", 1); +}, "Property description must be an object: 1", TypeError); + // kPropertyNotFunction test(function() { Set.prototype.add = 0; new Set(1); }, "Property 'add' of object # is not a function", TypeError); +// kProtoObjectOrNull +test(function() { + Object.setPrototypeOf({}, 1); +}, "Object prototype may only be an Object or null: 1", TypeError); + +// kRedefineDisallowed +test(function() { + "use strict"; + var o = {}; + Object.defineProperty(o, "x", { value: 1, configurable: false }); + Object.defineProperty(o, "x", { value: 2 }); +}, "Cannot redefine property: x", TypeError); + // kSymbolToPrimitive test(function() { 1 + Object(Symbol()); @@ -105,6 +191,12 @@ test(function() { Array.prototype.toString.call(null); }, "Cannot convert undefined or null to object", TypeError); +// kValueAndAccessor +test(function() { + Object.defineProperty({}, "x", { get: function(){}, value: 1}); +}, "Invalid property. A property cannot both have accessors and be " + + "writable or have a value, #", TypeError); + // kWithExpression test(function() { with (null) {} @@ -124,10 +216,37 @@ test(function() { }, "Reflect.construct: Arguments list has wrong type", TypeError); +//=== SyntaxError === + +test(function() { + new Function(")", ""); +}, "Function arg string contains parenthesis", SyntaxError); + + // === RangeError === +// kArrayLengthOutOfRange +test(function() { + "use strict"; + Object.defineProperty([], "length", { value: 1E100 }); +}, "defineProperty() array length out of range", RangeError); + +//kNumberFormatRange +test(function() { +Number(1).toFixed(100); +}, "toFixed() digits argument must be between 0 and 20", RangeError); + +test(function() { +Number(1).toExponential(100); +}, "toExponential() argument must be between 0 and 20", RangeError); + // kStackOverflow test(function() { function f() { f(Array(1000)); } f(); }, "Maximum call stack size exceeded", RangeError); + +// kToPrecisionFormatRange +test(function() { + Number(1).toPrecision(100); +}, "toPrecision() argument must be between 1 and 21", RangeError); -- 2.7.4