public String[] extract(AsyncMethodNode node) { for (AsyncMethodPart part : node.getBody()) { part.getStatement().acceptVisitor(visitor); } String[] result = visitor.dependencies.toArray(new String[0]); visitor.dependencies.clear(); return result; }
@Override public void visit(AsyncMethodNode methodNode) { async = true; for (AsyncMethodPart part : methodNode.getBody()) { part.getStatement().acceptVisitor(this); } }
public void writeAsync(DataOutput output, AsyncMethodNode method) throws IOException { output.writeInt(ElementModifier.pack(method.getModifiers())); output.writeShort(method.getVariables().size()); for (VariableNode var : method.getVariables()) { write(output, var); } try { output.writeShort(method.getBody().size()); for (int i = 0; i < method.getBody().size(); ++i) { method.getBody().get(i).getStatement().acceptVisitor(new NodeWriter(output)); } } catch (IOExceptionWrapper e) { throw new IOException("Error writing method body", e.getCause()); } }
breakEliminator.eliminate(part.getStatement()); findEscapingLiveVars(liveness, cfg, splitter, i, preservedVars); OptimizingVisitor optimizer = new OptimizingVisitor(preservedVars, stats.writes, stats.reads, moveConstants ? stats.constants : new Object[stats.constants.length], friendlyToDebugger); part.getStatement().acceptVisitor(optimizer); part.setStatement(optimizer.resultStmt); UnusedVariableEliminator unusedEliminator = new UnusedVariableEliminator(paramCount, method.getVariables()); for (AsyncMethodPart part : method.getBody()) { part.getStatement().acceptVisitor(unusedEliminator); part.getStatement().acceptVisitor(labelEliminator);
public RegularMethodNode decompileRegularCacheMiss(MethodHolder method) { RegularMethodNode methodNode = new RegularMethodNode(method.getReference()); Program program = method.getProgram(); int[] targetBlocks = new int[program.basicBlockCount()]; Arrays.fill(targetBlocks, -1); try { methodNode.setBody(getRegularMethodStatement(program, targetBlocks, false).getStatement()); } catch (RuntimeException e) { StringBuilder sb = new StringBuilder("Error decompiling method " + method.getReference() + ":\n"); sb.append(new ListingBuilder().buildListing(program, " ")); throw new DecompilationException(sb.toString(), e); } TypeInferer typeInferer = new TypeInferer(); typeInferer.inferTypes(program, method.getReference()); for (int i = 0; i < program.variableCount(); ++i) { VariableNode variable = new VariableNode(program.variableAt(i).getRegister(), typeInferer.typeOf(i)); variable.setName(program.variableAt(i).getDebugName()); methodNode.getVariables().add(variable); } Optimizer optimizer = new Optimizer(moveConstants); optimizer.optimize(methodNode, method.getProgram(), friendlyToDebugger); methodNode.getModifiers().addAll(method.getModifiers()); return methodNode; }
for (AsyncMethodPart part : methodNode.getBody()) { if (!tryCatchFinder.tryCatchFound) { part.getStatement().acceptVisitor(tryCatchFinder); statementRenderer.setEnd(true); statementRenderer.setCurrentPart(i); part.getStatement().acceptVisitor(statementRenderer); writer.outdent();
@Override public void visit(AsyncMethodNode methodNode) { async = true; for (AsyncMethodPart part : methodNode.getBody()) { part.getStatement().acceptVisitor(this); } }
private boolean checkAsyncRelevant(AsyncMethodNode node) { AsyncCallsFinder asyncCallsFinder = new AsyncCallsFinder(); for (AsyncMethodPart part : node.getBody()) { part.getStatement().acceptVisitor(asyncCallsFinder); } for (MethodReference asyncCall : asyncCallsFinder.asyncCalls) { if (!splitMethods.contains(asyncCall)) { return false; } } asyncCallsFinder.allCalls.removeAll(asyncCallsFinder.asyncCalls); for (MethodReference asyncCall : asyncCallsFinder.allCalls) { if (splitMethods.contains(asyncCall)) { return false; } } return true; }
AsyncMethodNode node = asyncCache.get(method).node; for (AsyncMethodPart part : node.getBody()) { part.getStatement().acceptVisitor(analyzer);
public void writeAsync(DataOutput output, AsyncMethodNode method) throws IOException { output.writeInt(packModifiers(method.getModifiers())); output.writeShort(method.getVariables().size()); for (VariableNode var : method.getVariables()) { write(output, var); } try { output.writeShort(method.getBody().size()); for (int i = 0; i < method.getBody().size(); ++i) { method.getBody().get(i).getStatement().acceptVisitor(new NodeWriter(output)); } } catch (IOExceptionWrapper e) { throw new IOException("Error writing method body", e.getCause()); } }
breakEliminator.eliminate(part.getStatement()); findEscapingLiveVars(liveness, cfg, splitter, i, preservedVars); OptimizingVisitor optimizer = new OptimizingVisitor(preservedVars, stats.writes, stats.reads, friendlyToDebugger); part.getStatement().acceptVisitor(optimizer); part.setStatement(optimizer.resultStmt); UnusedVariableEliminator unusedEliminator = new UnusedVariableEliminator(paramCount, method.getVariables()); for (AsyncMethodPart part : method.getBody()) { part.getStatement().acceptVisitor(unusedEliminator); part.getStatement().acceptVisitor(labelEliminator);
public RegularMethodNode decompileRegularCacheMiss(MethodHolder method) { RegularMethodNode methodNode = new RegularMethodNode(method.getReference()); Program program = method.getProgram(); int[] targetBlocks = new int[program.basicBlockCount()]; Arrays.fill(targetBlocks, -1); try { methodNode.setBody(getRegularMethodStatement(program, targetBlocks, false).getStatement()); } catch (RuntimeException e) { StringBuilder sb = new StringBuilder("Error decompiling method " + method.getReference() + ":\n"); sb.append(new ListingBuilder().buildListing(program, " ")); throw new DecompilationException(sb.toString(), e); } TypeInferer typeInferer = new TypeInferer(); typeInferer.inferTypes(program, method.getReference()); for (int i = 0; i < program.variableCount(); ++i) { VariableNode variable = new VariableNode(program.variableAt(i).getRegister(), typeInferer.typeOf(i)); variable.setName(program.variableAt(i).getDebugName()); methodNode.getVariables().add(variable); } Optimizer optimizer = new Optimizer(); optimizer.optimize(methodNode, method.getProgram(), friendlyToDebugger); methodNode.getModifiers().addAll(method.getModifiers()); return methodNode; }
for (AsyncMethodPart part : methodNode.getBody()) { if (!tryCatchFinder.tryCatchFound) { part.getStatement().acceptVisitor(tryCatchFinder); statementRenderer.setEnd(true); statementRenderer.setCurrentPart(i); part.getStatement().acceptVisitor(statementRenderer); writer.outdent();