Double and long invocation conventions fixed javap
authorJaroslav Tulach <jtulach@netbeans.org>
Mon, 12 Nov 2012 21:05:23 +0100
branchjavap
changeset 1563bb1a148a795
parent 155 0c97ae810dff
child 157 0d8b472b9047
Double and long invocation conventions fixed
vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
     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++;