/// <summary> /// Disassembles the assembly code for reified methods declared by the source type /// </summary> /// <param name="src">The source type</param> public static AsmFuncInfo[] DistillAsm(this Type src) { var disassembly = src.Deconstruct(); var dst = new AsmFuncInfo[disassembly.Length]; for (var i = 0; i < disassembly.Length; i++) { dst[i] = disassembly[i].DistillAsm(); } return(dst); }
public static string FormatInstructions(this AsmFuncInfo src, int?pad = null) { var format = sbuild(); for (var i = 0; i < src.InstructionCount; i++) { var insx = src.Instructions[i]; var fmt = insx.Format(pad ?? IPad); if (i != src.InstructionCount - 1) { format.AppendLine(fmt); } else { format.Append(fmt); } } return(format.ToString()); }
/// <summary> /// Formats an assembly function specifier /// </summary> /// <param name="src">The source function</param> /// <param name="pad">The padding between each instruction and associated commentary</param> public static string Format(this AsmFuncInfo src, int?pad = null) => lines(src.FormatHeader(), src.FormatInstructions(pad), src.FormatFooter());
/// <summary> /// Formats the encoded bytes as a comment /// </summary> /// <param name="src">The source function</param> public static string FormatFooter(this AsmFuncInfo src) { var propdecl = $"static ReadOnlySpan<byte> {src.FunctionName}Bytes"; return(concat(BeginComment, $"{propdecl} => new byte[{src.Encoding.Length}]", src.FormatEncoding(), AsciSym.Semicolon)); }
/// <summary> /// Formats the function body encoding /// </summary> /// <param name="src">The source function</param> public static string FormatEncoding(this AsmFuncInfo src) => embrace(src.Encoding.FormatHex(AsciSym.Comma, true, true, true));
/// <summary> /// Formats the function header /// </summary> /// <param name="src">The source function</param> /// <param name="pad"></param> public static string FormatHeader(this AsmFuncInfo src) => concat( line(concat(BeginComment, $"function: {src.Signature.Format()}")), concat(BeginComment, $"location: {src.StartAddress.GlobalHexRange(src.EndAddress)}") );