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
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 1720bd4..5b7b395 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.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 @@
       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;