X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/tests/stress/array-from-set-length.js diff --git a/tests/stress/array-from-set-length.js b/tests/stress/array-from-set-length.js new file mode 100644 index 0000000..ab6adea --- /dev/null +++ b/tests/stress/array-from-set-length.js @@ -0,0 +1,45 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error('bad value: ' + actual); +} + +for (var i = 0; i < 10; ++i) { + Object.defineProperty(Array.prototype, i, { + get() { + throw new Error('get is called.'); + }, + set(value) { + throw new Error('set is called.'); + } + }); +} + +class ArrayLike { + constructor(length) { + this.lengthCalled = false; + this._length = length; + } + set length(value) { + this.lengthCalled = true; + this._length = value; + } + get length() { + return this._length; + } +} + +var arrayLike = new ArrayLike(10); +for (var i = 0; i < 10; ++i) { + arrayLike[i] = i; +} +shouldBe(arrayLike.lengthCalled, false); + +var generated = Array.from.call(ArrayLike, arrayLike); + +shouldBe(generated.length, 10); +shouldBe(generated instanceof ArrayLike, true); +for (var i = 0; i < 10; ++i) { + shouldBe(generated[i], i); +} +shouldBe(arrayLike.lengthCalled, false); +shouldBe(generated.lengthCalled, true);