Minor refactoring: use array of MethodTransformers

instead of delegation
This commit is contained in:
Denis Zharkov
2014-09-16 14:22:50 +04:00
committed by Michael Bogdanov
parent 35cda83c8f
commit e1c2fbaec0
4 changed files with 7 additions and 25 deletions
@@ -34,9 +34,9 @@ import java.util.List;
public class OptimizationMethodVisitor extends MethodVisitor {
private static final int MEMORY_LIMIT_BY_METHOD_MB = 50;
private static final MethodTransformer MAIN_METHOD_TRANSFORMER = new RedundantNullCheckMethodTransformer(
new RedundantBoxingMethodTransformer(null)
);
private static final MethodTransformer[] TRANSFORMERS = new MethodTransformer[]{
new RedundantNullCheckMethodTransformer(), new RedundantBoxingMethodTransformer()
};
private final MethodNode methodNode;
private final MethodVisitor delegate;
@@ -66,7 +66,9 @@ public class OptimizationMethodVisitor extends MethodVisitor {
super.visitEnd();
if (canBeAnalyzed(methodNode)) {
MAIN_METHOD_TRANSFORMER.transform("fake", methodNode);
for (MethodTransformer transformer : TRANSFORMERS) {
transformer.transform("fake", methodNode);
}
}
methodNode.accept(new EndIgnoringMethodVisitorDecorator(Opcodes.ASM5, delegate));
@@ -31,9 +31,6 @@ import org.jetbrains.org.objectweb.asm.tree.analysis.Frame;
import java.util.*;
public class RedundantBoxingMethodTransformer extends MethodTransformer {
public RedundantBoxingMethodTransformer(MethodTransformer methodTransformer) {
super(methodTransformer);
}
@Override
public void transform(@NotNull String internalClassName, @NotNull MethodNode node) {
@@ -55,8 +52,6 @@ public class RedundantBoxingMethodTransformer extends MethodTransformer {
adaptInstructionsForBoxedValues(node, valuesToOptimize);
}
super.transform(internalClassName, node);
}
private static void interpretPopInstructionsForBoxedValues(
@@ -28,18 +28,12 @@ import java.util.ArrayList;
import java.util.List;
public class RedundantNullCheckMethodTransformer extends MethodTransformer {
public RedundantNullCheckMethodTransformer(MethodTransformer methodTransformer) {
super(methodTransformer);
}
@Override
public void transform(@NotNull String internalClassName, @NotNull MethodNode methodNode) {
while (removeRedundantNullCheckPass(internalClassName, methodNode)) {
//do nothing
}
super.transform(internalClassName, methodNode);
}
private static boolean removeRedundantNullCheckPass(@NotNull String internalClassName, @NotNull MethodNode methodNode) {
@@ -21,11 +21,6 @@ import org.jetbrains.org.objectweb.asm.tree.MethodNode;
import org.jetbrains.org.objectweb.asm.tree.analysis.*;
public abstract class MethodTransformer {
private final MethodTransformer delegate;
protected MethodTransformer(MethodTransformer delegate) {
this.delegate = delegate;
}
protected static <V extends Value> Frame<V>[] runAnalyzer(
@NotNull Analyzer<V> analyzer,
@@ -47,9 +42,5 @@ public abstract class MethodTransformer {
return runAnalyzer(new Analyzer<V>(interpreter), internalClassName, node);
}
public void transform(@NotNull String internalClassName, @NotNull MethodNode methodNode) {
if (delegate != null) {
delegate.transform(internalClassName, methodNode);
}
}
abstract public void transform(@NotNull String internalClassName, @NotNull MethodNode methodNode);
}