public void generateMethod(RegularMethodNode methodNode) { generateMethodSignature(writer, methodNode.getReference(), methodNode.getModifiers().contains(ElementModifier.STATIC), true); writer.print(" {").indent().println(); localsWriter = writer.fragment(); CodeGenerationVisitor visitor = new CodeGenerationVisitor(context, writer, includes); visitor.setCallingMethod(methodNode.getReference()); methodNode.getBody().acceptVisitor(visitor); generateLocals(methodNode, visitor.getTemporaries()); writer.outdent().println("}"); }
private void generateLocals(RegularMethodNode methodNode, int[] temporaryCount) { int start = methodNode.getReference().parameterCount() + 1; for (int i = start; i < methodNode.getVariables().size(); ++i) { VariableNode variableNode = methodNode.getVariables().get(i); if (variableNode.getType() == null) { continue; } localsWriter.printType(variableNode.getType()).print(" local_").print(String.valueOf(i)).println(";"); } for (CVariableType type : CVariableType.values()) { for (int i = 0; i < temporaryCount[type.ordinal()]; ++i) { localsWriter.print(type.text + " tmp_" + type.name().toLowerCase() + "_" + i).println(";"); } } } }
public void optimize(RegularMethodNode method, Program program, boolean friendlyToDebugger) { ReadWriteStatsBuilder stats = new ReadWriteStatsBuilder(method.getVariables().size()); stats.analyze(program); applyParametersToWriteStats(stats, method.getReference()); boolean[] preservedVars = new boolean[stats.writes.length]; BreakEliminator breakEliminator = new BreakEliminator(); breakEliminator.eliminate(method.getBody()); if (friendlyToDebugger) { for (int i = 0; i < method.getVariables().size(); ++i) { if (method.getVariables().get(i).getName() != null) { preservedVars[i] = true; } } } OptimizingVisitor optimizer = new OptimizingVisitor(preservedVars, stats.writes, stats.reads, moveConstants ? stats.constants : new Object[stats.constants.length], friendlyToDebugger); method.getBody().acceptVisitor(optimizer); method.setBody(optimizer.resultStmt); int paramCount = method.getReference().parameterCount(); UnusedVariableEliminator unusedEliminator = new UnusedVariableEliminator(paramCount, method.getVariables()); method.getBody().acceptVisitor(unusedEliminator); method.getVariables().clear(); method.getVariables().addAll(unusedEliminator.getReorderedVariables()); method.getBody().acceptVisitor(new RedundantLabelEliminator()); method.getBody().acceptVisitor(new RedundantReturnElimination()); for (int i = 0; i < method.getVariables().size(); ++i) { method.getVariables().get(i).setIndex(i); } }
statementRenderer.setAsync(false); this.async = false; MethodReference ref = method.getReference(); for (int i = 0; i < method.getVariables().size(); ++i) { debugEmitter.emitVariable(new String[] { method.getVariables().get(i).getName() },
statementRenderer.setAsync(false); this.async = false; MethodReference ref = method.getReference(); for (int i = 0; i < method.getVariables().size(); ++i) { debugEmitter.emitVariable(new String[] { method.getVariables().get(i).getName() },
public void optimize(RegularMethodNode method, Program program, boolean friendlyToDebugger) { ReadWriteStatsBuilder stats = new ReadWriteStatsBuilder(method.getVariables().size()); stats.analyze(program); boolean[] preservedVars = new boolean[stats.writes.length]; BreakEliminator breakEliminator = new BreakEliminator(); breakEliminator.eliminate(method.getBody()); OptimizingVisitor optimizer = new OptimizingVisitor(preservedVars, stats.writes, stats.reads, friendlyToDebugger); method.getBody().acceptVisitor(optimizer); method.setBody(optimizer.resultStmt); int paramCount = method.getReference().parameterCount(); UnusedVariableEliminator unusedEliminator = new UnusedVariableEliminator(paramCount, method.getVariables()); method.getBody().acceptVisitor(unusedEliminator); method.getVariables().clear(); method.getVariables().addAll(unusedEliminator.getReorderedVariables()); method.getBody().acceptVisitor(new RedundantLabelEliminator()); method.getBody().acceptVisitor(new RedundantReturnElimination()); for (int i = 0; i < method.getVariables().size(); ++i) { method.getVariables().get(i).setIndex(i); } }