refactor leaking parameters analysis

This commit is contained in:
Ilya Klyuchnikov
2014-08-19 09:04:42 +04:00
parent 8f97daf24a
commit 2f908004c7
3 changed files with 21 additions and 18 deletions
@@ -27,7 +27,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.org.objectweb.asm.*;
import org.jetbrains.org.objectweb.asm.tree.MethodNode;
import org.jetbrains.org.objectweb.asm.tree.analysis.AnalyzerException;
import org.jetbrains.org.objectweb.asm.tree.analysis.Frame;
import java.security.MessageDigest;
import java.util.*;
@@ -190,16 +189,16 @@ public class ClassDataIndexer implements DataIndexer<Bytes, HEquations, FileCont
}
}
final Pair<boolean[], Frame<org.jetbrains.org.objectweb.asm.tree.analysis.Value>[]> leakingParametersAndFrames =
final LeakingParameters leakingParametersAndFrames =
maybeLeakingParameter ? leakingParametersAndFrames(method, methodNode, argumentTypes, jsr) : null;
boolean[] leakingParameters =
leakingParametersAndFrames != null ? leakingParametersAndFrames.first : null;
leakingParametersAndFrames != null ? leakingParametersAndFrames.parameters : null;
final NullableLazyValue<boolean[]> origins = new NullableLazyValue<boolean[]>() {
@Override
protected boolean[] compute() {
try {
return OriginsAnalysis.resultOrigins(leakingParametersAndFrames.second, methodNode.instructions, richControlFlow.controlFlow);
return OriginsAnalysis.resultOrigins(leakingParametersAndFrames.frames, methodNode.instructions, richControlFlow.controlFlow);
}
catch (AnalyzerException e) {
LOG.debug("when processing " + method + " in " + presentableUrl, e);
@@ -350,14 +349,11 @@ public class ClassDataIndexer implements DataIndexer<Bytes, HEquations, FileCont
return result;
}
private Pair<boolean[], Frame<org.jetbrains.org.objectweb.asm.tree.analysis.Value>[]> leakingParametersAndFrames(Method method,
MethodNode methodNode,
Type[] argumentTypes,
boolean jsr)
private LeakingParameters leakingParametersAndFrames(Method method, MethodNode methodNode, Type[] argumentTypes, boolean jsr)
throws AnalyzerException {
return argumentTypes.length < 32 ?
LeakingParametersAnalysis.fastLeakingParameters(method.internalClassName, methodNode, jsr) :
LeakingParametersAnalysis.leakingParameters(method.internalClassName, methodNode, jsr);
LeakingParameters.buildFast(method.internalClassName, methodNode, jsr) :
LeakingParameters.build(method.internalClassName, methodNode, jsr);
}
}, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
@@ -15,7 +15,6 @@
*/
package com.intellij.codeInspection.bytecodeAnalysis.asm;
import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.tree.*;
@@ -29,8 +28,16 @@ import static org.jetbrains.org.objectweb.asm.Opcodes.*;
/**
* @author lambdamix
*/
public class LeakingParametersAnalysis {
public static Pair<boolean[], Frame<Value>[]> leakingParameters(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException {
public class LeakingParameters {
public final Frame<Value>[] frames;
public final boolean[] parameters;
public LeakingParameters(Frame<Value>[] frames, boolean[] parameters) {
this.frames = frames;
this.parameters = parameters;
}
public static LeakingParameters build(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException {
Frame<ParamsValue>[] frames = jsr ?
new Analyzer<ParamsValue>(new ParametersUsage(methodNode)).analyze(className, methodNode) :
new LiteAnalyzer<ParamsValue>(new ParametersUsage(methodNode)).analyze(className, methodNode);
@@ -50,10 +57,10 @@ public class LeakingParametersAnalysis {
}
}
}
return Pair.create(collector.leaking, (Frame<Value>[])(Frame<?>[])frames);
return new LeakingParameters((Frame<Value>[])(Frame<?>[])frames, collector.leaking);
}
public static Pair<boolean[], Frame<Value>[]> fastLeakingParameters(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException {
public static LeakingParameters buildFast(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException {
IParametersUsage parametersUsage = new IParametersUsage(methodNode);
Frame<?>[] frames = jsr ?
new Analyzer<IParamsValue>(parametersUsage).analyze(className, methodNode) :
@@ -63,7 +70,7 @@ public class LeakingParametersAnalysis {
for (int i = 0; i < result.length; i++) {
result[i] = (leakingMask & (1 << i)) != 0;
}
return Pair.create(result, (Frame<Value>[])frames);
return new LeakingParameters((Frame<Value>[])frames, result);
}
}
@@ -17,7 +17,7 @@ package com.intellij.codeInspection.bytecodeAnalysis;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInsight.InferredAnnotationsManager;
import com.intellij.codeInspection.bytecodeAnalysis.asm.LeakingParametersAnalysis;
import com.intellij.codeInspection.bytecodeAnalysis.asm.LeakingParameters;
import com.intellij.codeInspection.bytecodeAnalysis.data.*;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
@@ -95,7 +95,7 @@ public class BytecodeAnalysisTest extends JavaCodeInsightFixtureTestCase {
public void visitEnd() {
super.visitEnd();
try {
map.put(method, LeakingParametersAnalysis.leakingParameters(classReader.getClassName(), node, false).first);
map.put(method, LeakingParameters.build(classReader.getClassName(), node, false).parameters);
}
catch (AnalyzerException ignore) {}
}