OptimizationMethodVisitor: convert to Kotlin

This commit is contained in:
Dmitry Petrov
2017-05-11 14:23:58 +03:00
parent a3a60db926
commit 0dbf383ce8
@@ -14,64 +14,56 @@
* limitations under the License.
*/
package org.jetbrains.kotlin.codegen.optimization;
package org.jetbrains.kotlin.codegen.optimization
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.codegen.TransformationMethodVisitor;
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantBoxingMethodTransformer;
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantCoercionToUnitTransformer;
import org.jetbrains.kotlin.codegen.optimization.captured.CapturedVarsOptimizationMethodTransformer;
import org.jetbrains.kotlin.codegen.optimization.common.UtilKt;
import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckV2MethodTransformer;
import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.org.objectweb.asm.tree.MethodNode;
import org.jetbrains.kotlin.codegen.TransformationMethodVisitor
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantBoxingMethodTransformer
import org.jetbrains.kotlin.codegen.optimization.boxing.RedundantCoercionToUnitTransformer
import org.jetbrains.kotlin.codegen.optimization.captured.CapturedVarsOptimizationMethodTransformer
import org.jetbrains.kotlin.codegen.optimization.common.prepareForEmitting
import org.jetbrains.kotlin.codegen.optimization.nullCheck.RedundantNullCheckV2MethodTransformer
import org.jetbrains.org.objectweb.asm.MethodVisitor
import org.jetbrains.org.objectweb.asm.tree.MethodNode
public class OptimizationMethodVisitor extends TransformationMethodVisitor {
private static final int MEMORY_LIMIT_BY_METHOD_MB = 50;
class OptimizationMethodVisitor(
delegate: MethodVisitor,
private val disableOptimization: Boolean,
access: Int,
name: String,
desc: String,
signature: String?,
exceptions: Array<String>?
) : TransformationMethodVisitor(delegate, access, name, desc, signature, exceptions) {
private static final MethodTransformer MANDATORY_METHOD_TRANSFORMER = new FixStackWithLabelNormalizationMethodTransformer();
private static final MethodTransformer[] OPTIMIZATION_TRANSFORMERS = new MethodTransformer[] {
new CapturedVarsOptimizationMethodTransformer(),
new RedundantNullCheckV2MethodTransformer(),
new RedundantCheckCastEliminationMethodTransformer(),
new RedundantBoxingMethodTransformer(),
new RedundantCoercionToUnitTransformer(),
new DeadCodeEliminationMethodTransformer(),
new RedundantGotoMethodTransformer(),
new RedundantNopsCleanupMethodTransformer()
};
private final boolean disableOptimization;
public OptimizationMethodVisitor(
@NotNull MethodVisitor delegate,
boolean disableOptimization,
int access,
@NotNull String name,
@NotNull String desc,
@Nullable String signature,
@Nullable String[] exceptions
) {
super(delegate, access, name, desc, signature, exceptions);
this.disableOptimization = disableOptimization;
}
@Override
protected void performTransformations(@NotNull MethodNode methodNode) {
MANDATORY_METHOD_TRANSFORMER.transform("fake", methodNode);
override fun performTransformations(methodNode: MethodNode) {
MANDATORY_METHOD_TRANSFORMER.transform("fake", methodNode)
if (canBeOptimized(methodNode) && !disableOptimization) {
for (MethodTransformer transformer : OPTIMIZATION_TRANSFORMERS) {
transformer.transform("fake", methodNode);
for (transformer in OPTIMIZATION_TRANSFORMERS) {
transformer.transform("fake", methodNode)
}
}
UtilKt.prepareForEmitting(methodNode);
methodNode.prepareForEmitting()
}
private static boolean canBeOptimized(@NotNull MethodNode node) {
int totalFramesSizeMb = node.instructions.size() * (node.maxLocals + node.maxStack) / (1024 * 1024);
return totalFramesSizeMb < MEMORY_LIMIT_BY_METHOD_MB;
companion object {
private val MEMORY_LIMIT_BY_METHOD_MB = 50
private val MANDATORY_METHOD_TRANSFORMER = FixStackWithLabelNormalizationMethodTransformer()
private val OPTIMIZATION_TRANSFORMERS = arrayOf(
CapturedVarsOptimizationMethodTransformer(),
RedundantNullCheckV2MethodTransformer(),
RedundantCheckCastEliminationMethodTransformer(),
RedundantBoxingMethodTransformer(),
RedundantCoercionToUnitTransformer(),
DeadCodeEliminationMethodTransformer(),
RedundantGotoMethodTransformer(),
RedundantNopsCleanupMethodTransformer()
)
private fun canBeOptimized(node: MethodNode): Boolean {
val totalFramesSizeMb = node.instructions.size() * (node.maxLocals + node.maxStack) / (1024 * 1024)
return totalFramesSizeMb < MEMORY_LIMIT_BY_METHOD_MB
}
}
}