Source code

Revision control

Copy as Markdown

Other Tools

// GENERATED, DO NOT EDIT
// file: assertRelativeDateMs.js
// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Verify that the given date object's Number representation describes the
correct number of milliseconds since the Unix epoch relative to the local
time zone (as interpreted at the specified date).
defines: [assertRelativeDateMs]
---*/
/**
* @param {Date} date
* @param {Number} expectedMs
*/
function assertRelativeDateMs(date, expectedMs) {
var actualMs = date.valueOf();
var localOffset = date.getTimezoneOffset() * 60000;
if (actualMs - localOffset !== expectedMs) {
throw new Test262Error(
'Expected ' + date + ' to be ' + expectedMs +
' milliseconds from the Unix epoch'
);
}
}
// file: asyncHelpers.js
// Copyright (C) 2022 Igalia, S.L. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
A collection of assertion and wrapper functions for testing asynchronous built-ins.
defines: [asyncTest, assert.throwsAsync]
---*/
/**
* Defines the **sole** asynchronous test of a file.
* @see {@link ../docs/rfcs/async-helpers.md} for background.
*
* @param {Function} testFunc a callback whose returned promise indicates test results
* (fulfillment for success, rejection for failure)
* @returns {void}
*/
function asyncTest(testFunc) {
if (!Object.hasOwn(globalThis, "$DONE")) {
throw new Test262Error("asyncTest called without async flag");
}
if (typeof testFunc !== "function") {
$DONE(new Test262Error("asyncTest called with non-function argument"));
return;
}
try {
testFunc().then(
function () {
$DONE();
},
function (error) {
$DONE(error);
}
);
} catch (syncError) {
$DONE(syncError);
}
}
/**
* Asserts that a callback asynchronously throws an instance of a particular
* error (i.e., returns a promise whose rejection value is an object referencing
* the constructor).
*
* @param {Function} expectedErrorConstructor the expected constructor of the
* rejection value
* @param {Function} func the callback
* @param {string} [message] the prefix to use for failure messages
* @returns {Promise<void>} fulfills if the expected error is thrown,
* otherwise rejects
*/
assert.throwsAsync = function (expectedErrorConstructor, func, message) {
return new Promise(function (resolve) {
var fail = function (detail) {
if (message === undefined) {
throw new Test262Error(detail);
}
throw new Test262Error(message + " " + detail);
};
if (typeof expectedErrorConstructor !== "function") {
fail("assert.throwsAsync called with an argument that is not an error constructor");
}
if (typeof func !== "function") {
fail("assert.throwsAsync called with an argument that is not a function");
}
var expectedName = expectedErrorConstructor.name;
var expectation = "Expected a " + expectedName + " to be thrown asynchronously";
var res;
try {
res = func();
} catch (thrown) {
fail(expectation + " but the function threw synchronously");
}
if (res === null || typeof res !== "object" || typeof res.then !== "function") {
fail(expectation + " but result was not a thenable");
}
var onResFulfilled, onResRejected;
var resSettlementP = new Promise(function (onFulfilled, onRejected) {
onResFulfilled = onFulfilled;
onResRejected = onRejected;
});
try {
res.then(onResFulfilled, onResRejected)
} catch (thrown) {
fail(expectation + " but .then threw synchronously");
}
resolve(resSettlementP.then(
function () {
fail(expectation + " but no exception was thrown at all");
},
function (thrown) {
var actualName;
if (thrown === null || typeof thrown !== "object") {
fail(expectation + " but thrown value was not an object");
} else if (thrown.constructor !== expectedErrorConstructor) {
actualName = thrown.constructor.name;
if (expectedName === actualName) {
fail(expectation +
" but got a different error constructor with the same name");
}
fail(expectation + " but got a " + actualName);
}
}
));
});
};
// file: byteConversionValues.js
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Provide a list for original and expected values for different byte
conversions.
This helper is mostly used on tests for TypedArray and DataView, and each
array from the expected values must match the original values array on every
index containing its original value.
defines: [byteConversionValues]
---*/
var byteConversionValues = {
values: [
127, // 2 ** 7 - 1
128, // 2 ** 7
32767, // 2 ** 15 - 1
32768, // 2 ** 15
2147483647, // 2 ** 31 - 1
2147483648, // 2 ** 31
255, // 2 ** 8 - 1
256, // 2 ** 8
65535, // 2 ** 16 - 1
65536, // 2 ** 16
4294967295, // 2 ** 32 - 1
4294967296, // 2 ** 32
9007199254740991, // 2 ** 53 - 1
9007199254740992, // 2 ** 53
1.1,
0.1,
0.5,
0.50000001,
0.6,
0.7,
undefined,
-1,
-0,
-0.1,
-1.1,
NaN,
-127, // - ( 2 ** 7 - 1 )
-128, // - ( 2 ** 7 )
-32767, // - ( 2 ** 15 - 1 )
-32768, // - ( 2 ** 15 )
-2147483647, // - ( 2 ** 31 - 1 )
-2147483648, // - ( 2 ** 31 )
-255, // - ( 2 ** 8 - 1 )
-256, // - ( 2 ** 8 )
-65535, // - ( 2 ** 16 - 1 )
-65536, // - ( 2 ** 16 )
-4294967295, // - ( 2 ** 32 - 1 )
-4294967296, // - ( 2 ** 32 )
Infinity,
-Infinity,
0,
2049, // an integer which rounds down under ties-to-even when cast to float16
2051, // an integer which rounds up under ties-to-even when cast to float16
0.00006103515625, // smallest normal float16
0.00006097555160522461, // largest subnormal float16
5.960464477539063e-8, // smallest float16
2.9802322387695312e-8, // largest double which rounds to 0 when cast to float16
2.980232238769532e-8, // smallest double which does not round to 0 when cast to float16
8.940696716308594e-8, // a double which rounds up to a subnormal under ties-to-even when cast to float16
1.4901161193847656e-7, // a double which rounds down to a subnormal under ties-to-even when cast to float16
1.490116119384766e-7, // the next double above the one on the previous line one
65504, // max finite float16
65520, // smallest double which rounds to infinity when cast to float16
65519.99999999999, // largest double which does not round to infinity when cast to float16
0.000061005353927612305, // smallest double which rounds to a non-subnormal when cast to float16
0.0000610053539276123 // largest double which rounds to a subnormal when cast to float16
],
expected: {
Int8: [
127, // 127
-128, // 128
-1, // 32767
0, // 32768
-1, // 2147483647
0, // 2147483648
-1, // 255
0, // 256
-1, // 65535
0, // 65536
-1, // 4294967295
0, // 4294967296
-1, // 9007199254740991
0, // 9007199254740992
1, // 1.1
0, // 0.1
0, // 0.5
0, // 0.50000001,
0, // 0.6
0, // 0.7
0, // undefined
-1, // -1
0, // -0
0, // -0.1
-1, // -1.1
0, // NaN
-127, // -127
-128, // -128
1, // -32767
0, // -32768
1, // -2147483647
0, // -2147483648
1, // -255
0, // -256
1, // -65535
0, // -65536
1, // -4294967295
0, // -4294967296
0, // Infinity
0, // -Infinity
0, // 0
1, // 2049
3, // 2051
0, // 0.00006103515625
0, // 0.00006097555160522461
0, // 5.960464477539063e-8
0, // 2.9802322387695312e-8
0, // 2.980232238769532e-8
0, // 8.940696716308594e-8
0, // 1.4901161193847656e-7
0, // 1.490116119384766e-7
-32, // 65504
-16, // 65520
-17, // 65519.99999999999
0, // 0.000061005353927612305
0 // 0.0000610053539276123
],
Uint8: [
127, // 127
128, // 128
255, // 32767
0, // 32768
255, // 2147483647
0, // 2147483648
255, // 255
0, // 256
255, // 65535
0, // 65536
255, // 4294967295
0, // 4294967296
255, // 9007199254740991
0, // 9007199254740992
1, // 1.1
0, // 0.1
0, // 0.5
0, // 0.50000001,
0, // 0.6
0, // 0.7
0, // undefined
255, // -1
0, // -0
0, // -0.1
255, // -1.1
0, // NaN
129, // -127
128, // -128
1, // -32767
0, // -32768
1, // -2147483647
0, // -2147483648
1, // -255
0, // -256
1, // -65535
0, // -65536
1, // -4294967295
0, // -4294967296
0, // Infinity
0, // -Infinity
0, // 0
1, // 2049
3, // 2051
0, // 0.00006103515625
0, // 0.00006097555160522461
0, // 5.960464477539063e-8
0, // 2.9802322387695312e-8
0, // 2.980232238769532e-8
0, // 8.940696716308594e-8
0, // 1.4901161193847656e-7
0, // 1.490116119384766e-7
224, // 65504
240, // 65520
239, // 65519.99999999999
0, // 0.000061005353927612305
0 // 0.0000610053539276123
],
Uint8Clamped: [
127, // 127
128, // 128
255, // 32767
255, // 32768
255, // 2147483647
255, // 2147483648
255, // 255
255, // 256
255, // 65535
255, // 65536
255, // 4294967295
255, // 4294967296
255, // 9007199254740991
255, // 9007199254740992
1, // 1.1,
0, // 0.1
0, // 0.5
1, // 0.50000001,
1, // 0.6
1, // 0.7
0, // undefined
0, // -1
0, // -0
0, // -0.1
0, // -1.1
0, // NaN
0, // -127
0, // -128
0, // -32767
0, // -32768
0, // -2147483647
0, // -2147483648
0, // -255
0, // -256
0, // -65535
0, // -65536
0, // -4294967295
0, // -4294967296
255, // Infinity
0, // -Infinity
0, // 0
255, // 2049
255, // 2051
0, // 0.00006103515625
0, // 0.00006097555160522461
0, // 5.960464477539063e-8
0, // 2.9802322387695312e-8
0, // 2.980232238769532e-8
0, // 8.940696716308594e-8
0, // 1.4901161193847656e-7
0, // 1.490116119384766e-7
255, // 65504
255, // 65520
255, // 65519.99999999999
0, // 0.000061005353927612305
0 // 0.0000610053539276123
],
Int16: [
127, // 127
128, // 128
32767, // 32767
-32768, // 32768
-1, // 2147483647
0, // 2147483648
255, // 255
256, // 256
-1, // 65535
0, // 65536
-1, // 4294967295
0, // 4294967296
-1, // 9007199254740991
0, // 9007199254740992
1, // 1.1
0, // 0.1
0, // 0.5
0, // 0.50000001,
0, // 0.6
0, // 0.7
0, // undefined
-1, // -1
0, // -0
0, // -0.1
-1, // -1.1
0, // NaN
-127, // -127
-128, // -128
-32767, // -32767
-32768, // -32768
1, // -2147483647
0, // -2147483648
-255, // -255
-256, // -256
1, // -65535
0, // -65536
1, // -4294967295
0, // -4294967296
0, // Infinity
0, // -Infinity
0, // 0
2049, // 2049
2051, // 2051
0, // 0.00006103515625
0, // 0.00006097555160522461
0, // 5.960464477539063e-8
0, // 2.9802322387695312e-8
0, // 2.980232238769532e-8
0, // 8.940696716308594e-8
0, // 1.4901161193847656e-7
0, // 1.490116119384766e-7
-32, // 65504
-16, // 65520
-17, // 65519.99999999999
0, // 0.000061005353927612305
0 // 0.0000610053539276123
],
Uint16: [
127, // 127
128, // 128
32767, // 32767
32768, // 32768
65535, // 2147483647
0, // 2147483648
255, // 255
256, // 256
65535, // 65535
0, // 65536
65535, // 4294967295
0, // 4294967296
65535, // 9007199254740991
0, // 9007199254740992
1, // 1.1
0, // 0.1
0, // 0.5
0, // 0.50000001,
0, // 0.6
0, // 0.7
0, // undefined
65535, // -1
0, // -0
0, // -0.1
65535, // -1.1
0, // NaN
65409, // -127
65408, // -128
32769, // -32767
32768, // -32768
1, // -2147483647
0, // -2147483648
65281, // -255
65280, // -256
1, // -65535
0, // -65536
1, // -4294967295
0, // -4294967296
0, // Infinity
0, // -Infinity
0, // 0
2049, // 2049
2051, // 2051
0, // 0.00006103515625
0, // 0.00006097555160522461
0, // 5.960464477539063e-8
0, // 2.9802322387695312e-8
0, // 2.980232238769532e-8
0, // 8.940696716308594e-8
0, // 1.4901161193847656e-7
0, // 1.490116119384766e-7
65504, // 65504
65520, // 65520
65519, // 65519.99999999999
0, // 0.000061005353927612305
0 // 0.0000610053539276123
],
Int32: [
127, // 127
128, // 128
32767, // 32767
32768, // 32768
2147483647, // 2147483647
-2147483648, // 2147483648
255, // 255
256, // 256
65535, // 65535
65536, // 65536
-1, // 4294967295
0, // 4294967296
-1, // 9007199254740991
0, // 9007199254740992
1, // 1.1
0, // 0.1
0, // 0.5
0, // 0.50000001,
0, // 0.6
0, // 0.7
0, // undefined
-1, // -1
0, // -0
0, // -0.1
-1, // -1.1
0, // NaN
-127, // -127
-128, // -128
-32767, // -32767
-32768, // -32768
-2147483647, // -2147483647
-2147483648, // -2147483648
-255, // -255
-256, // -256
-65535, // -65535
-65536, // -65536
1, // -4294967295
0, // -4294967296
0, // Infinity
0, // -Infinity
0, // 0
2049, // 2049
2051, // 2051
0, // 0.00006103515625
0, // 0.00006097555160522461
0, // 5.960464477539063e-8
0, // 2.9802322387695312e-8
0, // 2.980232238769532e-8
0, // 8.940696716308594e-8
0, // 1.4901161193847656e-7
0, // 1.490116119384766e-7
65504, // 65504
65520, // 65520
65519, // 65519.99999999999
0, // 0.000061005353927612305
0 // 0.0000610053539276123
],
Uint32: [
127, // 127
128, // 128
32767, // 32767
32768, // 32768
2147483647, // 2147483647
2147483648, // 2147483648
255, // 255
256, // 256
65535, // 65535
65536, // 65536
4294967295, // 4294967295
0, // 4294967296
4294967295, // 9007199254740991
0, // 9007199254740992
1, // 1.1
0, // 0.1
0, // 0.5
0, // 0.50000001,
0, // 0.6
0, // 0.7
0, // undefined
4294967295, // -1
0, // -0
0, // -0.1
4294967295, // -1.1
0, // NaN
4294967169, // -127
4294967168, // -128
4294934529, // -32767
4294934528, // -32768
2147483649, // -2147483647
2147483648, // -2147483648
4294967041, // -255
4294967040, // -256
4294901761, // -65535
4294901760, // -65536
1, // -4294967295
0, // -4294967296
0, // Infinity
0, // -Infinity
0, // 0
2049, // 2049
2051, // 2051
0, // 0.00006103515625
0, // 0.00006097555160522461
0, // 5.960464477539063e-8
0, // 2.9802322387695312e-8
0, // 2.980232238769532e-8
0, // 8.940696716308594e-8
0, // 1.4901161193847656e-7
0, // 1.490116119384766e-7
65504, // 65504
65520, // 65520
65519, // 65519.99999999999
0, // 0.000061005353927612305
0 // 0.0000610053539276123
],
Float16: [
127, // 127
128, // 128
32768, // 32767
32768, // 32768
Infinity, // 2147483647
Infinity, // 2147483648
255, // 255
256, // 256
Infinity, // 65535
Infinity, // 65536
Infinity, // 4294967295
Infinity, // 4294967296
Infinity, // 9007199254740991
Infinity, // 9007199254740992
1.099609375, // 1.1
0.0999755859375, // 0.1
0.5, // 0.5
0.5, // 0.50000001,
0.60009765625, // 0.6
0.7001953125, // 0.7
NaN, // undefined
-1, // -1
-0, // -0
-0.0999755859375, // -0.1
-1.099609375, // -1.1
NaN, // NaN
-127, // -127
-128, // -128
-32768, // -32767
-32768, // -32768
-Infinity, // -2147483647
-Infinity, // -2147483648
-255, // -255
-256, // -256
-Infinity, // -65535
-Infinity, // -65536
-Infinity, // -4294967295
-Infinity, // -4294967296
Infinity, // Infinity
-Infinity, // -Infinity
0, // 0
2048, // 2049
2052, // 2051
0.00006103515625, // 0.00006103515625
0.00006097555160522461, // 0.00006097555160522461
5.960464477539063e-8, // 5.960464477539063e-8
0, // 2.9802322387695312e-8
5.960464477539063e-8, // 2.980232238769532e-8
1.1920928955078125e-7, // 8.940696716308594e-8
1.1920928955078125e-7, // 1.4901161193847656e-7
1.7881393432617188e-7, // 1.490116119384766e-7
65504, // 65504
Infinity, // 65520
65504, // 65519.99999999999
0.00006103515625, // 0.000061005353927612305
0.00006097555160522461 // 0.0000610053539276123
],
Float32: [
127, // 127
128, // 128
32767, // 32767
32768, // 32768
2147483648, // 2147483647
2147483648, // 2147483648
255, // 255
256, // 256
65535, // 65535
65536, // 65536
4294967296, // 4294967295
4294967296, // 4294967296
9007199254740992, // 9007199254740991
9007199254740992, // 9007199254740992
1.100000023841858, // 1.1
0.10000000149011612, // 0.1
0.5, // 0.5
0.5, // 0.50000001,
0.6000000238418579, // 0.6
0.699999988079071, // 0.7
NaN, // undefined
-1, // -1
-0, // -0
-0.10000000149011612, // -0.1
-1.100000023841858, // -1.1
NaN, // NaN
-127, // -127
-128, // -128
-32767, // -32767
-32768, // -32768
-2147483648, // -2147483647
-2147483648, // -2147483648
-255, // -255
-256, // -256
-65535, // -65535
-65536, // -65536
-4294967296, // -4294967295
-4294967296, // -4294967296
Infinity, // Infinity
-Infinity, // -Infinity
0, // 0
2049, // 2049
2051, // 2051
0.00006103515625, // 0.00006103515625
0.00006097555160522461, // 0.00006097555160522461
5.960464477539063e-8, // 5.960464477539063e-8
2.9802322387695312e-8, // 2.9802322387695312e-8
2.9802322387695312e-8, // 2.980232238769532e-8
8.940696716308594e-8, // 8.940696716308594e-8
1.4901161193847656e-7, // 1.4901161193847656e-7
1.4901161193847656e-7, // 1.490116119384766e-7
65504, // 65504
65520, // 65520
65520, // 65519.99999999999
0.000061005353927612305, // 0.000061005353927612305
0.000061005353927612305 // 0.0000610053539276123
],
Float64: [
127, // 127
128, // 128
32767, // 32767
32768, // 32768
2147483647, // 2147483647
2147483648, // 2147483648
255, // 255
256, // 256
65535, // 65535
65536, // 65536
4294967295, // 4294967295
4294967296, // 4294967296
9007199254740991, // 9007199254740991
9007199254740992, // 9007199254740992
1.1, // 1.1
0.1, // 0.1
0.5, // 0.5
0.50000001, // 0.50000001,
0.6, // 0.6
0.7, // 0.7
NaN, // undefined
-1, // -1
-0, // -0
-0.1, // -0.1
-1.1, // -1.1
NaN, // NaN
-127, // -127
-128, // -128
-32767, // -32767
-32768, // -32768
-2147483647, // -2147483647
-2147483648, // -2147483648
-255, // -255
-256, // -256
-65535, // -65535
-65536, // -65536
-4294967295, // -4294967295
-4294967296, // -4294967296
Infinity, // Infinity
-Infinity, // -Infinity
0, // 0
2049, // 2049
2051, // 2051
0.00006103515625, // 0.00006103515625
0.00006097555160522461, // 0.00006097555160522461
5.960464477539063e-8, // 5.960464477539063e-8
2.9802322387695312e-8, // 2.9802322387695312e-8
2.980232238769532e-8, // 2.980232238769532e-8
8.940696716308594e-8, // 8.940696716308594e-8
1.4901161193847656e-7, // 1.4901161193847656e-7
1.490116119384766e-7, // 1.490116119384766e-7
65504, // 65504
65520, // 65520
65519.99999999999, // 65519.99999999999
0.000061005353927612305, // 0.000061005353927612305
0.0000610053539276123 // 0.0000610053539276123
]
}
};
// file: dateConstants.js
// Copyright (C) 2009 the Sputnik authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Collection of date-centric values
defines:
- date_1899_end
- date_1900_start
- date_1969_end
- date_1970_start
- date_1999_end
- date_2000_start
- date_2099_end
- date_2100_start
- start_of_time
- end_of_time
---*/
var date_1899_end = -2208988800001;
var date_1900_start = -2208988800000;
var date_1969_end = -1;
var date_1970_start = 0;
var date_1999_end = 946684799999;
var date_2000_start = 946684800000;
var date_2099_end = 4102444799999;
var date_2100_start = 4102444800000;
var start_of_time = -8.64e15;
var end_of_time = 8.64e15;
// file: decimalToHexString.js
// Copyright (C) 2017 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Collection of functions used to assert the correctness of various encoding operations.
defines: [decimalToHexString, decimalToPercentHexString]
---*/
function decimalToHexString(n) {
var hex = "0123456789ABCDEF";
n >>>= 0;
var s = "";
while (n) {
s = hex[n & 0xf] + s;
n >>>= 4;
}
while (s.length < 4) {
s = "0" + s;
}
return s;
}
function decimalToPercentHexString(n) {
var hex = "0123456789ABCDEF";
return "%" + hex[(n >> 4) & 0xf] + hex[n & 0xf];
}
// file: deepEqual.js
// Copyright 2019 Ron Buckton. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: >
Compare two values structurally
defines: [assert.deepEqual]
---*/
assert.deepEqual = function(actual, expected, message) {
var format = assert.deepEqual.format;
assert(
assert.deepEqual._compare(actual, expected),
`Expected ${format(actual)} to be structurally equal to ${format(expected)}. ${(message || '')}`
);
};
assert.deepEqual.format = function(value, seen) {
switch (typeof value) {
case 'string':
return typeof JSON !== "undefined" ? JSON.stringify(value) : `"${value}"`;
case 'number':
case 'boolean':
case 'symbol':
case 'bigint':
return value.toString();
case 'undefined':
return 'undefined';
case 'function':
return `[Function${value.name ? `: ${value.name}` : ''}]`;
case 'object':
if (value === null) return 'null';
if (value instanceof Date) return `Date "${value.toISOString()}"`;
if (value instanceof RegExp) return value.toString();
if (!seen) {
seen = {
counter: 0,
map: new Map()
};
}
let usage = seen.map.get(value);
if (usage) {
usage.used = true;
return `[Ref: #${usage.id}]`;
}
usage = { id: ++seen.counter, used: false };
seen.map.set(value, usage);
if (typeof Set !== "undefined" && value instanceof Set) {
return `Set {${Array.from(value).map(value => assert.deepEqual.format(value, seen)).join(', ')}}${usage.used ? ` as #${usage.id}` : ''}`;
}
if (typeof Map !== "undefined" && value instanceof Map) {
return `Map {${Array.from(value).map(pair => `${assert.deepEqual.format(pair[0], seen)} => ${assert.deepEqual.format(pair[1], seen)}}`).join(', ')}}${usage.used ? ` as #${usage.id}` : ''}`;
}
if (Array.isArray ? Array.isArray(value) : value instanceof Array) {
return `[${value.map(value => assert.deepEqual.format(value, seen)).join(', ')}]${usage.used ? ` as #${usage.id}` : ''}`;
}
let tag = Symbol.toStringTag in value ? value[Symbol.toStringTag] : 'Object';
if (tag === 'Object' && Object.getPrototypeOf(value) === null) {
tag = '[Object: null prototype]';
}
return `${tag ? `${tag} ` : ''}{ ${Object.keys(value).map(key => `${key.toString()}: ${assert.deepEqual.format(value[key], seen)}`).join(', ')} }${usage.used ? ` as #${usage.id}` : ''}`;
default:
return typeof value;
}
};
assert.deepEqual._compare = (function () {
var EQUAL = 1;
var NOT_EQUAL = -1;
var UNKNOWN = 0;
function deepEqual(a, b) {
return compareEquality(a, b) === EQUAL;
}
function compareEquality(a, b, cache) {
return compareIf(a, b, isOptional, compareOptionality)
|| compareIf(a, b, isPrimitiveEquatable, comparePrimitiveEquality)
|| compareIf(a, b, isObjectEquatable, compareObjectEquality, cache)
|| NOT_EQUAL;
}
function compareIf(a, b, test, compare, cache) {
return !test(a)
? !test(b) ? UNKNOWN : NOT_EQUAL
: !test(b) ? NOT_EQUAL : cacheComparison(a, b, compare, cache);
}
function tryCompareStrictEquality(a, b) {
return a === b ? EQUAL : UNKNOWN;
}
function tryCompareTypeOfEquality(a, b) {
return typeof a !== typeof b ? NOT_EQUAL : UNKNOWN;
}
function tryCompareToStringTagEquality(a, b) {
var aTag = Symbol.toStringTag in a ? a[Symbol.toStringTag] : undefined;
var bTag = Symbol.toStringTag in b ? b[Symbol.toStringTag] : undefined;
return aTag !== bTag ? NOT_EQUAL : UNKNOWN;
}
function isOptional(value) {
return value === undefined
|| value === null;
}
function compareOptionality(a, b) {
return tryCompareStrictEquality(a, b)
|| NOT_EQUAL;
}
function isPrimitiveEquatable(value) {
switch (typeof value) {
case 'string':
case 'number':
case 'bigint':
case 'boolean':
case 'symbol':
return true;
default:
return isBoxed(value);
}
}
function comparePrimitiveEquality(a, b) {
if (isBoxed(a)) a = a.valueOf();
if (isBoxed(b)) b = b.valueOf();
return tryCompareStrictEquality(a, b)
|| tryCompareTypeOfEquality(a, b)
|| compareIf(a, b, isNaNEquatable, compareNaNEquality)
|| NOT_EQUAL;
}
function isNaNEquatable(value) {
return typeof value === 'number';
}
function compareNaNEquality(a, b) {
return isNaN(a) && isNaN(b) ? EQUAL : NOT_EQUAL;
}
function isObjectEquatable(value) {
return typeof value === 'object';
}
function compareObjectEquality(a, b, cache) {
if (!cache) cache = new Map();
return getCache(cache, a, b)
|| setCache(cache, a, b, EQUAL) // consider equal for now
|| cacheComparison(a, b, tryCompareStrictEquality, cache)
|| cacheComparison(a, b, tryCompareToStringTagEquality, cache)
|| compareIf(a, b, isValueOfEquatable, compareValueOfEquality)
|| compareIf(a, b, isToStringEquatable, compareToStringEquality)
|| compareIf(a, b, isArrayLikeEquatable, compareArrayLikeEquality, cache)
|| compareIf(a, b, isStructurallyEquatable, compareStructuralEquality, cache)
|| compareIf(a, b, isIterableEquatable, compareIterableEquality, cache)
|| cacheComparison(a, b, fail, cache);
}
function isBoxed(value) {
return value instanceof String
|| value instanceof Number
|| value instanceof Boolean
|| typeof Symbol === 'function' && value instanceof Symbol
|| typeof BigInt === 'function' && value instanceof BigInt;
}
function isValueOfEquatable(value) {
return value instanceof Date;
}
function compareValueOfEquality(a, b) {
return compareIf(a.valueOf(), b.valueOf(), isPrimitiveEquatable, comparePrimitiveEquality)
|| NOT_EQUAL;
}
function isToStringEquatable(value) {
return value instanceof RegExp;
}
function compareToStringEquality(a, b) {
return compareIf(a.toString(), b.toString(), isPrimitiveEquatable, comparePrimitiveEquality)
|| NOT_EQUAL;
}
function isArrayLikeEquatable(value) {
return (Array.isArray ? Array.isArray(value) : value instanceof Array)
|| (typeof Uint8Array === 'function' && value instanceof Uint8Array)
|| (typeof Uint8ClampedArray === 'function' && value instanceof Uint8ClampedArray)
|| (typeof Uint16Array === 'function' && value instanceof Uint16Array)
|| (typeof Uint32Array === 'function' && value instanceof Uint32Array)
|| (typeof Int8Array === 'function' && value instanceof Int8Array)
|| (typeof Int16Array === 'function' && value instanceof Int16Array)
|| (typeof Int32Array === 'function' && value instanceof Int32Array)
|| (typeof Float32Array === 'function' && value instanceof Float32Array)
|| (typeof Float64Array === 'function' && value instanceof Float64Array)
|| (typeof BigUint64Array === 'function' && value instanceof BigUint64Array)
|| (typeof BigInt64Array === 'function' && value instanceof BigInt64Array);
}
function compareArrayLikeEquality(a, b, cache) {
if (a.length !== b.length) return NOT_EQUAL;
for (var i = 0; i < a.length; i++) {
if (compareEquality(a[i], b[i], cache) === NOT_EQUAL) {
return NOT_EQUAL;
}
}
return EQUAL;
}
function isStructurallyEquatable(value) {
return !(typeof Promise === 'function' && value instanceof Promise // only comparable by reference
|| typeof WeakMap === 'function' && value instanceof WeakMap // only comparable by reference
|| typeof WeakSet === 'function' && value instanceof WeakSet // only comparable by reference
|| typeof Map === 'function' && value instanceof Map // comparable via @@iterator
|| typeof Set === 'function' && value instanceof Set); // comparable via @@iterator
}
function compareStructuralEquality(a, b, cache) {
var aKeys = [];
for (var key in a) aKeys.push(key);
var bKeys = [];
for (var key in b) bKeys.push(key);
if (aKeys.length !== bKeys.length) {
return NOT_EQUAL;
}
aKeys.sort();
bKeys.sort();
for (var i = 0; i < aKeys.length; i++) {
var aKey = aKeys[i];
var bKey = bKeys[i];
if (compareEquality(aKey, bKey, cache) === NOT_EQUAL) {
return NOT_EQUAL;
}
if (compareEquality(a[aKey], b[bKey], cache) === NOT_EQUAL) {
return NOT_EQUAL;
}
}
return compareIf(a, b, isIterableEquatable, compareIterableEquality, cache)
|| EQUAL;
}
function isIterableEquatable(value) {
return typeof Symbol === 'function'
&& typeof value[Symbol.iterator] === 'function';
}
function compareIteratorEquality(a, b, cache) {
if (typeof Map === 'function' && a instanceof Map && b instanceof Map ||
typeof Set === 'function' && a instanceof Set && b instanceof Set) {
if (a.size !== b.size) return NOT_EQUAL; // exit early if we detect a difference in size
}
var ar, br;
while (true) {
ar = a.next();
br = b.next();
if (ar.done) {
if (br.done) return EQUAL;
if (b.return) b.return();
return NOT_EQUAL;
}
if (br.done) {
if (a.return) a.return();
return NOT_EQUAL;
}
if (compareEquality(ar.value, br.value, cache) === NOT_EQUAL) {
if (a.return) a.return();
if (b.return) b.return();
return NOT_EQUAL;
}
}
}
function compareIterableEquality(a, b, cache) {
return compareIteratorEquality(a[Symbol.iterator](), b[Symbol.iterator](), cache);
}
function cacheComparison(a, b, compare, cache) {
var result = compare(a, b, cache);
if (cache && (result === EQUAL || result === NOT_EQUAL)) {
setCache(cache, a, b, /** @type {EQUAL | NOT_EQUAL} */(result));
}
return result;
}
function fail() {
return NOT_EQUAL;
}
function setCache(cache, left, right, result) {
var otherCache;
otherCache = cache.get(left);
if (!otherCache) cache.set(left, otherCache = new Map());
otherCache.set(right, result);
otherCache = cache.get(right);
if (!otherCache) cache.set(right, otherCache = new Map());
otherCache.set(left, result);
}
function getCache(cache, left, right) {
var otherCache;
var result;
otherCache = cache.get(left);
result = otherCache && otherCache.get(right);
if (result) return result;
otherCache = cache.get(right);
result = otherCache && otherCache.get(left);
if (result) return result;
return UNKNOWN;
}
return deepEqual;
})();
// file: detachArrayBuffer.js
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
A function used in the process of asserting correctness of TypedArray objects.
$262.detachArrayBuffer is defined by a host.
defines: [$DETACHBUFFER]
---*/
function $DETACHBUFFER(buffer) {
if (!$262 || typeof $262.detachArrayBuffer !== "function") {
throw new Test262Error("No method available to detach an ArrayBuffer");
}
$262.detachArrayBuffer(buffer);
}
// file: fnGlobalObject.js
// Copyright (C) 2017 Ecma International. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Produce a reliable global object
defines: [fnGlobalObject]
---*/
var __globalObject = Function("return this;")();
function fnGlobalObject() {
return __globalObject;
}
// file: isConstructor.js
// Copyright (C) 2017 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Test if a given function is a constructor function.
defines: [isConstructor]
features: [Reflect.construct]
---*/
function isConstructor(f) {
if (typeof f !== "function") {
throw new Test262Error("isConstructor invoked with a non-function value");
}
try {
Reflect.construct(function(){}, [], f);
} catch (e) {
return false;
}
return true;
}
// file: nans.js
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
A collection of NaN values produced from expressions that have been observed
to create distinct bit representations on various platforms. These provide a
weak basis for assertions regarding the consistent canonicalization of NaN
values in Array buffers.
defines: [NaNs]
---*/
var NaNs = [
NaN,
Number.NaN,
NaN * 0,
0/0,
Infinity/Infinity,
-(0/0),
Math.pow(-1, 0.5),
-Math.pow(-1, 0.5),
Number("Not-a-Number"),
];
// file: nativeFunctionMatcher.js
// Copyright (C) 2016 Michael Ficarra. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Assert _NativeFunction_ Syntax
info: |
NativeFunction :
function _NativeFunctionAccessor_ opt _IdentifierName_ opt ( _FormalParameters_ ) { [ native code ] }
NativeFunctionAccessor :
get
set
defines:
- assertToStringOrNativeFunction
- assertNativeFunction
- validateNativeFunctionSource
---*/
const validateNativeFunctionSource = function(source) {
// These regexes should be kept up to date with Unicode using `regexpu-core`.
// `/\p{ID_Start}/u`
const UnicodeIDStart = /(?:[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/;
// `/\p{ID_Continue}/u`
const UnicodeIDContinue = /(?:[0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u08D3-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF\u1AC0\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF])/;
// `/\p{Space_Separator}/u`
const UnicodeSpaceSeparator = /[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/;
const isNewline = (c) => /[\u000A\u000D\u2028\u2029]/.test(c);
const isWhitespace = (c) => /[\u0009\u000B\u000C\u0020\u00A0\uFEFF]/.test(c) || UnicodeSpaceSeparator.test(c);
let pos = 0;
const eatWhitespace = () => {
while (pos < source.length) {
const c = source[pos];
if (isWhitespace(c) || isNewline(c)) {
pos += 1;
continue;
}
if (c === '/') {
if (source[pos + 1] === '/') {
while (pos < source.length) {
if (isNewline(source[pos])) {
break;
}
pos += 1;
}
continue;
}
if (source[pos + 1] === '*') {
const end = source.indexOf('*/', pos);
if (end === -1) {
throw new SyntaxError();
}
pos = end + '*/'.length;
continue;
}
}
break;
}
};
const getIdentifier = () => {
eatWhitespace();
const start = pos;
let end = pos;
switch (source[end]) {
case '_':
case '$':
end += 1;
break;
default:
if (UnicodeIDStart.test(source[end])) {
end += 1;
break;
}
return null;
}
while (end < source.length) {
const c = source[end];
switch (c) {
case '_':
case '$':
end += 1;
break;
default:
if (UnicodeIDContinue.test(c)) {
end += 1;
break;
}
return source.slice(start, end);
}
}
return source.slice(start, end);
};
const test = (s) => {
eatWhitespace();
if (/\w/.test(s)) {
return getIdentifier() === s;
}
return source.slice(pos, pos + s.length) === s;
};
const eat = (s) => {
if (test(s)) {
pos += s.length;
return true;
}
return false;
};
const eatIdentifier = () => {
const n = getIdentifier();
if (n !== null) {
pos += n.length;
return true;
}
return false;
};
const expect = (s) => {
if (!eat(s)) {
throw new SyntaxError();
}
};
const eatString = () => {
if (source[pos] === '\'' || source[pos] === '"') {
const match = source[pos];
pos += 1;
while (pos < source.length) {
if (source[pos] === match && source[pos - 1] !== '\\') {
return;
}
if (isNewline(source[pos])) {
throw new SyntaxError();
}
pos += 1;
}
throw new SyntaxError();
}
};
// "Stumble" through source text until matching character is found.
// Assumes ECMAScript syntax keeps `[]` and `()` balanced.
const stumbleUntil = (c) => {
const match = {
']': '[',
')': '(',
}[c];
let nesting = 1;
while (pos < source.length) {
eatWhitespace();
eatString(); // Strings may contain unbalanced characters.
if (source[pos] === match) {
nesting += 1;
} else if (source[pos] === c) {
nesting -= 1;
}
pos += 1;
if (nesting === 0) {
return;
}
}
throw new SyntaxError();
};
// function
expect('function');
// NativeFunctionAccessor
eat('get') || eat('set');
// PropertyName
if (!eatIdentifier() && eat('[')) {
stumbleUntil(']');
}
// ( FormalParameters )
expect('(');
stumbleUntil(')');
// {
expect('{');
// [native code]
expect('[');
expect('native');
expect('code');
expect(']');
// }
expect('}');
eatWhitespace();
if (pos !== source.length) {
throw new SyntaxError();
}
};
const assertToStringOrNativeFunction = function(fn, expected) {
const actual = "" + fn;
try {
assert.sameValue(actual, expected);
} catch (unused) {
assertNativeFunction(fn, expected);
}
};
const assertNativeFunction = function(fn, special) {
const actual = "" + fn;
try {
validateNativeFunctionSource(actual);
} catch (unused) {
throw new Test262Error('Conforms to NativeFunction Syntax: ' + JSON.stringify(actual) + (special ? ' (' + special + ')' : ''));
}
};
// file: promiseHelper.js
// Copyright (C) 2017 Ecma International. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Check that an array contains a numeric sequence starting at 1
and incrementing by 1 for each entry in the array. Used by
Promise tests to assert the order of execution in deep Promise
resolution pipelines.
defines: [checkSequence, checkSettledPromises]
---*/
function checkSequence(arr, message) {
arr.forEach(function(e, i) {
if (e !== (i+1)) {
throw new Test262Error((message ? message : "Steps in unexpected sequence:") +
" '" + arr.join(',') + "'");
}
});
return true;
}
function checkSettledPromises(settleds, expected, message) {
const prefix = message ? `${message}: ` : '';
assert.sameValue(Array.isArray(settleds), true, `${prefix}Settled values is an array`);
assert.sameValue(
settleds.length,
expected.length,
`${prefix}The settled values has a different length than expected`
);
settleds.forEach((settled, i) => {
assert.sameValue(
Object.prototype.hasOwnProperty.call(settled, 'status'),
true,
`${prefix}The settled value has a property status`
);
assert.sameValue(settled.status, expected[i].status, `${prefix}status for item ${i}`);
if (settled.status === 'fulfilled') {
assert.sameValue(
Object.prototype.hasOwnProperty.call(settled, 'value'),
true,
`${prefix}The fulfilled promise has a property named value`
);
assert.sameValue(
Object.prototype.hasOwnProperty.call(settled, 'reason'),
false,
`${prefix}The fulfilled promise has no property named reason`
);
assert.sameValue(settled.value, expected[i].value, `${prefix}value for item ${i}`);
} else {
assert.sameValue(settled.status, 'rejected', `${prefix}Valid statuses are only fulfilled or rejected`);
assert.sameValue(
Object.prototype.hasOwnProperty.call(settled, 'value'),
false,
`${prefix}The fulfilled promise has no property named value`
);
assert.sameValue(
Object.prototype.hasOwnProperty.call(settled, 'reason'),
true,
`${prefix}The fulfilled promise has a property named reason`
);
assert.sameValue(settled.reason, expected[i].reason, `${prefix}Reason value for item ${i}`);
}
});
}
// file: proxyTrapsHelper.js
// Copyright (C) 2016 Jordan Harband. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Used to assert the correctness of object behavior in the presence
and context of Proxy objects.
defines: [allowProxyTraps]
---*/
function allowProxyTraps(overrides) {
function throwTest262Error(msg) {
return function () { throw new Test262Error(msg); };
}
if (!overrides) { overrides = {}; }
return {
getPrototypeOf: overrides.getPrototypeOf || throwTest262Error('[[GetPrototypeOf]] trap called'),
setPrototypeOf: overrides.setPrototypeOf || throwTest262Error('[[SetPrototypeOf]] trap called'),
isExtensible: overrides.isExtensible || throwTest262Error('[[IsExtensible]] trap called'),
preventExtensions: overrides.preventExtensions || throwTest262Error('[[PreventExtensions]] trap called'),
getOwnPropertyDescriptor: overrides.getOwnPropertyDescriptor || throwTest262Error('[[GetOwnProperty]] trap called'),
has: overrides.has || throwTest262Error('[[HasProperty]] trap called'),
get: overrides.get || throwTest262Error('[[Get]] trap called'),
set: overrides.set || throwTest262Error('[[Set]] trap called'),
deleteProperty: overrides.deleteProperty || throwTest262Error('[[Delete]] trap called'),
defineProperty: overrides.defineProperty || throwTest262Error('[[DefineOwnProperty]] trap called'),
enumerate: throwTest262Error('[[Enumerate]] trap called: this trap has been removed'),
ownKeys: overrides.ownKeys || throwTest262Error('[[OwnPropertyKeys]] trap called'),
apply: overrides.apply || throwTest262Error('[[Call]] trap called'),
construct: overrides.construct || throwTest262Error('[[Construct]] trap called')
};
}
// file: tcoHelper.js
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
This defines the number of consecutive recursive function calls that must be
made in order to prove that stack frames are properly destroyed according to
ES2015 tail call optimization semantics.
defines: [$MAX_ITERATIONS]
---*/
var $MAX_ITERATIONS = 100000;
// file: testTypedArray.js
// Copyright (C) 2015 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Collection of functions used to assert the correctness of TypedArray objects.
defines:
- floatArrayConstructors
- nonClampedIntArrayConstructors
- intArrayConstructors
- typedArrayConstructors
- TypedArray
- testWithTypedArrayConstructors
- nonAtomicsFriendlyTypedArrayConstructors
- testWithAtomicsFriendlyTypedArrayConstructors
- testWithNonAtomicsFriendlyTypedArrayConstructors
- testTypedArrayConversions
---*/
var floatArrayConstructors = [
Float64Array,
Float32Array
];
var nonClampedIntArrayConstructors = [
Int32Array,
Int16Array,
Int8Array,
Uint32Array,
Uint16Array,
Uint8Array
];
var intArrayConstructors = nonClampedIntArrayConstructors.concat([Uint8ClampedArray]);
// Float16Array is a newer feature
// adding it to this list unconditionally would cause implementations lacking it to fail every test which uses it
if (typeof Float16Array !== 'undefined') {
floatArrayConstructors.push(Float16Array);
}
/**
* Array containing every non-bigint typed array constructor.
*/
var typedArrayConstructors = floatArrayConstructors.concat(intArrayConstructors);
/**
* The %TypedArray% intrinsic constructor function.
*/
var TypedArray = Object.getPrototypeOf(Int8Array);
/**
* Callback for testing a typed array constructor.
*
* @callback typedArrayConstructorCallback
* @param {Function} Constructor the constructor object to test with.
*/
/**
* Calls the provided function for every typed array constructor.
*
* @param {typedArrayConstructorCallback} f - the function to call for each typed array constructor.
* @param {Array} selected - An optional Array with filtered typed arrays
*/
function testWithTypedArrayConstructors(f, selected) {
var constructors = selected || typedArrayConstructors;
for (var i = 0; i < constructors.length; ++i) {
var constructor = constructors[i];
try {
f(constructor);
} catch (e) {
e.message += " (Testing with " + constructor.name + ".)";
throw e;
}
}
}
var nonAtomicsFriendlyTypedArrayConstructors = floatArrayConstructors.concat([Uint8ClampedArray]);
/**
* Calls the provided function for every non-"Atomics Friendly" typed array constructor.
*
* @param {typedArrayConstructorCallback} f - the function to call for each typed array constructor.
* @param {Array} selected - An optional Array with filtered typed arrays
*/
function testWithNonAtomicsFriendlyTypedArrayConstructors(f) {
testWithTypedArrayConstructors(f, nonAtomicsFriendlyTypedArrayConstructors);
}
/**
* Calls the provided function for every "Atomics Friendly" typed array constructor.
*
* @param {typedArrayConstructorCallback} f - the function to call for each typed array constructor.
* @param {Array} selected - An optional Array with filtered typed arrays
*/
function testWithAtomicsFriendlyTypedArrayConstructors(f) {
testWithTypedArrayConstructors(f, [
Int32Array,
Int16Array,
Int8Array,
Uint32Array,
Uint16Array,
Uint8Array,
]);
}
/**
* Helper for conversion operations on TypedArrays, the expected values
* properties are indexed in order to match the respective value for each
* TypedArray constructor
* @param {Function} fn - the function to call for each constructor and value.
* will be called with the constructor, value, expected
* value, and a initial value that can be used to avoid
* a false positive with an equivalent expected value.
*/
function testTypedArrayConversions(byteConversionValues, fn) {
var values = byteConversionValues.values;
var expected = byteConversionValues.expected;
testWithTypedArrayConstructors(function(TA) {
var name = TA.name.slice(0, -5);
return values.forEach(function(value, index) {
var exp = expected[name][index];
var initial = 0;
if (exp === 0) {
initial = 1;
}
fn(TA, value, exp, initial);
});
});
}
/**
* Checks if the given argument is one of the float-based TypedArray constructors.
*
* @param {constructor} ctor - the value to check
* @returns {boolean}
*/
function isFloatTypedArrayConstructor(arg) {
return floatArrayConstructors.indexOf(arg) !== -1;
}
/**
* Determines the precision of the given float-based TypedArray constructor.
*
* @param {constructor} ctor - the value to check
* @returns {string} "half", "single", or "double" for Float16Array, Float32Array, and Float64Array respectively.
*/
function floatTypedArrayConstructorPrecision(FA) {
if (typeof Float16Array !== "undefined" && FA === Float16Array) {
return "half";
} else if (FA === Float32Array) {
return "single";
} else if (FA === Float64Array) {
return "double";
} else {
throw new Error("Malformed test - floatTypedArrayConstructorPrecision called with non-float TypedArray");
}
}