]> source.dussan.org Git - javassist.git/commitdiff
Merge branch 'master' into master 299/head
authorShigeru Chiba <chibash@users.noreply.github.com>
Tue, 10 May 2022 16:54:28 +0000 (01:54 +0900)
committerGitHub <noreply@github.com>
Tue, 10 May 2022 16:54:28 +0000 (01:54 +0900)
1  2 
src/main/javassist/bytecode/SignatureAttribute.java

index 15dbd56c6c4c56c18ff9a8f70c0a1cb4cd24d6ab,6a4830572b60dcb55c1aafe822ac63815bb55523..c17b3f290e85d2b0d71c8b82a2a4cafa9e3505ca
@@@ -122,72 -121,30 +122,73 @@@ public class SignatureAttribute extend
              if (j < 0)
                  break;
  
 -            int k = desc.indexOf(';', j);
 -            if (k < 0)
 -                break;
 -
 -            int l = desc.indexOf('<', j);
 -            int classEndIndex;
 -            char classEndChar;
 -            if (l < 0 || k < l) {
 -                classEndIndex = k;
 -                classEndChar = ';';
 -            } else {
 -                classEndIndex = l;
 -                classEndChar = '<';
 +            StringBuilder nameBuf = new StringBuilder();
 +            StringBuilder genericParamBuf = new StringBuilder();
 +            final ArrayList<StringBuilder> nameBufs = new ArrayList<>();
 +            final ArrayList<StringBuilder> genericParamBufs = new ArrayList<>();
 +            int k = j;
 +            char c;
 +            try {
 +                while ((c = desc.charAt(++k)) != ';') {
 +                    if (c == '<') {
 +                      genericParamBuf.append(c);
 +                      int level = 1;
 +                        while (level > 0) {
 +                              c = desc.charAt(++k);
 +                              genericParamBuf.append(c);
 +                              if (c == '<') ++level;
 +                              else if (c == '>') --level;
 +                        }
 +                    } else if (c == '.') {
 +                      nameBufs.add(nameBuf);
 +                      genericParamBufs.add(genericParamBuf);
 +                      nameBuf = new StringBuilder();
 +                      genericParamBuf = new StringBuilder();
 +                    } else {
 +                      nameBuf.append(c);
 +                    }
 +                }
              }
 -            i = classEndIndex + 1;
 -
 -            String name = desc.substring(j + 1, classEndIndex);
 -            String name2 = map.get(name);
 -            if (name2 != null) {
 -                newdesc.append(desc.substring(head, j));
 -                newdesc.append('L');
 -                newdesc.append(name2);
 -                newdesc.append(classEndChar);
 -                head = i;
 +            catch (IndexOutOfBoundsException e) { break; }
-               nameBufs.add(nameBuf);
-               genericParamBufs.add(genericParamBuf);
++
++            nameBufs.add(nameBuf);
++                genericParamBufs.add(genericParamBuf);
 +            i = k + 1;
 +            
 +            String name = String.join("$", nameBufs.toArray(new StringBuilder[0]));
 +            String newname = map.get(name);
 +            if (newname != null) {
 +                final String[] nameSplit = name.split("\\$");
 +                final String[] newnameSplit = newname.split("\\$");
 +              if (nameSplit.length == newnameSplit.length) {
 +                      final String[] newnames = new String[nameBufs.size()];
 +                      for (int start = 0, z = 0; z < nameBufs.size(); ++z) {
 +                              final int toAggregate = (int) nameBufs.get(z).chars().filter(ch -> ch == '$').count() + 1;
 +                              String s = String.join("$", Arrays.copyOfRange(newnameSplit, start, start + toAggregate));
 +                              start += toAggregate;
 +                              newnames[z] = s;
 +                      }
 +                      
 +                      
 +                      newdesc.append(desc.substring(head, j));
 +                      newdesc.append('L');
 +                      for (int z = 0; z < newnames.length; ++z) {
 +                              if (z > 0) {
 +                                      newdesc.append('.');
 +                              }
 +                              newdesc.append(newnames[z]);
 +                              final String newgenericParam;
 +                              final StringBuilder genericParamBufCurrent = genericParamBufs.get(z);
 +                              if (genericParamBufCurrent.length() > 0) {
 +                                      newgenericParam = "<" + renameClass(genericParamBufCurrent.substring(1, genericParamBufCurrent.length() - 1), map) + ">";
 +                              } else {
 +                                      newgenericParam = genericParamBufCurrent.toString(); //empty string
 +                              }
 +                              newdesc.append(newgenericParam);
 +                      }
 +                      newdesc.append(c); //the final semicolon
 +                      head = i;
 +              }
              }
          }