From 6a0a64eb6da0443ce75de571f1e3ce573bab5313 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 9 Nov 2023 10:32:00 +0100 Subject: [PATCH] JVM: remove usages of trove4j #KTI-1135 --- compiler/backend/build.gradle.kts | 2 +- .../org/jetbrains/kotlin/codegen/FrameMap.kt | 41 +++++++++---------- .../jetbrains/kotlin/codegen/inline/SMAP.kt | 4 +- .../optimization/common/ControlFlowGraph.kt | 7 ++-- .../backend/jvm/lower/EnumClassLowering.kt | 7 ++-- .../kotlin/code/CodeConformanceTest.kt | 6 --- 6 files changed, 28 insertions(+), 39 deletions(-) diff --git a/compiler/backend/build.gradle.kts b/compiler/backend/build.gradle.kts index d2433b6498a..88a828c4921 100644 --- a/compiler/backend/build.gradle.kts +++ b/compiler/backend/build.gradle.kts @@ -12,7 +12,7 @@ dependencies { api(project(":compiler:serialization")) api(project(":compiler:backend.common.jvm")) compileOnly(intellijCore()) - compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) + compileOnly(commonDependency("org.jetbrains.intellij.deps.fastutil:intellij-deps-fastutil")) compileOnly(commonDependency("org.jetbrains.intellij.deps:asm-all")) compileOnly(libs.guava) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt index 2839e21c7dd..04843691627 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt @@ -16,18 +16,15 @@ package org.jetbrains.kotlin.codegen -import com.google.common.collect.Lists -import com.intellij.openapi.util.Trinity -import gnu.trove.TObjectIntHashMap +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.org.objectweb.asm.Type -import java.util.* open class FrameMap : FrameMapBase() open class FrameMapBase { - private val myVarIndex = TObjectIntHashMap() - private val myVarSizes = TObjectIntHashMap() + private val myVarIndex = Object2IntOpenHashMap() + private val myVarSizes = Object2IntOpenHashMap() var currentSize = 0 private set @@ -40,10 +37,10 @@ open class FrameMapBase { } open fun leave(key: T): Int { - val size = myVarSizes.get(key) + val size = myVarSizes.getValue(key) currentSize -= size - myVarSizes.remove(key) - val oldIndex = myVarIndex.remove(key) + myVarSizes.removeInt(key) + val oldIndex = myVarIndex.removeInt(key) if (oldIndex != currentSize) { throw IllegalStateException("Descriptor can be left only if it is last: $key") } @@ -61,7 +58,7 @@ open class FrameMapBase { } open fun getIndex(descriptor: T): Int { - return if (myVarIndex.contains(descriptor)) myVarIndex.get(descriptor) else -1 + return if (myVarIndex.contains(descriptor)) myVarIndex.getInt(descriptor) else -1 } fun mark(): Mark { @@ -79,16 +76,16 @@ open class FrameMapBase { fun dropTo() { val descriptorsToDrop = ArrayList() - val iterator = myVarIndex.iterator() + val iterator = myVarIndex.object2IntEntrySet().fastIterator() while (iterator.hasNext()) { - iterator.advance() - if (iterator.value() >= myIndex) { - descriptorsToDrop.add(iterator.key()) + val (key, value) = iterator.next() + if (value >= myIndex) { + descriptorsToDrop.add(key) } } for (declarationDescriptor in descriptorsToDrop) { - myVarIndex.remove(declarationDescriptor) - myVarSizes.remove(declarationDescriptor) + myVarIndex.removeInt(declarationDescriptor) + myVarSizes.removeInt(declarationDescriptor) } currentSize = myIndex } @@ -97,17 +94,17 @@ open class FrameMapBase { override fun toString(): String { val sb = StringBuilder() - if (myVarIndex.size() != myVarSizes.size()) { + if (myVarIndex.size != myVarSizes.size) { return "inconsistent" } - val descriptors = Lists.newArrayList>() + val descriptors = mutableListOf>() - for (descriptor0 in myVarIndex.keys()) { + for (descriptor0 in myVarIndex.keys) { @Suppress("UNCHECKED_CAST") val descriptor = descriptor0 as T - val varIndex = myVarIndex.get(descriptor) - val varSize = myVarSizes.get(descriptor) - descriptors.add(Trinity.create(descriptor, varIndex, varSize)) + val varIndex = myVarIndex.getInt(descriptor) + val varSize = myVarSizes.getInt(descriptor) + descriptors.add(Triple(descriptor, varIndex, varSize)) } descriptors.sortBy { left -> left.second } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt index 7a14aa603c0..b09aa7482d3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.codegen.inline -import gnu.trove.TIntIntHashMap +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap import org.jetbrains.kotlin.codegen.SourceInfo import org.jetbrains.org.objectweb.asm.tree.MethodNode import java.util.* @@ -57,7 +57,7 @@ object SMAPBuilder { } class SourceMapCopier(val parent: SourceMapper, private val smap: SMAP, val callSite: SourcePosition? = null) { - private val visitedLines = TIntIntHashMap() + private val visitedLines = Int2IntOpenHashMap() private var lastVisitedRange: RangeMapping? = null fun mapLineNumber(lineNumber: Int): Int { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ControlFlowGraph.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ControlFlowGraph.kt index 0c7e2a0c774..a731202143c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ControlFlowGraph.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ControlFlowGraph.kt @@ -5,11 +5,10 @@ package org.jetbrains.kotlin.codegen.optimization.common -import gnu.trove.TIntHashSet +import it.unimi.dsi.fastutil.ints.IntOpenHashSet import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.tree.* - class ControlFlowGraph private constructor(private val insns: InsnList) { private val successors: Array> = Array(insns.size()) { ArrayList(2) } private val predecessors: Array> = Array(insns.size()) { ArrayList(2) } @@ -32,7 +31,7 @@ class ControlFlowGraph private constructor(private val insns: InsnList) { private val queue = IntArray(nInsns) private var top = 0 - private val predecessors = Array(nInsns) { TIntHashSet() } + private val predecessors = Array(nInsns) { IntOpenHashSet() } private val AbstractInsnNode.indexOf get() = instructions.indexOf(this) @@ -46,7 +45,7 @@ class ControlFlowGraph private constructor(private val insns: InsnList) { traverseCfg() for ((i, preds) in predecessors.withIndex()) { - for (pred in preds.toArray()) { + for (pred in preds.toIntArray()) { graph.predecessors[i].add(pred) graph.successors[pred].add(i) } diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt index b44d3067a60..2a54bcd2362 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.backend.jvm.lower -import gnu.trove.TObjectIntHashMap import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.lower.at @@ -95,14 +94,14 @@ private class EnumClassLowering(private val context: JvmBackendContext) : ClassL private inner class EnumClassTransformer(private val irClass: IrClass, private val supportsEnumEntries: Boolean) { private val loweredEnumConstructors = hashMapOf() private val loweredEnumConstructorParameters = hashMapOf() - private val enumEntryOrdinals = TObjectIntHashMap() + private val enumEntryOrdinals = hashMapOf() private val declarationToEnumEntry = mutableMapOf() private val enumArrayType = context.irBuiltIns.arrayClass.typeWith(irClass.defaultType) // Enum[] fun run() { // Lower IrEnumEntry into IrField and IrClass members irClass.declarations.asSequence().filterIsInstance().withIndex().forEach { (index, enumEntry) -> - enumEntryOrdinals.put(enumEntry, index) + enumEntryOrdinals[enumEntry] = index enumEntry.correspondingClass?.let { entryClass -> declarationToEnumEntry[entryClass] = enumEntry } declarationToEnumEntry[buildEnumEntryField(enumEntry)] = enumEntry } @@ -307,7 +306,7 @@ private class EnumClassLowering(private val context: JvmBackendContext) : ClassL call.copyTypeArgumentsFrom(original) if (enumEntry != null) { call.putValueArgument(0, irString(enumEntry.name.asString())) - call.putValueArgument(1, irInt(enumEntryOrdinals[enumEntry])) + call.putValueArgument(1, irInt(enumEntryOrdinals[enumEntry]!!)) } else { val constructor = currentScope!!.scope.scopeOwnerSymbol as IrConstructorSymbol call.putValueArgument(0, irGet(constructor.owner.valueParameters[0])) diff --git a/repo/codebase-tests/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt b/repo/codebase-tests/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt index 25e2fcc6674..6eb02d17498 100644 --- a/repo/codebase-tests/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt +++ b/repo/codebase-tests/tests/org/jetbrains/kotlin/code/CodeConformanceTest.kt @@ -9,9 +9,7 @@ import com.intellij.openapi.util.io.FileUtil import junit.framework.TestCase import org.jetbrains.kotlin.config.LanguageFeature import java.io.File -import java.util.* import java.util.regex.Pattern -import kotlin.collections.HashSet class CodeConformanceTest : TestCase() { companion object { @@ -221,9 +219,6 @@ class CodeConformanceTest : TestCase() { allowedFiles = listOf( "analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KotlinClassInnerStuffCache.kt", "build-common/src/org/jetbrains/kotlin/incremental/IncrementalJvmCache.kt", - "compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt", - "compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt", - "compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/ControlFlowGraph.kt", "compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/CliVirtualFileFinder.kt", "compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCliJavaFileManagerImpl.kt", "compiler/cli/cli-base/src/org/jetbrains/kotlin/cli/jvm/index/JvmDependenciesIndexImpl.kt", @@ -231,7 +226,6 @@ class CodeConformanceTest : TestCase() { "compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt", "compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt", "compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PreliminaryLoopVisitor.kt", - "compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt", "compiler/psi/src/org/jetbrains/kotlin/psi/KotlinStringLiteralTextEscaper.kt", "compiler/resolution.common.jvm/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt", "compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt",