vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
changeset 571 62c327a1e23f
parent 567 62dd2c794431
child 587 a7a45e5e5e77
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Jan 24 00:11:04 2013 +0100
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Thu Jan 24 17:08:02 2013 +0100
     1.3 @@ -1106,11 +1106,13 @@
     1.4                      int indx = readIntArg(byteCodes, i);
     1.5                      final String type = jc.getClassName(indx);
     1.6                      if (!type.startsWith("[")) {
     1.7 -                        // no way to check arrays right now
     1.8 -                        // XXX proper exception
     1.9                          emit(out,
    1.10                               "if (@1 !== null && !@1.$instOf_@2) throw {};",
    1.11                               smapper.getA(0), type.replace('/', '_'));
    1.12 +                    } else {
    1.13 +                        emit(out, "vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@2').cast__Ljava_lang_Object_2Ljava_lang_Object_2(@1);",
    1.14 +                             smapper.getA(0), type
    1.15 +                        );
    1.16                      }
    1.17                      i += 2;
    1.18                      break;
    1.19 @@ -1118,9 +1120,16 @@
    1.20                  case opc_instanceof: {
    1.21                      int indx = readIntArg(byteCodes, i);
    1.22                      final String type = jc.getClassName(indx);
    1.23 -                    emit(out, "var @2 = @1.$instOf_@3 ? 1 : 0;",
    1.24 -                         smapper.popA(), smapper.pushI(),
    1.25 -                         type.replace('/', '_'));
    1.26 +                    if (!type.startsWith("[")) {
    1.27 +                        emit(out, "var @2 = @1.$instOf_@3 ? 1 : 0;",
    1.28 +                             smapper.popA(), smapper.pushI(),
    1.29 +                             type.replace('/', '_'));
    1.30 +                    } else {
    1.31 +                        emit(out, "var @2 = vm.java_lang_Class(false).forName__Ljava_lang_Class_2Ljava_lang_String_2('@3').isInstance__ZLjava_lang_Object_2(@1);",
    1.32 +                            smapper.popA(), smapper.pushI(),
    1.33 +                            type
    1.34 +                        );
    1.35 +                    }
    1.36                      i += 2;
    1.37                      break;
    1.38                  }