From 34bc5ff07fc75ef6adc513fe8b2818ebf1c93a0b Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Mon, 20 May 2013 21:25:14 +0200 Subject: [PATCH] 8014797: rename Java.toJavaArray/toJavaScriptArray to Java.to/from, respectively Reviewed-by: jlaskey, sundar --- .../docs/JavaScriptingProgrammersGuide.html | 10 ++-- nashorn/docs/source/javaarray.js | 4 +- .../nashorn/api/scripting/resources/engine.js | 2 +- .../nashorn/internal/objects/NativeJava.java | 51 ++++++++++++------- .../runtime/resources/Messages.properties | 1 + nashorn/test/script/basic/NASHORN-556.js | 24 ++++----- .../test/script/basic/javaarrayconversion.js | 16 +++--- .../script/currently-failing/logcoverage.js | 3 +- nashorn/test/script/trusted/NASHORN-638.js | 3 +- nashorn/test/script/trusted/NASHORN-653.js | 3 +- 10 files changed, 64 insertions(+), 53 deletions(-) diff --git a/nashorn/docs/JavaScriptingProgrammersGuide.html b/nashorn/docs/JavaScriptingProgrammersGuide.html index a9af9612271..a9803f7fd81 100644 --- a/nashorn/docs/JavaScriptingProgrammersGuide.html +++ b/nashorn/docs/JavaScriptingProgrammersGuide.html @@ -616,26 +616,26 @@ print(a[0]);

It is also possible to convert between JavaScript and Java arrays. -Given a JavaScript array and a Java type, Java.toJavaArray returns a Java array with the same initial contents, and with the specified component type. +Given a JavaScript array and a Java type, Java.to returns a Java array with the same initial contents, and with the specified array type.


  var anArray = [1, "13", false]
- var javaIntArray = Java.toJavaArray(anArray, "int")
+ var javaIntArray = Java.to(anArray, "int[]")
  print(javaIntArray[0]) // prints 1
  print(javaIntArray[1]) // prints 13, as string "13" was converted to number 13 as per ECMAScript ToNumber conversion
  print(javaIntArray[2]) // prints 0, as boolean false was converted to number 0 as per ECMAScript ToNumber conversion
 

-You can use either a string or a type object returned from Java.type() to specify the component type of the array. +You can use either a string or a type object returned from Java.type() to specify the type of the array. You can also omit the array type, in which case a Object[] will be created.

-Given a Java array or Collection, Java.toJavaScriptArray returns a JavaScript array with a shallow copy of its contents. Note that in most cases, you can use Java arrays and lists natively in Nashorn; in cases where for some reason you need to have an actual JavaScript native array (e.g. to work with the array comprehensions functions), you will want to use this method. +Given a Java array or Collection, Java.from returns a JavaScript array with a shallow copy of its contents. Note that in most cases, you can use Java arrays and lists natively in Nashorn; in cases where for some reason you need to have an actual JavaScript native array (e.g. to work with the array comprehensions functions), you will want to use this method.


 var File = Java.type("java.io.File");
 var listCurDir = new File(".").listFiles();
-var jsList = Java.toJavaScriptArray(listCurDir);
+var jsList = Java.from(listCurDir);
 print(jsList);
 

