List <BinSpan> GetUnusedBinSpans(List <BinSpan> list) { uint codeSize = (uint)Method.Body.GetCodeSize(); list = BinSpan.OrderAndCompact(list); var res = new List <BinSpan>(); if (list.Count == 0) { if (codeSize > 0) { res.Add(new BinSpan(0, codeSize)); } return(res); } uint prevEnd = 0; for (int i = 0; i < list.Count; i++) { var span = list[i]; Debug.Assert(span.Start >= prevEnd); uint length = span.Start - prevEnd; if (length > 0) { res.Add(new BinSpan(prevEnd, length)); } prevEnd = span.End; } Debug.Assert(prevEnd <= codeSize); if (prevEnd < codeSize) { res.Add(new BinSpan(prevEnd, codeSize - prevEnd)); } return(res); }
/// <summary> /// Constructor /// </summary> /// <param name="decompilerOptionsVersion">Decompiler options version number. This version number should get incremented when the options change.</param> /// <param name="method">Method</param> public MethodDebugInfoBuilder(int decompilerOptionsVersion, MethodDef method) { this.decompilerOptionsVersion = decompilerOptionsVersion; this.method = method ?? throw new ArgumentNullException(nameof(method)); statements = new List <SourceStatement>(); Scope = new MethodDebugScopeBuilder(); Scope.Span = BinSpan.FromBounds(0, (uint)method.Body.GetCodeSize()); }
/// <summary> /// Constructor /// </summary> /// <param name="span">Scope span</param> /// <param name="scopes">Child scopes</param> /// <param name="locals">Locals</param> /// <param name="imports">Imports</param> /// <param name="constants">Constants</param> public MethodDebugScope(BinSpan span, MethodDebugScope[] scopes, SourceLocal[] locals, ImportInfo[] imports, MethodDebugConstant[] constants) { Span = span; Scopes = scopes ?? throw new ArgumentNullException(nameof(scopes)); Locals = locals ?? throw new ArgumentNullException(nameof(locals)); Imports = imports ?? throw new ArgumentNullException(nameof(imports)); Constants = constants ?? throw new ArgumentNullException(nameof(constants)); }
/// <summary> /// Gets step ranges /// </summary> /// <param name="sourceStatement">Source statement</param> /// <returns></returns> public uint[] GetRanges(SourceStatement sourceStatement) { var list = new List <BinSpan>(GetUnusedBinSpans().Length + 1); list.Add(sourceStatement.BinSpan); list.AddRange(GetUnusedBinSpans()); var orderedList = BinSpan.OrderAndCompactList(list); if (orderedList.Count == 0) { return(Array.Empty <uint>()); } var binSpanArray = new uint[orderedList.Count * 2]; for (int i = 0; i < orderedList.Count; i++) { binSpanArray[i * 2 + 0] = orderedList[i].Start; binSpanArray[i * 2 + 1] = orderedList[i].End; } return(binSpanArray); }
/// <summary> /// Constructor /// </summary> /// <param name="binSpan">Binary span</param> /// <param name="textSpan">Text span</param> public SourceStatement(BinSpan binSpan, TextSpan textSpan) { this.binSpan = binSpan; this.textSpan = textSpan; }