Merge branch 'bocoup/ta-subarray'

This commit is contained in:
Gorkem Yakin 2016-04-25 16:53:20 -07:00
commit 851be6108a
27 changed files with 1214 additions and 0 deletions

View File

@ -0,0 +1,64 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Throws a TypeError creating a new instance with a detached buffer
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
7. Let relativeBegin be ? ToInteger(begin).
...
9. If end is undefined, let relativeEnd be srcLength; else, let relativeEnd be
? ToInteger(end).
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
4. Return ? TypedArrayCreate(constructor, argumentList).
22.2.4.6 TypedArrayCreate ( constructor, argumentList )
1. Let newTypedArray be ? Construct(constructor, argumentList).
...
22.2.4.5 TypedArray ( buffer [ , byteOffset [ , length ] ] )
...
11. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
...
includes: [testTypedArray.js, detachArrayBuffer.js]
---*/
var begin, end;
var o1 = {
valueOf: function() {
begin = true;
return 0;
}
};
var o2 = {
valueOf: function() {
end = true;
return 2;
}
}
testWithTypedArrayConstructors(function(TA) {
var sample = new TA(2);
begin = false;
end = false;
$DETACHBUFFER(sample.buffer);
assert.throws(TypeError, function() {
sample.subarray(o1, o2);
});
assert(begin, "observable ToInteger(begin)");
assert(end, "observable ToInteger(end)");
});

View File

@ -0,0 +1,30 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Infinity values on begin and end
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
includes: [testTypedArray.js, compareArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
assert(
compareArray(sample.subarray(-Infinity), [40, 41, 42, 43]),
"begin == -Infinity"
);
assert(
compareArray(sample.subarray(Infinity), []),
"being == Infinity"
);
assert(
compareArray(sample.subarray(0, -Infinity), []),
"end == -Infinity"
);
assert(
compareArray(sample.subarray(0, Infinity), [40, 41, 42, 43]),
"end == Infinity"
);
});

View File

@ -0,0 +1,30 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: -0 values on begin and end
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
includes: [testTypedArray.js, compareArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
assert(
compareArray(sample.subarray(-0), [40, 41, 42, 43]),
"begin == -0"
);
assert(
compareArray(sample.subarray(-0, 4), [40, 41, 42, 43]),
"being == -0, end == length"
);
assert(
compareArray(sample.subarray(0, -0), []),
"being == 0, end == -0"
);
assert(
compareArray(sample.subarray(-0, -0), []),
"being == -0, end == -0"
);
});

View File

@ -0,0 +1,26 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Subarray result does not import own property
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
includes: [testTypedArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([41, 42, 43, 44]);
var result;
sample.foo = 42;
result = sample.subarray(0);
assert.sameValue(
result.hasOwnProperty("foo"),
false,
"does not import own property"
);
});

View File

@ -0,0 +1,30 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Returns a new instance from the same constructor
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
includes: [testTypedArray.js, compareArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
var result = sample.subarray(1);
assert.sameValue(
Object.getPrototypeOf(result),
Object.getPrototypeOf(sample),
"prototype"
);
assert.sameValue(result.constructor, sample.constructor, "constructor");
assert(result instanceof TA, "instanceof");
assert(
compareArray(sample, [40, 41, 42, 43]),
"original sample remains the same"
);
});

View File

@ -0,0 +1,34 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Returns a new instance sharing the same buffer
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
includes: [testTypedArray.js, compareArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
var buffer = sample.buffer;
var result = sample.subarray(1);
assert.notSameValue(result, sample, "returns a new instance");
assert.sameValue(result.buffer, sample.buffer, "shared buffer");
assert.sameValue(sample.buffer, buffer, "original buffer is preserved");
sample[1] = 100;
assert(
compareArray(result, [100, 42, 43]),
"changes on the original sample values affect the new instance"
);
result[1] = 111;
assert(
compareArray(sample, [40, 100, 111, 43]),
"changes on the new instance values affect the original sample"
);
});

View File

