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 { public class OptimizationMethodVisitor extends MethodVisitor {
private static final int MEMORY_LIMIT_BY_METHOD_MB = 50; private static final int MEMORY_LIMIT_BY_METHOD_MB = 50;
private static final MethodTransformer MAIN_METHOD_TRANSFORMER = new RedundantNullCheckMethodTransformer( private static final MethodTransformer[] TRANSFORMERS = new MethodTransformer[]{
new RedundantBoxingMethodTransformer(null) new RedundantNullCheckMethodTransformer(), new RedundantBoxingMethodTransformer()
); };
private final MethodNode methodNode; private final MethodNode methodNode;
private final MethodVisitor delegate; private final MethodVisitor delegate;
@@ -66,7 +66,9 @@ public class OptimizationMethodVisitor extends MethodVisitor {
super.visitEnd(); super.visitEnd();
if (canBeAnalyzed(methodNode)) { if (canBeAnalyzed(methodNode)) {
MAIN_METHOD_TRANSFORMER.transform("fake", methodNode); for (MethodTransformer transformer : TRANSFORMERS) {
transformer.transform("fake", methodNode);
}
} }
methodNode.accept(new EndIgnoringMethodVisitorDecorator(Opcodes.ASM5, delegate)); methodNode.accept(new EndIgnoringMethodVisitorDecorator(Opcodes.ASM5, delegate));
@@ -31,9 +31,6 @@ import org.jetbrains.org.objectweb.asm.tree.analysis.Frame;
import java.util.*; import java.util.*;
public class RedundantBoxingMethodTransformer extends MethodTransformer { public class RedundantBoxingMethodTransformer extends MethodTransformer {
public RedundantBoxingMethodTransformer(MethodTransformer methodTransformer) {
super(methodTransformer);
}
@Override @Override
public void transform(@NotNull String internalClassName, @NotNull MethodNode node) { public void transform(@NotNull String internalClassName, @NotNull MethodNode node) {
@@ -55,8 +52,6 @@ public class RedundantBoxingMethodTransformer extends MethodTransformer {
adaptInstructionsForBoxedValues(node, valuesToOptimize); adaptInstructionsForBoxedValues(node, valuesToOptimize);
} }
super.transform(internalClassName, node);
} }
private static void interpretPopInstructionsForBoxedValues( private static void interpretPopInstructionsForBoxedValues(
@@ -28,18 +28,12 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class RedundantNullCheckMethodTransformer extends MethodTransformer { public class RedundantNullCheckMethodTransformer extends MethodTransformer {
public RedundantNullCheckMethodTransformer(MethodTransformer methodTransformer) {
super(methodTransformer);
}
@Override @Override
public void transform(@NotNull String internalClassName, @NotNull MethodNode methodNode) { public void transform(@NotNull String internalClassName, @NotNull MethodNode methodNode) {
while (removeRedundantNullCheckPass(internalClassName, methodNode)) { while (removeRedundantNullCheckPass(internalClassName, methodNode)) {
//do nothing //do nothing
} }
super.transform(internalClassName, methodNode);
} }
private static boolean removeRedundantNullCheckPass(@NotNull String internalClassName, @NotNull MethodNode 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.*; import org.jetbrains.org.objectweb.asm.tree.analysis.*;
public abstract class MethodTransformer { public abstract class MethodTransformer {
private final MethodTransformer delegate;
protected MethodTransformer(MethodTransformer delegate) {
this.delegate = delegate;
}
protected static <V extends Value> Frame<V>[] runAnalyzer( protected static <V extends Value> Frame<V>[] runAnalyzer(
@NotNull Analyzer<V> analyzer, @NotNull Analyzer<V> analyzer,
@@ -47,9 +42,5 @@ public abstract class MethodTransformer {
return runAnalyzer(new Analyzer<V>(interpreter), internalClassName, node); return runAnalyzer(new Analyzer<V>(interpreter), internalClassName, node);
} }
public void transform(@NotNull String internalClassName, @NotNull MethodNode methodNode) { abstract public void transform(@NotNull String internalClassName, @NotNull MethodNode methodNode);
if (delegate != null) {
delegate.transform(internalClassName, methodNode);
}
}
} }