diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/BaseExpressionCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/BaseExpressionCodegen.kt index 2257b7bb0d1..7bd842c4ad0 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/BaseExpressionCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/BaseExpressionCodegen.kt @@ -20,12 +20,11 @@ import org.jetbrains.kotlin.codegen.inline.NameGenerator import org.jetbrains.kotlin.codegen.inline.ReifiedTypeParametersUsages import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor -import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter interface BaseExpressionCodegen { - val frameMap: FrameMap + val frameMap: FrameMapBase<*> val visitor: InstructionAdapter @@ -38,10 +37,10 @@ interface BaseExpressionCodegen { fun propagateChildReifiedTypeParametersUsages(reifiedTypeParametersUsages: ReifiedTypeParametersUsages) fun pushClosureOnStack( - classDescriptor: ClassDescriptor, - putThis: Boolean, - callGenerator: CallGenerator, - functionReferenceReceiver: StackValue? + classDescriptor: ClassDescriptor, + putThis: Boolean, + callGenerator: CallGenerator, + functionReferenceReceiver: StackValue? ) fun markLineNumberAfterInlineIfNeeded() diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt index 05776a1e7ac..c8ce685b611 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FrameMap.kt @@ -14,119 +14,109 @@ * limitations under the License. */ -package org.jetbrains.kotlin.codegen; +package org.jetbrains.kotlin.codegen -import com.google.common.collect.Lists; -import com.intellij.openapi.util.Trinity; -import gnu.trove.TObjectIntHashMap; -import gnu.trove.TObjectIntIterator; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.org.objectweb.asm.Type; +import com.google.common.collect.Lists +import com.intellij.openapi.util.Trinity +import gnu.trove.TObjectIntHashMap +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.org.objectweb.asm.Type -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.ArrayList -public class FrameMap { - private final TObjectIntHashMap myVarIndex = new TObjectIntHashMap<>(); - private final TObjectIntHashMap myVarSizes = new TObjectIntHashMap<>(); - private int myMaxIndex = 0; +class FrameMap : FrameMapBase() - public int enter(DeclarationDescriptor descriptor, Type type) { - int index = myMaxIndex; - myVarIndex.put(descriptor, index); - myMaxIndex += type.getSize(); - myVarSizes.put(descriptor, type.getSize()); - return index; +open class FrameMapBase { + private val myVarIndex = TObjectIntHashMap() + private val myVarSizes = TObjectIntHashMap() + var currentSize = 0 + private set + + fun enter(descriptor: T, type: Type): Int { + val index = currentSize + myVarIndex.put(descriptor, index) + currentSize += type.size + myVarSizes.put(descriptor, type.size) + return index } - public int leave(DeclarationDescriptor descriptor) { - int size = myVarSizes.get(descriptor); - myMaxIndex -= size; - myVarSizes.remove(descriptor); - int oldIndex = myVarIndex.remove(descriptor); - if (oldIndex != myMaxIndex) { - throw new IllegalStateException("Descriptor can be left only if it is last: " + descriptor); + fun leave(descriptor: T): Int { + val size = myVarSizes.get(descriptor) + currentSize -= size + myVarSizes.remove(descriptor) + val oldIndex = myVarIndex.remove(descriptor) + if (oldIndex != currentSize) { + throw IllegalStateException("Descriptor can be left only if it is last: $descriptor") } - return oldIndex; + return oldIndex } - public int enterTemp(Type type) { - int result = myMaxIndex; - myMaxIndex += type.getSize(); - return result; + fun enterTemp(type: Type): Int { + val result = currentSize + currentSize += type.size + return result } - public void leaveTemp(Type type) { - myMaxIndex -= type.getSize(); + fun leaveTemp(type: Type) { + currentSize -= type.size } - public int getIndex(DeclarationDescriptor descriptor) { - return myVarIndex.contains(descriptor) ? myVarIndex.get(descriptor) : -1; + fun getIndex(descriptor: T): Int { + return if (myVarIndex.contains(descriptor)) myVarIndex.get(descriptor) else -1 } - public Mark mark() { - return new Mark(myMaxIndex); + fun mark(): Mark { + return Mark(currentSize) } - public int getCurrentSize() { - return myMaxIndex; - } + inner class Mark(private val myIndex: Int) { - public class Mark { - private final int myIndex; - - public Mark(int index) { - myIndex = index; - } - - public void dropTo() { - List descriptorsToDrop = new ArrayList<>(); - TObjectIntIterator iterator = myVarIndex.iterator(); + fun dropTo() { + val descriptorsToDrop = ArrayList() + val iterator = myVarIndex.iterator() while (iterator.hasNext()) { - iterator.advance(); + iterator.advance() if (iterator.value() >= myIndex) { - descriptorsToDrop.add(iterator.key()); + descriptorsToDrop.add(iterator.key()) } } - for (DeclarationDescriptor declarationDescriptor : descriptorsToDrop) { - myVarIndex.remove(declarationDescriptor); - myVarSizes.remove(declarationDescriptor); + for (declarationDescriptor in descriptorsToDrop) { + myVarIndex.remove(declarationDescriptor) + myVarSizes.remove(declarationDescriptor) } - myMaxIndex = myIndex; + currentSize = myIndex } } - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); + override fun toString(): String { + val sb = StringBuilder() if (myVarIndex.size() != myVarSizes.size()) { - return "inconsistent"; + return "inconsistent" } - List> descriptors = Lists.newArrayList(); + val descriptors = Lists.newArrayList>() - for (Object descriptor0 : myVarIndex.keys()) { - DeclarationDescriptor descriptor = (DeclarationDescriptor) descriptor0; - int varIndex = myVarIndex.get(descriptor); - int varSize = myVarSizes.get(descriptor); - descriptors.add(Trinity.create(descriptor, varIndex, varSize)); + for (descriptor0 in myVarIndex.keys()) { + val descriptor = descriptor0 as T + val varIndex = myVarIndex.get(descriptor) + val varSize = myVarSizes.get(descriptor) + descriptors.add(Trinity.create(descriptor, varIndex, varSize)) } - descriptors.sort(Comparator.comparingInt(left -> left.second)); + descriptors.sortBy { left -> left.second } - sb.append("size=").append(myMaxIndex); + sb.append("size=").append(currentSize) - boolean first = true; - for (Trinity t : descriptors) { + var first = true + for (t in descriptors) { if (!first) { - sb.append(", "); + sb.append(", ") } - first = false; - sb.append(t.first).append(",i=").append(t.second).append(",s=").append(t.third); + first = false + sb.append(t.first).append(",i=").append(t.second).append(",s=").append(t.third) } - return sb.toString(); + return sb.toString() } }