1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Sep 28 08:00:05 2012 +0200
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Fri Sep 28 12:58:20 2012 +0200
1.3 @@ -588,9 +588,13 @@
1.4 case bc_checkcast: {
1.5 int indx = readIntArg(byteCodes, i);
1.6 CPClassInfo ci = jc.getConstantPool().getClass(indx);
1.7 - out.append("if(stack[stack.length - 1].$instOf_")
1.8 - .append(ci.getClassName().getInternalName().replace('/', '_'))
1.9 - .append(" != 1) throw {};"); // XXX proper exception
1.10 + final String type = ci.getClassName().getType();
1.11 + if (!type.startsWith("[")) {
1.12 + // no way to check arrays right now
1.13 + out.append("if(stack[stack.length - 1].$instOf_")
1.14 + .append(type.replace('/', '_'))
1.15 + .append(" != 1) throw {};"); // XXX proper exception
1.16 + }
1.17 i += 2;
1.18 break;
1.19 }
1.20 @@ -710,24 +714,24 @@
1.21 }
1.22
1.23 private String findMethodName(Method m) {
1.24 - StringBuilder tmp = new StringBuilder();
1.25 + StringBuilder name = new StringBuilder();
1.26 + String descr = m.getDescriptor();
1.27 if ("<init>".equals(m.getName())) { // NOI18N
1.28 - tmp.append("consV"); // NOI18N
1.29 + name.append("cons"); // NOI18N
1.30 } else if ("<clinit>".equals(m.getName())) { // NOI18N
1.31 - tmp.append("classV"); // NOI18N
1.32 + name.append("class"); // NOI18N
1.33 } else {
1.34 - tmp.append(m.getName());
1.35 - outType(m.getReturnType(), tmp);
1.36 + name.append(m.getName());
1.37 }
1.38 - List<Parameter> args = m.getParameters();
1.39 - for (Parameter t : args) {
1.40 - outType(t.getDescriptor(), tmp);
1.41 - }
1.42 - return tmp.toString();
1.43 +
1.44 + boolean hasReturn[] = { false };
1.45 + countArgs(findDescriptor(m.getDescriptor()), hasReturn, name);
1.46 + return name.toString();
1.47 }
1.48
1.49 private String findMethodName(CPMethodInfo mi, int[] cnt, boolean[] hasReturn) {
1.50 StringBuilder name = new StringBuilder();
1.51 + String descr = mi.getDescriptor();
1.52 if ("<init>".equals(mi.getName())) { // NOI18N
1.53 name.append("cons"); // NOI18N
1.54 } else {