1.1 --- a/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Nov 12 20:08:36 2012 +0100
1.2 +++ b/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Nov 12 21:05:23 2012 +0100
1.3 @@ -139,7 +139,7 @@
1.4 if (javaScriptBody(m, true)) {
1.5 return;
1.6 }
1.7 - int[] argsCnt = { -1 };
1.8 + StringBuilder argsCnt = new StringBuilder();
1.9 final String mn = findMethodName(m, argsCnt);
1.10 out.append("\nfunction ").append(
1.11 className(jc)
1.12 @@ -149,12 +149,12 @@
1.13 }
1.14 out.append('(');
1.15 String space = "";
1.16 - for (int index = 0, i = 0; i < argsCnt[0]; i++) {
1.17 + for (int index = 0, i = 0; i < argsCnt.length(); i++) {
1.18 out.append(space);
1.19 out.append("arg").append(String.valueOf(index));
1.20 space = ",";
1.21 final String desc = null;// XXX findDescriptor(args.get(i).getDescriptor());
1.22 - if ("D".equals(desc) || "J".equals(desc)) {
1.23 + if (argsCnt.charAt(i) == '1') {
1.24 index += 2;
1.25 } else {
1.26 index++;
1.27 @@ -164,7 +164,7 @@
1.28 final byte[] code = m.getCode();
1.29 if (code != null) {
1.30 int len = m.getMaxLocals();
1.31 - for (int index = argsCnt[0], i = argsCnt[0]; i < len; i++) {
1.32 + for (int index = argsCnt.length(), i = argsCnt.length(); i < len; i++) {
1.33 out.append(" var ");
1.34 out.append("arg").append(String.valueOf(i)).append(";\n");
1.35 }
1.36 @@ -177,7 +177,7 @@
1.37 }
1.38
1.39 private void generateMethodReference(String prefix, MethodData m) throws IOException {
1.40 - final String name = findMethodName(m, null);
1.41 + final String name = findMethodName(m, new StringBuilder());
1.42 out.append(prefix).append(name).append(" = ")
1.43 .append(className(jc))
1.44 .append('_').append(name).append(";");
1.45 @@ -187,17 +187,16 @@
1.46 if (javaScriptBody(m, false)) {
1.47 return;
1.48 }
1.49 - int[] argsCnt = { -1 };
1.50 + StringBuilder argsCnt = new StringBuilder();
1.51 out.append("\nfunction ").append(
1.52 className(jc)
1.53 ).append('_').append(findMethodName(m, argsCnt));
1.54 out.append("(arg0");
1.55 String space = ",";
1.56 - for (int index = 1, i = 0; i < argsCnt[0]; i++) {
1.57 + for (int index = 1, i = 0; i < argsCnt.length(); i++) {
1.58 out.append(space);
1.59 out.append("arg").append(String.valueOf(index));
1.60 - final String desc = null;// XXX findDescriptor(args.get(i).getDescriptor());
1.61 - if ("D".equals(desc) || "J".equals(desc)) {
1.62 + if (argsCnt.charAt(i) == '1') {
1.63 index += 2;
1.64 } else {
1.65 index++;
1.66 @@ -207,7 +206,7 @@
1.67 final byte[] code = m.getCode();
1.68 if (code != null) {
1.69 int len = m.getMaxLocals();
1.70 - for (int index = argsCnt[0], i = argsCnt[0]; i < len; i++) {
1.71 + for (int index = argsCnt.length(), i = argsCnt.length(); i < len; i++) {
1.72 out.append(" var ");
1.73 out.append("arg").append(String.valueOf(i + 1)).append(";\n");
1.74 }
1.75 @@ -766,8 +765,7 @@
1.76 return (byteCodes[offsetInstruction] + 256) % 256;
1.77 }
1.78
1.79 - private static int countArgs(String descriptor, boolean[] hasReturnType, StringBuilder sig) {
1.80 - int cnt = 0;
1.81 + private static void countArgs(String descriptor, boolean[] hasReturnType, StringBuilder sig, StringBuilder cnt) {
1.82 int i = 0;
1.83 Boolean count = null;
1.84 boolean array = false;
1.85 @@ -793,11 +791,15 @@
1.86 case 'S':
1.87 case 'Z':
1.88 if (count) {
1.89 - cnt++;
1.90 if (array) {
1.91 sig.append('A');
1.92 }
1.93 sig.append(ch);
1.94 + if (ch == 'J' || ch == 'D') {
1.95 + cnt.append('1');
1.96 + } else {
1.97 + cnt.append('0');
1.98 + }
1.99 } else {
1.100 hasReturnType[0] = true;
1.101 sig.insert(firstPos, ch);
1.102 @@ -815,12 +817,12 @@
1.103 case 'L':
1.104 int next = descriptor.indexOf(';', i);
1.105 if (count) {
1.106 - cnt++;
1.107 if (array) {
1.108 sig.append('A');
1.109 }
1.110 sig.append(ch);
1.111 sig.append(descriptor.substring(i, next).replace('/', '_'));
1.112 + cnt.append('0');
1.113 } else {
1.114 sig.insert(firstPos, descriptor.substring(i, next).replace('/', '_'));
1.115 sig.insert(firstPos, ch);
1.116 @@ -838,7 +840,6 @@
1.117 break; // invalid character
1.118 }
1.119 }
1.120 - return cnt;
1.121 }
1.122
1.123 private void generateStaticField(FieldData v) throws IOException {
1.124 @@ -847,7 +848,7 @@
1.125 .append('_').append(v.getName()).append(" = 0;");
1.126 }
1.127
1.128 - private String findMethodName(MethodData m, int[] cnt) {
1.129 + private String findMethodName(MethodData m, StringBuilder cnt) {
1.130 StringBuilder name = new StringBuilder();
1.131 if ("<init>".equals(m.getName())) { // NOI18N
1.132 name.append("cons"); // NOI18N
1.133 @@ -858,14 +859,11 @@
1.134 }
1.135
1.136 boolean hasReturn[] = { false };
1.137 - int argsCnt = countArgs(findDescriptor(m.getInternalSig()), hasReturn, name);
1.138 - if (cnt != null) {
1.139 - cnt[0] = argsCnt;
1.140 - }
1.141 + countArgs(findDescriptor(m.getInternalSig()), hasReturn, name, cnt);
1.142 return name.toString();
1.143 }
1.144
1.145 - private String findMethodName(String[] mi, int[] cnt, boolean[] hasReturn) {
1.146 + private String findMethodName(String[] mi, StringBuilder cnt, boolean[] hasReturn) {
1.147 StringBuilder name = new StringBuilder();
1.148 String descr = mi[2];//mi.getDescriptor();
1.149 String nm= mi[1];
1.150 @@ -874,7 +872,7 @@
1.151 } else {
1.152 name.append(nm);
1.153 }
1.154 - cnt[0] = countArgs(findDescriptor(descr), hasReturn, name);
1.155 + countArgs(findDescriptor(descr), hasReturn, name, cnt);
1.156 return name.toString();
1.157 }
1.158
1.159 @@ -883,10 +881,10 @@
1.160 int methodIndex = readIntArg(byteCodes, i);
1.161 String[] mi = jc.getFieldInfoName(methodIndex);
1.162 boolean[] hasReturn = { false };
1.163 - int[] cnt = { 0 };
1.164 + StringBuilder cnt = new StringBuilder();
1.165 String mn = findMethodName(mi, cnt, hasReturn);
1.166 out.append("{ ");
1.167 - for (int j = cnt[0] - 1; j >= 0; j--) {
1.168 + for (int j = cnt.length() - 1; j >= 0; j--) {
1.169 out.append("var v" + j).append(" = stack.pop(); ");
1.170 }
1.171
1.172 @@ -907,7 +905,7 @@
1.173 out.append("stack.pop()");
1.174 sep = ", ";
1.175 }
1.176 - for (int j = 0; j < cnt[0]; j++) {
1.177 + for (int j = 0; j < cnt.length(); j++) {
1.178 out.append(sep);
1.179 out.append("v" + j);
1.180 sep = ", ";
1.181 @@ -926,10 +924,10 @@
1.182 int methodIndex = readIntArg(byteCodes, i);
1.183 String[] mi = jc.getFieldInfoName(methodIndex);
1.184 boolean[] hasReturn = { false };
1.185 - int[] cnt = { 0 };
1.186 + StringBuilder cnt = new StringBuilder();
1.187 String mn = findMethodName(mi, cnt, hasReturn);
1.188 out.append("{ ");
1.189 - for (int j = cnt[0] - 1; j >= 0; j--) {
1.190 + for (int j = cnt.length() - 1; j >= 0; j--) {
1.191 out.append("var v" + j).append(" = stack.pop(); ");
1.192 }
1.193 out.append("var self = stack.pop(); ");
1.194 @@ -940,7 +938,7 @@
1.195 out.append(mn);
1.196 out.append('(');
1.197 out.append("self");
1.198 - for (int j = 0; j < cnt[0]; j++) {
1.199 + for (int j = 0; j < cnt.length(); j++) {
1.200 out.append(", ");
1.201 out.append("v" + j);
1.202 }
1.203 @@ -1013,9 +1011,9 @@
1.204 if (p.body == null) {
1.205 return false;
1.206 }
1.207 - int argsCnt[] = { -1 };
1.208 + StringBuilder cnt = new StringBuilder();
1.209 out.append("\nfunction ").append(className(jc)).append('_').
1.210 - append(findMethodName(m, argsCnt));
1.211 + append(findMethodName(m, cnt));
1.212 out.append("(");
1.213 String space;
1.214 int index;
1.215 @@ -1027,7 +1025,7 @@
1.216 space = "";
1.217 index = 0;
1.218 }
1.219 - for (int i = 0; i < argsCnt[0]; i++) {
1.220 + for (int i = 0; i < cnt.length(); i++) {
1.221 out.append(space);
1.222 out.append(p.args[index]);
1.223 index++;