blob: 0986fe3433b76e0323bf3c8e70e1e9d96bb7b75e [file] [log] [blame]
const constructors = [
Int8Array,
Uint8Array,
Uint8ClampedArray,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array ];
if (typeof SharedArrayBuffer != "undefined")
constructors.push(sharedConstructor(Int8Array),
sharedConstructor(Uint8Array),
sharedConstructor(Int16Array),
sharedConstructor(Uint16Array),
sharedConstructor(Int32Array),
sharedConstructor(Uint32Array),
sharedConstructor(Float32Array),
sharedConstructor(Float64Array));
for (var constructor of constructors) {
// Two tests involving %TypedArray%.from and a Proxy.
var log = [];
function LoggingProxy(target) {
log.push("target", target);
var h = {
defineProperty: function (t, id) {
log.push("define", id);
return true;
},
has: function (t, id) {
log.push("has", id);
return id in t;
},
get: function (t, id) {
log.push("get", id);
return t[id];
},
set: function (t, id, v) {
log.push("set", id);
t[id] = v;
return true;
}
};
return new Proxy(Object(target), h);
}
// Unlike Array.from, %TypedArray%.from uses [[Put]] instead of [[DefineOwnProperty]].
// Hence, it calls handler.set to create new elements rather than handler.defineProperty.
// Additionally, it doesn't set the length property at the end.
LoggingProxy.from = constructor.from;
LoggingProxy.from([3, 4, 5]);
assertDeepEq(log, ["target", 3, "set", "0", "set", "1", "set", "2"]);
// When the argument passed to %TypedArray%.from is a Proxy, %TypedArray%.from
// calls handler.get on it.
log = [];
assertDeepEq(constructor.from(new LoggingProxy([3, 4, 5])), new constructor([3, 4, 5]));
assertDeepEq(log, ["target", [3, 4, 5],
"get", Symbol.iterator,
"get", "length", "get", "0",
"get", "length", "get", "1",
"get", "length", "get", "2",
"get", "length"]);
// Array-like iteration only gets the length once.
log = [];
var arr = [5, 6, 7];
arr[Symbol.iterator] = undefined;
assertDeepEq(constructor.from(new LoggingProxy(arr)), new constructor([5, 6, 7]));
assertDeepEq(log, ["target", [5, 6, 7],
"get", Symbol.iterator,
"get", "length",
"get", "0", "get", "1", "get", "2"]);
}
if (typeof reportCompare === "function")
reportCompare(true, true);