1.1 --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Mon Aug 27 15:16:39 2012 +0200
1.2 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Sat Sep 15 22:12:49 2012 +0200
1.3 @@ -21,6 +21,10 @@
1.4 import java.io.InputStream;
1.5 import java.util.List;
1.6 import static org.netbeans.modules.classfile.ByteCodes.*;
1.7 +import org.netbeans.modules.classfile.CPClassInfo;
1.8 +import org.netbeans.modules.classfile.CPEntry;
1.9 +import org.netbeans.modules.classfile.CPFieldInfo;
1.10 +import org.netbeans.modules.classfile.CPLongInfo;
1.11 import org.netbeans.modules.classfile.CPMethodInfo;
1.12 import org.netbeans.modules.classfile.ClassFile;
1.13 import org.netbeans.modules.classfile.Code;
1.14 @@ -137,24 +141,28 @@
1.15 out.append("stack.push(arg").append(indx + ");");
1.16 break;
1.17 }
1.18 + case bc_astore_0:
1.19 case bc_istore_0:
1.20 case bc_lstore_0:
1.21 case bc_fstore_0:
1.22 case bc_dstore_0:
1.23 out.append("arg0 = stack.pop();");
1.24 break;
1.25 + case bc_astore_1:
1.26 case bc_istore_1:
1.27 case bc_lstore_1:
1.28 case bc_fstore_1:
1.29 case bc_dstore_1:
1.30 out.append("arg1 = stack.pop();");
1.31 break;
1.32 + case bc_astore_2:
1.33 case bc_istore_2:
1.34 case bc_lstore_2:
1.35 case bc_fstore_2:
1.36 case bc_dstore_2:
1.37 out.append("arg2 = stack.pop();");
1.38 break;
1.39 + case bc_astore_3:
1.40 case bc_istore_3:
1.41 case bc_lstore_3:
1.42 case bc_fstore_3:
1.43 @@ -262,6 +270,14 @@
1.44 case bc_iconst_5:
1.45 out.append("stack.push(5);");
1.46 break;
1.47 + case bc_ldc_w:
1.48 + case bc_ldc2_w: {
1.49 + int indx = readIntArg(byteCodes, i);
1.50 + CPEntry entry = jc.getConstantPool().get(indx);
1.51 + i += 2;
1.52 + out.append("stack.push(" + entry.getValue() + ");");
1.53 + break;
1.54 + }
1.55 case bc_if_icmpeq: {
1.56 i = generateIf(byteCodes, i, "==");
1.57 break;
1.58 @@ -323,6 +339,37 @@
1.59 i += 2;
1.60 break;
1.61 }
1.62 + case bc_new: {
1.63 + int indx = readIntArg(byteCodes, i);
1.64 + CPClassInfo ci = jc.getConstantPool().getClass(indx);
1.65 + out.append("stack.push(");
1.66 + out.append("new ").append(ci.getClassName().getExternalName().replace('.','_'));
1.67 + out.append("());");
1.68 + i += 2;
1.69 + break;
1.70 + }
1.71 + case bc_dup:
1.72 + out.append("stack.push(stack[stack.length - 1]);");
1.73 + break;
1.74 + case bc_bipush:
1.75 + out.append("stack.push(" + byteCodes[++i] + ");");
1.76 + break;
1.77 + case bc_invokevirtual:
1.78 + case bc_invokespecial: {
1.79 + int indx = readIntArg(byteCodes, i);
1.80 + CPMethodInfo mi = (CPMethodInfo) jc.getConstantPool().get(indx);
1.81 + out.append("{ var tmp = stack.pop(); tmp." + mi.getMethodName() + "(); }");
1.82 + i += 2;
1.83 + break;
1.84 + }
1.85 + case bc_getfield: {
1.86 + int indx = readIntArg(byteCodes, i);
1.87 + CPFieldInfo fi = (CPFieldInfo) jc.getConstantPool().get(indx);
1.88 + out.append(" stack.push(stack.pop().").append(fi.getFieldName()).append(");");
1.89 + i += 2;
1.90 + break;
1.91 + }
1.92 +
1.93 }
1.94 out.append(" /*");
1.95 for (int j = prev; j <= i; j++) {
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/src/test/java/org/apidesign/java4browser/Instance.java Sat Sep 15 22:12:49 2012 +0200
2.3 @@ -0,0 +1,37 @@
2.4 +/*
2.5 + * To change this template, choose Tools | Templates
2.6 + * and open the template in the editor.
2.7 + */
2.8 +package org.apidesign.java4browser;
2.9 +
2.10 +/**
2.11 + *
2.12 + * @author Jaroslav Tulach <jtulach@netbeans.org>
2.13 + */
2.14 +public class Instance {
2.15 + private int i;
2.16 + protected short s;
2.17 + public double d;
2.18 + private float f;
2.19 + protected byte b = (byte)131;
2.20 +
2.21 + public Instance(int i, double d) {
2.22 + this.i = i;
2.23 + this.d = d;
2.24 + }
2.25 +
2.26 + public byte getByte() {
2.27 + return b;
2.28 + }
2.29 +
2.30 + public void setByte(byte b) {
2.31 + this.b = b;
2.32 + }
2.33 +
2.34 + public static double magicOne() {
2.35 + Instance i = new Instance(10, 3.3d);
2.36 + i.setByte((byte)0x09);
2.37 +
2.38 + return (i.i - i.getByte()) * i.d;
2.39 + }
2.40 +}
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/src/test/java/org/apidesign/java4browser/InstanceTest.java Sat Sep 15 22:12:49 2012 +0200
3.3 @@ -0,0 +1,47 @@
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 +import javax.script.Invocable;
3.11 +import javax.script.ScriptException;
3.12 +import org.testng.annotations.Test;
3.13 +import static org.testng.Assert.*;
3.14 +
3.15 +/**
3.16 + *
3.17 + * @author Jaroslav Tulach <jtulach@netbeans.org>
3.18 + */
3.19 +public class InstanceTest {
3.20 + @Test public void verifyMagicOne() throws Exception {
3.21 + assertExec(
3.22 + "Should be seven",
3.23 + "org_apidesign_java4browser_Instance_magicOneD",
3.24 + Double.valueOf(3.3)
3.25 + );
3.26 + }
3.27 +
3.28 + private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
3.29 + StringBuilder sb = new StringBuilder();
3.30 + Invocable i = StaticMethodTest.compileClass("Instance.class", sb);
3.31 +
3.32 + Object ret = null;
3.33 + try {
3.34 + ret = i.invokeFunction(methodName, args);
3.35 + } catch (ScriptException ex) {
3.36 + fail("Execution failed in " + sb, ex);
3.37 + } catch (NoSuchMethodException ex) {
3.38 + fail("Cannot find method in " + sb, ex);
3.39 + }
3.40 + if (ret == null && expRes == null) {
3.41 + return;
3.42 + }
3.43 + if (expRes.equals(ret)) {
3.44 + return;
3.45 + }
3.46 + assertEquals(ret, expRes, msg + "was: " + ret + "\n" + sb);
3.47 +
3.48 + }
3.49 +
3.50 +}