[Utils] Reoptimize equals of names based on interning of strings
diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/JvmClassName.java b/core/compiler.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/JvmClassName.java
index f5bdb7c..359e7f4 100644
--- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/JvmClassName.java
+++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/JvmClassName.java
@@ -19,7 +19,6 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName;
-import org.jetbrains.kotlin.utils.StringInterner;
public class JvmClassName {
@NotNull
@@ -58,7 +57,7 @@
private FqName fqName;
private JvmClassName(@NotNull String internalName) {
- this.internalName = StringInterner.interned(internalName);
+ this.internalName = internalName;
}
/**
@@ -111,7 +110,7 @@
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
- return internalName == ((JvmClassName) o).internalName; // strings are interned
+ return internalName.equals(((JvmClassName) o).internalName);
}
@Override
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/FqNameUnsafe.java b/core/compiler.common/src/org/jetbrains/kotlin/name/FqNameUnsafe.java
index 35c1311..4833d70 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/name/FqNameUnsafe.java
+++ b/core/compiler.common/src/org/jetbrains/kotlin/name/FqNameUnsafe.java
@@ -20,7 +20,6 @@
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.kotlin.utils.StringInterner;
import java.util.Collections;
import java.util.List;
@@ -49,16 +48,16 @@
private transient Name shortName;
FqNameUnsafe(@NotNull String fqName, @NotNull FqName safe) {
- this.fqName = StringInterner.interned(fqName);
+ this.fqName = fqName;
this.safe = safe;
}
public FqNameUnsafe(@NotNull String fqName) {
- this.fqName = StringInterner.interned(fqName);
+ this.fqName = fqName;
}
private FqNameUnsafe(@NotNull String fqName, FqNameUnsafe parent, Name shortName) {
- this.fqName = StringInterner.interned(fqName);
+ this.fqName = fqName;
this.parent = parent;
this.shortName = shortName;
}
@@ -197,7 +196,7 @@
FqNameUnsafe that = (FqNameUnsafe) o;
- if (fqName != that.fqName) return false; // strings are interned
+ if (!fqName.equals(that.fqName)) return false;
return true;
}
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/Name.java b/core/compiler.common/src/org/jetbrains/kotlin/name/Name.java
index 859627b..1423ec2 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/name/Name.java
+++ b/core/compiler.common/src/org/jetbrains/kotlin/name/Name.java
@@ -18,7 +18,6 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.kotlin.utils.StringInterner;
public final class Name implements Comparable<Name> {
@NotNull
@@ -26,7 +25,7 @@
private final boolean special;
private Name(@NotNull String name, boolean special) {
- this.name = StringInterner.interned(name);
+ this.name = name;
this.special = special;
}
@@ -117,7 +116,7 @@
Name name1 = (Name) o;
if (special != name1.special) return false;
- if (name != name1.name) return false; // strings are interned
+ if (!name.equals(name1.name)) return false;
return true;
}
diff --git a/core/deserialization.common.jvm/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt b/core/deserialization.common.jvm/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt
index 056f2a7..2db9630 100644
--- a/core/deserialization.common.jvm/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt
+++ b/core/deserialization.common.jvm/src/org/jetbrains/kotlin/load/kotlin/MemberSignature.kt
@@ -8,11 +8,14 @@
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMemberSignature
+import org.jetbrains.kotlin.utils.UniqueString
+import org.jetbrains.kotlin.utils.UniqueString.Companion.uniqueString
// The purpose of this class is to hold a unique signature of either a method or a field, so that annotations on a member can be put
// into a map indexed by these signatures
@Suppress("DataClassPrivateConstructor")
-data class MemberSignature private constructor(val signature: String) {
+data class MemberSignature private constructor(private val signatureImpl: UniqueString) {
+ val signature get() = signatureImpl.value
companion object {
@JvmStatic
fun fromMethod(nameResolver: NameResolver, signature: JvmProtoBuf.JvmMethodSignature): MemberSignature {
@@ -21,12 +24,12 @@
@JvmStatic
fun fromMethodNameAndDesc(name: String, desc: String): MemberSignature {
- return MemberSignature(name + desc)
+ return MemberSignature(uniqueString(name + desc))
}
@JvmStatic
fun fromFieldNameAndDesc(name: String, desc: String): MemberSignature {
- return MemberSignature("$name#$desc")
+ return MemberSignature(uniqueString("$name#$desc"))
}
@JvmStatic
@@ -37,7 +40,7 @@
@JvmStatic
fun fromMethodSignatureAndParameterIndex(signature: MemberSignature, index: Int): MemberSignature {
- return MemberSignature("${signature.signature}@$index")
+ return MemberSignature(uniqueString("${signature.signature}@$index"))
}
}
}
diff --git a/core/util.runtime/src/org/jetbrains/kotlin/utils/StringInterner.kt b/core/util.runtime/src/org/jetbrains/kotlin/utils/StringInterner.kt
index bf9e9fb..2db3f26 100644
--- a/core/util.runtime/src/org/jetbrains/kotlin/utils/StringInterner.kt
+++ b/core/util.runtime/src/org/jetbrains/kotlin/utils/StringInterner.kt
@@ -7,9 +7,13 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
-object StringInterner {
- private val cache = ConcurrentHashMap<String, String>()
+class UniqueString private constructor(val value: String) {
+ override fun toString(): String = value
- @JvmStatic
- fun interned(string: String): String = cache.getOrPut(string) { string }
-}
\ No newline at end of file
+ companion object {
+ private val cache = ConcurrentHashMap<String, UniqueString>()
+ fun uniqueString(value: String): UniqueString {
+ return cache.getOrPut(value) { UniqueString(value) }
+ }
+ }
+}