1.1 --- a/emul/src/main/java/java/lang/Class.java Sat Dec 01 12:35:30 2012 +0100
1.2 +++ b/emul/src/main/java/java/lang/Class.java Sat Dec 01 15:30:56 2012 +0100
1.3 @@ -402,6 +402,7 @@
1.4 *
1.5 * @return the superclass of the class represented by this object.
1.6 */
1.7 + @JavaScriptBody(args = "self", body = "return self.superclass;")
1.8 public native Class<? super T> getSuperclass();
1.9
1.10 /**
2.1 --- a/javap/src/main/java/org/apidesign/javap/ClassData.java Sat Dec 01 12:35:30 2012 +0100
2.2 +++ b/javap/src/main/java/org/apidesign/javap/ClassData.java Sat Dec 01 15:30:56 2012 +0100
2.3 @@ -488,6 +488,12 @@
2.4 return stringValue(cpx, false);
2.5 }
2.6 public String stringValue(int cpx, boolean textual) {
2.7 + return stringValue(cpx, textual, null);
2.8 + }
2.9 + public String stringValue(int cpx, String[] classRefs) {
2.10 + return stringValue(cpx, true, classRefs);
2.11 + }
2.12 + private String stringValue(int cpx, boolean textual, String[] refs) {
2.13 if (cpx==0) return "#0";
2.14 int tag;
2.15 Object x;
2.16 @@ -550,6 +556,9 @@
2.17 case CONSTANT_CLASS:
2.18 String jn = javaName(getClassName(cpx));
2.19 if (textual) {
2.20 + if (refs != null) {
2.21 + refs[0] = jn;
2.22 + }
2.23 return jn.replace('/', '_') + "(false).constructor.$class";
2.24 }
2.25 return jn;
3.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 12:35:30 2012 +0100
3.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 15:30:56 2012 +0100
3.3 @@ -95,10 +95,13 @@
3.4 // ClassName sc = jc.getSuperClass();
3.5 String sc = jc.getSuperClassName(); // with _
3.6 if (sc != null) {
3.7 - out.append("\n var p = CLS.prototype = ").
3.8 + out.append("\n var pp = ").
3.9 append(sc.replace('/', '_')).append("(true);");
3.10 + out.append("\n var p = CLS.prototype = pp;");
3.11 + out.append("\n var sprcls = pp.constructor.$class;");
3.12 } else {
3.13 out.append("\n var p = CLS.prototype;");
3.14 + out.append("\n var sprcls = null;");
3.15 }
3.16 for (MethodData m : jc.getMethods()) {
3.17 if (m.isStatic()) {
3.18 @@ -114,6 +117,7 @@
3.19 }
3.20 out.append("\n CLS.$class = java_lang_Class(true);");
3.21 out.append("\n CLS.$class.jvmName = '").append(jc.getClassName()).append("';");
3.22 + out.append("\n CLS.$class.superclass = sprcls;");
3.23 out.append("\n }");
3.24 out.append("\n if (arguments.length === 0) {");
3.25 out.append("\n if (!(this instanceof CLS)) {");
3.26 @@ -963,8 +967,12 @@
3.27 }
3.28 }
3.29
3.30 - private String encodeConstant(int entryIndex) {
3.31 - String s = jc.stringValue(entryIndex, true);
3.32 + private String encodeConstant(int entryIndex) throws IOException {
3.33 + String[] classRef = { null };
3.34 + String s = jc.stringValue(entryIndex, classRef);
3.35 + if (classRef[0] != null) {
3.36 + addReference(classRef[0]);
3.37 + }
3.38 return s;
3.39 }
3.40