rt/emul/mini/src/main/java/java/lang/Class.java
branchclosure
changeset 1532 10d26626c426
parent 1528 984f8ed9e514
child 1585 60dcb3d7a687
     1.1 --- a/rt/emul/mini/src/main/java/java/lang/Class.java	Mon May 05 12:25:44 2014 +0200
     1.2 +++ b/rt/emul/mini/src/main/java/java/lang/Class.java	Tue May 06 08:36:54 2014 +0200
     1.3 @@ -151,7 +151,7 @@
     1.4      public static Class<?> forName(String className)
     1.5      throws ClassNotFoundException {
     1.6          if (className.startsWith("[")) {
     1.7 -            Class<?> arrType = defineArray(className);
     1.8 +            Class<?> arrType = defineArray(className, null);
     1.9              Class<?> c = arrType;
    1.10              while (c != null && c.isArray()) {
    1.11                  c = c.getComponentType0(); // verify component type is sane
    1.12 @@ -1544,13 +1544,24 @@
    1.13      public Class<?> getComponentType() {
    1.14          if (isArray()) {
    1.15              try {
    1.16 -                return getComponentType0();
    1.17 +                Class<?> c = getComponentTypeByFnc();
    1.18 +                return c != null ? c : getComponentType0();
    1.19              } catch (ClassNotFoundException cnfe) {
    1.20                  throw new IllegalStateException(cnfe);
    1.21              }
    1.22          }
    1.23          return null;
    1.24      }
    1.25 +    
    1.26 +    @JavaScriptBody(args = {  }, body = 
    1.27 +        "if (this.fnc) {\n"
    1.28 +      + "  var c = this.fnc(false).constructor.$class;\n"
    1.29 +//      + "  java.lang.System.out.println('will call: ' + (!!this.fnc) + ' res: ' + c.jvmName);\n"
    1.30 +      + "  if (c) return c;\n"
    1.31 +      + "}\n"
    1.32 +      + "return null;"
    1.33 +    )
    1.34 +    private native Class<?> getComponentTypeByFnc();
    1.35  
    1.36      private Class<?> getComponentType0() throws ClassNotFoundException {
    1.37          String n = getName().substring(1);
    1.38 @@ -1577,24 +1588,26 @@
    1.39              case 'C':
    1.40                  return Character.TYPE;
    1.41              case '[':
    1.42 -                return defineArray(n);
    1.43 +                return defineArray(n, null);
    1.44              default:
    1.45                  throw new ClassNotFoundException("Unknown component type of " + getName());
    1.46          }
    1.47      }
    1.48      
    1.49 -    @JavaScriptBody(args = { "sig" }, body = 
    1.50 +    @JavaScriptBody(args = { "sig", "fnc" }, body = 
    1.51          "if (!sig) sig = '[Ljava/lang/Object;';\n" +
    1.52          "var c = Array[sig];\n" +
    1.53 -        "if (c) return c;\n" +
    1.54 -        "c = vm.java_lang_Class(true);\n" +
    1.55 -        "c.jvmName = sig;\n" +
    1.56 -        "c.superclass = vm.java_lang_Object(false).$class;\n" +
    1.57 -        "c.array = true;\n" +
    1.58 -        "Array[sig] = c;\n" +
    1.59 +        "if (!c) {\n" +
    1.60 +        "  c = vm.java_lang_Class(true);\n" +
    1.61 +        "  c.jvmName = sig;\n" +
    1.62 +        "  c.superclass = vm.java_lang_Object(false).$class;\n" +
    1.63 +        "  c.array = true;\n" +
    1.64 +        "  Array[sig] = c;\n" +
    1.65 +        "}\n" +
    1.66 +        "if (!c.fnc) c.fnc = fnc;\n" +
    1.67          "return c;"
    1.68      )
    1.69 -    private static native Class<?> defineArray(String sig);
    1.70 +    private static native Class<?> defineArray(String sig, Object fnc);
    1.71      
    1.72      /**
    1.73       * Returns true if and only if this class was declared as an enum in the