Handle methods that take and return array arguments
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 25 Sep 2012 14:19:12 +0200
changeset 3282476405e1ad
parent 31 3072c9fab69c
child 33 96e44a3f544d
Handle methods that take and return array arguments
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
vm/src/test/java/org/apidesign/vm4brwsr/Array.java
     1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Sep 25 12:38:07 2012 +0200
     1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Tue Sep 25 14:19:12 2012 +0200
     1.3 @@ -129,7 +129,7 @@
     1.4              out.append(space);
     1.5              out.append("arg").append(String.valueOf(index));
     1.6              space = ",";
     1.7 -            final String desc = args.get(i).getDescriptor();
     1.8 +            final String desc = findDescriptor(args.get(i).getDescriptor());
     1.9              if ("D".equals(desc) || "J".equals(desc)) {
    1.10                  index += 2;
    1.11              } else {
    1.12 @@ -169,7 +169,7 @@
    1.13          for (int index = 1, i = 0; i < args.size(); i++) {
    1.14              out.append(space);
    1.15              out.append("arg").append(String.valueOf(index));
    1.16 -            final String desc = args.get(i).getDescriptor();
    1.17 +            final String desc = findDescriptor(args.get(i).getDescriptor());
    1.18              if ("D".equals(desc) || "J".equals(desc)) {
    1.19                  index += 2;
    1.20              } else {
    1.21 @@ -633,6 +633,7 @@
    1.22          int cnt = 0;
    1.23          int i = 0;
    1.24          Boolean count = null;
    1.25 +        boolean array = false;
    1.26          int firstPos = sig.length();
    1.27          while (i < descriptor.length()) {
    1.28              char ch = descriptor.charAt(i++);
    1.29 @@ -643,6 +644,9 @@
    1.30                  case ')':
    1.31                      count = false;
    1.32                      continue;
    1.33 +                case 'A':
    1.34 +                    array = true;
    1.35 +                    break;
    1.36                  case 'B': 
    1.37                  case 'C': 
    1.38                  case 'D': 
    1.39 @@ -653,10 +657,16 @@
    1.40                  case 'Z': 
    1.41                      if (count) {
    1.42                          cnt++;
    1.43 +                        if (array) {
    1.44 +                            sig.append('A');
    1.45 +                        }
    1.46                          sig.append(ch);
    1.47                      } else {
    1.48                          hasReturnType[0] = true;
    1.49                          sig.insert(firstPos, ch);
    1.50 +                        if (array) {
    1.51 +                            sig.insert(firstPos, 'A');
    1.52 +                        }
    1.53                      }
    1.54                      continue;
    1.55                  case 'V': 
    1.56 @@ -668,11 +678,17 @@
    1.57                      int next = descriptor.indexOf(';', i);
    1.58                      if (count) {
    1.59                          cnt++;
    1.60 +                        if (array) {
    1.61 +                            sig.append('A');
    1.62 +                        }
    1.63                          sig.append(ch);
    1.64                          sig.append(descriptor.substring(i, next).replace('/', '_'));
    1.65                      } else {
    1.66                          sig.insert(firstPos, descriptor.substring(i, next).replace('/', '_'));
    1.67                          sig.insert(firstPos, ch);
    1.68 +                        if (array) {
    1.69 +                            sig.append('A');
    1.70 +                        }
    1.71                          hasReturnType[0] = true;
    1.72                      }
    1.73                      i = next + 1;
    1.74 @@ -701,11 +717,11 @@
    1.75              tmp.append("classV"); // NOI18N
    1.76          } else {
    1.77              tmp.append(m.getName());
    1.78 -            outType(m.getReturnType(), tmp);
    1.79 +            outType(findDescriptor(m.getReturnType()), tmp);
    1.80          } 
    1.81          List<Parameter> args = m.getParameters();
    1.82          for (Parameter t : args) {
    1.83 -            outType(t.getDescriptor(), tmp);
    1.84 +            outType(findDescriptor(t.getDescriptor()), tmp);
    1.85          }
    1.86          return tmp.toString();
    1.87      }
    1.88 @@ -717,7 +733,7 @@
    1.89          } else {
    1.90              name.append(mi.getName());
    1.91          }
    1.92 -        cnt[0] = countArgs(mi.getDescriptor(), hasReturn, name);
    1.93 +        cnt[0] = countArgs(findDescriptor(mi.getDescriptor()), hasReturn, name);
    1.94          return name.toString();
    1.95      }
    1.96  
    1.97 @@ -816,4 +832,8 @@
    1.98          }
    1.99          return v;
   1.100      }
   1.101 +
   1.102 +    private String findDescriptor(String d) {
   1.103 +        return d.replace('[', 'A');
   1.104 +    }
   1.105  }
     2.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/Array.java	Tue Sep 25 12:38:07 2012 +0200
     2.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Array.java	Tue Sep 25 14:19:12 2012 +0200
     2.3 @@ -39,8 +39,8 @@
     2.4          return shorts[1];
     2.5      }
     2.6      
     2.7 -    int ints() {
     2.8 -        return ints[2];
     2.9 +    int[] ints() {
    2.10 +        return ints;
    2.11      }
    2.12      
    2.13      float floats() {
    2.14 @@ -58,7 +58,7 @@
    2.15          for (int i = 0; i < ARR.length; i++) {
    2.16              sum += ARR[i].bytes();
    2.17              sum += ARR[i].shorts();
    2.18 -            sum += ARR[i].ints();
    2.19 +            sum += ARR[i].ints()[2];
    2.20              sum += ARR[i].floats();
    2.21              sum += ARR[i].doubles();
    2.22          }