Adding each constructor function field reflection
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 01 Dec 2012 08:52:30 +0100
branchreflection
changeset 22525e350c6385f
parent 223 860933a7787f
child 227 fae5261c8a9a
Adding each constructor function field
emul/src/main/java/java/lang/Class.java
emul/src/main/java/java/lang/Object.java
javap/src/main/java/org/apidesign/javap/ClassData.java
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java
vm/src/test/java/org/apidesign/vm4brwsr/Classes.java
     1.1 --- a/emul/src/main/java/java/lang/Class.java	Thu Nov 29 21:58:17 2012 +0100
     1.2 +++ b/emul/src/main/java/java/lang/Class.java	Sat Dec 01 08:52:30 2012 +0100
     1.3 @@ -27,6 +27,7 @@
     1.4  
     1.5  import java.io.InputStream;
     1.6  import java.lang.annotation.Annotation;
     1.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
     1.8  
     1.9  /**
    1.10   * Instances of the class {@code Class} represent classes and
    1.11 @@ -382,13 +383,12 @@
    1.12       *          represented by this object.
    1.13       */
    1.14      public String getName() {
    1.15 -        throw new UnsupportedOperationException();
    1.16 -//        String name = this.name;
    1.17 -//        if (name == null)
    1.18 -//            this.name = name = getName0();
    1.19 -//        return name;
    1.20 +        return jvmName().replace('/', '.');
    1.21      }
    1.22  
    1.23 +    @JavaScriptBody(args = "self", body = "return self.jvmName;")
    1.24 +    private native String jvmName();
    1.25 +
    1.26      /**
    1.27       * Returns the {@code Class} representing the superclass of the entity
    1.28       * (class, interface, primitive type or void) represented by this
     2.1 --- a/emul/src/main/java/java/lang/Object.java	Thu Nov 29 21:58:17 2012 +0100
     2.2 +++ b/emul/src/main/java/java/lang/Object.java	Sat Dec 01 08:52:30 2012 +0100
     2.3 @@ -25,6 +25,8 @@
     2.4  
     2.5  package java.lang;
     2.6  
     2.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
     2.8 +
     2.9  /**
    2.10   * Class {@code Object} is the root of the class hierarchy.
    2.11   * Every class has {@code Object} as a superclass. All objects,
    2.12 @@ -61,6 +63,7 @@
    2.13       * @see    Class Literals, section 15.8.2 of
    2.14       *         <cite>The Java&trade; Language Specification</cite>.
    2.15       */
    2.16 +    @JavaScriptBody(args="self", body="return self.constructor.$class;")
    2.17      public final native Class<?> getClass();
    2.18  
    2.19      /**
     3.1 --- a/javap/src/main/java/org/apidesign/javap/ClassData.java	Thu Nov 29 21:58:17 2012 +0100
     3.2 +++ b/javap/src/main/java/org/apidesign/javap/ClassData.java	Sat Dec 01 08:52:30 2012 +0100
     3.3 @@ -548,10 +548,11 @@
     3.4              return in.toString();
     3.5          }
     3.6          case CONSTANT_CLASS:
     3.7 +            String jn = javaName(getClassName(cpx));
     3.8              if (textual) {
     3.9 -                return "new java_lang_Class"; // XXX temporary JS
    3.10 +                return jn.replace('/', '_') + ".$class";
    3.11              }
    3.12 -            return javaName(getClassName(cpx));
    3.13 +            return jn;
    3.14          case CONSTANT_STRING:
    3.15              String sv = stringValue(((CPX)x).cpx, textual);
    3.16              if (textual) {
     4.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Nov 29 21:58:17 2012 +0100
     4.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Sat Dec 01 08:52:30 2012 +0100
     4.3 @@ -111,6 +111,8 @@
     4.4          for (String superInterface : jc.getSuperInterfaces()) {
     4.5              out.append("\n    p.$instOf_").append(superInterface.replace('/', '_')).append(" = true;");
     4.6          }
     4.7 +        out.append("\n    CLS.$class = java_lang_Class(true);");
     4.8 +        out.append("\n    CLS.$class.jvmName = '").append(jc.getClassName()).append("';");
     4.9          out.append("\n      if (arguments.length === 0) {");
    4.10          out.append("\n        return new CLS();");
    4.11          out.append("\n      }");
     5.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Thu Nov 29 21:58:17 2012 +0100
     5.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/ClassTest.java	Sat Dec 01 08:52:30 2012 +0100
     5.3 @@ -44,6 +44,12 @@
     5.4          assertExec("Classes are not equal", Classes.class, "differenceInClassesZ", Double.valueOf(1.0));
     5.5      }
     5.6  
     5.7 +    @Test public void javaInstanceName() throws Exception {
     5.8 +        assertEquals(Classes.classForInstance(), "java.io.IOException");
     5.9 +    }
    5.10 +    @Test public void jsInstanceName() throws Exception {
    5.11 +        assertExec("I/O name", Classes.class, "classForInstanceLjava_lang_String", "java.io.IOException");
    5.12 +    }
    5.13      @Test public void javaName() throws Exception {
    5.14          assertEquals(Classes.name(), "java.io.IOException");
    5.15      }
     6.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Thu Nov 29 21:58:17 2012 +0100
     6.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Classes.java	Sat Dec 01 08:52:30 2012 +0100
     6.3 @@ -34,6 +34,10 @@
     6.4          return c1 != c2;
     6.5      }
     6.6      
     6.7 +    public static String classForInstance() {
     6.8 +        return new IOException().getClass().getName().toString();
     6.9 +    }
    6.10 +    
    6.11      public static String name() {
    6.12          return IOException.class.getName().toString();
    6.13      }