private void Export(ILogger logger, Summary summary, DisassemblyResult disassemblyResult, BenchmarkCase benchmarkCase, ref int referenceIndex) { logger.WriteLine($"<h2>{summary[benchmarkCase].GetRuntimeInfo()}</h2>"); logger.WriteLine("<table><tbody>"); int methodIndex = 0; foreach (var method in disassemblyResult.Methods.Where(method => string.IsNullOrEmpty(method.Problem))) { referenceIndex++; logger.WriteLine($"<tr><th colspan=\"2\" style=\"text-align: left;\">{method.Name}</th><th></th></tr>"); var pretty = DisassemblyPrettifier.Prettify(method, disassemblyResult, config, $"M{methodIndex++:00}"); bool even = false, diffTheLabels = pretty.Count > 1; foreach (var element in pretty) { if (element is DisassemblyPrettifier.Label label) { even = !even; logger.WriteLine($"<tr class=\"{(even && diffTheLabels ? "evenMap" : string.Empty)}\">"); logger.WriteLine($"<td id=\"{referenceIndex}_{label.Id}\" class=\"label\" data-label=\"{referenceIndex}_{label.TextRepresentation}\"><pre><code>{label.TextRepresentation}</pre></code></td>"); logger.WriteLine("<td> </td></tr>"); continue; } logger.WriteLine($"<tr class=\"{(even && diffTheLabels ? "evenMap" : string.Empty)}\">"); logger.Write("<td></td>"); if (element is DisassemblyPrettifier.Reference reference) { logger.WriteLine($"<td id=\"{referenceIndex}\" class=\"reference\" data-reference=\"{referenceIndex}_{reference.Id}\"><a href=\"#{referenceIndex}_{reference.Id}\"><pre><code>{reference.TextRepresentation}</pre></code></a></td>"); } else { logger.WriteLine($"<td><pre><code>{element.TextRepresentation}</pre></code></td>"); } logger.Write("</tr>"); } logger.WriteLine("<tr><td colspan=\"{2}\"> </td></tr>"); } foreach (var withProblems in disassemblyResult.Methods .Where(method => !string.IsNullOrEmpty(method.Problem)) .GroupBy(method => method.Problem)) { logger.WriteLine($"<tr><td colspan=\"{2}\"><b>{withProblems.Key}</b></td></tr>"); foreach (var withProblem in withProblems) { logger.WriteLine($"<tr><td colspan=\"{2}\">{withProblem.Name}</td></tr>"); } logger.WriteLine("<tr><td colspan=\"{2}\"></td></tr>"); } logger.WriteLine("</tbody></table>"); }
internal static void Export(ILogger logger, DisassemblyResult disassemblyResult, DisassemblyDiagnoserConfig config, bool quotingCode = true) { int methodIndex = 0; foreach (var method in disassemblyResult.Methods.Where(method => string.IsNullOrEmpty(method.Problem))) { if (quotingCode) { logger.WriteLine("```assembly"); } logger.WriteLine($"; {method.Name}"); var pretty = DisassemblyPrettifier.Prettify(method, disassemblyResult, config, $"M{methodIndex++:00}"); ulong totalSizeInBytes = 0; foreach (var element in pretty) { if (element is DisassemblyPrettifier.Label label) { logger.WriteLine($"{label.TextRepresentation}:"); } else if (element.Source is Sharp sharp) { logger.WriteLine($"; {sharp.Text.Replace("\n", "\n; ")}"); // they are multiline and we need to add ; for each line } else if (element.Source is Asm asm) { checked { totalSizeInBytes += (uint)asm.Instruction.ByteLength; } logger.WriteLine($" {element.TextRepresentation}"); } else if (element.Source is MonoCode mono) { logger.WriteLine(mono.Text); } } logger.WriteLine($"; Total bytes of code {totalSizeInBytes}"); if (quotingCode) { logger.WriteLine("```"); } } foreach (var withProblems in disassemblyResult.Methods .Where(method => !string.IsNullOrEmpty(method.Problem)) .GroupBy(method => method.Problem)) { logger.WriteLine($"**{withProblems.Key}**"); foreach (var withProblem in withProblems) { logger.WriteLine(withProblem.Name); } } logger.WriteLine(); }