Minor. Cleanup codegen.optimization package

This commit is contained in:
Denis Zharkov
2016-05-18 12:22:07 +03:00
parent 329fb9d619
commit 88637ba336
6 changed files with 12 additions and 40 deletions
@@ -28,4 +28,4 @@ class MandatoryMethodTransformer : MethodTransformer() {
labelNormalization.transform(internalClassName, methodNode)
fixStack.transform(internalClassName, methodNode)
}
}
}
@@ -208,7 +208,7 @@ open class MethodAnalyzer<V : Value>(
private fun mergeControlFlowEdge(insn: Int, frame: Frame<V>) {
val oldFrame = frames[insn]
var changes: Boolean
val changes: Boolean
if (oldFrame == null) {
frames[insn] = newFrame(frame)
@@ -223,4 +223,4 @@ open class MethodAnalyzer<V : Value>(
}
}
}
}
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.codegen.optimization.fixStack
import com.intellij.util.SmartList
import com.intellij.util.containers.Stack
import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil
import org.jetbrains.kotlin.codegen.optimization.common.MethodAnalyzer
@@ -26,11 +25,9 @@ import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode
import org.jetbrains.org.objectweb.asm.tree.JumpInsnNode
import org.jetbrains.org.objectweb.asm.tree.MethodNode
import org.jetbrains.org.objectweb.asm.tree.TryCatchBlockNode
import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue
import org.jetbrains.org.objectweb.asm.tree.analysis.Frame
import org.jetbrains.org.objectweb.asm.tree.analysis.Interpreter
import java.util.*
internal class FixStackAnalyzer(
owner: String,
@@ -159,4 +156,4 @@ internal class FixStackAnalyzer(
private fun FixStackFrame.executeSaveStackBeforeTry(insn: AbstractInsnNode) {
saveStackAndClear(insn)
}
}
}
@@ -23,13 +23,13 @@ import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil
import org.jetbrains.kotlin.codegen.optimization.common.InsnSequence
import org.jetbrains.kotlin.codegen.optimization.common.findPreviousOrNull
import org.jetbrains.kotlin.codegen.optimization.common.hasOpcode
import org.jetbrains.kotlin.codegen.optimization.fixStack.forEachPseudoInsn
import org.jetbrains.kotlin.codegen.pseudoInsns.PseudoInsn
import org.jetbrains.kotlin.codegen.pseudoInsns.parsePseudoInsnOrNull
import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.tree.*
import java.util.*
import kotlin.properties.Delegates
import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode
import org.jetbrains.org.objectweb.asm.tree.JumpInsnNode
import org.jetbrains.org.objectweb.asm.tree.LabelNode
import org.jetbrains.org.objectweb.asm.tree.MethodNode
internal class FixStackContext(val methodNode: MethodNode) {
val breakContinueGotoNodes = linkedSetOf<JumpInsnNode>()
@@ -103,7 +103,7 @@ internal class FixStackContext(val methodNode: MethodNode) {
if (restoreLabel !is LabelNode) {
throw AssertionError("${indexOf(insnNode)}: restore should be preceded by a catch block label")
}
val saveNodes = findMatchingSaveNodes(insnNode, restoreLabel)
val saveNodes = findMatchingSaveNodes(restoreLabel)
if (saveNodes.isEmpty()) {
throw AssertionError("${indexOf(insnNode)}: in handler ${indexOf(restoreLabel)} restore is not matched with save")
}
@@ -115,7 +115,7 @@ internal class FixStackContext(val methodNode: MethodNode) {
restoreStackMarkersForSaveMarker.getOrPut(saveNode, { SmartList<AbstractInsnNode>() }).add(insnNode)
}
private fun findMatchingSaveNodes(insnNode: AbstractInsnNode, restoreLabel: LabelNode): List<AbstractInsnNode> {
private fun findMatchingSaveNodes(restoreLabel: LabelNode): List<AbstractInsnNode> {
val saveNodes = SmartHashSet<AbstractInsnNode>()
methodNode.tryCatchBlocks.forEach { tcb ->
if (restoreLabel == tcb.start || restoreLabel == tcb.handler) {
@@ -139,4 +139,4 @@ internal class FixStackContext(val methodNode: MethodNode) {
saveStackNodesForTryStartLabel.isNotEmpty() ||
openingInlineMethodMarker.isNotEmpty()
}
}
@@ -94,4 +94,4 @@ internal class LocalVariablesManager(val context: FixStackContext, val methodNod
updateMaxLocals(returnValueIndex + returnValue.size)
return returnValueIndex
}
}
}
@@ -16,41 +16,18 @@
package org.jetbrains.kotlin.codegen.optimization.fixStack
import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil
import org.jetbrains.kotlin.codegen.optimization.common.InsnSequence
import org.jetbrains.kotlin.codegen.pseudoInsns.PseudoInsn
import org.jetbrains.kotlin.codegen.pseudoInsns.parsePseudoInsnOrNull
import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.tree.*
import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue
import org.jetbrains.org.objectweb.asm.tree.analysis.Frame
import org.jetbrains.org.objectweb.asm.tree.analysis.Value
inline fun InsnList.forEachPseudoInsn(block: (PseudoInsn, AbstractInsnNode) -> Unit) {
InsnSequence(this).forEach { insn ->
parsePseudoInsnOrNull(insn)?.let { block(it, insn) }
}
}
inline fun InsnList.forEachInlineMarker(block: (String, MethodInsnNode) -> Unit) {
InsnSequence(this).forEach { insn ->
if (InlineCodegenUtil.isInlineMarker(insn)) {
val methodInsnNode = insn as MethodInsnNode
block(methodInsnNode.name, methodInsnNode)
}
}
}
fun <V : Value> Frame<V>.top(): V? =
peek(0)
fun <V : Value> Frame<V>.peek(offset: Int): V? =
if (stackSize >= offset) getStack(stackSize - offset - 1) else null
fun MethodNode.updateMaxLocals(newMaxLocals: Int) {
maxLocals = Math.max(maxLocals, newMaxLocals)
}
class SavedStackDescriptor(
val savedValues: List<BasicValue>,
val firstLocalVarIndex: Int
@@ -64,7 +41,6 @@ class SavedStackDescriptor(
fun isNotEmpty(): Boolean = savedValues.isNotEmpty()
}
fun saveStack(methodNode: MethodNode, nodeToReplace: AbstractInsnNode, savedStackDescriptor: SavedStackDescriptor,
restoreImmediately: Boolean) {
with(methodNode.instructions) {
@@ -148,4 +124,3 @@ fun replaceMarkerWithPops(methodNode: MethodNode, node: AbstractInsnNode, expect
remove(node)
}
}