Unifying the way method names are constructed so they work for arrays as well
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Fri, 28 Sep 2012 12:58:20 +0200
changeset 42f30e2afc8ddb
parent 41 db31d4001c21
child 43 57e370fa2456
child 46 b07c7c256771
Unifying the way method names are constructed so they work for arrays as well
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Sep 28 09:29:53 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 {