diff options
author | 2015-11-03 00:28:58 +0000 | |
---|---|---|
committer | 2015-11-03 18:04:19 +0000 | |
commit | 1c4bf137a67145626a9c3593d92171ce9ab03df2 (patch) | |
tree | d558fba2eb573e189336b766cd1b5d65a99cd3ff /src/main | |
parent | 97931bd74c6952bfa872b8b779157b6f7b89a824 (diff) |
Cache and canonicalize references to PathFragments in LineNumberTable$HashLine. This avoids creating largely the same set of PathFragment again and again.
Also remove unnecessary boxing/unboxing.
--
MOS_MIGRATED_REVID=106892926
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/LineNumberTable.java | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/LineNumberTable.java b/src/main/java/com/google/devtools/build/lib/syntax/LineNumberTable.java index 1720bd47e2..5b7b395f1d 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/LineNumberTable.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/LineNumberTable.java @@ -27,7 +27,9 @@ import java.nio.CharBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -207,11 +209,18 @@ public abstract class LineNumberTable implements Serializable { CharSequence bufString = CharBuffer.wrap(buffer); Matcher m = pattern.matcher(bufString); List<SingleHashLine> unorderedTable = new ArrayList<>(); + Map<String, PathFragment> pathCache = new HashMap<>(); while (m.find()) { + String pathString = m.group(2); + PathFragment pathFragment = pathCache.get(pathString); + if (pathFragment == null) { + pathFragment = defaultPath.getRelative(pathString); + pathCache.put(pathString, pathFragment); + } unorderedTable.add(new SingleHashLine( - m.start(0) + 1, //offset (+1 to skip \n in pattern) - Integer.valueOf(m.group(1)), // line number - defaultPath.getRelative(m.group(2)))); // filename is an absolute path + m.start(0) + 1, //offset (+1 to skip \n in pattern) + Integer.parseInt(m.group(1)), // line number + pathFragment)); // filename is an absolute path } this.table = hashOrdering.immutableSortedCopy(unorderedTable); this.bufferLength = buffer.length; |