public AsyncMethodNode readAsync(DataInput input, MethodReference method) throws IOException { AsyncMethodNode node = new AsyncMethodNode(method); node.getModifiers().addAll(unpackModifiers(input.readInt())); int varCount = input.readShort(); for (int i = 0; i < varCount; ++i) { node.getVariables().add(readVariable(input)); } int partCount = input.readShort(); for (int i = 0; i < partCount; ++i) { AsyncMethodPart part = new AsyncMethodPart(); part.setStatement(readStatement(input)); node.getBody().add(part); } return node; }
private AsyncMethodNode decompileAsyncCacheMiss(MethodHolder method) { AsyncMethodNode node = new AsyncMethodNode(method.getReference()); AsyncProgramSplitter splitter = new AsyncProgramSplitter(classSource, splitMethods); splitter.split(method.getProgram()); for (int i = 0; i < splitter.size(); ++i) { AsyncMethodPart part; try { part = getRegularMethodStatement(splitter.getProgram(i), splitter.getBlockSuccessors(i), i > 0); } catch (RuntimeException e) { StringBuilder sb = new StringBuilder("Error decompiling method " + method.getReference() + " part " + i + ":\n"); sb.append(new ListingBuilder().buildListing(splitter.getProgram(i), " ")); throw new DecompilationException(sb.toString(), e); } node.getBody().add(part); } Program program = method.getProgram(); 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()); node.getVariables().add(variable); } Optimizer optimizer = new Optimizer(moveConstants); optimizer.optimize(node, splitter, friendlyToDebugger); node.getModifiers().addAll(method.getModifiers()); return node; }
public AsyncMethodNode readAsync(DataInput input, MethodReference method) throws IOException { AsyncMethodNode node = new AsyncMethodNode(method); node.getModifiers().addAll(unpackModifiers(input.readInt())); int varCount = input.readShort(); for (int i = 0; i < varCount; ++i) { node.getVariables().add(readVariable(input)); } int partCount = input.readShort(); for (int i = 0; i < partCount; ++i) { AsyncMethodPart part = new AsyncMethodPart(); part.setStatement(readStatement(input)); node.getBody().add(part); } return node; }
private AsyncMethodNode decompileAsyncCacheMiss(MethodHolder method) { AsyncMethodNode node = new AsyncMethodNode(method.getReference()); AsyncProgramSplitter splitter = new AsyncProgramSplitter(classSource, splitMethods); splitter.split(method.getProgram()); for (int i = 0; i < splitter.size(); ++i) { AsyncMethodPart part; try { part = getRegularMethodStatement(splitter.getProgram(i), splitter.getBlockSuccessors(i), i > 0); } catch (RuntimeException e) { StringBuilder sb = new StringBuilder("Error decompiling method " + method.getReference() + " part " + i + ":\n"); sb.append(new ListingBuilder().buildListing(splitter.getProgram(i), " ")); throw new DecompilationException(sb.toString(), e); } node.getBody().add(part); } Program program = method.getProgram(); 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()); node.getVariables().add(variable); } Optimizer optimizer = new Optimizer(); optimizer.optimize(node, splitter, friendlyToDebugger); node.getModifiers().addAll(method.getModifiers()); return node; }