Support for casts
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 25 Sep 2012 12:26:29 +0200
changeset 307efb52f76270
parent 29 dcb98731b000
child 31 3072c9fab69c
Support for casts
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/test/java/org/apidesign/vm4brwsr/Instance.java
vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java
     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,