public String[] extract(RegularMethodNode node) { node.getBody().acceptVisitor(visitor); String[] result = visitor.dependencies.toArray(new String[0]); visitor.dependencies.clear(); return result; }
@Override public void visit(RegularMethodNode methodNode) { async = false; methodNode.getBody().acceptVisitor(this); }
public void write(DataOutput output, RegularMethodNode method) throws IOException { output.writeInt(ElementModifier.pack(method.getModifiers())); output.writeShort(method.getVariables().size()); for (VariableNode var : method.getVariables()) { write(output, var); } try { method.getBody().acceptVisitor(new NodeWriter(output)); } catch (IOExceptionWrapper e) { throw new IOException("Error writing method body", e.getCause()); } }
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); } }
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("}"); }
public WasmFunction generate(MethodReference methodReference, MethodHolder bodyMethod) { ClassHolder cls = classSource.get(methodReference.getClassName()); MethodHolder method = cls.getMethod(methodReference.getDescriptor()); RegularMethodNode methodAst = decompiler.decompileRegular(bodyMethod); WasmFunction function = context.getFunction(names.forMethod(methodReference)); int firstVariable = method.hasModifier(ElementModifier.STATIC) ? 1 : 0; for (int i = firstVariable; i < methodAst.getVariables().size(); ++i) { VariableNode variable = methodAst.getVariables().get(i); WasmType type = variable.getType() != null ? WasmGeneratorUtil.mapType(variable.getType()) : WasmType.INT32; function.add(new WasmLocal(type, variable.getName())); } WasmGenerationVisitor visitor = new WasmGenerationVisitor(context, classGenerator, binaryWriter, function, firstVariable); methodAst.getBody().acceptVisitor(visitor); if (visitor.result instanceof WasmBlock) { ((WasmBlock) visitor.result).setType(function.getResult()); } function.getBody().add(visitor.result); AnnotationReader exportAnnot = method.getAnnotations().get(Export.class.getName()); if (exportAnnot != null) { function.setExportName(exportAnnot.getValue("name").getString()); } return function; }
@Override public void visit(RegularMethodNode methodNode) { async = false; methodNode.getBody().acceptVisitor(this); }
AstDependencyAnalyzer analyzer = new AstDependencyAnalyzer(); RegularMethodNode node = cache.get(method).node; node.getBody().acceptVisitor(analyzer); analyzer.dependencies.add(method.getClassName()); try (DataOutputStream output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)))) {
public void write(DataOutput output, RegularMethodNode method) throws IOException { output.writeInt(packModifiers(method.getModifiers())); output.writeShort(method.getVariables().size()); for (VariableNode var : method.getVariables()) { write(output, var); } try { method.getBody().acceptVisitor(new NodeWriter(output)); } catch (IOExceptionWrapper e) { throw new IOException("Error writing method body", e.getCause()); } }
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); } }
public WasmFunction generate(MethodReference methodReference, MethodHolder bodyMethod) { ClassHolder cls = classSource.get(methodReference.getClassName()); MethodHolder method = cls.getMethod(methodReference.getDescriptor()); RegularMethodNode methodAst = decompiler.decompileRegular(bodyMethod); WasmFunction function = context.getFunction(WasmMangling.mangleMethod(methodReference)); int firstVariable = method.hasModifier(ElementModifier.STATIC) ? 1 : 0; for (int i = firstVariable; i < methodAst.getVariables().size(); ++i) { VariableNode variable = methodAst.getVariables().get(i); WasmType type = variable.getType() != null ? WasmGeneratorUtil.mapType(variable.getType()) : WasmType.INT32; function.add(new WasmLocal(type, variable.getName())); } WasmGenerationVisitor visitor = new WasmGenerationVisitor(context, classGenerator, binaryWriter, function, firstVariable); methodAst.getBody().acceptVisitor(visitor); if (visitor.result instanceof WasmBlock) { ((WasmBlock) visitor.result).setType(function.getResult()); } function.getBody().add(visitor.result); AnnotationReader exportAnnot = method.getAnnotations().get(Export.class.getName()); if (exportAnnot != null) { function.setExportName(exportAnnot.getValue("name").getString()); } return function; }