1.1 --- a/callgraph/src/main/java/org/netbeans/lib/callgraph/util/EightBitStrings.java Mon Aug 29 13:00:53 2016 -0400
1.2 +++ b/callgraph/src/main/java/org/netbeans/lib/callgraph/util/EightBitStrings.java Sat Sep 03 02:41:36 2016 -0400
1.3 @@ -70,14 +70,22 @@
1.4 private final InternTable INTERN_TABLE = new InternTable();
1.5 public final CharSequence DOT = create(".");
1.6 public final CharSequence QUOTE = create("\"");
1.7 + public final CharSequence SPACE = create(" ");
1.8 + public final CharSequence QUOTE_SPACE = create("\" ");
1.9 public final CharSequence CLOSE_OPEN_QUOTE = create("\" \"");
1.10
1.11 - private boolean disabled;
1.12 + private final boolean disabled;
1.13 + private final boolean aggressive;
1.14
1.15 public EightBitStrings(boolean disabled) {
1.16 - this.disabled = disabled;
1.17 + this (disabled, false);
1.18 }
1.19
1.20 + public EightBitStrings(boolean disabled, boolean aggressive) {
1.21 + this.disabled = disabled;
1.22 + this.aggressive = aggressive;
1.23 + }
1.24 +
1.25 public void clear() {
1.26 INTERN_TABLE.dispose();
1.27 }
1.28 @@ -87,6 +95,9 @@
1.29 return string instanceof ComparableCharSequence ? (ComparableCharSequence) string
1.30 : new StringWrapper(string.toString());
1.31 }
1.32 + if (aggressive) {
1.33 + return concat(string);
1.34 + }
1.35 return INTERN_TABLE.intern(string);
1.36 }
1.37
1.38 @@ -100,32 +111,66 @@
1.39 sb.append(c);
1.40 }
1.41 return new StringWrapper(sb.toString());
1.42 + } else if (aggressive) {
1.43 + List<CharSequence> nue = new ArrayList<>(seqs.length + (seqs.length / 2));
1.44 + for (CharSequence seq : seqs) {
1.45 + int ln = seq.length();
1.46 + StringBuilder sb = new StringBuilder();
1.47 + for(int i=0; i < ln; i++) {
1.48 + char c = seq.charAt(i);
1.49 + if (Character.isLetter(c) || Character.isDigit(c)) {
1.50 + sb.append(c);
1.51 + } else {
1.52 + nue.add(sb.toString());
1.53 + sb = new StringBuilder();
1.54 + nue.add(new String(new char[] { c }));
1.55 + }
1.56 + }
1.57 + if (sb.length() > 0) {
1.58 + nue.add(sb.toString());
1.59 + }
1.60 + }
1.61 + if (nue.size() != seqs.length) {
1.62 + seqs = nue.toArray(new CharSequence[nue.size()]);
1.63 + }
1.64 }
1.65 return new Concatenation(seqs);
1.66 }
1.67
1.68 - public ComparableCharSequence concatQuoted(Collection<CharSequence> seqs) {
1.69 + public ComparableCharSequence concatQuoted(Collection<Object> seqs) {
1.70 if (disabled) {
1.71 StringBuilder sb = new StringBuilder("\"");
1.72 - for (Iterator<CharSequence> it = seqs.iterator(); it.hasNext();) {
1.73 - CharSequence c = it.next();
1.74 + boolean first = true;
1.75 + for (Iterator<Object> it = seqs.iterator(); it.hasNext();) {
1.76 + Object c = it.next();
1.77 + if (!first) {
1.78 + sb.append(SPACE);
1.79 + }
1.80 + if (c instanceof CharSequence) {
1.81 + sb.append(QUOTE);
1.82 + }
1.83 sb.append(c);
1.84 - if (it.hasNext()) {
1.85 - sb.append("\" \"");
1.86 - } else {
1.87 - sb.append("\"");
1.88 + if (c instanceof CharSequence) {
1.89 + sb.append(QUOTE);
1.90 }
1.91 + first = false;
1.92 }
1.93 return new StringWrapper(sb.toString());
1.94 } else {
1.95 - List<CharSequence> quoted = new ArrayList<>((seqs.size() * 2) + 1);
1.96 - quoted.add(this.QUOTE);
1.97 - for (Iterator<CharSequence> it = seqs.iterator(); it.hasNext();) {
1.98 - quoted.add(it.next());
1.99 - if (it.hasNext()) {
1.100 - quoted.add(CLOSE_OPEN_QUOTE);
1.101 + List<CharSequence> quoted = new ArrayList<>((seqs.size() * 3) + 1);
1.102 + for (Iterator<Object> it = seqs.iterator(); it.hasNext();) {
1.103 + Object c = it.next();
1.104 + if (c instanceof CharSequence) {
1.105 + quoted.add(QUOTE);
1.106 + quoted.add((CharSequence)c);
1.107 + if (it.hasNext()) {
1.108 + quoted.add(QUOTE_SPACE);
1.109 + } else {
1.110 + quoted.add(QUOTE);
1.111 + }
1.112 } else {
1.113 - quoted.add(QUOTE);
1.114 + quoted.add(create(c.toString()));
1.115 + quoted.add(SPACE);
1.116 }
1.117 }
1.118 return new Concatenation(quoted.toArray(new CharSequence[quoted.size()]));
1.119 @@ -153,6 +198,10 @@
1.120 int internTableSize() {
1.121 return INTERN_TABLE.last + 1;
1.122 }
1.123 +
1.124 + List<CharSequence> dumpInternTable() {
1.125 + return INTERN_TABLE.dumpInternTable();
1.126 + }
1.127
1.128 static class InternTable {
1.129
1.130 @@ -187,6 +236,10 @@
1.131 Arrays.sort(entries, 0, last + 1);
1.132 return entry;
1.133 }
1.134 +
1.135 + List<CharSequence> dumpInternTable() {
1.136 + return Arrays.asList(entries);
1.137 + }
1.138
1.139 private static final class Entry implements ComparableCharSequence {
1.140
1.141 @@ -316,10 +369,16 @@
1.142 private final InternTable.Entry[] entries;
1.143
1.144 Concatenation(CharSequence... entries) {
1.145 - this.entries = new InternTable.Entry[entries.length];
1.146 - for (int i = 0; i < entries.length; i++) {
1.147 - this.entries[i] = INTERN_TABLE.intern(entries[i]);
1.148 + List<InternTable.Entry> l = new ArrayList<>(entries.length);
1.149 + for (CharSequence cs : entries) {
1.150 + if (cs instanceof Concatenation) {
1.151 + Concatenation c1 = (Concatenation) cs;
1.152 + l.addAll(Arrays.asList(c1.entries));
1.153 + } else {
1.154 + l.add(INTERN_TABLE.intern(cs));
1.155 + }
1.156 }
1.157 + this.entries = l.toArray(new InternTable.Entry[l.size()]);
1.158 }
1.159
1.160 @Override
1.161 @@ -358,7 +417,7 @@
1.162 sb.append(e);
1.163 }
1.164 if (debug) {
1.165 - sb.append (" - " + Arrays.asList(entries));
1.166 + sb.append(" - ").append (Arrays.asList(entries));
1.167 }
1.168 return sb.toString();
1.169 }