8156743: ES6 for..of should work for Java Maps and Sets
authorsdama
Thu, 02 Mar 2017 09:01:55 -0800
changeset 44052 874212484a4e
parent 43902 ab43112aebc5
child 44053 26d0f0323b1f
8156743: ES6 for..of should work for Java Maps and Sets Summary: Implemented java map object iterator which behaves similar to native map object iterator Reviewed-by: jlaskey, attila Contributed-by: srinivas.dama@oracle.com
nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java
nashorn/test/script/basic/es6/JDK-8156743.js
nashorn/test/script/basic/es6/JDK-8156743.js.EXPECTED
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java	Thu Feb 23 16:21:31 2017 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java	Thu Mar 02 09:01:55 2017 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2017, 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
@@ -56,6 +56,8 @@
 import jdk.nashorn.internal.objects.AbstractIterator;
 import jdk.nashorn.internal.objects.Global;
 import jdk.nashorn.internal.objects.NativeObject;
+import jdk.nashorn.internal.objects.NativeJava;
+import jdk.nashorn.internal.objects.NativeArray;
 import jdk.nashorn.internal.parser.Lexer;
 import jdk.nashorn.internal.runtime.arrays.ArrayIndex;
 import jdk.nashorn.internal.runtime.linker.Bootstrap;
@@ -398,6 +400,30 @@
             if (itr != null) {
                 return itr;
             }
+
+        if (obj instanceof Map) {
+            return new Iterator<Object>() {
+                private Iterator<?> iter = ((Map<?,?>)obj).entrySet().iterator();
+
+                @Override
+                public boolean hasNext() {
+                    return iter.hasNext();
+                }
+
+                @Override
+                public Object next() {
+                    Map.Entry<?,?> next = (Map.Entry)iter.next();
+                    Object[] keyvalue = new Object[]{next.getKey(), next.getValue()};
+                    NativeArray array = NativeJava.from(null, keyvalue);
+                    return array;
+                }
+
+                @Override
+                public void remove() {
+                    iter.remove();
+                }
+            };
+        }
         }
 
         final Global global = Global.instance();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/es6/JDK-8156743.js	Thu Mar 02 09:01:55 2017 -0800
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2017, 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-8156743: ES6 for..of should work for Java Maps and Sets
+ *
+ * @test
+ * @run
+ * @option --language=es6
+ */
+
+var map = new Map([
+    [1, 'one'],
+    [2, 'two'],
+    [3, 'three']
+]);
+
+var set = new Set(['red', 'green', 'blue']);
+
+var HashMap = Java.type("java.util.HashMap");
+var jmap = new HashMap();
+jmap.put(1, 'one');
+jmap.put(2, 'two');
+jmap.put(3, 'three');
+
+var HashSet = Java.type("java.util.HashSet");
+var jset = new HashSet();
+jset.add('red');
+jset.add('green');
+jset.add('blue');
+
+for(var keyvalue of map){
+    print(keyvalue[0],keyvalue[1]);
+}
+
+for(var keyvalue of jmap){
+    print(keyvalue[0],keyvalue[1]);
+}
+
+for(var keyvalue of map){
+    print(keyvalue);
+}
+
+for(var keyvalue of jmap){
+    print(keyvalue);
+}
+
+for(var element of set){
+    print(element);
+}
+
+for(var element of jset){
+    print(element);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/es6/JDK-8156743.js.EXPECTED	Thu Mar 02 09:01:55 2017 -0800
@@ -0,0 +1,18 @@
+1 one
+2 two
+3 three
+1 one
+2 two
+3 three
+1,one
+2,two
+3,three
+1,one
+2,two
+3,three
+red
+green
+blue
+red
+green
+blue