# HG changeset patch # User Jaroslav Tulach # Date 1359728356 -3600 # Node ID 960ecf7cea5d63c4dfd7a5ac2a1c9e4ef15ca79b # Parent f203b54b3d3385f93dd12e62afed83479239daa2 instanceof works on null diff -r f203b54b3d33 -r 960ecf7cea5d vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Feb 01 14:16:26 2013 +0100 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Feb 01 15:19:16 2013 +0100 @@ -1269,7 +1269,7 @@ int indx = readIntArg(byteCodes, i); final String type = jc.getClassName(indx); if (!type.startsWith("[")) { - emit(out, "var @2 = @1.$instOf_@3 ? 1 : 0;", + emit(out, "var @2 = @1 != null && @1.$instOf_@3 ? 1 : 0;", smapper.popA(), smapper.pushI(), type.replace('/', '_')); } else { diff -r f203b54b3d33 -r 960ecf7cea5d vm/src/test/java/org/apidesign/vm4brwsr/Instance.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Fri Feb 01 14:16:26 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Fri Feb 01 15:19:16 2013 +0100 @@ -68,12 +68,12 @@ GetByte i = new InstanceSub(7, 2.2d); return i.getByte(); } - public static boolean instanceOf(boolean sub) { + public static boolean instanceOf(int sub) { Instance i = createInstance(sub); return isInstanceSubOf(i); } public static int castsWork(boolean interfc) { - Instance i = createInstance(true); + Instance i = createInstance(2); if (interfc) { GetByte b = (GetByte)i; } else { @@ -85,11 +85,16 @@ private static boolean isInstanceSubOf(Instance instance) { return instance instanceof InstanceSub; } - private static Instance createInstance(boolean sub) { - return sub ? new InstanceSub(3, 0) : new Instance(); + private static Instance createInstance(int type) { + switch (type) { + case 0: return null; + case 1: return new Instance(); + case 2: return new InstanceSub(3, 0); + } + throw new IllegalArgumentException(); } private static boolean isNull() { - return createInstance(true) == null; + return createInstance(2) == null; } @JavaScriptBody(args = "obj", body = "return obj.constructor;") diff -r f203b54b3d33 -r 960ecf7cea5d vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Fri Feb 01 14:16:26 2013 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Fri Feb 01 15:19:16 2013 +0100 @@ -80,16 +80,23 @@ @Test public void isInstanceOf() throws Exception { assertExec( "Yes, we are instance", - Instance.class, "instanceOf__ZZ", - Double.valueOf(1.0), true + Instance.class, "instanceOf__ZI", + Double.valueOf(1.0), 2 ); } @Test public void notInstanceOf() throws Exception { assertExec( "No, we are not an instance", - Instance.class, "instanceOf__ZZ", - Double.valueOf(0.0), false + Instance.class, "instanceOf__ZI", + Double.valueOf(0.0), 1 + ); + } + @Test public void nullInstanceOf() throws Exception { + assertExec( + "No, null is not an instance", + Instance.class, "instanceOf__ZI", + Double.valueOf(0.0), 0 ); }