# HG changeset patch # User Jaroslav Tulach # Date 1348077465 -7200 # Node ID 99f832e5765ff43b7b8e8efea4d7d24cd65b83ed # Parent 282828609b8622ae297ec9ac3f1ccc442a51412f Can invoke overwritten methods diff -r 282828609b86 -r 99f832e5765f src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Wed Sep 19 19:29:05 2012 +0200 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Wed Sep 19 19:57:45 2012 +0200 @@ -26,6 +26,7 @@ import org.netbeans.modules.classfile.CPFieldInfo; import org.netbeans.modules.classfile.CPMethodInfo; import org.netbeans.modules.classfile.ClassFile; +import org.netbeans.modules.classfile.ClassName; import org.netbeans.modules.classfile.Code; import org.netbeans.modules.classfile.Method; import org.netbeans.modules.classfile.Parameter; @@ -65,9 +66,11 @@ compiler.generateStaticField(v); } } + out.append("function java_lang_Object(){}\n"); // XXX temporary out.append("function java_lang_Object_consV(self){}\n"); // XXX temporary - out.append("\nfunction ").append(jc.getName().getExternalName().replace('.', '_')); + final String className = jc.getName().getExternalName().replace('.', '_'); + out.append("\nfunction ").append(className); out.append("() {"); for (Method m : jc.getMethods()) { if (!m.isStatic()) { @@ -80,6 +83,11 @@ } } out.append("\n}"); + ClassName sc = jc.getSuperClass(); + if (sc != null) { + out.append("\n ").append(className) + .append(".prototype = new ").append(sc.getExternalName().replace('.', '_')); + } } private void generateStaticMethod(Method m) throws IOException { out.append("\nfunction ").append( diff -r 282828609b86 -r 99f832e5765f src/test/java/org/apidesign/java4browser/Instance.java --- a/src/test/java/org/apidesign/java4browser/Instance.java Wed Sep 19 19:29:05 2012 +0200 +++ b/src/test/java/org/apidesign/java4browser/Instance.java Wed Sep 19 19:57:45 2012 +0200 @@ -43,7 +43,7 @@ return (i.i - i.b) * i.d; } public static byte virtualBytes() { - Instance i = new Instance(); + Instance i = new InstanceSub(7, 2.2d); i.setByte((byte)0x0a); return i.getByte(); } diff -r 282828609b86 -r 99f832e5765f src/test/java/org/apidesign/java4browser/InstanceSub.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/org/apidesign/java4browser/InstanceSub.java Wed Sep 19 19:57:45 2012 +0200 @@ -0,0 +1,20 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.apidesign.java4browser; + +/** + * + * @author Jaroslav Tulach + */ +public class InstanceSub extends Instance { + public InstanceSub(int i, double d) { + super(i, d); + } + + @Override + public void setByte(byte b) { + super.setByte((byte) (b + 1)); + } +} diff -r 282828609b86 -r 99f832e5765f src/test/java/org/apidesign/java4browser/InstanceTest.java --- a/src/test/java/org/apidesign/java4browser/InstanceTest.java Wed Sep 19 19:29:05 2012 +0200 +++ b/src/test/java/org/apidesign/java4browser/InstanceTest.java Wed Sep 19 19:57:45 2012 +0200 @@ -37,15 +37,15 @@ } @Test public void verifyInstanceMethods() throws Exception { assertExec( - "Should be ten", + "Should be eleven as we invoke overwritten method", "org_apidesign_java4browser_Instance_virtualBytesB", - Double.valueOf(10) + Double.valueOf(11) ); } private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception { StringBuilder sb = new StringBuilder(); - Invocable i = StaticMethodTest.compileClass("Instance.class", sb); + Invocable i = StaticMethodTest.compileClass(sb, "Instance.class", "InstanceSub.class"); Object ret = null; try { diff -r 282828609b86 -r 99f832e5765f src/test/java/org/apidesign/java4browser/StaticMethodTest.java --- a/src/test/java/org/apidesign/java4browser/StaticMethodTest.java Wed Sep 19 19:29:05 2012 +0200 +++ b/src/test/java/org/apidesign/java4browser/StaticMethodTest.java Wed Sep 19 19:57:45 2012 +0200 @@ -131,7 +131,7 @@ private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception { StringBuilder sb = new StringBuilder(); - Invocable i = compileClass("StaticMethod.class", sb); + Invocable i = compileClass(sb, "StaticMethod.class"); Object ret = null; try { @@ -151,13 +151,15 @@ } - static Invocable compileClass(String name, StringBuilder sb) throws ScriptException, IOException { - InputStream is = StaticMethodTest.class.getResourceAsStream(name); - assertNotNull(is, "Class file found"); - if (sb == null) { - sb = new StringBuilder(); + static Invocable compileClass(StringBuilder sb, String... names) throws ScriptException, IOException { + for (String name : names) { + InputStream is = StaticMethodTest.class.getResourceAsStream(name); + assertNotNull(is, "Class file found"); + if (sb == null) { + sb = new StringBuilder(); + } + ByteCodeToJavaScript.compile(name, is, sb); } - ByteCodeToJavaScript.compile(name, is, sb); ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine js = sem.getEngineByExtension("js"); try {