From c75b514551a531f47967168e563e3322a8b29c9b Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 8 Feb 2016 14:06:01 +0300 Subject: [PATCH] Get rid of InstructionsAndFrames.kt --- .../codegen/inline/InstructionsAndFrames.kt | 30 ------------------- .../kotlin/codegen/inline/MethodInliner.java | 16 +++++----- .../codegen/inline/MethodInlinerUtil.kt | 13 ++++---- 3 files changed, 16 insertions(+), 43 deletions(-) delete mode 100644 compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InstructionsAndFrames.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InstructionsAndFrames.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InstructionsAndFrames.kt deleted file mode 100644 index 2de62f7d935..00000000000 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InstructionsAndFrames.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2010-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.codegen.inline - -import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode -import org.jetbrains.org.objectweb.asm.tree.InsnList -import org.jetbrains.org.objectweb.asm.tree.analysis.Frame -import org.jetbrains.org.objectweb.asm.tree.analysis.SourceValue - -class InstructionsAndFrames(val frames: Array>, ins: InsnList) { - - val indexes = (0..ins.size() - 1).associate { Pair(ins.get(it), it) } - - operator fun get(node: AbstractInsnNode): Frame? = frames[indexes[node]!!] - -} \ No newline at end of file diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java index b821c83de20..f567e112353 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInliner.java @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.codegen.inline; import com.google.common.collect.Lists; import com.intellij.util.ArrayUtil; -import com.intellij.util.containers.SmartHashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.codegen.ClosureCodegen; @@ -26,6 +25,7 @@ import org.jetbrains.kotlin.codegen.StackValue; import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods; import org.jetbrains.kotlin.codegen.optimization.MandatoryMethodTransformer; import org.jetbrains.kotlin.codegen.state.JetTypeMapper; +import org.jetbrains.kotlin.utils.SmartSet; import org.jetbrains.org.objectweb.asm.Label; import org.jetbrains.org.objectweb.asm.MethodVisitor; import org.jetbrains.org.objectweb.asm.Opcodes; @@ -428,9 +428,9 @@ public class MethodInliner { catch (AnalyzerException e) { throw wrapException(e, node, "couldn't inline method call"); } - Set toDelete = new SmartHashSet(); - InstructionsAndFrames instructionsAndFrames = new InstructionsAndFrames(sources, node.instructions); - AbstractInsnNode cur = node.instructions.getFirst(); + Set toDelete = SmartSet.create(); + InsnList instructions = node.instructions; + AbstractInsnNode cur = instructions.getFirst(); int index = 0; boolean awaitClassReification = false; @@ -466,7 +466,7 @@ public class MethodInliner { AbstractInsnNode insnNode = MethodInlinerUtilKt.singleOrNullInsn(sourceValue); if (insnNode != null) { lambdaInfo = MethodInlinerUtilKt.getLambdaIfExistsAndMarkInstructions( - this, insnNode, frame, instructionsAndFrames, toDelete, true + this, insnNode, frame, true, instructions, sources, toDelete ); } @@ -481,7 +481,7 @@ public class MethodInliner { AbstractInsnNode insnNode = MethodInlinerUtilKt.singleOrNullInsn(sourceValue); if (insnNode != null) { LambdaInfo lambdaInfo = MethodInlinerUtilKt.getLambdaIfExistsAndMarkInstructions( - this, insnNode, frame, instructionsAndFrames, toDelete, false + this, insnNode, frame, false, instructions, sources, toDelete ); if (lambdaInfo != null) { lambdaMapping.put(offset, lambdaInfo); @@ -523,13 +523,13 @@ public class MethodInliner { //it may occurs that interval for default handler starts before catch start label, so this label seems as dead, //but as result all this labels will be merged into one (see KT-5863) } else { - node.instructions.remove(prevNode); + toDelete.add(prevNode); } } } for (AbstractInsnNode insnNode : toDelete) { - node.instructions.remove(insnNode); + instructions.remove(insnNode); } //clean dead try/catch blocks diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInlinerUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInlinerUtil.kt index 975ffd3dbd6..ebbff0658e4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInlinerUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/MethodInlinerUtil.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.codegen.inline import org.jetbrains.kotlin.codegen.optimization.common.InsnSequence import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode +import org.jetbrains.org.objectweb.asm.tree.InsnList import org.jetbrains.org.objectweb.asm.tree.VarInsnNode import org.jetbrains.org.objectweb.asm.tree.analysis.Frame import org.jetbrains.org.objectweb.asm.tree.analysis.SourceValue @@ -27,9 +28,11 @@ import org.jetbrains.org.objectweb.asm.tree.analysis.SourceValue fun MethodInliner.getLambdaIfExistsAndMarkInstructions( insnNode: AbstractInsnNode, localFrame: Frame, - insAndFrames: InstructionsAndFrames, - toDelete: MutableSet, - processSwap: Boolean): LambdaInfo? { + processSwap: Boolean, + insnList: InsnList, + frames: Array?>, + toDelete: MutableSet +): LambdaInfo? { val processingInsnNode = if (processSwap && insnNode.opcode == Opcodes.SWAP) InlineCodegenUtil.getPrevMeaningful(insnNode) else insnNode @@ -40,12 +43,12 @@ fun MethodInliner.getLambdaIfExistsAndMarkInstructions( val local = localFrame.getLocal(varIndex) val storeIns = local.singleOrNullInsn() if (storeIns is VarInsnNode && storeIns.getOpcode() == Opcodes.ASTORE) { - val frame = insAndFrames[storeIns] + val frame = frames[insnList.indexOf(storeIns)] if (frame != null) { val topOfStack = frame.getStack(frame.stackSize - 1) val lambdaAload = topOfStack.singleOrNullInsn() if (lambdaAload != null) { - lambdaInfo = getLambdaIfExistsAndMarkInstructions(lambdaAload, frame, insAndFrames, toDelete, processSwap) + lambdaInfo = getLambdaIfExistsAndMarkInstructions(lambdaAload, frame, processSwap, insnList, frames, toDelete) if (lambdaInfo != null) { toDelete.add(storeIns) toDelete.add(lambdaAload)