Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 62 additions & 12 deletions harness/propertyHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,20 @@ defines:
// Capture primordial functions and receiver-uncurried primordial methods that
// are used in verification but might be destroyed *by* that process itself.
var __isArray = Array.isArray;
var __max = Math.max;
var __defineProperty = Object.defineProperty;
var __getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
var __getOwnPropertyNames = Object.getOwnPropertyNames;
var __join = Function.prototype.call.bind(Array.prototype.join);
var __push = Function.prototype.call.bind(Array.prototype.push);
var __hasOwnProperty = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
var __propertyIsEnumerable = Function.prototype.call.bind(Object.prototype.propertyIsEnumerable);
var nonIndexNumericPropertyName = Math.pow(2, 32) - 1;
var __getTypedArrayByteLength =
Object.getPrototypeOf &&
typeof Uint8Array !== "undefined" &&
Function.prototype.call.bind(
__getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype), "byteLength").get
);

/**
* @param {object} obj
Expand Down Expand Up @@ -119,7 +125,7 @@ function verifyProperty(obj, name, desc, options) {

if (__hasOwnProperty(desc, 'configurable') && desc.configurable !== undefined) {
if (desc.configurable !== originalDesc.configurable ||
desc.configurable !== isConfigurable(obj, name)) {
desc.configurable !== isConfigurable(obj, name, originalDesc)) {
__push(failures, label + " descriptor should " + (desc.configurable ? '' : 'not ') + "be configurable");
}
}
Expand All @@ -135,15 +141,48 @@ function verifyProperty(obj, name, desc, options) {
return true;
}

function isConfigurable(obj, name) {
function toNumber(value) {
// https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-math.max
return __max(value);
}

// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-canonicalnumericindexstring
function isCanonicalNumericIndexString(value) {
if (typeof value !== "string") return false;
if (value === "-0") return true;
var n = toNumber(value);
return String(n) === value;
}

function isTypedArray(value) {
try {
// https://tc39.es/ecma262/multipage/indexed-collections.html#sec-get-%typedarray%.prototype.bytelength
__getTypedArrayByteLength(value);
return true;
} catch (_err) {
return false;
}
}

function isConfigurable(obj, name, originalDesc) {
try {
delete obj[name];
} catch (e) {
if (!(e instanceof TypeError)) {
throw new Test262Error("Expected TypeError, got " + e);
}
}
return !__hasOwnProperty(obj, name);
var deleted = !__hasOwnProperty(obj, name);

// TypedArray canonical numeric string properties are never *actually* deleted,
// so we skip post-hoc verification for them
// https://tc39.es/ecma262/multipage/ordinary-and-exotic-objects-behaviours.html#sec-typedarray-delete
if (isCanonicalNumericIndexString(name) && isTypedArray(obj) && originalDesc) {
if (deleted) throw new Test262Error("Expected TypedArray index deletion to be ignored");
return originalDesc.configurable;
}

return deleted;
}

function isEnumerable(obj, name) {
Expand Down Expand Up @@ -172,17 +211,28 @@ function isSameValue(a, b) {
}

function isWritable(obj, name, verifyProp, value) {
var unlikelyValue = __isArray(obj) && name === "length" ?
nonIndexNumericPropertyName :
"unlikelyValue";
var newValue = value || unlikelyValue;
var hadValue = __hasOwnProperty(obj, name);
var oldValue = obj[name];
var writeSucceeded;

if (arguments.length < 4 && newValue === oldValue) {
newValue = newValue + "2";
var newValue = value;
if (newValue === undefined) {
switch (typeof oldValue) {
// To accommodate Array and TypedArray instances, preserve a numeric type.
case "number":
if (oldValue <= 0 || __isArray(obj) && name === "length") {
newValue = oldValue === -Infinity ? 0 : oldValue + 1;
} else {
newValue = oldValue === Infinity ? 1 : oldValue - 1;
}
break;
case "bigint":
newValue = oldValue <= BigInt(0) ? oldValue + BigInt(1) : oldValue - BigInt(1);
break;
default:
newValue = oldValue !== "unlikelyValue" ? "unlikelyValue" : "unlikelyValue2";
break;
}
}
var writeSucceeded;

try {
obj[name] = newValue;
Expand Down
4 changes: 2 additions & 2 deletions harness/testTypedArray.js
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ function ctorArgFactoryMatchesSome(argFactory, features) {
if (argFactory === makeImmutableArrayBuffer) return true;
break;
default:
throw Test262Error("unknown feature: " + features[i]);
throw new Test262Error("unknown feature: " + features[i]);
}
}
return false;
Expand Down Expand Up @@ -271,7 +271,7 @@ function testWithAllTypedArrayConstructors(f, constructors, includeArgFactories,
}
}
if (ctorArgFactories.length === 0) {
throw Test262Error("no arg factories match include " + includeArgFactories + " and exclude " + excludeArgFactories);
throw new Test262Error("no arg factories match include " + includeArgFactories + " and exclude " + excludeArgFactories);
}
for (var k = 0; k < ctorArgFactories.length; ++k) {
var argFactory = ctorArgFactories[k];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
const view = new TA(buffer);
assert.sameValue(Atomics.add(view, 0, 1n), 0n, 'Atomics.add(view, 0, 1n) returns 0n');
assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n');
}, null, ["arraybuffer"], ["immutable"]);
}, null, null, ["immutable"]);
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/add/non-shared-bufferdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {

assert.sameValue(Atomics.add(view, 0, 1), 0, 'Atomics.add(view, 0, 1) returns 0');
assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1');
}, ["arraybuffer"], ["immutable"]);
}, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.add(view, 0, 1);
}, `Atomics.add(new ${TA.name}(buffer), 0, 1) throws TypeError`);
}, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
const view = new TA(buffer);
assert.sameValue(Atomics.and(view, 0, 1n), 0n, 'Atomics.and(view, 0, 1n) returns 0n');
assert.sameValue(Atomics.load(view, 0), 0n, 'Atomics.load(view, 0) returns 0n');
}, null, ["arraybuffer"], ["immutable"]);
}, null, null, ["immutable"]);
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/and/non-shared-bufferdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {

assert.sameValue(Atomics.and(view, 0, 1), 0, 'Atomics.and(view, 0, 1) returns 0');
assert.sameValue(Atomics.load(view, 0), 0, 'Atomics.load(view, 0) returns 0');
}, ["arraybuffer"], ["immutable"]);
}, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.and(view, 0, 1);
}, `Atomics.and(new ${TA.name}(buffer), 0, 1) throws TypeError`);
}, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
const view = new TA(buffer);
assert.sameValue(Atomics.compareExchange(view, 0, 0n, 1n), 0n, 'Atomics.compareExchange(view, 0, 0n, 1n) returns 0n');
assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n');
}, null, ["arraybuffer"], ["immutable"]);
}, null, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {

assert.sameValue(Atomics.compareExchange(view, 0, 0, 1), 0, 'Atomics.compareExchange(view, 0, 0, 1) returns 0');
assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1');
}, ["arraybuffer"], ["immutable"]);
}, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.compareExchange(view, 0, 0, 0);
}, `Atomics.compareExchange(new ${TA.name}(buffer), 0, 0, 0) throws TypeError`);
}, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
const view = new TA(buffer);
assert.sameValue(Atomics.exchange(view, 0, 1n), 0n, 'Atomics.exchange(view, 0, 1n) returns 0n');
assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n');
}, null, ["arraybuffer"], ["immutable"]);
}, null, null, ["immutable"]);
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/exchange/non-shared-bufferdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {

assert.sameValue(Atomics.exchange(view, 0, 1), 0, 'Atomics.exchange(view, 0, 1) returns 0');
assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1');
}, ["arraybuffer"], ["immutable"]);
}, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.exchange(view, 0, 1);
}, `Atomics.exchange(new ${TA.name}(buffer), 0, 1) throws TypeError`);
}, ["arraybuffer"]);
});
5 changes: 2 additions & 3 deletions test/built-ins/Atomics/load/bad-range.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,12 @@ features: [ArrayBuffer, Atomics, DataView, SharedArrayBuffer, Symbol, TypedArray
---*/

var buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 2);
var views = nonClampedIntArrayConstructors.slice();

testWithTypedArrayConstructors(function(TA) {
testWithAtomicsFriendlyTypedArrayConstructors(function(TA) {
let view = new TA(buffer);
testWithAtomicsOutOfBoundsIndices(function(IdxGen) {
assert.throws(RangeError, function() {
Atomics.load(view, IdxGen(view));
});
});
}, views, ["passthrough"]);
}, null, ["passthrough"]);
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
const buffer = makeCtorArg(4);
const view = new TA(buffer);
assert.sameValue(Atomics.load(view, 0), 0n, 'Atomics.load(view, 0) returns 0n');
}, null, ["arraybuffer"]);
});
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/load/non-shared-bufferdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
const view = new TA(makeCtorArg(4));

assert.sameValue(Atomics.load(view, 0), 0, 'Atomics.load(view, 0) returns 0');
}, null, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.load(view, 0);
}, `Atomics.load(new ${TA.name}(buffer), 0) throws TypeError`);
}, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ var index = {
}
};

for (var badArrayType of nonAtomicsFriendlyTypedArrayConstructors) {
var typedArray = new badArrayType(new SharedArrayBuffer(8));
testWithNonAtomicsFriendlyTypedArrayConstructors(function(TA) {
var typedArray = new TA(new SharedArrayBuffer(8));
assert.throws(TypeError, function() {
Atomics.load(typedArray, index);
});
}
}, ["passthrough"]);
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
const view = new TA(buffer);
assert.sameValue(Atomics.or(view, 0, 1n), 0n, 'Atomics.or(view, 0, 1n) returns 0n');
assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n');
}, null, ["arraybuffer"], ["immutable"]);
}, null, null, ["immutable"]);
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/or/non-shared-bufferdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {

assert.sameValue(Atomics.or(view, 0, 1), 0, 'Atomics.or(view, 0, 1) returns 0');
assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1');
}, ["arraybuffer"], ["immutable"]);
}, null, ["immutable"]);
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/or/non-shared-int-views-throws.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.or(view, 0, 1);
}, `Atomics.or(new ${TA.name}(buffer), 0, 1) throws TypeError`);
}, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
const view = new TA(buffer);
assert.sameValue(Atomics.store(view, 0, 1n), 1n, 'Atomics.store(view, 0, 1n) returns 1n');
assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n');
}, null, ["arraybuffer"], ["immutable"]);
}, null, null, ["immutable"]);
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/store/non-shared-bufferdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {

assert.sameValue(Atomics.store(view, 0, 1), 1, 'Atomics.store(view, 0, 1) returns 1');
assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1');
}, ["arraybuffer"], ["immutable"]);
}, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.store(view, 0, 1);
}, `Atomics.store(new ${TA.name}(buffer), 0, 1) throws TypeError`);
}, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
assert.sameValue(Atomics.store(view, 0, 1n), 1n, 'Atomics.store(view, 0, 1n) returns 1n');
assert.sameValue(Atomics.sub(view, 0, 1n), 1n, 'Atomics.sub(view, 0, 1n) returns 1n');
assert.sameValue(Atomics.load(view, 0), 0n, 'Atomics.load(view, 0) returns 0n');
}, null, ["arraybuffer"], ["immutable"]);
}, null, null, ["immutable"]);
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/sub/non-shared-bufferdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.sameValue(Atomics.store(view, 0, 1), 1, 'Atomics.store(view, 0, 1) returns 1');
assert.sameValue(Atomics.sub(view, 0, 1), 1, 'Atomics.sub(view, 0, 1) returns 1');
assert.sameValue(Atomics.load(view, 0), 0, 'Atomics.load(view, 0) returns 0');
}, ["arraybuffer"], ["immutable"]);
}, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.sub(view, 0, 1);
}, `Atomics.sub(new ${TA.name}(buffer), 0, 1) throws TypeError`);
}, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ testWithBigIntTypedArrayConstructors((TA, makeCtorArg) => {
const view = new TA(buffer);
assert.sameValue(Atomics.xor(view, 0, 1n), 0n, 'Atomics.xor(view, 0, 1n) returns 0n');
assert.sameValue(Atomics.load(view, 0), 1n, 'Atomics.load(view, 0) returns 1n');
}, null, ["arraybuffer"], ["immutable"]);
}, null, null, ["immutable"]);
2 changes: 1 addition & 1 deletion test/built-ins/Atomics/xor/non-shared-bufferdata.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ testWithAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {

assert.sameValue(Atomics.xor(view, 0, 1), 0, 'Atomics.xor(view, 0, 1) returns 0');
assert.sameValue(Atomics.load(view, 0), 1, 'Atomics.load(view, 0) returns 1');
}, ["arraybuffer"], ["immutable"]);
}, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ testWithNonAtomicsFriendlyTypedArrayConstructors((TA, makeCtorArg) => {
assert.throws(TypeError, function() {
Atomics.xor(view, 0, 1);
}, `Atomics.xor(new ${TA.name}(buffer), 0, 1) throws TypeError`);
}, ["arraybuffer"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) {
assert.throws(Test262Error, function() {
Object.defineProperty(sample, "0", {value: obj});
});
}, null, ["passthrough"]);
}, null, null, ["immutable"]);
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) {
false,
"numericIndex > length"
);
}, null, ["passthrough"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) {
false,
"-1"
);
}, null, ["passthrough"]);
});
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,4 @@ testWithBigIntTypedArrayConstructors(function(TA, makeCtorArg) {
);
assert.sameValue(sample[0], 0n, "does not change the value for [0]");
assert.sameValue(sample["-0"], undefined, "does define a value for ['-0']");
}, null, ["passthrough"]);
});
Loading
Loading