@ -0,0 +1,57 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Subarray may return a new instance with a smaller length
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
includes: [testTypedArray.js, compareArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
function testRes(result, expected, msg) {
assert(compareArray(result, expected), msg + ", result: [" + result + "]");
}
testRes(sample.subarray(1), [41, 42, 43], "begin == 1");
testRes(sample.subarray(2), [42, 43], "begin == 2");
testRes(sample.subarray(3), [43], "begin == 3");
testRes(sample.subarray(1, 4), [41, 42, 43], "begin == 1, end == length");
testRes(sample.subarray(2, 4), [42, 43], "begin == 2, end == length");
testRes(sample.subarray(3, 4), [43], "begin == 3, end == length");
testRes(sample.subarray(0, 1), [40], "begin == 0, end == 1");
testRes(sample.subarray(0, 2), [40, 41], "begin == 0, end == 2");
testRes(sample.subarray(0, 3), [40, 41, 42], "begin == 0, end == 3");
testRes(sample.subarray(-1), [43], "begin == -1");
testRes(sample.subarray(-2), [42, 43], "begin == -2");
testRes(sample.subarray(-3), [41, 42, 43], "begin == -3");
testRes(sample.subarray(-1, 4), [43], "begin == -1, end == length");
testRes(sample.subarray(-2, 4), [42, 43], "begin == -2, end == length");
testRes(sample.subarray(-3, 4), [41, 42, 43], "begin == -3, end == length");
testRes(sample.subarray(0, -1), [40, 41, 42], "begin == 0, end == -1");
testRes(sample.subarray(0, -2), [40, 41], "begin == 0, end == -2");
testRes(sample.subarray(0, -3), [40], "begin == 0, end == -3");
testRes(sample.subarray(-0, -1), [40, 41, 42], "begin == -0, end == -1");
testRes(sample.subarray(-0, -2), [40, 41], "begin == -0, end == -2");
testRes(sample.subarray(-0, -3), [40], "begin == -0, end == -3");
testRes(sample.subarray(-2, -1), [42], "length == 4, begin == -2, end == -1");
testRes(sample.subarray(1, -1), [41, 42], "length == 4, begin == 1, end == -1");
testRes(sample.subarray(1, -2), [41], "length == 4, begin == 1, end == -2");
testRes(sample.subarray(2, -1), [42], "length == 4, begin == 2, end == -1");
testRes(sample.subarray(-1, 5), [43], "begin == -1, end > length");
testRes(sample.subarray(-2, 4), [42, 43], "begin == -2, end > length");
testRes(sample.subarray(-3, 4), [41, 42, 43], "begin == -3, end > length");
});

View File

@ -0,0 +1,56 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Subarray may return a new empty instance
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
includes: [testTypedArray.js, compareArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
function testRes(result, msg) {
assert.sameValue(result.length, 0, msg);
assert.sameValue(
result.hasOwnProperty(0),
false,
msg + " & result.hasOwnProperty(0) === false"
);
}
testRes(sample.subarray(4), "begin == length");
testRes(sample.subarray(5), "begin > length");
testRes(sample.subarray(4, 4), "begin == length, end == length");
testRes(sample.subarray(5, 4), "begin > length, end == length");
testRes(sample.subarray(4, 4), "begin == length, end > length");
testRes(sample.subarray(5, 4), "begin > length, end > length");
testRes(sample.subarray(0, 0), "begin == 0, end == 0");
testRes(sample.subarray(-0, -0), "begin == -0, end == -0");
testRes(sample.subarray(1, 0), "begin > 0, end == 0");
testRes(sample.subarray(-1, 0), "being < 0, end == 0");
testRes(sample.subarray(2, 1), "begin > 0, begin < length, begin > end, end > 0");
testRes(sample.subarray(2, 2), "begin > 0, begin < length, begin == end");
testRes(sample.subarray(2, -2), "begin > 0, begin < length, end == -2");
testRes(sample.subarray(-1, -1), "length = 4, begin == -1, end == -1");
testRes(sample.subarray(-1, -2), "length = 4, begin == -1, end == -2");
testRes(sample.subarray(-2, -2), "length = 4, begin == -2, end == -2");
testRes(sample.subarray(0, -4), "begin == 0, end == -length");
testRes(sample.subarray(-4, -4), "begin == -length, end == -length");
testRes(sample.subarray(-5, -4), "begin < -length, end == -length");
testRes(sample.subarray(0, -5), "begin == 0, end < -length");
testRes(sample.subarray(-4, -5), "begin == -length, end < -length");
testRes(sample.subarray(-5, -5), "begin < -length, end < -length");
});

View File

