# HG changeset patch # User Jaroslav Tulach # Date 1348568789 -7200 # Node ID 7efb52f76270b4dc068e07bea62b493b412b4f6c # Parent dcb98731b000c2bd91dc5aba0bf3d8ca925e8eeb Support for casts diff -r dcb98731b000 -r 7efb52f76270 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Sep 25 12:11:03 2012 +0200 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Sep 25 12:26:29 2012 +0200 @@ -101,6 +101,9 @@ } } out.append("\n this.$instOf_").append(className).append(" = true;"); + for (ClassName superInterface : jc.getInterfaces()) { + out.append("\n this.$instOf_").append(superInterface.getInternalName().replace('/', '_')).append(" = true;"); + } out.append("\n}"); ClassName sc = jc.getSuperClass(); if (sc != null) { @@ -569,6 +572,15 @@ i += 2; break; } + case bc_checkcast: { + int indx = readIntArg(byteCodes, i); + CPClassInfo ci = jc.getConstantPool().getClass(indx); + out.append("if(stack[stack.length - 1].$instOf_") + .append(ci.getClassName().getInternalName().replace('/', '_')) + .append(" != 1) throw {};"); // XXX proper exception + i += 2; + break; + } case bc_instanceof: { int indx = readIntArg(byteCodes, i); CPClassInfo ci = jc.getConstantPool().getClass(indx); @@ -576,6 +588,7 @@ .append(ci.getClassName().getInternalName().replace('/', '_')) .append(" ? 1 : 0);"); i += 2; + break; } } diff -r dcb98731b000 -r 7efb52f76270 vm/src/test/java/org/apidesign/vm4brwsr/Instance.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Tue Sep 25 12:11:03 2012 +0200 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Tue Sep 25 12:26:29 2012 +0200 @@ -70,6 +70,16 @@ Instance i = createInstance(sub); return isInstanceSubOf(i); } + public static int castsWork(boolean interfc) { + Instance i = createInstance(true); + if (interfc) { + GetByte b = (GetByte)i; + } else { + InstanceSub s = (InstanceSub)i; + } + return 5; + } + private static boolean isInstanceSubOf(Instance instance) { return instance instanceof InstanceSub; } diff -r dcb98731b000 -r 7efb52f76270 vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Tue Sep 25 12:11:03 2012 +0200 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Tue Sep 25 12:26:29 2012 +0200 @@ -87,6 +87,21 @@ ); } + @Test public void verifyCastToClass() throws Exception { + assertExec( + "Five signals all is good", + "org_apidesign_vm4brwsr_Instance_castsWorkIZ", + Double.valueOf(5.0), false + ); + } + @Test public void verifyCastToInterface() throws Exception { + assertExec( + "Five signals all is good", + "org_apidesign_vm4brwsr_Instance_castsWorkIZ", + Double.valueOf(5.0), true + ); + } + private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception { StringBuilder sb = new StringBuilder(); Invocable i = StaticMethodTest.compileClass(sb,