Can invoke overwritten methods
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 19 Sep 2012 19:57:45 +0200
changeset 1399f832e5765f
parent 12 282828609b86
child 14 018eee22b8cf
Can invoke overwritten methods
src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java
src/test/java/org/apidesign/java4browser/Instance.java
src/test/java/org/apidesign/java4browser/InstanceSub.java
src/test/java/org/apidesign/java4browser/InstanceTest.java
src/test/java/org/apidesign/java4browser/StaticMethodTest.java
     1.1 --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Wed Sep 19 19:29:05 2012 +0200
     1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java	Wed Sep 19 19:57:45 2012 +0200
     1.3 @@ -26,6 +26,7 @@
     1.4  import org.netbeans.modules.classfile.CPFieldInfo;
     1.5  import org.netbeans.modules.classfile.CPMethodInfo;
     1.6  import org.netbeans.modules.classfile.ClassFile;
     1.7 +import org.netbeans.modules.classfile.ClassName;
     1.8  import org.netbeans.modules.classfile.Code;
     1.9  import org.netbeans.modules.classfile.Method;
    1.10  import org.netbeans.modules.classfile.Parameter;
    1.11 @@ -65,9 +66,11 @@
    1.12                  compiler.generateStaticField(v);
    1.13              }
    1.14          }
    1.15 +        out.append("function java_lang_Object(){}\n"); // XXX temporary
    1.16          out.append("function java_lang_Object_consV(self){}\n"); // XXX temporary
    1.17          
    1.18 -        out.append("\nfunction ").append(jc.getName().getExternalName().replace('.', '_'));
    1.19 +        final String className = jc.getName().getExternalName().replace('.', '_');
    1.20 +        out.append("\nfunction ").append(className);
    1.21          out.append("() {");
    1.22          for (Method m : jc.getMethods()) {
    1.23              if (!m.isStatic()) {
    1.24 @@ -80,6 +83,11 @@
    1.25              }
    1.26          }
    1.27          out.append("\n}");
    1.28 +        ClassName sc = jc.getSuperClass();
    1.29 +        if (sc != null) {
    1.30 +            out.append("\n  ").append(className)
    1.31 +               .append(".prototype = new ").append(sc.getExternalName().replace('.', '_'));
    1.32 +        }
    1.33      }
    1.34      private void generateStaticMethod(Method m) throws IOException {
    1.35          out.append("\nfunction ").append(
     2.1 --- a/src/test/java/org/apidesign/java4browser/Instance.java	Wed Sep 19 19:29:05 2012 +0200
     2.2 +++ b/src/test/java/org/apidesign/java4browser/Instance.java	Wed Sep 19 19:57:45 2012 +0200
     2.3 @@ -43,7 +43,7 @@
     2.4          return (i.i - i.b) * i.d;
     2.5      }
     2.6      public static byte virtualBytes() {
     2.7 -        Instance i = new Instance();
     2.8 +        Instance i = new InstanceSub(7, 2.2d);
     2.9          i.setByte((byte)0x0a);
    2.10          return i.getByte();
    2.11      }
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/src/test/java/org/apidesign/java4browser/InstanceSub.java	Wed Sep 19 19:57:45 2012 +0200
     3.3 @@ -0,0 +1,20 @@
     3.4 +/*
     3.5 + * To change this template, choose Tools | Templates
     3.6 + * and open the template in the editor.
     3.7 + */
     3.8 +package org.apidesign.java4browser;
     3.9 +
    3.10 +/**
    3.11 + *
    3.12 + * @author Jaroslav Tulach <jtulach@netbeans.org>
    3.13 + */
    3.14 +public class InstanceSub extends Instance {
    3.15 +    public InstanceSub(int i, double d) {
    3.16 +        super(i, d);
    3.17 +    }
    3.18 +    
    3.19 +    @Override
    3.20 +    public void setByte(byte b) {
    3.21 +        super.setByte((byte) (b + 1));
    3.22 +    }
    3.23 +}
     4.1 --- a/src/test/java/org/apidesign/java4browser/InstanceTest.java	Wed Sep 19 19:29:05 2012 +0200
     4.2 +++ b/src/test/java/org/apidesign/java4browser/InstanceTest.java	Wed Sep 19 19:57:45 2012 +0200
     4.3 @@ -37,15 +37,15 @@
     4.4      }
     4.5      @Test public void verifyInstanceMethods() throws Exception {
     4.6          assertExec(
     4.7 -            "Should be ten",
     4.8 +            "Should be eleven as we invoke overwritten method",
     4.9              "org_apidesign_java4browser_Instance_virtualBytesB",
    4.10 -            Double.valueOf(10)
    4.11 +            Double.valueOf(11)
    4.12          );
    4.13      }
    4.14      
    4.15      private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
    4.16          StringBuilder sb = new StringBuilder();
    4.17 -        Invocable i = StaticMethodTest.compileClass("Instance.class", sb);
    4.18 +        Invocable i = StaticMethodTest.compileClass(sb, "Instance.class", "InstanceSub.class");
    4.19          
    4.20          Object ret = null;
    4.21          try {
     5.1 --- a/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Wed Sep 19 19:29:05 2012 +0200
     5.2 +++ b/src/test/java/org/apidesign/java4browser/StaticMethodTest.java	Wed Sep 19 19:57:45 2012 +0200
     5.3 @@ -131,7 +131,7 @@
     5.4      
     5.5      private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
     5.6          StringBuilder sb = new StringBuilder();
     5.7 -        Invocable i = compileClass("StaticMethod.class", sb);
     5.8 +        Invocable i = compileClass(sb, "StaticMethod.class");
     5.9          
    5.10          Object ret = null;
    5.11          try {
    5.12 @@ -151,13 +151,15 @@
    5.13          
    5.14      }
    5.15  
    5.16 -    static Invocable compileClass(String name, StringBuilder sb) throws ScriptException, IOException {
    5.17 -        InputStream is = StaticMethodTest.class.getResourceAsStream(name);
    5.18 -        assertNotNull(is, "Class file found");
    5.19 -        if (sb == null) {
    5.20 -            sb = new StringBuilder();
    5.21 +    static Invocable compileClass(StringBuilder sb, String... names) throws ScriptException, IOException {
    5.22 +        for (String name : names) {
    5.23 +            InputStream is = StaticMethodTest.class.getResourceAsStream(name);
    5.24 +            assertNotNull(is, "Class file found");
    5.25 +            if (sb == null) {
    5.26 +                sb = new StringBuilder();
    5.27 +            }
    5.28 +            ByteCodeToJavaScript.compile(name, is, sb);
    5.29          }
    5.30 -        ByteCodeToJavaScript.compile(name, is, sb);
    5.31          ScriptEngineManager sem = new ScriptEngineManager();
    5.32          ScriptEngine js = sem.getEngineByExtension("js");
    5.33          try {