@ -0,0 +1,36 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Subarray may return a new instance with the same length
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
includes: [testTypedArray.js, compareArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
function testRes(result, msg) {
assert.sameValue(result.length, 4, msg);
assert.sameValue(result[0], 40, msg + " & result[0] === 40");
assert.sameValue(result[1], 41, msg + " & result[1] === 41");
assert.sameValue(result[2], 42, msg + " & result[2] === 42");
assert.sameValue(result[3], 43, msg + " & result[3] === 43");
}
testRes(sample.subarray(0), "begin == 0");
testRes(sample.subarray(-4), "begin == -srcLength");
testRes(sample.subarray(-5), "begin < -srcLength");
testRes(sample.subarray(0, 4), "begin == 0, end == srcLength");
testRes(sample.subarray(-4, 4), "begin == -srcLength, end == srcLength");
testRes(sample.subarray(-5, 4), "begin < -srcLength, end == srcLength");
testRes(sample.subarray(0, 5), "begin == 0, end > srcLength");
testRes(sample.subarray(-4, 5), "begin == -srcLength, end > srcLength");
testRes(sample.subarray(-5, 5), "begin < -srcLength, end > srcLength");
});

View File

@ -0,0 +1,24 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Return abrupt from ToInteger(begin), begin is symbol
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
7. Let relativeBegin be ? ToInteger(begin).
...
includes: [testTypedArray.js]
features: [Symbol]
---*/
var s = Symbol("1");
testWithTypedArrayConstructors(function(TA) {
var sample = new TA();
assert.throws(TypeError, function() {
sample.subarray(s);
});
});

View File

@ -0,0 +1,37 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Return abrupt from ToInteger(begin)
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
7. Let relativeBegin be ? ToInteger(begin).
...
includes: [testTypedArray.js]
---*/
var o1 = {
valueOf: function() {
throw new Test262Error();
}
};
var o2 = {
toString: function() {
throw new Test262Error();
}
};
testWithTypedArrayConstructors(function(TA) {
var sample = new TA();
assert.throws(Test262Error, function() {
sample.subarray(o1);
});
assert.throws(Test262Error, function() {
sample.subarray(o2);
});
});

View File

@ -0,0 +1,25 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Return abrupt from ToInteger(end), end is symbol
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
9. If end is undefined, let relativeEnd be srcLength; else, let relativeEnd
be ? ToInteger(end).
...
includes: [testTypedArray.js]
features: [Symbol]
---*/
var s = Symbol("1");
testWithTypedArrayConstructors(function(TA) {
var sample = new TA();
assert.throws(TypeError, function() {
sample.subarray(0, s);
});
});

View File

@ -0,0 +1,38 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Return abrupt from ToInteger(end)
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
9. If end is undefined, let relativeEnd be srcLength; else, let relativeEnd
be ? ToInteger(end).
...
includes: [testTypedArray.js]
---*/
var o1 = {
valueOf: function() {
throw new Test262Error();
}
};
var o2 = {
toString: function() {
throw new Test262Error();
}
};
testWithTypedArrayConstructors(function(TA) {
var sample = new TA();
assert.throws(Test262Error, function() {
sample.subarray(0, o1);
});
assert.throws(Test262Error, function() {
sample.subarray(0, o2);
});
});

View File

@ -0,0 +1,39 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: Return abrupt from SpeciesConstructor's get Constructor
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
...
7.3.20 SpeciesConstructor ( O, defaultConstructor )
1. Assert: Type(O) is Object.
2. Let C be ? Get(O, "constructor").
3. If C is undefined, return defaultConstructor.
...
includes: [testTypedArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
Object.defineProperty(sample, "constructor", {
get: function() {
throw new Test262Error();
}
});
assert.throws(Test262Error, function() {
sample.subarray(0);
});
});

View File

@ -0,0 +1,60 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: get inherited constructor on SpeciesConstructor
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
...
7.3.20 SpeciesConstructor ( O, defaultConstructor )
1. Assert: Type(O) is Object.
2. Let C be ? Get(O, "constructor").
3. If C is undefined, return defaultConstructor.
...
includes: [testTypedArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
var calls = 0;
var result;
Object.defineProperty(TA.prototype, "constructor", {
get: function() {
calls++;
}
});
result = sample.subarray(0);
assert.sameValue(calls, 1, "called custom ctor get accessor once");
assert.sameValue(
Object.getPrototypeOf(result),
Object.getPrototypeOf(sample),
"use defaultCtor on an undefined return - getPrototypeOf check"
);
assert.sameValue(
result.constructor,
undefined,
"used defaultCtor but still checks the inherited .constructor"
);
calls = 6;
result.constructor;
assert.sameValue(
calls,
7,
"result.constructor triggers the inherited accessor property"
);
});

