Refactor all ctor callsites of PathFragment to instead call a static 'create' method. This paves the way for changing PathFragment to e.g. an abstract class with multiple subclasses. This way we can split out the windows-specific stuff into one of these concrete classes, making the code more readable and also saving memory (since the shallow heap size of the NonWindowsPathFragment subclass will hopefully be smaller than that of the current PathFragment). This also lets us pursue gc churn optimizations. We can now do interning in PathFragment#create and can also get rid of unnecessary intermediate PathFragment allocations. RELNOTES: None PiperOrigin-RevId: 152145768
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java index 16f926a..b5d6c1c 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
@@ -340,7 +340,7 @@ } List<PathFragment> inputExecPaths = new ArrayList<>(); for (String path : entry.getPaths()) { - PathFragment execPath = new PathFragment(path); + PathFragment execPath = PathFragment.create(path); // Code assumes that action has only 1-2 outputs and ArrayList.contains() will be // most efficient. if (!outputs.contains(execPath)) {
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java index c63fd5b..c4567d8 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
@@ -81,7 +81,7 @@ @Override public PathFragment getExecPath() { - return new PathFragment(path); + return PathFragment.create(path); } @Override @@ -170,7 +170,7 @@ * relative to that Artifact. */ public static TreeFileArtifact treeFileArtifact(Artifact parent, String relativePath) { - return treeFileArtifact(parent, new PathFragment(relativePath)); + return treeFileArtifact(parent, PathFragment.create(relativePath)); } /** Returns an Iterable of TreeFileArtifacts with the given parent and parent relative paths. */
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java index a5b865f..7c6a870 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -547,7 +547,7 @@ && relativePath.getSegment(0).equals(Label.EXTERNAL_PATH_PREFIX)) { // Turn external/repo/foo into ../repo/foo. relativePath = relativePath.relativeTo(Label.EXTERNAL_PATH_PREFIX); - relativePath = new PathFragment("..").getRelative(relativePath); + relativePath = PathFragment.create("..").getRelative(relativePath); } return relativePath; }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java index 3f2f360..ddeb001 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactFactory.java
@@ -127,7 +127,7 @@ */ public ArtifactFactory(Path execRootParent, String derivedPathPrefix) { this.execRootParent = execRootParent; - this.derivedPathPrefix = new PathFragment(derivedPathPrefix); + this.derivedPathPrefix = PathFragment.create(derivedPathPrefix); } /**
diff --git a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java index 404b0de..2a19d03 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java +++ b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java
@@ -175,8 +175,8 @@ PathFragment packageDirectory, String purpose, Iterable<Artifact> inputs, Root middlemanDir) { String escapedPackageDirectory = Actions.escapedPath(packageDirectory.getPathString()); PathFragment stampName = - new PathFragment("_middlemen/" + (purpose.startsWith(escapedPackageDirectory) - ? purpose : (escapedPackageDirectory + purpose))); + PathFragment.create("_middlemen/" + (purpose.startsWith(escapedPackageDirectory) + ? purpose : (escapedPackageDirectory + purpose))); Artifact stampFile = artifactFactory.getDerivedArtifact(stampName, middlemanDir, actionRegistry.getOwner()); MiddlemanAction.create( @@ -186,7 +186,7 @@ private Artifact getStampFileArtifact(String middlemanName, String purpose, Root middlemanDir) { String escapedFilename = Actions.escapedPath(middlemanName); - PathFragment stampName = new PathFragment("_middlemen/" + escapedFilename + "-" + purpose); + PathFragment stampName = PathFragment.create("_middlemen/" + escapedFilename + "-" + purpose); Artifact stampFile = artifactFactory.getDerivedArtifact(stampName, middlemanDir, actionRegistry.getOwner()); return stampFile;