# HG changeset patch # User Jaroslav Tulach # Date 1354372256 -3600 # Node ID b22dbc9329ece460ce1200eecf361f9393536b97 # Parent fb4c53e0097fbdc34d3f9af43e3f71eac627b713 Class.getSuperclass seems to work diff -r fb4c53e0097f -r b22dbc9329ec emul/src/main/java/java/lang/Class.java --- a/emul/src/main/java/java/lang/Class.java Sat Dec 01 12:35:30 2012 +0100 +++ b/emul/src/main/java/java/lang/Class.java Sat Dec 01 15:30:56 2012 +0100 @@ -402,6 +402,7 @@ * * @return the superclass of the class represented by this object. */ + @JavaScriptBody(args = "self", body = "return self.superclass;") public native Class getSuperclass(); /** diff -r fb4c53e0097f -r b22dbc9329ec javap/src/main/java/org/apidesign/javap/ClassData.java --- a/javap/src/main/java/org/apidesign/javap/ClassData.java Sat Dec 01 12:35:30 2012 +0100 +++ b/javap/src/main/java/org/apidesign/javap/ClassData.java Sat Dec 01 15:30:56 2012 +0100 @@ -488,6 +488,12 @@ return stringValue(cpx, false); } public String stringValue(int cpx, boolean textual) { + return stringValue(cpx, textual, null); + } + public String stringValue(int cpx, String[] classRefs) { + return stringValue(cpx, true, classRefs); + } + private String stringValue(int cpx, boolean textual, String[] refs) { if (cpx==0) return "#0"; int tag; Object x; @@ -550,6 +556,9 @@ case CONSTANT_CLASS: String jn = javaName(getClassName(cpx)); if (textual) { + if (refs != null) { + refs[0] = jn; + } return jn.replace('/', '_') + "(false).constructor.$class"; } return jn; diff -r fb4c53e0097f -r b22dbc9329ec vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 12:35:30 2012 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sat Dec 01 15:30:56 2012 +0100 @@ -95,10 +95,13 @@ // ClassName sc = jc.getSuperClass(); String sc = jc.getSuperClassName(); // with _ if (sc != null) { - out.append("\n var p = CLS.prototype = "). + out.append("\n var pp = "). append(sc.replace('/', '_')).append("(true);"); + out.append("\n var p = CLS.prototype = pp;"); + out.append("\n var sprcls = pp.constructor.$class;"); } else { out.append("\n var p = CLS.prototype;"); + out.append("\n var sprcls = null;"); } for (MethodData m : jc.getMethods()) { if (m.isStatic()) { @@ -114,6 +117,7 @@ } out.append("\n CLS.$class = java_lang_Class(true);"); out.append("\n CLS.$class.jvmName = '").append(jc.getClassName()).append("';"); + out.append("\n CLS.$class.superclass = sprcls;"); out.append("\n }"); out.append("\n if (arguments.length === 0) {"); out.append("\n if (!(this instanceof CLS)) {"); @@ -963,8 +967,12 @@ } } - private String encodeConstant(int entryIndex) { - String s = jc.stringValue(entryIndex, true); + private String encodeConstant(int entryIndex) throws IOException { + String[] classRef = { null }; + String s = jc.stringValue(entryIndex, classRef); + if (classRef[0] != null) { + addReference(classRef[0]); + } return s; }