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; }
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()); } }
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; }
if (methodNode.getModifiers().contains(ElementModifier.STATIC)) { firstToSave = 1; writer.outdent().append("}").softNewLine(); if (methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) { writer.append("try").ws().append('{').indent().softNewLine(); for (int i = 0; i < methodNode.getBody().size(); ++i) { writer.append("case ").append(i).append(":").indent().softNewLine(); if (i == 0 && methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) { writer.appendMethodBody(NameFrequencyEstimator.MONITOR_ENTER_METHOD); writer.append("("); if (methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) { writer.outdent().append("}").ws().append("finally").ws().append('{').indent().softNewLine(); writer.append("if").ws().append("(!").appendFunction("$rt_suspending").append("())")
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; }
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()); } }
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; }
if (methodNode.getModifiers().contains(ElementModifier.STATIC)) { firstToSave = 1; writer.outdent().append("}").softNewLine(); if (methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) { writer.append("try").ws().append('{').indent().softNewLine(); for (int i = 0; i < methodNode.getBody().size(); ++i) { writer.append("case ").append(i).append(":").indent().softNewLine(); if (i == 0 && methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) { writer.appendMethodBody(new MethodReference(Object.class, "monitorEnter", Object.class, void.class)); if (methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) { writer.outdent().append("}").ws().append("finally").ws().append('{').indent().softNewLine(); writer.append("if").ws().append("(!").appendFunction("$rt_suspending").append("())")