InstructionStringifier(StringBuilder sb, ProgramReader program) { this.sb = sb; variableLabels = new String[program.variableCount()]; Set<String> occupiedLabels = new HashSet<>(); for (int i = 0; i < program.variableCount(); ++i) { VariableReader var = program.variableAt(i); String suggestedName = var.getLabel() != null ? var.getLabel() : Integer.toString(i); if (!occupiedLabels.add(suggestedName)) { int suffix = 1; String base = suggestedName + "_"; do { suggestedName = base + suffix++; } while (!occupiedLabels.add(suggestedName)); } variableLabels[i] = suggestedName; } }
private String[] getVariableNames(ProgramReader program, boolean debuggerFriendly) { String[] names = new String[program.variableCount()]; for (int i = 0; i < names.length; ++i) { names[i] = program.variableAt(i).getDebugName(); if (debuggerFriendly && names[i] == null) { names[i] = ""; } } return names; }
private int[] getVariableCategories(ProgramReader program, MethodReference method) { TypeInferer inferer = new TypeInferer(); inferer.inferTypes(program, method); int[] categories = new int[program.variableCount()]; for (int i = 0; i < program.variableCount(); ++i) { VariableType type = inferer.typeOf(i); categories[i] = type != null ? type.ordinal() : 255; } return categories; }
StringBuilder insnSb = new StringBuilder(); InstructionStringifier stringifier = new InstructionStringifier(insnSb, program); for (int i = 0; i < program.variableCount(); ++i) { VariableReader var = program.variableAt(i); if (var == null || var.getDebugName() == null) {
void findAliases(ProgramReader program) { DisjointSet set = new DisjointSet(); for (int i = 0; i < program.variableCount(); ++i) { set.create(); AliasReader reader = new AliasReader(set, program.variableCount()); for (int i = 0; i < program.basicBlockCount(); ++i) { BasicBlockReader block = program.basicBlockAt(i); int[] variables = new int[program.variableCount()]; for (int i = 0; i < variables.length; ++i) { int v = set.find(i);
@Override public void methodReached(DependencyAgent agent, MethodDependency method) { if (method.getMethod() == null || method.getMethod().getProgram() == null) { return; } ProgramReader program = method.getMethod().getProgram(); FunctionGetFinder finder = new FunctionGetFinder(program.variableCount()); for (BasicBlockReader block : program.getBasicBlocks()) { block.readAllInstructions(finder); } if (!finder.invocations.isEmpty()) { processInvocations(agent, method.getMethod(), finder); } }
public Object interpret(ProgramReader program, Object[] parameters) throws InterpretException { variables = new Object[program.variableCount()]; System.arraycopy(parameters, 0, variables, 0, parameters.length); currentBlock = program.basicBlockAt(0);
public int[] buildMapping(ProgramReader program, boolean[] significantParams, boolean needsReturn) { lastIndex = program.variableCount(); this.paramCount = significantParams.length; if (needsReturn) { int[] result = new int[program.variableCount()]; int classCount = 0; for (int i = 0; i < program.variableCount(); ++i) { if (!escaping.contains(i) && i >= significantParams.length) { result[i] = -1;
aliasFinder.findAliases(template); CapturedValue[] capturedValueArray = new CapturedValue[template.variableCount()]; for (int i = 0; i < capturedValues.size(); ++i) { capturedValueArray[i + 1] = capturedValues.get(i); for (int i = capturedValues.size(); i < template.variableCount(); ++i) { VariableReader variable = template.variableAt(i); Variable variableCopy = program.createVariable();
public static Program copy(ProgramReader program) { Program copy = new Program(); for (int i = 0; i < program.variableCount(); ++i) { Variable var = copy.createVariable(); var.setDebugName(program.variableAt(i).getDebugName()); var.setLabel(program.variableAt(i).getLabel()); } for (int i = 0; i < program.basicBlockCount(); ++i) { copy.createBasicBlock(); } for (int i = 0; i < program.basicBlockCount(); ++i) { BasicBlockReader block = program.basicBlockAt(i); BasicBlock blockCopy = copy.basicBlockAt(i); copyBasicBlock(block, blockCopy); } return copy; }
private void processInvocations(DependencyAgent agent, MethodReader method, FunctionGetFinder finder) { int[] variableClasses = finder.variableClasses.pack(method.getProgram().variableCount()); String[] stringConstants = new String[finder.stringConstants.length]; ValueType[] classConstants = new ValueType[finder.classConstants.length];
@Override protected void processMethod(MethodDependency methodDep) { MethodReader method = methodDep.getMethod(); ProgramReader program = method.getProgram(); if (program != null) { FastInstructionAnalyzer instructionAnalyzer = new FastInstructionAnalyzer(this); instructionAnalyzer.setCaller(method.getReference()); for (BasicBlockReader block : program.getBasicBlocks()) { block.readAllInstructions(instructionAnalyzer); for (TryCatchBlockReader tryCatch : block.readTryCatchBlocks()) { if (tryCatch.getExceptionType() != null) { linkClass(tryCatch.getExceptionType()); } } } methodDep.variableNodes = new DependencyNode[program.variableCount()]; for (int i = 0; i < methodDep.variableNodes.length; ++i) { methodDep.variableNodes[i] = instancesNode; } } if (method.hasModifier(ElementModifier.SYNCHRONIZED)) { processAsyncMethod(methodDep); } }
nodes = new DependencyNode[dep.getMethod().getProgram().variableCount()]; for (int i = 0; i < nodes.length; ++i) { int mappedNode = nodeMapping[i];
public void inferTypes(ProgramReader program, MethodReference method) { int sz = program.variableCount(); types = new InferenceType[sz];
InstructionStringifier(StringBuilder sb, ProgramReader program) { this.sb = sb; variableLabels = new String[program.variableCount()]; Set<String> occupiedLabels = new HashSet<>(); for (int i = 0; i < program.variableCount(); ++i) { VariableReader var = program.variableAt(i); String suggestedName = var.getLabel() != null ? var.getLabel() : Integer.toString(i); if (!occupiedLabels.add(suggestedName)) { int suffix = 1; String base = suggestedName + "_"; do { suggestedName = base + suffix++; } while (!occupiedLabels.add(suggestedName)); } variableLabels[i] = suggestedName; } }
private String[] getVariableNames(ProgramReader program) { String[] names = new String[program.variableCount()]; for (int i = 0; i < names.length; ++i) { names[i] = program.variableAt(i).getDebugName(); } return names; }
private int[] getVariableCategories(ProgramReader program, MethodReference method) { TypeInferer inferer = new TypeInferer(); inferer.inferTypes(program, method); int[] categories = new int[program.variableCount()]; for (int i = 0; i < program.variableCount(); ++i) { VariableType type = inferer.typeOf(i); categories[i] = type != null ? type.ordinal() : 255; } return categories; }
void findAliases(ProgramReader program) { DisjointSet set = new DisjointSet(); for (int i = 0; i < program.variableCount(); ++i) { set.create(); AliasReader reader = new AliasReader(set, program.variableCount()); for (int i = 0; i < program.basicBlockCount(); ++i) { BasicBlockReader block = program.basicBlockAt(i); int[] variables = new int[program.variableCount()]; for (int i = 0; i < variables.length; ++i) { int v = set.find(i);
public Object interpret(ProgramReader program, Object[] parameters) throws InterpretException { variables = new Object[program.variableCount()]; System.arraycopy(parameters, 0, variables, 0, parameters.length); currentBlock = program.basicBlockAt(0);
public static Program copy(ProgramReader program) { Program copy = new Program(); for (int i = 0; i < program.variableCount(); ++i) { Variable var = copy.createVariable(); var.setDebugName(program.variableAt(i).getDebugName()); var.setLabel(program.variableAt(i).getLabel()); } for (int i = 0; i < program.basicBlockCount(); ++i) { copy.createBasicBlock(); } for (int i = 0; i < program.basicBlockCount(); ++i) { BasicBlockReader block = program.basicBlockAt(i); BasicBlock blockCopy = copy.basicBlockAt(i); copyBasicBlock(block, blockCopy); } return copy; }