Class.getSuperclass seems to work reflection
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 01 Dec 2012 15:30:56 +0100
branchreflection
changeset 230b22dbc9329ec
parent 229 fb4c53e0097f
child 231 dde8422fb5ae
Class.getSuperclass seems to work
emul/src/main/java/java/lang/Class.java
javap/src/main/java/org/apidesign/javap/ClassData.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     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