Intern PackageIdentifiers as a memory optimization.
--
MOS_MIGRATED_REVID=104403040
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
index 65f4258..991544c 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
@@ -20,6 +20,8 @@
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
import com.google.devtools.build.lib.util.StringCanonicalizer;
import com.google.devtools.build.lib.util.StringUtilities;
import com.google.devtools.build.lib.vfs.Canonicalizer;
@@ -45,6 +47,17 @@
@Immutable
public final class PackageIdentifier implements Comparable<PackageIdentifier>, Serializable {
+ private static final Interner<PackageIdentifier> INTERNER = Interners.newStrongInterner();
+
+ public static PackageIdentifier create(String repository, PathFragment pkgName)
+ throws LabelSyntaxException {
+ return create(RepositoryName.create(repository), pkgName);
+ }
+
+ public static PackageIdentifier create(RepositoryName repository, PathFragment pkgName) {
+ return INTERNER.intern(new PackageIdentifier(repository, pkgName));
+ }
+
/**
* A human-readable name for the repository.
*/
@@ -281,7 +294,7 @@
public static PackageIdentifier createInDefaultRepo(PathFragment name) {
try {
- return new PackageIdentifier(DEFAULT_REPOSITORY, name);
+ return create(DEFAULT_REPOSITORY, name);
} catch (LabelSyntaxException e) {
throw new IllegalArgumentException("could not create package identifier for " + name
+ ": " + e.getMessage());
@@ -297,11 +310,7 @@
/** The name of the package. Canonical (i.e. x.equals(y) <=> x==y). */
private final PathFragment pkgName;
- public PackageIdentifier(String repository, PathFragment pkgName) throws LabelSyntaxException {
- this(RepositoryName.create(repository), pkgName);
- }
-
- public PackageIdentifier(RepositoryName repository, PathFragment pkgName) {
+ private PackageIdentifier(RepositoryName repository, PathFragment pkgName) {
Preconditions.checkNotNull(repository);
Preconditions.checkNotNull(pkgName);
this.repository = repository;
@@ -335,7 +344,7 @@
throw new LabelSyntaxException(error);
}
- return new PackageIdentifier(repo, new PathFragment(packageName));
+ return create(repo, new PathFragment(packageName));
}
public RepositoryName getRepository() {