aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Eric Fellheimer <felly@google.com>2015-11-03 00:28:58 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-11-03 18:04:19 +0000
commit1c4bf137a67145626a9c3593d92171ce9ab03df2 (patch)
treed558fba2eb573e189336b766cd1b5d65a99cd3ff /src/main
parent97931bd74c6952bfa872b8b779157b6f7b89a824 (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.java15
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;