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 }