提交 33c73961 编写于 作者: A attila

8014797: rename Java.toJavaArray/toJavaScriptArray to Java.to/from, respectively.

Reviewed-by: jlaskey, sundar
上级 8835b29b
......@@ -616,26 +616,26 @@ print(a[0]);
</pre>
<p>
It is also possible to convert between JavaScript and Java arrays.
Given a JavaScript array and a Java type, <code>Java.toJavaArray</code> returns a Java array with the same initial contents, and with the specified component type.
Given a JavaScript array and a Java type, <code>Java.to</code> returns a Java array with the same initial contents, and with the specified array type.
</p>
<pre><code>
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
</code></pre>
<p>
You can use either a string or a type object returned from <code>Java.type()</code> to specify the component type of the array.
You can use either a string or a type object returned from <code>Java.type()</code> to specify the type of the array.
You can also omit the array type, in which case a <code>Object[]</code> will be created.
</p>
<p>
Given a Java array or Collection, <code>Java.toJavaScriptArray</code> 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, <code>Java.from</code> 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.
</p>
<pre><code>
var File = Java.type("java.io.File");
var listCurDir = new File(".").listFiles();
var jsList = Java.toJavaScriptArray(listCurDir);
var jsList = Java.from(listCurDir);
print(jsList);
</code></pre>
<hr>
......
......@@ -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);
......@@ -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);
}
});
......@@ -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:
* <pre>
* 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
* </pre>
* @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 {
* <pre>
* 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) {
......
......@@ -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]
......
......@@ -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;
}
......
......@@ -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);
......
......@@ -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();
......
......@@ -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());
......
......@@ -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());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册