View File

@ -0,0 +1,62 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
Throws if O.constructor returns a non-Object and non-undefined value
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
...
7.3.20 SpeciesConstructor ( O, defaultConstructor )
1. Assert: Type(O) is Object.
2. Let C be ? Get(O, "constructor").
3. If C is undefined, return defaultConstructor.
4. If Type(C) is not Object, throw a TypeError exception.
...
includes: [testTypedArray.js]
features: [Symbol]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
sample.constructor = 42;
assert.throws(TypeError, function() {
sample.subarray(0);
}, "42");
sample.constructor = "1";
assert.throws(TypeError, function() {
sample.subarray(0);
}, "string");
sample.constructor = null;
assert.throws(TypeError, function() {
sample.subarray(0);
}, "null");
sample.constructor = NaN;
assert.throws(TypeError, function() {
sample.subarray(0);
}, "NaN");
sample.constructor = false;
assert.throws(TypeError, function() {
sample.subarray(0);
}, "false");
sample.constructor = Symbol("1");
assert.throws(TypeError, function() {
sample.subarray(0);
}, "symbol");
});

View File

@ -0,0 +1,52 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: get constructor on SpeciesConstructor
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
...
7.3.20 SpeciesConstructor ( O, defaultConstructor )
1. Assert: Type(O) is Object.
2. Let C be ? Get(O, "constructor").
3. If C is undefined, return defaultConstructor.
...
includes: [testTypedArray.js]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
var calls = 0;
var result;
Object.defineProperty(sample, "constructor", {
get: function() {
calls++;
}
});
result = sample.subarray(0);
assert.sameValue(calls, 1, "called custom ctor get accessor once");
assert.sameValue(
Object.getPrototypeOf(result),
Object.getPrototypeOf(sample),
"use defaultCtor on an undefined return - getPrototypeOf check"
);
assert.sameValue(
result.constructor,
TA,
"use defaultCtor on an undefined return - .constructor check"
);
});

View File

@ -0,0 +1,44 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
Returns abrupt from get @@species on found constructor
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
...
7.3.20 SpeciesConstructor ( O, defaultConstructor )
1. Assert: Type(O) is Object.
2. Let C be ? Get(O, "constructor").
...
5. Let S be ? Get(C, @@species).
...
includes: [testTypedArray.js]
features: [Symbol.species]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA(2);
sample.constructor = {};
Object.defineProperty(sample.constructor, Symbol.species, {
get: function() {
throw new Test262Error();
}
});
assert.throws(Test262Error, function() {
sample.subarray(0);
});
});

View File

@ -0,0 +1,62 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
Verify arguments on custom @@species construct call
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
4. Return ? TypedArrayCreate(constructor, argumentList).
7.3.20 SpeciesConstructor ( O, defaultConstructor )
...
5. Let S be ? Get(C, @@species).
...
7. If IsConstructor(S) is true, return S.
...
22.2.4.6 TypedArrayCreate ( constructor, argumentList )
1. Let newTypedArray be ? Construct(constructor, argumentList).
2. Perform ? ValidateTypedArray(newTypedArray).
3. If argumentList is a List of a single Number, then
...
4. Return newTypedArray.
includes: [testTypedArray.js]
features: [Symbol.species]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42]);
var calls = 0;
var expectedOffset = TA.BYTES_PER_ELEMENT;
var result, ctorThis;
sample.constructor = {};
sample.constructor[Symbol.species] = function(buffer, offset, length) {
result = arguments;
ctorThis = this;
return new TA(buffer, offset, length);
};;
sample.subarray(1);
assert.sameValue(result.length, 3, "called with 3 arguments");
assert.sameValue(result[0], sample.buffer, "[0] is sample.buffer");
assert.sameValue(result[1], expectedOffset, "[1] is the byte offset pos");
assert.sameValue(result[2], 2, "[2] is expected length");
assert(
ctorThis instanceof sample.constructor[Symbol.species],
"`this` value in the @@species fn is an instance of the function itself"
);
});

View File

