# HG changeset patch # User Jaroslav Tulach # Date 1348575552 -7200 # Node ID 82476405e1ad8c489dc5af05d0cccd7b28e18130 # Parent 3072c9fab69c5f6c63d18ce8b3f5c6922e68172c Handle methods that take and return array arguments diff -r 3072c9fab69c -r 82476405e1ad vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Sep 25 12:38:07 2012 +0200 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Tue Sep 25 14:19:12 2012 +0200 @@ -129,7 +129,7 @@ out.append(space); out.append("arg").append(String.valueOf(index)); space = ","; - final String desc = args.get(i).getDescriptor(); + final String desc = findDescriptor(args.get(i).getDescriptor()); if ("D".equals(desc) || "J".equals(desc)) { index += 2; } else { @@ -169,7 +169,7 @@ for (int index = 1, i = 0; i < args.size(); i++) { out.append(space); out.append("arg").append(String.valueOf(index)); - final String desc = args.get(i).getDescriptor(); + final String desc = findDescriptor(args.get(i).getDescriptor()); if ("D".equals(desc) || "J".equals(desc)) { index += 2; } else { @@ -633,6 +633,7 @@ int cnt = 0; int i = 0; Boolean count = null; + boolean array = false; int firstPos = sig.length(); while (i < descriptor.length()) { char ch = descriptor.charAt(i++); @@ -643,6 +644,9 @@ case ')': count = false; continue; + case 'A': + array = true; + break; case 'B': case 'C': case 'D': @@ -653,10 +657,16 @@ case 'Z': if (count) { cnt++; + if (array) { + sig.append('A'); + } sig.append(ch); } else { hasReturnType[0] = true; sig.insert(firstPos, ch); + if (array) { + sig.insert(firstPos, 'A'); + } } continue; case 'V': @@ -668,11 +678,17 @@ int next = descriptor.indexOf(';', i); if (count) { cnt++; + if (array) { + sig.append('A'); + } sig.append(ch); sig.append(descriptor.substring(i, next).replace('/', '_')); } else { sig.insert(firstPos, descriptor.substring(i, next).replace('/', '_')); sig.insert(firstPos, ch); + if (array) { + sig.append('A'); + } hasReturnType[0] = true; } i = next + 1; @@ -701,11 +717,11 @@ tmp.append("classV"); // NOI18N } else { tmp.append(m.getName()); - outType(m.getReturnType(), tmp); + outType(findDescriptor(m.getReturnType()), tmp); } List args = m.getParameters(); for (Parameter t : args) { - outType(t.getDescriptor(), tmp); + outType(findDescriptor(t.getDescriptor()), tmp); } return tmp.toString(); } @@ -717,7 +733,7 @@ } else { name.append(mi.getName()); } - cnt[0] = countArgs(mi.getDescriptor(), hasReturn, name); + cnt[0] = countArgs(findDescriptor(mi.getDescriptor()), hasReturn, name); return name.toString(); } @@ -816,4 +832,8 @@ } return v; } + + private String findDescriptor(String d) { + return d.replace('[', 'A'); + } } diff -r 3072c9fab69c -r 82476405e1ad vm/src/test/java/org/apidesign/vm4brwsr/Array.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/Array.java Tue Sep 25 12:38:07 2012 +0200 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/Array.java Tue Sep 25 14:19:12 2012 +0200 @@ -39,8 +39,8 @@ return shorts[1]; } - int ints() { - return ints[2]; + int[] ints() { + return ints; } float floats() { @@ -58,7 +58,7 @@ for (int i = 0; i < ARR.length; i++) { sum += ARR[i].bytes(); sum += ARR[i].shorts(); - sum += ARR[i].ints(); + sum += ARR[i].ints()[2]; sum += ARR[i].floats(); sum += ARR[i].doubles(); }