1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Sep 25 12:11:03 2012 +0200
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Sep 25 12:26:29 2012 +0200
1.3 @@ -101,6 +101,9 @@
1.4 }
1.5 }
1.6 out.append("\n this.$instOf_").append(className).append(" = true;");
1.7 + for (ClassName superInterface : jc.getInterfaces()) {
1.8 + out.append("\n this.$instOf_").append(superInterface.getInternalName().replace('/', '_')).append(" = true;");
1.9 + }
1.10 out.append("\n}");
1.11 ClassName sc = jc.getSuperClass();
1.12 if (sc != null) {
1.13 @@ -569,6 +572,15 @@
1.14 i += 2;
1.15 break;
1.16 }
1.17 + case bc_checkcast: {
1.18 + int indx = readIntArg(byteCodes, i);
1.19 + CPClassInfo ci = jc.getConstantPool().getClass(indx);
1.20 + out.append("if(stack[stack.length - 1].$instOf_")
1.21 + .append(ci.getClassName().getInternalName().replace('/', '_'))
1.22 + .append(" != 1) throw {};"); // XXX proper exception
1.23 + i += 2;
1.24 + break;
1.25 + }
1.26 case bc_instanceof: {
1.27 int indx = readIntArg(byteCodes, i);
1.28 CPClassInfo ci = jc.getConstantPool().getClass(indx);
1.29 @@ -576,6 +588,7 @@
1.30 .append(ci.getClassName().getInternalName().replace('/', '_'))
1.31 .append(" ? 1 : 0);");
1.32 i += 2;
1.33 + break;
1.34 }
1.35
1.36 }
2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Tue Sep 25 12:11:03 2012 +0200
2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Tue Sep 25 12:26:29 2012 +0200
2.3 @@ -70,6 +70,16 @@
2.4 Instance i = createInstance(sub);
2.5 return isInstanceSubOf(i);
2.6 }
2.7 + public static int castsWork(boolean interfc) {
2.8 + Instance i = createInstance(true);
2.9 + if (interfc) {
2.10 + GetByte b = (GetByte)i;
2.11 + } else {
2.12 + InstanceSub s = (InstanceSub)i;
2.13 + }
2.14 + return 5;
2.15 + }
2.16 +
2.17 private static boolean isInstanceSubOf(Instance instance) {
2.18 return instance instanceof InstanceSub;
2.19 }
3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Tue Sep 25 12:11:03 2012 +0200
3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Tue Sep 25 12:26:29 2012 +0200
3.3 @@ -87,6 +87,21 @@
3.4 );
3.5 }
3.6
3.7 + @Test public void verifyCastToClass() throws Exception {
3.8 + assertExec(
3.9 + "Five signals all is good",
3.10 + "org_apidesign_vm4brwsr_Instance_castsWorkIZ",
3.11 + Double.valueOf(5.0), false
3.12 + );
3.13 + }
3.14 + @Test public void verifyCastToInterface() throws Exception {
3.15 + assertExec(
3.16 + "Five signals all is good",
3.17 + "org_apidesign_vm4brwsr_Instance_castsWorkIZ",
3.18 + Double.valueOf(5.0), true
3.19 + );
3.20 + }
3.21 +
3.22 private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception {
3.23 StringBuilder sb = new StringBuilder();
3.24 Invocable i = StaticMethodTest.compileClass(sb,