diff -r b9318fe303cd -r 7efb52f76270 vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Sep 24 11:07:38 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; } }