# HG changeset patch # User hannesw # Date 1477036929 -7200 # Node ID dc96f5cd1a9ca8613916767c81e0cc050c8f213b # Parent c21a5d772a0d62eed97241e6837f3eeb9458b199 8168140: TypedArrays should implement ES6 iterator protocol Reviewed-by: sundar, lagergren diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayIterator.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayIterator.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/ArrayIterator.java Fri Oct 21 10:02:09 2016 +0200 @@ -47,13 +47,25 @@ private final Global global; - ArrayIterator(final Object iteratedObject, final IterationKind iterationKind, final Global global) { + private ArrayIterator(final Object iteratedObject, final IterationKind iterationKind, final Global global) { super(global.getArrayIteratorPrototype(), $nasgenmap$); this.iteratedObject = iteratedObject instanceof ScriptObject ? (ScriptObject) iteratedObject : null; this.iterationKind = iterationKind; this.global = global; } + static ArrayIterator newArrayValueIterator(final Object iteratedObject) { + return new ArrayIterator(Global.toObject(iteratedObject), IterationKind.VALUE, Global.instance()); + } + + static ArrayIterator newArrayKeyIterator(final Object iteratedObject) { + return new ArrayIterator(Global.toObject(iteratedObject), IterationKind.KEY, Global.instance()); + } + + static ArrayIterator newArrayKeyValueIterator(final Object iteratedObject) { + return new ArrayIterator(Global.toObject(iteratedObject), IterationKind.KEY_VALUE, Global.instance()); + } + /** * 22.1.5.2.1 %ArrayIteratorPrototype%.next() * diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java Fri Oct 21 10:02:09 2016 +0200 @@ -1726,7 +1726,7 @@ */ @Function(attributes = Attribute.NOT_ENUMERABLE) public static Object entries(final Object self) { - return new ArrayIterator(Global.toObject(self), AbstractIterator.IterationKind.KEY_VALUE, Global.instance()); + return ArrayIterator.newArrayKeyValueIterator(self); } /** @@ -1737,7 +1737,7 @@ */ @Function(attributes = Attribute.NOT_ENUMERABLE) public static Object keys(final Object self) { - return new ArrayIterator(Global.toObject(self), AbstractIterator.IterationKind.KEY, Global.instance()); + return ArrayIterator.newArrayKeyIterator(self); } /** @@ -1748,7 +1748,7 @@ */ @Function(attributes = Attribute.NOT_ENUMERABLE) public static Object values(final Object self) { - return new ArrayIterator(Global.toObject(self), AbstractIterator.IterationKind.VALUE, Global.instance()); + return ArrayIterator.newArrayValueIterator(self); } /** @@ -1759,7 +1759,7 @@ */ @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") public static Object getIterator(final Object self) { - return new ArrayIterator(Global.toObject(self), AbstractIterator.IterationKind.VALUE, Global.instance()); + return ArrayIterator.newArrayValueIterator(self); } /** diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat32Array.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat32Array.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat32Array.java Fri Oct 21 10:02:09 2016 +0200 @@ -232,6 +232,17 @@ return (NativeFloat32Array)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getFloat32ArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat64Array.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat64Array.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat64Array.java Fri Oct 21 10:02:09 2016 +0200 @@ -232,6 +232,17 @@ return (NativeFloat64Array)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getFloat64ArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt16Array.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt16Array.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt16Array.java Fri Oct 21 10:02:09 2016 +0200 @@ -225,6 +225,17 @@ return (NativeInt16Array)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getInt16ArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt32Array.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt32Array.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt32Array.java Fri Oct 21 10:02:09 2016 +0200 @@ -224,6 +224,17 @@ return (NativeInt32Array)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getInt32ArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt8Array.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt8Array.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt8Array.java Fri Oct 21 10:02:09 2016 +0200 @@ -224,6 +224,17 @@ return (NativeInt8Array)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getInt8ArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint16Array.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint16Array.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint16Array.java Fri Oct 21 10:02:09 2016 +0200 @@ -229,6 +229,17 @@ return (NativeUint16Array)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getUint16ArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint32Array.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint32Array.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint32Array.java Fri Oct 21 10:02:09 2016 +0200 @@ -244,6 +244,17 @@ return (NativeUint32Array)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getUint32ArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8Array.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8Array.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8Array.java Fri Oct 21 10:02:09 2016 +0200 @@ -230,6 +230,17 @@ return (NativeUint8Array)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getUint8ArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java Fri Oct 21 09:43:11 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java Fri Oct 21 10:02:09 2016 +0200 @@ -266,6 +266,17 @@ return (NativeUint8ClampedArray)ArrayBufferView.subarrayImpl(self, begin, end); } + /** + * ECMA 6 22.2.3.30 %TypedArray%.prototype [ @@iterator ] ( ) + * + * @param self the self reference + * @return an iterator over the array's values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, name = "@@iterator") + public static Object getIterator(final Object self) { + return ArrayIterator.newArrayValueIterator(self); + } + @Override protected ScriptObject getPrototype(final Global global) { return global.getUint8ClampedArrayPrototype(); diff -r c21a5d772a0d -r dc96f5cd1a9c nashorn/test/script/basic/es6/JDK-8168140.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/es6/JDK-8168140.js Fri Oct 21 10:02:09 2016 +0200 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8168140: TypedArrays should implement ES6 iterator protocol + * + * @test + * @run + * @option --language=es6 + */ + +let TypedArrayTypes = [ + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array +]; + +let arrays = []; +let sum = 0; + +TypedArrayTypes.forEach(function(ArrayType) { + var a = new ArrayType(10); + for (let i = 0; i < a.length; i++) { + a[i] = i; + } + arrays.push(a); +}); + +Assert.assertTrue(arrays.length === 9); + +for (let array of arrays) { + + Assert.assertTrue(array.length === 10); + let count = 0; + + for (let value of array) { + Assert.assertTrue(value === count++); + sum += value; + } +} + +Assert.assertTrue(sum === 405);