diff --git a/nashorn/docs/source/javaarray.js b/nashorn/docs/source/javaarray.js index a02aa3ca9f6..d0de9124684 100644 --- a/nashorn/docs/source/javaarray.js +++ b/nashorn/docs/source/javaarray.js @@ -40,7 +40,7 @@ print(a[0]); // convert a script array to Java array var anArray = [1, "13", false]; -var javaIntArray = Java.toJavaArray(anArray, "int"); +var javaIntArray = Java.to(anArray, "int[]"); print(javaIntArray[0]);// prints 1 print(javaIntArray[1]); // prints 13, as string "13" was converted to number 13 as per ECMAScript ToNumber conversion print(javaIntArray[2]);// prints 0, as boolean false was converted to number 0 as per ECMAScript ToNumber conversion @@ -48,5 +48,5 @@ print(javaIntArray[2]);// prints 0, as boolean false was converted to number 0 a // convert a Java array to a JavaScript array var File = Java.type("java.io.File"); var listCurDir = new File(".").listFiles(); -var jsList = Java.toJavaScriptArray(listCurDir); +var jsList = Java.from(listCurDir); print(jsList); diff --git a/nashorn/src/jdk/nashorn/api/scripting/resources/engine.js b/nashorn/src/jdk/nashorn/api/scripting/resources/engine.js index e95607287d4..62d6735ee3f 100644 --- a/nashorn/src/jdk/nashorn/api/scripting/resources/engine.js +++ b/nashorn/src/jdk/nashorn/api/scripting/resources/engine.js @@ -88,7 +88,7 @@ Object.defineProperty(this, "sprintf", { } } - array = Java.toJavaArray(array); + array = Java.to(array); return Packages.jdk.nashorn.api.scripting.ScriptUtils.format(format, array); } }); diff --git a/nashorn/src/jdk/nashorn/internal/objects/NativeJava.java b/nashorn/src/jdk/nashorn/internal/objects/NativeJava.java index 5faec5ea98b..800b224f10d 100644 --- a/nashorn/src/jdk/nashorn/internal/objects/NativeJava.java +++ b/nashorn/src/jdk/nashorn/internal/objects/NativeJava.java @@ -240,39 +240,52 @@ public final class NativeJava { } /** - * Given a JavaScript array and a Java type, returns a Java array with the same initial contents, and with the - * specified component type. Example: + * Given a script object and a Java type, converts the script object into the desired Java type. Currently it only + * performs shallow creation of Java arrays, but might be extended for other types in the future. Example: *
      * var anArray = [1, "13", false]
-     * var javaIntArray = Java.toJavaArray(anArray, "int")
+     * var javaIntArray = Java.to(anArray, "int[]")
      * print(javaIntArray[0]) // prints 1
      * print(javaIntArray[1]) // prints 13, as string "13" was converted to number 13 as per ECMAScript ToNumber conversion
      * print(javaIntArray[2]) // prints 0, as boolean false was converted to number 0 as per ECMAScript ToNumber conversion
      * 
