Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 /// <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());
 }
Ejemplo n.º 3
0
 /// <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));
 }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
 /// <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;
 }