# HG changeset patch # User Jaroslav Tulach # Date 1348129619 -7200 # Node ID 6e8e00258234457c643062cdfe7ac85bad6529fe # Parent 65f6fdfd34b6edd5b891d27db1104b9e0940af90 Methods that accept and return objects are supported diff -r 65f6fdfd34b6 -r 6e8e00258234 src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java --- a/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Thu Sep 20 09:29:42 2012 +0200 +++ b/src/main/java/org/apidesign/java4browser/ByteCodeToJavaScript.java Thu Sep 20 10:26:59 2012 +0200 @@ -355,6 +355,20 @@ i += 2; break; } + case bc_ifnonnull: { + int indx = i + readIntArg(byteCodes, i); + out.append("if (stack.pop()) { gt = " + indx); + out.append("; continue; }"); + i += 2; + break; + } + case bc_ifnull: { + int indx = i + readIntArg(byteCodes, i); + out.append("if (!stack.pop()) { gt = " + indx); + out.append("; continue; }"); + i += 2; + break; + } case bc_if_icmpne: i = generateIf(byteCodes, i, "!="); break; @@ -494,12 +508,17 @@ sig.insert(firstPos, 'V'); continue; case 'L': - i = descriptor.indexOf(';', i); + int next = descriptor.indexOf(';', i); if (count) { cnt++; + sig.append(ch); + sig.append(descriptor.substring(i, next).replace('/', '_')); } else { + sig.insert(firstPos, descriptor.substring(i, next).replace('/', '_')); + sig.insert(firstPos, ch); hasReturnType[0] = true; } + i = next + 1; continue; case '[': //arrays++; @@ -523,11 +542,11 @@ out.append("consV"); // NOI18N } else { out.append(m.getName()); - out.append(m.getReturnType()); + outType(m.getReturnType(), out); } List args = m.getParameters(); for (Parameter t : args) { - out.append(t.getDescriptor()); + outType(t.getDescriptor(), out); } return out.toString(); } @@ -611,4 +630,13 @@ i += 2; return i; } + + private void outType(final String d, StringBuilder out) { + if (d.charAt(0) == 'L') { + assert d.charAt(d.length() - 1) == ';'; + out.append(d.replace('/', '_').substring(0, d.length() - 1)); + } else { + out.append(d); + } + } } diff -r 65f6fdfd34b6 -r 6e8e00258234 src/test/java/org/apidesign/java4browser/Instance.java --- a/src/test/java/org/apidesign/java4browser/Instance.java Thu Sep 20 09:29:42 2012 +0200 +++ b/src/test/java/org/apidesign/java4browser/Instance.java Thu Sep 20 10:26:59 2012 +0200 @@ -53,4 +53,17 @@ GetByte i = new InstanceSub(7, 2.2d); return i.getByte(); } + public static boolean instanceOf(boolean sub) { + Instance i = createInstance(sub); + return isInstanceSubOf(i); + } + 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 boolean isNull() { + return createInstance(true) == null; + } } diff -r 65f6fdfd34b6 -r 6e8e00258234 src/test/java/org/apidesign/java4browser/InstanceTest.java --- a/src/test/java/org/apidesign/java4browser/InstanceTest.java Thu Sep 20 09:29:42 2012 +0200 +++ b/src/test/java/org/apidesign/java4browser/InstanceTest.java Thu Sep 20 10:26:59 2012 +0200 @@ -49,7 +49,31 @@ Double.valueOf(31) ); } - + + @Test public void isNull() throws Exception { + assertExec( + "Yes, we are instance", + "org_apidesign_java4browser_Instance_isNullZ", + Double.valueOf(0.0) + ); + } + /* + @Test public void isInstanceOf() throws Exception { + assertExec( + "Yes, we are instance", + "org_apidesign_java4browser_Instance_instanceOfZZ", + Double.valueOf(1.0), true + ); + } + + @Test public void notInstanceOf() throws Exception { + assertExec( + "No, we are not an instance", + "org_apidesign_java4browser_Instance_instanceOfZZ", + Double.valueOf(0.0), false + ); + } + */ private static void assertExec(String msg, String methodName, Object expRes, Object... args) throws Exception { StringBuilder sb = new StringBuilder(); Invocable i = StaticMethodTest.compileClass(sb, "Instance.class", "InstanceSub.class");