* @param self not used - * @param objArray the JavaScript array. Can be null. - * @param objType either a {@link #type(Object, Object) type object} or a String describing the component type of - * the Java array to create. Can not be null. If undefined, Object is assumed (allowing the argument to be omitted). - * @return a Java array with the copy of JavaScript array's contents, converted to the appropriate Java component - * type. Returns null if objArray is null. + * @param objArray the script object. Can be null. + * @param objType either a {@link #type(Object, Object) type object} or a String describing the type of the Java + * object to create. Can not be null. If undefined, a "default" conversion is presumed (allowing the argument to be + * omitted). + * @return a Java object whose value corresponds to the original script object's value. Specifically, for array + * target types, returns a Java array of the same type with contents converted to the array's component type. Does + * not recursively convert for multidimensional arrays. + * type. Returns null if scriptObject is null. * @throws ClassNotFoundException if the class described by objType is not found */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) - public static Object toJavaArray(final Object self, final Object objArray, final Object objType) throws ClassNotFoundException { - final StaticClass componentType = - objType instanceof StaticClass ? - (StaticClass)objType : - objType == UNDEFINED ? - StaticClass.forClass(Object.class) : - type(objType); - + public static Object to(final Object self, final Object objArray, final Object objType) throws ClassNotFoundException { if (objArray == null) { return null; } + final Class componentType; + if(objType == UNDEFINED) { + componentType = Object.class; + } else { + final StaticClass arrayType; + if(objType instanceof StaticClass) { + arrayType = (StaticClass)objType; + } else { + arrayType = type(objType); + } + final Class arrayClass = arrayType.getRepresentedClass(); + if(!arrayClass.isArray()) { + throw typeError("to.expects.array.type", arrayClass.getName()); + } + componentType = arrayClass.getComponentType(); + } + Global.checkObject(objArray); - return ((ScriptObject)objArray).getArray().asArrayOfType(componentType.getRepresentedClass()); + return ((ScriptObject)objArray).getArray().asArrayOfType(componentType); } /** @@ -283,7 +296,7 @@ public final class NativeJava { *
      * var File = Java.type("java.io.File")
      * var listHomeDir = new File("~").listFiles()
-     * var jsListHome = Java.toJavaScriptArray(listHomeDir)
+     * var jsListHome = Java.from(listHomeDir)
      * var jpegModifiedDates = jsListHome
      *     .filter(function(val) { return val.getName().endsWith(".jpg") })
      *     .map(function(val) { return val.lastModified() })
@@ -294,7 +307,7 @@ public final class NativeJava {
      * null.
      */
     @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
-    public static Object toJavaScriptArray(final Object self, final Object objArray) {
+    public static Object from(final Object self, final Object objArray) {
         if (objArray == null) {
             return null;
         } else if (objArray instanceof Collection) {
diff --git a/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties b/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties
index 9f327521bcc..4f435ea2e96 100644
--- a/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties
+++ b/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties
@@ -125,6 +125,7 @@ type.error.no.constructor.matches.args=Can not construct {0} with the passed arg
 type.error.no.method.matches.args=Can not invoke method {0} with the passed arguments; they do not match any of its method signatures.
 type.error.method.not.constructor=Java method {0} can't be used as a constructor.
 type.error.env.not.object=$ENV must be an Object.
+type.error.to.expects.array.type=Java.to() expects an array target type. {0} is not an array type.
 range.error.inappropriate.array.length=inappropriate array length: {0}
 range.error.invalid.fraction.digits=fractionDigits argument to {0} must be in [0, 20]
 range.error.invalid.precision=precision argument toPrecision() must be in [1, 21]
diff --git a/nashorn/test/script/basic/NASHORN-556.js b/nashorn/test/script/basic/NASHORN-556.js
index 5cb164a0cf3..1332d02bef8 100644
--- a/nashorn/test/script/basic/NASHORN-556.js
+++ b/nashorn/test/script/basic/NASHORN-556.js
@@ -47,7 +47,7 @@ function f1() {
   // (NoTypeArrayData)
   var empty = {};
   empty.length = 10;
-  Java.toJavaArray(empty);
+  Java.to(empty);
   delete empty[0];
   Array.prototype.slice.call(empty, 0, 1);
   Array.prototype.pop.call(empty);
@@ -63,7 +63,7 @@ function f1() {
 function f2() {
   // DeletedArrayFilter
   var deleted = [,1,,2,,3,,4,,];
-  assertEq(2, Java.toJavaArray(deleted)[3]);
+  assertEq(2, Java.to(deleted)[3]);
   assertEq(undefined, deleted.pop());
   assertEq(4, deleted.pop());
   deleted.unshift(5);
@@ -78,7 +78,7 @@ function f2() {
 function f3() {
   // DeletedRangeArrayFilter
   var delrange = [1,2,3,,,,,,,,,,];
-  Java.toJavaArray(delrange);
+  Java.to(delrange);
   delrange.unshift(4);
   p.apply(null, delrange);
   print(delrange.slice(1,3), delrange.slice(2,6));
@@ -88,7 +88,7 @@ function f3() {
 function f4() {
   // NumberArrayData
   var num = [1.1,2.2,3.3,4.4,5.5];
-  Java.toJavaArray(num);
+  Java.to(num);
   assertEq(2, num[3] >>> 1);
   assertEq(5, num[4] | 0);
   assertEq(5.5, num.pop());
@@ -104,7 +104,7 @@ function f4() {
 function f5() {
   // ObjectArrayData
   var obj = [2,"two",3.14,"pi",14,"fourteen"];
-  Java.toJavaArray(obj);
+  Java.to(obj);
   assertEq(-12.86, obj[2] - 16);
   assertEq(7, obj[4] >>> 1);
   obj.unshift("one");
@@ -131,14 +131,14 @@ function f6() {
   sparse.length = 1024*1024;
   sparse.push(sparse.length);
   delete sparse[sparse.length-1];
-  //print(Java.toJavaArray(sparse).length);
+  //print(Java.to(sparse).length);
   (function(){}).apply(null, sparse);
 }
 
 function f7() {
   // UndefinedArrayFilter
   var undef = [1,2,3,4,5,undefined,7,8,9,19];
-  Java.toJavaArray(undef);
+  Java.to(undef);
   assertEq(4, undef[8] >>> 1);
   var tmp = undef[9] >>> 1;
   undef[8] = tmp;
@@ -154,8 +154,8 @@ function f7() {
 
 function f8() {
   // LongArrayData
-  var j = Java.toJavaScriptArray(Java.toJavaArray([23,37,42,86,47], "long"));
-  Java.toJavaArray(j);
+  var j = Java.from(Java.to([23,37,42,86,47], "long[]"));
+  Java.to(j);
   p.apply(null, j);
   assertEq(43, j[3] >>> 1);
   assertEq(36, j[4] - 11);
@@ -164,12 +164,12 @@ function f8() {
   assertEq(7, j.shift());
   assertEq(47, j.pop());
   j.push("asdf");
-  j = Java.toJavaScriptArray(Java.toJavaArray([23,37,42,86,47], "long"));
+  j = Java.from(Java.to([23,37,42,86,47], "long[]"));
   j.length = 3;
   j[0] = 13;
-  j = Java.toJavaScriptArray(Java.toJavaArray([23,37,42,86,47], "long"));
+  j = Java.from(Java.to([23,37,42,86,47], "long[]"));
   delete j[0];
-  j = Java.toJavaScriptArray(Java.toJavaArray([23,37,42,86,47], "long"));
+  j = Java.from(Java.to([23,37,42,86,47], "long[]"));
   j.length = 20;
   j[0] = 13.37;
 }
diff --git a/nashorn/test/script/basic/javaarrayconversion.js b/nashorn/test/script/basic/javaarrayconversion.js
index 34e2f95fb12..96ebe904668 100644
--- a/nashorn/test/script/basic/javaarrayconversion.js
+++ b/nashorn/test/script/basic/javaarrayconversion.js
@@ -34,7 +34,7 @@ var x; // used for undefined
 var testCount = 0;
 
 function testF(inputValue, type, testFn) {
-  var x = Java.toJavaArray([inputValue], type)[0];
+  var x = Java.to([inputValue], type + "[]")[0];
   if(!testFn(x)) {
     throw ("unexpected value: " + x)
   }
@@ -130,7 +130,7 @@ test({ valueOf: function() { return "42"; },  toString: function() { return "43"
 
 function assertCantConvert(sourceType, targetType) {
   try {
-    Java.toJavaArray([new Java.type(sourceType)()], targetType)
+    Java.to([new Java.type(sourceType)()], targetType + "[]")
     throw "no TypeError encountered"
   } catch(e) {
       if(!(e instanceof TypeError)) {
@@ -164,7 +164,7 @@ var intArray = new (Java.type("int[]"))(3)
 intArray[0] = 1234;
 intArray[1] = 42;
 intArray[2] = 5;
-var jsIntArray = Java.toJavaScriptArray(intArray)
+var jsIntArray = Java.from(intArray)
 assert(jsIntArray instanceof Array);
 assert(jsIntArray[0] === 1234);
 assert(jsIntArray[1] === 42);
@@ -179,7 +179,7 @@ assert(intArray[2] === 6);
 var byteArray = new (Java.type("byte[]"))(2)
 byteArray[0] = -128;
 byteArray[1] = 127;
-var jsByteArray = Java.toJavaScriptArray(byteArray)
+var jsByteArray = Java.from(byteArray)
 assert(jsByteArray instanceof Array);
 assert(jsByteArray[0] === -128);
 assert(jsByteArray[1] === 127);
@@ -187,7 +187,7 @@ assert(jsByteArray[1] === 127);
 var shortArray = new (Java.type("short[]"))(2)
 shortArray[0] = -32768;
 shortArray[1] = 32767;
-var jsShortArray = Java.toJavaScriptArray(shortArray)
+var jsShortArray = Java.from(shortArray)
 assert(jsShortArray instanceof Array);
 assert(jsShortArray[0] === -32768);
 assert(jsShortArray[1] === 32767);
@@ -195,7 +195,7 @@ assert(jsShortArray[1] === 32767);
 var floatArray = new (Java.type("float[]"))(2)
 floatArray[0] = java.lang.Float.MIN_VALUE;
 floatArray[1] = java.lang.Float.MAX_VALUE;
-var jsFloatArray = Java.toJavaScriptArray(floatArray)
+var jsFloatArray = Java.from(floatArray)
 assert(jsFloatArray instanceof Array);
 assert(jsFloatArray[0] == java.lang.Float.MIN_VALUE);
 assert(jsFloatArray[1] == java.lang.Float.MAX_VALUE);
@@ -204,7 +204,7 @@ var charArray = new (Java.type("char[]"))(3)
 charArray[0] = "a";
 charArray[1] = "b";
 charArray[2] = "1";
-var jsCharArray = Java.toJavaScriptArray(charArray)
+var jsCharArray = Java.from(charArray)
 assert(jsCharArray instanceof Array);
 assert(jsCharArray[0] === 97);
 assert(jsCharArray[1] === 98);
@@ -213,7 +213,7 @@ assert(jsCharArray[2] === 49);
 var booleanArray = new (Java.type("boolean[]"))(2)
 booleanArray[0] = true;
 booleanArray[1] = false;
-var jsBooleanArray = Java.toJavaScriptArray(booleanArray)
+var jsBooleanArray = Java.from(booleanArray)
 assert(jsBooleanArray instanceof Array);
 assert(jsBooleanArray[0] === true);
 assert(jsBooleanArray[1] === false);
diff --git a/nashorn/test/script/currently-failing/logcoverage.js b/nashorn/test/script/currently-failing/logcoverage.js
index 18b16aa1e00..2d8d410a881 100644
--- a/nashorn/test/script/currently-failing/logcoverage.js
+++ b/nashorn/test/script/currently-failing/logcoverage.js
@@ -53,8 +53,7 @@ function runScriptEngine(opts, name) {
             // set new standard err
             System.setErr(newErr);
             System.setOut(newOut);
-            var strType = Java.type("java.lang.String");
-            var engine = fac.getScriptEngine(Java.toJavaArray(opts, strType));
+            var engine = fac.getScriptEngine(Java.to(opts, "java.lang.String[]"));
 	    var reader = new java.io.FileReader(name);
             engine.eval(reader);
             newErr.flush();
diff --git a/nashorn/test/script/trusted/NASHORN-638.js b/nashorn/test/script/trusted/NASHORN-638.js
index 9cb6d694c55..1ff789a919b 100644
--- a/nashorn/test/script/trusted/NASHORN-638.js
+++ b/nashorn/test/script/trusted/NASHORN-638.js
@@ -47,8 +47,7 @@ function runScriptEngine(opts, code) {
         try {
             // set new standard err
             System.setErr(newErr);
-            var strType = Java.type("java.lang.String");
-            var engine = fac.getScriptEngine(Java.toJavaArray(opts, strType));
+            var engine = fac.getScriptEngine(Java.to(opts, "java.lang.String[]"));
             engine.eval(code);
             newErr.flush();
             return new java.lang.String(baos.toByteArray());
diff --git a/nashorn/test/script/trusted/NASHORN-653.js b/nashorn/test/script/trusted/NASHORN-653.js
index 2084bf70aeb..14a2cbc4c1c 100644
--- a/nashorn/test/script/trusted/NASHORN-653.js
+++ b/nashorn/test/script/trusted/NASHORN-653.js
@@ -85,8 +85,7 @@ function runScriptEngine(opts, code) {
         try {
             // set new standard err
             System.setErr(newErr);
-            var strType = Java.type("java.lang.String");
-            var engine = fac.getScriptEngine(Java.toJavaArray(opts, strType));
+            var engine = fac.getScriptEngine(Java.to(opts, "java.lang.String[]"));
             engine.eval(code);
             newErr.flush();
             return new java.lang.String(baos.toByteArray());