Intern PathFragment instances created during Ninja file parsing.
Before this change, a new instance was created for each dependency edge, which was very wasteful.
RELNOTES: None.
PiperOrigin-RevId: 298853548
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser/NinjaParserStep.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser/NinjaParserStep.java
index e0a6735..9e30c2e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser/NinjaParserStep.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/parser/NinjaParserStep.java
@@ -18,6 +18,7 @@
import com.google.common.base.Ascii;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSortedMap;
+import com.google.common.collect.Interner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.devtools.build.lib.bazel.rules.ninja.file.GenericParsingException;
@@ -27,6 +28,7 @@
import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaTarget.InputKind;
import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaTarget.InputOutputKind;
import com.google.devtools.build.lib.bazel.rules.ninja.parser.NinjaTarget.OutputKind;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.nio.charset.StandardCharsets;
@@ -37,6 +39,17 @@
/** Ninja files parser. The types of tokens: {@link NinjaToken}. Ninja lexer: {@link NinjaLexer}. */
public class NinjaParserStep {
+ /**
+ * An interner for {@link PathFragment} instances for the inputs and outputs of {@link
+ * NinjaTarget}.
+ */
+ // TODO(lberki): Make this non-static.
+ // The reason why this field is static is that I haven't grokked yet what the lifetime of each
+ // object in Ninja parsing is. Once I figure out which object has the lifetime of "exactly as long
+ // as the parsing is running", I can just put this in a field of that object and plumb it here.
+ private static final Interner<PathFragment> PATH_FRAGMENT_INTERNER =
+ BlazeInterners.newWeakInterner();
+
private final NinjaLexer lexer;
public NinjaParserStep(NinjaLexer lexer) {
@@ -300,7 +313,9 @@
entry.getValue().stream()
.map(
value ->
- PathFragment.create(targetScope.getExpandedValue(Integer.MAX_VALUE, value)))
+ PATH_FRAGMENT_INTERNER.intern(
+ PathFragment.create(
+ targetScope.getExpandedValue(Integer.MAX_VALUE, value))))
.collect(Collectors.toList());
InputOutputKind inputOutputKind = entry.getKey();
if (inputOutputKind instanceof InputKind) {