2015-04-17 08:35:59 +00:00
|
|
|
// Copyright 2015 the V8 project authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2017-11-28 05:24:33 +00:00
|
|
|
// Flags: --allow-natives-syntax --stack-size=100 --harmony
|
2015-04-17 13:27:41 +00:00
|
|
|
|
2015-04-17 08:35:59 +00:00
|
|
|
function test(f, expected, type) {
|
|
|
|
try {
|
|
|
|
f();
|
|
|
|
} catch (e) {
|
|
|
|
assertInstanceof(e, type);
|
|
|
|
assertEquals(expected, e.message);
|
2015-04-17 13:27:41 +00:00
|
|
|
return;
|
2015-04-17 08:35:59 +00:00
|
|
|
}
|
2015-04-21 09:03:24 +00:00
|
|
|
assertUnreachable("Exception expected");
|
2015-04-17 08:35:59 +00:00
|
|
|
}
|
|
|
|
|
2017-11-28 05:24:33 +00:00
|
|
|
const typedArrayConstructors = [
|
|
|
|
Uint8Array,
|
|
|
|
Int8Array,
|
|
|
|
Uint16Array,
|
|
|
|
Int16Array,
|
|
|
|
Uint32Array,
|
|
|
|
Int32Array,
|
|
|
|
Float32Array,
|
|
|
|
Float64Array,
|
|
|
|
Uint8ClampedArray
|
|
|
|
];
|
|
|
|
|
2015-04-17 08:35:59 +00:00
|
|
|
// === Error ===
|
|
|
|
|
|
|
|
// kCyclicProto
|
|
|
|
test(function() {
|
|
|
|
var o = {};
|
|
|
|
o.__proto__ = o;
|
|
|
|
}, "Cyclic __proto__ value", Error);
|
|
|
|
|
|
|
|
|
|
|
|
// === TypeError ===
|
|
|
|
|
2015-04-17 13:27:41 +00:00
|
|
|
// kApplyNonFunction
|
|
|
|
test(function() {
|
2017-06-20 12:36:43 +00:00
|
|
|
Reflect.apply(1, []);
|
2015-04-17 13:27:41 +00:00
|
|
|
}, "Function.prototype.apply was called on 1, which is a number " +
|
|
|
|
"and not a function", TypeError);
|
|
|
|
|
2015-04-24 10:22:00 +00:00
|
|
|
test(function() {
|
|
|
|
var a = [1, 2];
|
|
|
|
Object.freeze(a);
|
|
|
|
a.splice(1, 1, [1]);
|
2018-04-23 08:13:39 +00:00
|
|
|
}, "Cannot assign to read only property '1' of object '[object Array]'",
|
|
|
|
TypeError);
|
2015-04-24 10:22:00 +00:00
|
|
|
|
|
|
|
test(function() {
|
|
|
|
var a = [1];
|
|
|
|
Object.seal(a);
|
|
|
|
a.shift();
|
2018-04-23 08:13:39 +00:00
|
|
|
}, "Cannot delete property '0' of [object Array]", TypeError);
|
2015-04-24 10:22:00 +00:00
|
|
|
|
2015-04-21 09:03:24 +00:00
|
|
|
// kCalledNonCallable
|
|
|
|
test(function() {
|
|
|
|
[].forEach(1);
|
|
|
|
}, "1 is not a function", TypeError);
|
|
|
|
|
2015-04-24 10:22:00 +00:00
|
|
|
// kCalledOnNonObject
|
|
|
|
test(function() {
|
|
|
|
Object.defineProperty(1, "x", {});
|
|
|
|
}, "Object.defineProperty called on non-object", TypeError);
|
|
|
|
|
2015-12-17 08:40:49 +00:00
|
|
|
test(function() {
|
|
|
|
(function() {}).apply({}, 1);
|
|
|
|
}, "CreateListFromArrayLike called on non-object", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
Reflect.apply(function() {}, {}, 1);
|
|
|
|
}, "CreateListFromArrayLike called on non-object", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
Reflect.construct(function() {}, 1);
|
|
|
|
}, "CreateListFromArrayLike called on non-object", TypeError);
|
|
|
|
|
2015-04-24 10:22:00 +00:00
|
|
|
// kCalledOnNullOrUndefined
|
2017-09-05 02:19:29 +00:00
|
|
|
test(function() {
|
|
|
|
String.prototype.includes.call(null);
|
|
|
|
}, "String.prototype.includes called on null or undefined", TypeError);
|
|
|
|
|
2017-10-10 15:38:35 +00:00
|
|
|
test(function() {
|
|
|
|
String.prototype.match.call(null);
|
|
|
|
}, "String.prototype.match called on null or undefined", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
String.prototype.search.call(null);
|
|
|
|
}, "String.prototype.search called on null or undefined", TypeError);
|
|
|
|
|
2015-04-24 10:22:00 +00:00
|
|
|
test(function() {
|
|
|
|
Array.prototype.shift.call(null);
|
2017-10-13 18:49:20 +00:00
|
|
|
}, "Cannot convert undefined or null to object", TypeError);
|
2015-04-24 10:22:00 +00:00
|
|
|
|
2017-08-22 23:39:31 +00:00
|
|
|
test(function() {
|
2017-09-05 02:19:29 +00:00
|
|
|
String.prototype.trim.call(null);
|
|
|
|
}, "String.prototype.trim called on null or undefined", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
String.prototype.trimLeft.call(null);
|
|
|
|
}, "String.prototype.trimLeft called on null or undefined", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
String.prototype.trimRight.call(null);
|
|
|
|
}, "String.prototype.trimRight called on null or undefined", TypeError);
|
2017-08-22 23:39:31 +00:00
|
|
|
|
2015-10-26 11:07:48 +00:00
|
|
|
// kCannotFreezeArrayBufferView
|
2015-05-12 13:52:26 +00:00
|
|
|
test(function() {
|
2015-10-26 11:07:48 +00:00
|
|
|
Object.freeze(new Uint16Array(1));
|
|
|
|
}, "Cannot freeze array buffer views with elements", TypeError);
|
2015-05-12 13:52:26 +00:00
|
|
|
|
|
|
|
// kConstAssign
|
|
|
|
test(function() {
|
|
|
|
"use strict";
|
|
|
|
const a = 1;
|
|
|
|
a = 2;
|
|
|
|
}, "Assignment to constant variable.", TypeError);
|
|
|
|
|
2015-04-17 13:27:41 +00:00
|
|
|
// kCannotConvertToPrimitive
|
|
|
|
test(function() {
|
2015-09-23 21:46:37 +00:00
|
|
|
var o = { toString: function() { return this } };
|
|
|
|
[].join(o);
|
2015-04-17 13:27:41 +00:00
|
|
|
}, "Cannot convert object to primitive value", TypeError);
|
|
|
|
|
2015-05-05 07:57:37 +00:00
|
|
|
// kConstructorNotFunction
|
2017-11-12 14:50:59 +00:00
|
|
|
test(function() {
|
|
|
|
Map();
|
|
|
|
}, "Constructor Map requires 'new'", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
Set();
|
|
|
|
}, "Constructor Set requires 'new'", TypeError);
|
|
|
|
|
2015-05-05 07:57:37 +00:00
|
|
|
test(function() {
|
|
|
|
Uint16Array(1);
|
|
|
|
}, "Constructor Uint16Array requires 'new'", TypeError);
|
|
|
|
|
2017-11-12 14:50:59 +00:00
|
|
|
test(function() {
|
|
|
|
WeakSet();
|
|
|
|
}, "Constructor WeakSet requires 'new'", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
WeakMap();
|
|
|
|
}, "Constructor WeakMap requires 'new'", TypeError);
|
|
|
|
|
2015-05-06 07:51:56 +00:00
|
|
|
// kDataViewNotArrayBuffer
|
|
|
|
test(function() {
|
|
|
|
new DataView(1);
|
|
|
|
}, "First argument to DataView constructor must be an ArrayBuffer", TypeError);
|
|
|
|
|
2015-04-21 09:03:24 +00:00
|
|
|
// kDefineDisallowed
|
|
|
|
test(function() {
|
|
|
|
"use strict";
|
|
|
|
var o = {};
|
|
|
|
Object.preventExtensions(o);
|
|
|
|
Object.defineProperty(o, "x", { value: 1 });
|
2017-02-13 10:27:03 +00:00
|
|
|
}, "Cannot define property x, object is not extensible", TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2017-11-28 05:24:33 +00:00
|
|
|
// kDetachedOperation
|
|
|
|
for (constructor of typedArrayConstructors) {
|
|
|
|
test(() => {
|
|
|
|
const ta = new constructor([1]);
|
2018-12-11 10:22:02 +00:00
|
|
|
%ArrayBufferDetach(ta.buffer);
|
2017-11-28 05:24:33 +00:00
|
|
|
ta.find(() => {});
|
2019-09-11 15:45:30 +00:00
|
|
|
}, "Cannot perform %TypedArray%.prototype.find on a detached ArrayBuffer", TypeError);
|
2017-11-29 13:57:20 +00:00
|
|
|
|
|
|
|
test(() => {
|
|
|
|
const ta = new constructor([1]);
|
2018-12-11 10:22:02 +00:00
|
|
|
%ArrayBufferDetach(ta.buffer);
|
2017-11-29 13:57:20 +00:00
|
|
|
ta.findIndex(() => {});
|
2019-09-11 15:45:30 +00:00
|
|
|
}, "Cannot perform %TypedArray%.prototype.findIndex on a detached ArrayBuffer", TypeError);
|
2017-11-28 05:24:33 +00:00
|
|
|
}
|
|
|
|
|
2015-04-30 16:22:00 +00:00
|
|
|
// kFirstArgumentNotRegExp
|
|
|
|
test(function() {
|
|
|
|
"a".startsWith(/a/);
|
|
|
|
}, "First argument to String.prototype.startsWith " +
|
|
|
|
"must not be a regular expression", TypeError);
|
|
|
|
|
2017-08-22 23:39:31 +00:00
|
|
|
test(function() {
|
|
|
|
"a".includes(/a/);
|
|
|
|
}, "First argument to String.prototype.includes " +
|
|
|
|
"must not be a regular expression", TypeError);
|
|
|
|
|
2016-09-05 13:48:23 +00:00
|
|
|
// kFlagsGetterNonObject
|
|
|
|
test(function() {
|
|
|
|
Object.getOwnPropertyDescriptor(RegExp.prototype, "flags").get.call(1);
|
|
|
|
}, "RegExp.prototype.flags getter called on non-object 1", TypeError);
|
|
|
|
|
2015-04-30 16:22:00 +00:00
|
|
|
// kFunctionBind
|
|
|
|
test(function() {
|
|
|
|
Function.prototype.bind.call(1);
|
|
|
|
}, "Bind must be called on a function", TypeError);
|
|
|
|
|
2015-04-17 08:35:59 +00:00
|
|
|
// kGeneratorRunning
|
|
|
|
test(function() {
|
|
|
|
var iter;
|
|
|
|
function* generator() { yield iter.next(); }
|
|
|
|
var iter = generator();
|
|
|
|
iter.next();
|
|
|
|
}, "Generator is already running", TypeError);
|
|
|
|
|
|
|
|
// kIncompatibleMethodReceiver
|
|
|
|
test(function() {
|
2015-11-03 06:18:17 +00:00
|
|
|
Set.prototype.add.call([]);
|
|
|
|
}, "Method Set.prototype.add called on incompatible receiver [object Array]",
|
|
|
|
TypeError);
|
2015-04-17 08:35:59 +00:00
|
|
|
|
2017-10-30 13:00:18 +00:00
|
|
|
test(function() {
|
|
|
|
WeakSet.prototype.add.call([]);
|
|
|
|
}, "Method WeakSet.prototype.add called on incompatible receiver [object Array]",
|
|
|
|
TypeError);
|
|
|
|
|
2017-10-30 14:08:30 +00:00
|
|
|
test(function() {
|
|
|
|
WeakSet.prototype.delete.call([]);
|
|
|
|
}, "Method WeakSet.prototype.delete called on incompatible receiver [object Array]",
|
|
|
|
TypeError);
|
|
|
|
|
2017-10-30 13:00:18 +00:00
|
|
|
test(function() {
|
|
|
|
WeakMap.prototype.set.call([]);
|
|
|
|
}, "Method WeakMap.prototype.set called on incompatible receiver [object Array]",
|
|
|
|
TypeError);
|
|
|
|
|
2017-10-30 14:08:30 +00:00
|
|
|
test(function() {
|
|
|
|
WeakMap.prototype.delete.call([]);
|
|
|
|
}, "Method WeakMap.prototype.delete called on incompatible receiver [object Array]",
|
|
|
|
TypeError);
|
|
|
|
|
2016-05-17 11:23:59 +00:00
|
|
|
// kNonCallableInInstanceOfCheck
|
|
|
|
test(function() {
|
|
|
|
1 instanceof {};
|
|
|
|
}, "Right-hand side of 'instanceof' is not callable", TypeError);
|
|
|
|
|
|
|
|
// kNonObjectInInstanceOfCheck
|
2015-04-17 13:27:41 +00:00
|
|
|
test(function() {
|
|
|
|
1 instanceof 1;
|
2016-03-21 14:00:42 +00:00
|
|
|
}, "Right-hand side of 'instanceof' is not an object", TypeError);
|
2015-04-17 13:27:41 +00:00
|
|
|
|
|
|
|
// kInstanceofNonobjectProto
|
|
|
|
test(function() {
|
|
|
|
function f() {}
|
|
|
|
var o = new f();
|
|
|
|
f.prototype = 1;
|
|
|
|
o instanceof f;
|
|
|
|
}, "Function has non-object prototype '1' in instanceof check", TypeError);
|
|
|
|
|
|
|
|
// kInvalidInOperatorUse
|
|
|
|
test(function() {
|
|
|
|
1 in 1;
|
|
|
|
}, "Cannot use 'in' operator to search for '1' in 1", TypeError);
|
|
|
|
|
2017-10-30 13:00:18 +00:00
|
|
|
// kInvalidWeakMapKey
|
|
|
|
test(function() {
|
|
|
|
new WeakMap([[1, 1]]);
|
|
|
|
}, "Invalid value used as weak map key", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
new WeakMap().set(1, 1);
|
|
|
|
}, "Invalid value used as weak map key", TypeError);
|
|
|
|
|
|
|
|
// kInvalidWeakSetValue
|
|
|
|
test(function() {
|
|
|
|
new WeakSet([1]);
|
|
|
|
}, "Invalid value used in weak set", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
new WeakSet().add(1);
|
|
|
|
}, "Invalid value used in weak set", TypeError);
|
|
|
|
|
2015-05-05 07:57:37 +00:00
|
|
|
// kIteratorResultNotAnObject
|
|
|
|
test(function() {
|
|
|
|
var obj = {};
|
|
|
|
obj[Symbol.iterator] = function() { return { next: function() { return 1 }}};
|
|
|
|
Array.from(obj);
|
|
|
|
}, "Iterator result 1 is not an object", TypeError);
|
|
|
|
|
|
|
|
// kIteratorValueNotAnObject
|
|
|
|
test(function() {
|
|
|
|
new Map([1]);
|
|
|
|
}, "Iterator value 1 is not an entry object", TypeError);
|
|
|
|
|
2018-05-02 12:15:24 +00:00
|
|
|
test(function() {
|
|
|
|
let holeyDoubleArray = [, 123.123];
|
|
|
|
assertTrue(%HasDoubleElements(holeyDoubleArray));
|
|
|
|
assertTrue(%HasHoleyElements(holeyDoubleArray));
|
|
|
|
new Map(holeyDoubleArray);
|
|
|
|
}, "Iterator value undefined is not an entry object", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
let holeyDoubleArray = [, 123.123];
|
|
|
|
assertTrue(%HasDoubleElements(holeyDoubleArray));
|
|
|
|
assertTrue(%HasHoleyElements(holeyDoubleArray));
|
|
|
|
new WeakMap(holeyDoubleArray);
|
|
|
|
}, "Iterator value undefined is not an entry object", TypeError);
|
|
|
|
|
2015-04-17 13:27:41 +00:00
|
|
|
// kNotConstructor
|
|
|
|
test(function() {
|
|
|
|
new Symbol();
|
|
|
|
}, "Symbol is not a constructor", TypeError);
|
|
|
|
|
2015-05-12 13:52:26 +00:00
|
|
|
// kNotDateObject
|
|
|
|
test(function() {
|
2016-01-12 10:47:27 +00:00
|
|
|
Date.prototype.getHours.call(1);
|
2015-05-12 13:52:26 +00:00
|
|
|
}, "this is not a Date object.", TypeError);
|
|
|
|
|
2015-04-21 09:03:24 +00:00
|
|
|
// kNotGeneric
|
2017-04-19 08:34:24 +00:00
|
|
|
test(() => String.prototype.toString.call(1),
|
|
|
|
"String.prototype.toString requires that 'this' be a String",
|
|
|
|
TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2017-04-19 08:34:24 +00:00
|
|
|
test(() => String.prototype.valueOf.call(1),
|
|
|
|
"String.prototype.valueOf requires that 'this' be a String",
|
|
|
|
TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2017-04-19 08:34:24 +00:00
|
|
|
test(() => Boolean.prototype.toString.call(1),
|
|
|
|
"Boolean.prototype.toString requires that 'this' be a Boolean",
|
|
|
|
TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2017-04-19 08:34:24 +00:00
|
|
|
test(() => Boolean.prototype.valueOf.call(1),
|
|
|
|
"Boolean.prototype.valueOf requires that 'this' be a Boolean",
|
|
|
|
TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2017-04-19 08:34:24 +00:00
|
|
|
test(() => Number.prototype.toString.call({}),
|
|
|
|
"Number.prototype.toString requires that 'this' be a Number",
|
|
|
|
TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2017-04-19 08:34:24 +00:00
|
|
|
test(() => Number.prototype.valueOf.call({}),
|
|
|
|
"Number.prototype.valueOf requires that 'this' be a Number",
|
|
|
|
TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2017-04-19 08:34:24 +00:00
|
|
|
test(() => Function.prototype.toString.call(1),
|
|
|
|
"Function.prototype.toString requires that 'this' be a Function",
|
|
|
|
TypeError);
|
2015-05-05 07:57:37 +00:00
|
|
|
|
|
|
|
// kNotTypedArray
|
|
|
|
test(function() {
|
|
|
|
Uint16Array.prototype.forEach.call(1);
|
|
|
|
}, "this is not a typed array.", TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
2015-05-12 13:52:26 +00:00
|
|
|
// kObjectNotExtensible
|
|
|
|
test(function() {
|
|
|
|
"use strict";
|
|
|
|
var o = {};
|
|
|
|
Object.freeze(o);
|
|
|
|
o.a = 1;
|
2017-02-13 10:27:03 +00:00
|
|
|
}, "Cannot add property a, object is not extensible", TypeError);
|
2015-05-12 13:52:26 +00:00
|
|
|
|
2015-04-21 09:03:24 +00:00
|
|
|
// 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);
|
|
|
|
|
2015-04-17 08:35:59 +00:00
|
|
|
// kPropertyNotFunction
|
2017-11-12 14:50:59 +00:00
|
|
|
test(function() {
|
|
|
|
Map.prototype.set = 0;
|
|
|
|
new Map([[1, 2]]);
|
|
|
|
}, "'0' returned for property 'set' of object '#<Map>' is not a function", TypeError);
|
|
|
|
|
2015-04-17 08:35:59 +00:00
|
|
|
test(function() {
|
|
|
|
Set.prototype.add = 0;
|
2017-11-12 14:50:59 +00:00
|
|
|
new Set([1]);
|
2015-12-02 12:25:02 +00:00
|
|
|
}, "'0' returned for property 'add' of object '#<Set>' is not a function", TypeError);
|
2015-04-17 08:35:59 +00:00
|
|
|
|
2017-11-12 14:50:59 +00:00
|
|
|
test(function() {
|
|
|
|
WeakMap.prototype.set = 0;
|
|
|
|
new WeakMap([[{}, 1]]);
|
|
|
|
}, "'0' returned for property 'set' of object '#<WeakMap>' is not a function", TypeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
WeakSet.prototype.add = 0;
|
|
|
|
new WeakSet([{}]);
|
|
|
|
}, "'0' returned for property 'add' of object '#<WeakSet>' is not a function", TypeError);
|
|
|
|
|
2015-04-21 09:03:24 +00:00
|
|
|
// 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);
|
|
|
|
|
2015-04-24 10:22:00 +00:00
|
|
|
// kReduceNoInitial
|
|
|
|
test(function() {
|
|
|
|
[].reduce(function() {});
|
|
|
|
}, "Reduce of empty array with no initial value", TypeError);
|
|
|
|
|
2015-05-06 07:51:56 +00:00
|
|
|
// kResolverNotAFunction
|
|
|
|
test(function() {
|
|
|
|
new Promise(1);
|
|
|
|
}, "Promise resolver 1 is not a function", TypeError);
|
|
|
|
|
2015-05-12 13:52:26 +00:00
|
|
|
// kStrictDeleteProperty
|
|
|
|
test(function() {
|
|
|
|
"use strict";
|
|
|
|
var o = {};
|
|
|
|
Object.defineProperty(o, "p", { value: 1, writable: false });
|
|
|
|
delete o.p;
|
|
|
|
}, "Cannot delete property 'p' of #<Object>", TypeError);
|
|
|
|
|
|
|
|
// kStrictPoisonPill
|
|
|
|
test(function() {
|
|
|
|
"use strict";
|
|
|
|
arguments.callee;
|
|
|
|
}, "'caller', 'callee', and 'arguments' properties may not be accessed on " +
|
|
|
|
"strict mode functions or the arguments objects for calls to them",
|
|
|
|
TypeError);
|
|
|
|
|
|
|
|
// kStrictReadOnlyProperty
|
|
|
|
test(function() {
|
|
|
|
"use strict";
|
|
|
|
(1).a = 1;
|
2015-10-09 09:12:28 +00:00
|
|
|
}, "Cannot create property 'a' on number '1'", TypeError);
|
2015-05-12 13:52:26 +00:00
|
|
|
|
2015-04-17 13:27:41 +00:00
|
|
|
// kSymbolToString
|
|
|
|
test(function() {
|
|
|
|
"" + Symbol();
|
|
|
|
}, "Cannot convert a Symbol value to a string", TypeError);
|
|
|
|
|
|
|
|
// kSymbolToNumber
|
|
|
|
test(function() {
|
|
|
|
1 + Symbol();
|
|
|
|
}, "Cannot convert a Symbol value to a number", TypeError);
|
|
|
|
|
|
|
|
// kUndefinedOrNullToObject
|
|
|
|
test(function() {
|
|
|
|
Array.prototype.toString.call(null);
|
|
|
|
}, "Cannot convert undefined or null to object", TypeError);
|
|
|
|
|
2015-04-21 09:03:24 +00:00
|
|
|
// kValueAndAccessor
|
|
|
|
test(function() {
|
|
|
|
Object.defineProperty({}, "x", { get: function(){}, value: 1});
|
2015-10-14 19:22:17 +00:00
|
|
|
}, "Invalid property descriptor. Cannot both specify accessors " +
|
|
|
|
"and a value or writable attribute, #<Object>", TypeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2015-04-17 13:27:41 +00:00
|
|
|
|
2015-05-15 13:32:32 +00:00
|
|
|
// === SyntaxError ===
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2015-05-15 13:32:32 +00:00
|
|
|
// kInvalidRegExpFlags
|
|
|
|
test(function() {
|
2015-11-25 13:46:09 +00:00
|
|
|
eval("/a/x.test(\"a\");");
|
|
|
|
}, "Invalid regular expression flags", SyntaxError);
|
2015-05-15 13:32:32 +00:00
|
|
|
|
2016-03-02 14:20:21 +00:00
|
|
|
// kInvalidOrUnexpectedToken
|
|
|
|
test(function() {
|
|
|
|
eval("'\n'");
|
|
|
|
}, "Invalid or unexpected token", SyntaxError);
|
|
|
|
|
2022-05-16 15:53:06 +00:00
|
|
|
// kJsonParseUnterminatedString
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('{"a" : "}')
|
|
|
|
}, "Unterminated string in JSON at position 9", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseExpectedPropNameOrRBrace
|
2015-05-15 13:32:32 +00:00
|
|
|
test(function() {
|
|
|
|
JSON.parse("{")
|
2022-05-16 15:53:06 +00:00
|
|
|
}, "Expected property name or '}' in JSON at position 1", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseExpectedDoubleQuotedPropertyName
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('{"foo" : 1, }');
|
|
|
|
}, "Expected double-quoted property name in JSON at position 12", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseExpectedCommaNameOrRBrack
|
|
|
|
test(function() {
|
|
|
|
JSON.parse("{'foo': 1}");
|
|
|
|
}, "Expected property name or '}' in JSON at position 1", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseExpectedCommaNameOrRBrace
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('[1, 2, 3, 4');
|
|
|
|
}, "Expected ',' or ']' after array element in JSON at position 11", SyntaxError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('[1, 2, 3, 4g');
|
|
|
|
}, "Expected ',' or ']' after array element in JSON at position 11", SyntaxError);
|
2015-05-15 13:32:32 +00:00
|
|
|
|
2022-05-16 15:53:06 +00:00
|
|
|
// kJsonParseExponentPartMissingNumber
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('[1e]');
|
|
|
|
}, "Exponent part is missing a number in JSON at position 3", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseExpectedColonAfterPropertyName
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('{"a"}');
|
|
|
|
}, "Expected ':' after property name in JSON at position 4", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnterminatedFractionNumber
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('{"a": 0.bs}');
|
|
|
|
}, "Unterminated fractional number in JSON at position 8", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedNonWhiteSpaceCharacter
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('{"a": 3}a');
|
|
|
|
}, "Unexpected non-whitespace character after JSON at position 8", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseBadEscapedCharacter
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('{"b" : "\\a"}');
|
|
|
|
}, "Bad escaped character in JSON at position 9", SyntaxError);
|
|
|
|
|
2022-05-18 16:12:47 +00:00
|
|
|
// kJsonParseBadControlCharacter
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('"a\bz"');
|
|
|
|
}, "Bad control character in string literal in JSON at position 2", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseBadUnicodeEscape
|
|
|
|
test(function() {
|
|
|
|
JSON.parse("[\"\\t\\u");
|
|
|
|
}, "Bad Unicode escape in JSON at position 6", SyntaxError);
|
|
|
|
|
2022-05-16 15:53:06 +00:00
|
|
|
// kJsonParseNoNumberAfterMinusSign
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('-');
|
|
|
|
}, "No number after minus sign in JSON at position 1", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenShortString
|
|
|
|
test(function () {
|
|
|
|
JSON.parse(NaN)
|
|
|
|
}, "\"NaN\" is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenShortString
|
2015-05-15 13:32:32 +00:00
|
|
|
test(function() {
|
|
|
|
JSON.parse("/")
|
2022-05-16 15:53:06 +00:00
|
|
|
}, "Unexpected token '/', \"/\" is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenShortString
|
|
|
|
test(function () {
|
|
|
|
JSON.parse(undefined)
|
|
|
|
}, "\"undefined\" is not valid JSON", SyntaxError);
|
2015-05-15 13:32:32 +00:00
|
|
|
|
2022-05-16 15:53:06 +00:00
|
|
|
// kJsonParseUnexpectedTokenShortString
|
|
|
|
test(function () {
|
|
|
|
JSON.parse(Infinity)
|
|
|
|
}, "\"Infinity\" is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenShortString
|
|
|
|
test(function () {
|
|
|
|
JSON.parse('Bad string')
|
|
|
|
}, "Unexpected token 'B', \"Bad string\" is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenShortString
|
|
|
|
test(function () {
|
|
|
|
JSON.parse({})
|
|
|
|
}, "\"[object Object]\" is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseExpectedPropNameOrRBrace
|
2015-05-15 13:32:32 +00:00
|
|
|
test(function() {
|
|
|
|
JSON.parse("{ 1")
|
2022-05-16 15:53:06 +00:00
|
|
|
}, "Expected property name or '}' in JSON at position 2", SyntaxError);
|
2015-05-15 13:32:32 +00:00
|
|
|
|
2022-05-16 15:53:06 +00:00
|
|
|
// kJsonParseUnexpectedNonWhiteSpaceCharacter
|
2015-05-15 13:32:32 +00:00
|
|
|
test(function() {
|
|
|
|
JSON.parse('"""')
|
2022-05-16 15:53:06 +00:00
|
|
|
}, "Unexpected non-whitespace character after JSON at position 2", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenStringShortString
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('[1, 2,]');
|
|
|
|
}, "Unexpected token ']', \"[1, 2,]\" is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenStringShortString
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('[1, 2, 3, 4, ]');
|
|
|
|
}, "Unexpected token ']', \"[1, 2, 3, 4, ]\" is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenStringSurroundWithContext
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('[1, 2, 3, 4, 5, , 7, 8, 9, 10]');
|
|
|
|
}, "Unexpected token ',', ...\" 3, 4, 5, , 7, 8, 9,\"... is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenStringStartWithContext
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('[, 2, 3, 4, 5, 6, 7, 8, 9, 10]');
|
|
|
|
}, "Unexpected token ',', \"[, 2, 3, 4,\"... is not valid JSON", SyntaxError);
|
|
|
|
|
|
|
|
// kJsonParseUnexpectedTokenStringEndWithContext
|
|
|
|
test(function() {
|
|
|
|
JSON.parse('[1, 2, 3, 4, 5, 6, 7, ]');
|
|
|
|
}, "Unexpected token ']', ...\" 5, 6, 7, ]\" is not valid JSON", SyntaxError);
|
2015-05-15 13:32:32 +00:00
|
|
|
|
2016-02-10 11:28:13 +00:00
|
|
|
// kMalformedRegExp
|
|
|
|
test(function() {
|
2021-08-26 10:41:13 +00:00
|
|
|
new Function('/(/.test("a");');
|
2016-02-10 11:28:13 +00:00
|
|
|
}, "Invalid regular expression: /(/: Unterminated group", SyntaxError);
|
|
|
|
|
|
|
|
// kParenthesisInArgString
|
|
|
|
test(function() {
|
|
|
|
new Function(")", "");
|
2017-04-03 14:56:15 +00:00
|
|
|
}, "Arg string terminates parameters early", SyntaxError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2015-05-07 10:00:21 +00:00
|
|
|
// === ReferenceError ===
|
|
|
|
|
2015-05-15 13:32:32 +00:00
|
|
|
// kNotDefined
|
2015-05-07 10:00:21 +00:00
|
|
|
test(function() {
|
|
|
|
"use strict";
|
|
|
|
o;
|
|
|
|
}, "o is not defined", ReferenceError);
|
|
|
|
|
2015-04-17 13:27:41 +00:00
|
|
|
// === RangeError ===
|
|
|
|
|
2017-02-13 10:28:34 +00:00
|
|
|
// kInvalidOffset
|
|
|
|
test(function() {
|
|
|
|
new Uint8Array(new ArrayBuffer(1),2);
|
|
|
|
}, "Start offset 2 is outside the bounds of the buffer", RangeError);
|
|
|
|
|
2015-04-21 09:03:24 +00:00
|
|
|
// kArrayLengthOutOfRange
|
|
|
|
test(function() {
|
|
|
|
"use strict";
|
|
|
|
Object.defineProperty([], "length", { value: 1E100 });
|
2015-07-02 15:27:19 +00:00
|
|
|
}, "Invalid array length", RangeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2015-05-06 07:51:56 +00:00
|
|
|
// kInvalidArrayBufferLength
|
|
|
|
test(function() {
|
|
|
|
new ArrayBuffer(-1);
|
|
|
|
}, "Invalid array buffer length", RangeError);
|
|
|
|
|
|
|
|
// kInvalidArrayLength
|
|
|
|
test(function() {
|
|
|
|
[].length = -1;
|
|
|
|
}, "Invalid array length", RangeError);
|
|
|
|
|
2015-04-30 16:22:00 +00:00
|
|
|
// kInvalidCodePoint
|
|
|
|
test(function() {
|
|
|
|
String.fromCodePoint(-1);
|
|
|
|
}, "Invalid code point -1", RangeError);
|
|
|
|
|
|
|
|
// kInvalidCountValue
|
|
|
|
test(function() {
|
|
|
|
"a".repeat(-1);
|
2022-04-20 05:17:16 +00:00
|
|
|
}, "Invalid count value: -1", RangeError);
|
|
|
|
|
|
|
|
// kInvalidCountValue
|
|
|
|
test(function() {
|
|
|
|
"a".repeat(Infinity);
|
|
|
|
}, "Invalid count value: Infinity", RangeError);
|
|
|
|
|
|
|
|
// kInvalidCountValue
|
|
|
|
test(function() {
|
|
|
|
"a".repeat(-Infinity);
|
|
|
|
}, "Invalid count value: -Infinity", RangeError);
|
2015-04-30 16:22:00 +00:00
|
|
|
|
2015-05-06 07:51:56 +00:00
|
|
|
// kInvalidArrayBufferLength
|
|
|
|
test(function() {
|
|
|
|
new Uint16Array(-1);
|
2017-04-06 14:27:23 +00:00
|
|
|
}, "Invalid typed array length: -1", RangeError);
|
2015-05-06 07:51:56 +00:00
|
|
|
|
2017-09-14 12:43:49 +00:00
|
|
|
// kThrowInvalidStringLength
|
2017-10-16 13:23:28 +00:00
|
|
|
test(function() {
|
|
|
|
"a".padEnd(1 << 30);
|
|
|
|
}, "Invalid string length", RangeError);
|
|
|
|
|
|
|
|
test(function() {
|
|
|
|
"a".padStart(1 << 30);
|
|
|
|
}, "Invalid string length", RangeError);
|
|
|
|
|
2017-09-14 12:43:49 +00:00
|
|
|
test(function() {
|
|
|
|
"a".repeat(1 << 30);
|
|
|
|
}, "Invalid string length", RangeError);
|
|
|
|
|
2018-10-24 12:25:09 +00:00
|
|
|
test(function() {
|
|
|
|
new Array(1 << 30).join();
|
|
|
|
}, "Invalid string length", RangeError);
|
|
|
|
|
2015-04-24 10:22:00 +00:00
|
|
|
// kNormalizationForm
|
|
|
|
test(function() {
|
|
|
|
"".normalize("ABC");
|
|
|
|
}, "The normalization form should be one of NFC, NFD, NFKC, NFKD.", RangeError);
|
|
|
|
|
|
|
|
// kNumberFormatRange
|
2015-04-21 09:03:24 +00:00
|
|
|
test(function() {
|
2017-07-20 12:24:38 +00:00
|
|
|
Number(1).toFixed(101);
|
|
|
|
}, "toFixed() digits argument must be between 0 and 100", RangeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
|
|
|
test(function() {
|
2017-07-20 12:24:38 +00:00
|
|
|
Number(1).toExponential(101);
|
|
|
|
}, "toExponential() argument must be between 0 and 100", RangeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
2015-04-17 13:27:41 +00:00
|
|
|
// kStackOverflow
|
|
|
|
test(function() {
|
|
|
|
function f() { f(Array(1000)); }
|
|
|
|
f();
|
|
|
|
}, "Maximum call stack size exceeded", RangeError);
|
2015-04-21 09:03:24 +00:00
|
|
|
|
|
|
|
// kToPrecisionFormatRange
|
|
|
|
test(function() {
|
2017-07-20 12:24:38 +00:00
|
|
|
Number(1).toPrecision(101);
|
|
|
|
}, "toPrecision() argument must be between 1 and 100", RangeError);
|
2015-04-24 10:22:00 +00:00
|
|
|
|
|
|
|
// kToPrecisionFormatRange
|
|
|
|
test(function() {
|
|
|
|
Number(1).toString(100);
|
|
|
|
}, "toString() radix argument must be between 2 and 36", RangeError);
|
|
|
|
|
|
|
|
|
|
|
|
// === URIError ===
|
|
|
|
|
|
|
|
// kURIMalformed
|
|
|
|
test(function() {
|
|
|
|
decodeURI("%%");
|
|
|
|
}, "URI malformed", URIError);
|