# HG changeset patch # User Jaroslav Tulach # Date 1348836300 -7200 # Node ID b07c7c256771d653c61ea34e3640a57d7bc72659 # Parent f30e2afc8ddb4e0d8d4adb2afb0a0b98fda3f6c5 Understands aconst_null. To achieve that we realized that invokeinterface bytecode is followed by four bytes, not just two. diff -r f30e2afc8ddb -r b07c7c256771 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Sep 28 12:58:20 2012 +0200 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Sep 28 14:45:00 2012 +0200 @@ -355,6 +355,9 @@ case bc_i2s: out.append("/* number conversion */"); break; + case bc_aconst_null: + out.append("stack.push(null);"); + break; case bc_iconst_0: case bc_dconst_0: case bc_lconst_0: @@ -485,7 +488,10 @@ i += 2; break; } - case bc_invokeinterface: + case bc_invokeinterface: { + i = invokeVirtualMethod(byteCodes, i) + 2; + break; + } case bc_invokevirtual: i = invokeVirtualMethod(byteCodes, i); break; diff -r f30e2afc8ddb -r b07c7c256771 vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Fri Sep 28 12:58:20 2012 +0200 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethod.java Fri Sep 28 14:45:00 2012 +0200 @@ -24,6 +24,18 @@ public class StaticMethod { private static int cnt; + public static Object none(int x, int y) { + Object toRet = null; + for (int i = x; i < y; i++) { + if (i == 2) { + toRet = null; + } else { + toRet = new Object(); + } + } + return toRet; + } + public static int sum(int x, int y) { return x + y; } diff -r f30e2afc8ddb -r b07c7c256771 vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Fri Sep 28 12:58:20 2012 +0200 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/StaticMethodTest.java Fri Sep 28 14:45:00 2012 +0200 @@ -110,6 +110,13 @@ 3 ); } + @Test public void nullCheck() throws Exception { + assertExec( + "Returns nothing", + "org_apidesign_vm4brwsr_StaticMethod_noneLjava_lang_ObjectII", + null, 1, 3 + ); + } @Test public void and() throws Exception { assertExec( "And will be 3", @@ -143,7 +150,7 @@ if (ret == null && expRes == null) { return; } - if (expRes.equals(ret)) { + if (expRes != null && expRes.equals(ret)) { return; } assertEquals(ret, expRes, msg + "was: " + ret + "\n" + sb);