Several small deRPC fixes.
 - Canonicalization of inner array type names
 - Ensuring that primitive return types for service methods cause their boxed counterparts to be rescued since return types are boxed over the wire.
 - Re-use an existing local variable.

Patch by: bobv
Review by: amitmanjhi

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5762 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
index 7c01bb7..2467976 100644
--- a/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
+++ b/user/src/com/google/gwt/rpc/rebind/RpcProxyCreator.java
@@ -302,12 +302,20 @@
         serializationSto.getSerializableTypes());
     Collections.addAll(serializableTypes,
         deserializationSto.getSerializableTypes());
+    for (JMethod m : serviceIntf.getOverridableMethods()) {
+      // Pick up any primitive return types, which get sent boxed
+      assert serializableTypes.contains(m.getReturnType())
+          || m.getReturnType().isPrimitive() != null : "Missing non-primitive return type "
+          + m.getReturnType().getQualifiedSourceName();
+      serializableTypes.add(m.getReturnType());
+    }
 
     StringBuilder sb = new StringBuilder("@ArtificialRescue({");
     for (JType serializableType : serializableTypes) {
 
       JArrayType serializableArray = serializableType.isArray();
       JClassType serializableClass = serializableType.isClass();
+      JPrimitiveType serializablePrimitive = serializableType.isPrimitive();
       if (serializableArray != null) {
         sb.append("\n@Rescue(className = \"");
         if (serializableArray.getLeafType() instanceof JPrimitiveType) {
@@ -319,8 +327,15 @@
           sb.append(serializableArray.getQualifiedSourceName());
         }
         sb.append("\",\n instantiable = true),");
+
       } else if (serializableClass != null) {
         writeSingleRescue(typeOracle, deserializationSto, sb, serializableClass);
+
+      } else if (serializablePrimitive != null) {
+        JClassType boxedClass = typeOracle.findType(serializablePrimitive.getQualifiedBoxedSourceName());
+        assert boxedClass != null : "No boxed version of "
+            + serializablePrimitive.getQualifiedSourceName();
+        writeSingleRescue(typeOracle, deserializationSto, sb, boxedClass);
       }
     }
     sb.append("})");
diff --git a/user/src/com/google/gwt/rpc/server/WebModeClientOracle.java b/user/src/com/google/gwt/rpc/server/WebModeClientOracle.java
index 42090b8..97e6262 100644
--- a/user/src/com/google/gwt/rpc/server/WebModeClientOracle.java
+++ b/user/src/com/google/gwt/rpc/server/WebModeClientOracle.java
@@ -381,9 +381,15 @@
         leafType = leafType.getComponentType();
       } while (leafType.isArray());
 
-      if (leafType.getPackage() == null) {
+      Class<?> enclosing = leafType.getEnclosingClass();
+      if (enclosing != null) {
+        // com.foo.Enclosing$Name[]
+        return canonicalName(enclosing) + "$" + clazz.getSimpleName();
+      } else if (leafType.getPackage() == null) {
+        // Name0[
         return clazz.getSimpleName();
       } else {
+        // com.foo.Name[]
         return leafType.getPackage().getName() + "." + clazz.getSimpleName();
       }
     } else {
diff --git a/user/src/com/google/gwt/rpc/server/WebModePayloadSink.java b/user/src/com/google/gwt/rpc/server/WebModePayloadSink.java
index 924a55b..3edbec8 100644
--- a/user/src/com/google/gwt/rpc/server/WebModePayloadSink.java
+++ b/user/src/com/google/gwt/rpc/server/WebModePayloadSink.java
@@ -555,8 +555,7 @@
        * Set the typeIds and queryIds to exact values, or fall back to acting
        * like a plain Object[] array.
        */
-      int typeId = clientOracle.getTypeId(Array.newInstance(
-          x.getComponentType(), 0).getClass());
+      int typeId = clientOracle.getTypeId(targetClass);
       if (typeId == 0) {
         typeId = clientOracle.getTypeId(Object[].class);
       }