@ -0,0 +1,52 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
Custom @@species constructor may return a totally different TypedArray
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
4. Return ? TypedArrayCreate(constructor, argumentList).
7.3.20 SpeciesConstructor ( O, defaultConstructor )
...
5. Let S be ? Get(C, @@species).
...
7. If IsConstructor(S) is true, return S.
...
22.2.4.6 TypedArrayCreate ( constructor, argumentList )
1. Let newTypedArray be ? Construct(constructor, argumentList).
2. Perform ? ValidateTypedArray(newTypedArray).
3. If argumentList is a List of a single Number, then
...
4. Return newTypedArray.
includes: [testTypedArray.js, compareArray.js]
features: [Symbol.species]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40]);
var other = new Int8Array([1, 0, 1]);
var result;
sample.constructor = {};
sample.constructor[Symbol.species] = function() {
return other;
};
result = sample.subarray(0, 0);
assert.sameValue(result, other, "returned another typedarray");
assert(compareArray(result, [1, 0, 1]), "the returned object is preserved");
});

View File

@ -0,0 +1,46 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
Custom @@species constructor throws if it does not return a compatible object
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
4. Return ? TypedArrayCreate(constructor, argumentList).
7.3.20 SpeciesConstructor ( O, defaultConstructor )
...
5. Let S be ? Get(C, @@species).
...
7. If IsConstructor(S) is true, return S.
...
22.2.4.6 TypedArrayCreate ( constructor, argumentList )
1. Let newTypedArray be ? Construct(constructor, argumentList).
2. Perform ? ValidateTypedArray(newTypedArray).
...
includes: [testTypedArray.js]
features: [Symbol.species]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA(2);
var ctor = function() {};
sample.constructor = {};
sample.constructor[Symbol.species] = ctor;
assert.throws(TypeError, function() {
sample.subarray(0);
});
});

View File

@ -0,0 +1,53 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
Use custom @@species constructor if available
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
4. Return ? TypedArrayCreate(constructor, argumentList).
7.3.20 SpeciesConstructor ( O, defaultConstructor )
...
5. Let S be ? Get(C, @@species).
...
7. If IsConstructor(S) is true, return S.
...
22.2.4.6 TypedArrayCreate ( constructor, argumentList )
1. Let newTypedArray be ? Construct(constructor, argumentList).
2. Perform ? ValidateTypedArray(newTypedArray).
3. If argumentList is a List of a single Number, then
...
4. Return newTypedArray.
includes: [testTypedArray.js, compareArray.js]
features: [Symbol.species]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42]);
var calls = 0;
var result;
sample.constructor = {};
sample.constructor[Symbol.species] = function(buffer, offset, length) {
calls++;
return new TA(buffer, offset, length);
};;
result = sample.subarray(1);
assert.sameValue(calls, 1, "ctor called once");
assert(compareArray(result, [41, 42]), "expected subarray");
});

View File

@ -0,0 +1,65 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
Throws if returned @@species is not a constructor, null or undefined.
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
...
7.3.20 SpeciesConstructor ( O, defaultConstructor )
...
5. Let S be ? Get(C, @@species).
6. If S is either undefined or null, return defaultConstructor.
7. If IsConstructor(S) is true, return S.
8. Throw a TypeError exception.
...
includes: [testTypedArray.js]
features: [Symbol.species]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA(2);
sample.constructor = {};
sample.constructor[Symbol.species] = 0;
assert.throws(TypeError, function() {
sample.subarray(0);
}, "0");
sample.constructor[Symbol.species] = "string";
assert.throws(TypeError, function() {
sample.subarray(0);
}, "string");
sample.constructor[Symbol.species] = {};
assert.throws(TypeError, function() {
sample.subarray(0);
}, "{}");
sample.constructor[Symbol.species] = NaN;
assert.throws(TypeError, function() {
sample.subarray(0);
}, "NaN");
sample.constructor[Symbol.species] = false;
assert.throws(TypeError, function() {
sample.subarray(0);
}, "false");
sample.constructor[Symbol.species] = true;
assert.throws(TypeError, function() {
sample.subarray(0);
}, "true");
});

View File

