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