Minor refactoring: use array of MethodTransformers
instead of delegation
This commit is contained in:
committed by
Michael Bogdanov
parent
35cda83c8f
commit
e1c2fbaec0
+6
-4
@@ -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));
|
||||||
|
|||||||
-5
@@ -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(
|
||||||
|
|||||||
-6
@@ -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) {
|
||||||
|
|||||||
+1
-10
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user