@ -0,0 +1,53 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
Use defaultConstructor if @@species is either undefined or null
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
...
7.3.20 SpeciesConstructor ( O, defaultConstructor )
...
5. Let S be ? Get(C, @@species).
6. If S is either undefined or null, return defaultConstructor.
...
includes: [testTypedArray.js]
features: [Symbol.species]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA(2);
var result;
sample.constructor = {};
result = sample.subarray(0);
assert.sameValue(
Object.getPrototypeOf(result),
Object.getPrototypeOf(sample),
"undefined @@species - prototype check "
);
assert.sameValue(result.constructor, TA, "undefined @@species - ctor check");
sample.constructor[Symbol.species] = null;
result = sample.subarray(0);
assert.sameValue(
Object.getPrototypeOf(result),
Object.getPrototypeOf(sample),
"null @@species - prototype check "
);
assert.sameValue(result.constructor, TA, "null @@species - ctor check");
});

View File

@ -0,0 +1,45 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: >
get @@species from found constructor
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
17. Return ? TypedArraySpeciesCreate(O, argumentsList).
22.2.4.7 TypedArraySpeciesCreate ( exemplar, argumentList )
...
3. Let constructor be ? SpeciesConstructor(exemplar, defaultConstructor).
...
7.3.20 SpeciesConstructor ( O, defaultConstructor )
1. Assert: Type(O) is Object.
2. Let C be ? Get(O, "constructor").
...
5. Let S be ? Get(C, @@species).
...
includes: [testTypedArray.js]
features: [Symbol.species]
---*/
testWithTypedArrayConstructors(function(TA) {
var sample = new TA(2);
var calls = 0;
sample.constructor = {};
Object.defineProperty(sample.constructor, Symbol.species, {
get: function() {
calls++;
}
});
sample.subarray(0);
assert.sameValue(calls, 1);
});

View File

@ -0,0 +1,47 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: ToInteger(begin)
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
7. Let relativeBegin be ? ToInteger(begin).
...
includes: [testTypedArray.js, compareArray.js]
---*/
var obj = {
valueOf: function() {
return 2;
}
};
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
assert(compareArray(sample.subarray(false), [40, 41, 42, 43]), "false");
assert(compareArray(sample.subarray(true), [41, 42, 43]), "true");
assert(compareArray(sample.subarray(NaN), [40, 41, 42, 43]), "NaN");
assert(compareArray(sample.subarray(null), [40, 41, 42, 43]), "null");
assert(compareArray(sample.subarray(undefined), [40, 41, 42, 43]), "undefined");
assert(compareArray(sample.subarray(1.1), [41, 42, 43]), "1.1");
assert(compareArray(sample.subarray(1.5), [41, 42, 43]), "1.5");
assert(compareArray(sample.subarray(0.6), [40, 41, 42, 43]), "0.6");
assert(compareArray(sample.subarray(-1.5), [43]), "-1.5");
assert(compareArray(sample.subarray(-1.1), [43]), "-1.1");
assert(compareArray(sample.subarray(-0.6), [40, 41, 42, 43]), "-0.6");
assert(compareArray(sample.subarray("3"), [43]), "string");
assert(
compareArray(
sample.subarray(obj),
[42, 43]
),
"object"
);
});

View File

@ -0,0 +1,47 @@
// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-%typedarray%.prototype.subarray
description: ToInteger(end)
info: >
22.2.3.27 %TypedArray%.prototype.subarray( begin , end )
...
9. If end is undefined, let relativeEnd be srcLength; else, let relativeEnd be
? ToInteger(end).
...
includes: [testTypedArray.js, compareArray.js]
---*/
var obj = {
valueOf: function() {
return 2;
}
};
testWithTypedArrayConstructors(function(TA) {
var sample = new TA([40, 41, 42, 43]);
assert(compareArray(sample.subarray(0, false), []), "false");
assert(compareArray(sample.subarray(0, true), [40]), "true");
assert(compareArray(sample.subarray(0, NaN), []), "NaN");
assert(compareArray(sample.subarray(0, null), []), "null");
assert(compareArray(sample.subarray(0, undefined), [40, 41, 42, 43]), "undefined");
assert(compareArray(sample.subarray(0, 0.6), []), "0.6");
assert(compareArray(sample.subarray(0, 1.1), [40]), "1.1");
assert(compareArray(sample.subarray(0, 1.5), [40]), "1.5");
assert(compareArray(sample.subarray(0, -0.6), []), "-0.6");
assert(compareArray(sample.subarray(0, -1.1), [40, 41, 42]), "-1.1");
assert(compareArray(sample.subarray(0, -1.5), [40, 41, 42]), "-1.5");
assert(compareArray(sample.subarray(0, "3"), [40, 41, 42]), "string");
assert(
compareArray(
sample.subarray(0, obj),
[40, 41]
),
"object"
);
});