From b08cda8dd6f6605777569b50cca7d1ea34e52859 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 19 Jun 2014 18:30:01 +0400 Subject: [PATCH] Avoid recomputing ClassData in DeserializedDescriptorResolver --- .../DeserializedDescriptorResolver.java | 5 +--- .../serialization/ClassDeserializer.kt | 23 ++++++++++++++++--- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java index fdf9a388699..cec546404ad 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java @@ -58,10 +58,7 @@ public final class DeserializedDescriptorResolver { public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) { String[] data = readData(kotlinClass, CLASS); if (data != null) { - ClassData classData = JavaProtoBufUtil.readClassDataFrom(data); - NameResolver nameResolver = classData.getNameResolver(); - ClassId classId = nameResolver.getClassId(classData.getClassProto().getFqName()); - return context.getClassDeserializer().deserializeClass(classId); + return context.getClassDeserializer().deserializeClass(JavaProtoBufUtil.readClassDataFrom(data)); } return null; } diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt index bfbe81170de..53762804c02 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassDeserializer.kt @@ -24,8 +24,8 @@ import kotlin.properties.Delegates public class ClassDeserializer(val storageManager: StorageManager, val classDataFinder: ClassDataFinder) { private val classes = storageManager.createMemoizedFunctionWithNullableValues { - (classId: ClassId) -> - val classData = classDataFinder.findClassData(classId) + (key: ClassKey) -> + val classData = key.classData ?: classDataFinder.findClassData(key.classId) if (classData != null) { DeserializedClassDescriptor(context, classData) } @@ -36,5 +36,22 @@ public class ClassDeserializer(val storageManager: StorageManager, val classData var context: DeserializationGlobalContext by Delegates.notNull() - public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(classId) + public fun deserializeClass(classId: ClassId): ClassDescriptor? = classes(ClassKey(classId, null)) + + //needed to avoid calling ClassDataFinder#findClassData() if it is already computed at call site + public fun deserializeClass(classData: ClassData): ClassDescriptor? = classes(ClassKey(classData.readId(), classData)) + + private inner class ClassKey(val classId: ClassId, val classData: ClassData?) { + override fun equals(other: Any?): Boolean { + return other is ClassKey && classId == other.classId + } + + override fun hashCode(): Int { + return classId.hashCode() + } + } + + private fun ClassData.readId(): ClassId { + return getNameResolver().getClassId(getClassProto().getFqName()) + } } \ No newline at end of file