Author: b...@google.com Date: Tue Mar 31 19:20:10 2009 New Revision: 5142 Modified: trunk/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java trunk/user/test/com/google/gwt/dev/jjs/test/SingleJsoImplTest.java
Log: Fix a bug where array return types could not be used with SingleJsoImpl methods. Reported by: pmuetschard Patch by: bobv Review by: jat, scottb Modified: trunk/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java Tue Mar 31 19:20:10 2009 @@ -19,6 +19,7 @@ import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.core.ext.TreeLogger.Type; +import com.google.gwt.core.ext.typeinfo.JArrayType; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.JMethod; import com.google.gwt.core.ext.typeinfo.JParameter; @@ -1001,12 +1002,16 @@ } private String getBinaryOrPrimitiveName(JType type) { + JArrayType asArray = type.isArray(); JClassType asClass = type.isClassOrInterface(); JPrimitiveType asPrimitive = type.isPrimitive(); if (asClass != null) { return getBinaryName(asClass); } else if (asPrimitive != null) { return asPrimitive.getQualifiedSourceName(); + } else if (asArray != null) { + JType componentType = asArray.getComponentType(); + return getBinaryOrPrimitiveName(componentType) + "[]"; } else { throw new InternalCompilerException("Cannot create binary name for " + type.getQualifiedSourceName()); Modified: trunk/user/test/com/google/gwt/dev/jjs/test/SingleJsoImplTest.java ============================================================================== --- trunk/user/test/com/google/gwt/dev/jjs/test/SingleJsoImplTest.java (original) +++ trunk/user/test/com/google/gwt/dev/jjs/test/SingleJsoImplTest.java Tue Mar 31 19:20:10 2009 @@ -106,6 +106,56 @@ } } + static class JavaUsesArrays implements UsesArrays { + public void acceptInt3Array(int[][][] arr) { + assertTrue(arr.length == 3); + } + + public void acceptIntArray(int[] arr) { + assertTrue(arr.length == 1); + } + + public void acceptObject3Array(Object[][][] arr) { + assertTrue(arr.length == 3); + } + + public void acceptObjectArray(Object[] arr) { + assertTrue(arr.length == 1); + } + + public void acceptString3Array(String[][][] arr) { + assertTrue(arr.length == 3); + } + + public void acceptStringArray(String[] arr) { + assertTrue(arr.length == 1); + } + + public int[][][] returnInt3Array() { + return new int[3][2][1]; + } + + public int[] returnIntArray() { + return new int[1]; + } + + public Object[][][] returnObject3Array() { + return new Object[3][2][1]; + } + + public Object[] returnObjectArray() { + return new Object[1]; + } + + public String[][][] returnString3Array() { + return new String[3][2][1]; + } + + public String[] returnStringArray() { + return new String[1]; + } + } + static class JsoAdder extends JavaScriptObject implements Adder { protected JsoAdder() { } @@ -223,6 +273,60 @@ } } + static final class JsoUsesArrays extends JavaScriptObject implements + UsesArrays { + protected JsoUsesArrays() { + } + + public void acceptInt3Array(int[][][] arr) { + assertTrue(arr.length == 3); + } + + public void acceptIntArray(int[] arr) { + assertTrue(arr.length == 1); + } + + public void acceptObject3Array(Object[][][] arr) { + assertTrue(arr.length == 3); + } + + public void acceptObjectArray(Object[] arr) { + assertTrue(arr.length == 1); + } + + public void acceptString3Array(String[][][] arr) { + assertTrue(arr.length == 3); + } + + public void acceptStringArray(String[] arr) { + assertTrue(arr.length == 1); + } + + public int[][][] returnInt3Array() { + return new int[3][2][1]; + } + + public int[] returnIntArray() { + return new int[1]; + } + + public Object[][][] returnObject3Array() { + return new Object[3][2][1]; + } + + public Object[] returnObjectArray() { + return new Object[1]; + } + + public String[][][] returnString3Array() { + return new String[3][2][1]; + } + + public String[] returnStringArray() { + return new String[1]; + } + } + /** * Ensure that SingleJsoImpl interfaces can be extended and implemented by * regular Java types. @@ -273,6 +377,35 @@ interface Tag { } + /** + * Ensure that arrays are valid return and parameter types. + */ + interface UsesArrays { + void acceptInt3Array(int[][][] arr); + + void acceptIntArray(int[] arr); + + void acceptObject3Array(Object[][][] arr); + + void acceptObjectArray(Object[] arr); + + void acceptString3Array(String[][][] arr); + + void acceptStringArray(String[] arr); + + int[][][] returnInt3Array(); + + int[] returnIntArray(); + + Object[][][] returnObject3Array(); + + Object[] returnObjectArray(); + + String[][][] returnString3Array(); + + String[] returnStringArray(); + } + private static native JsoAdder makeAdder(int offset) /*-{ return {offset:offset}; }-*/; @@ -299,6 +432,24 @@ InnerType i = (InnerType) JavaScriptObject.createObject(); assertEquals(5, a.call(i, 5).get()); assertEquals(5, i.get()); + } + + public void testCallsWithArrays() { + UsesArrays a = JavaScriptObject.createObject().<JsoUsesArrays> cast(); + a.acceptIntArray(a.returnIntArray()); + a.acceptInt3Array(a.returnInt3Array()); + a.acceptStringArray(a.returnStringArray()); + a.acceptString3Array(a.returnString3Array()); + a.acceptObjectArray(a.returnStringArray()); + a.acceptObject3Array(a.returnString3Array()); + + a = new JavaUsesArrays(); + a.acceptIntArray(a.returnIntArray()); + a.acceptInt3Array(a.returnInt3Array()); + a.acceptStringArray(a.returnStringArray()); + a.acceptString3Array(a.returnString3Array()); + a.acceptObjectArray(a.returnStringArray()); + a.acceptObject3Array(a.returnString3Array()); } public void testDualCase() { --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---