コード例 #1
0
            public CurrentMethod(WindowsPdbWriter pdbWriter, MethodDef method, Dictionary <Instruction, uint> toOffset)
            {
                this.pdbWriter = pdbWriter;
                Method         = method;
                this.toOffset  = toOffset;
                toOffset.Clear();
                uint offset       = 0;
                var  instructions = method.Body.Instructions;
                int  count        = instructions.Count;

                for (int i = 0; i < count; i++)
                {
                    var instr = instructions[i];
                    toOffset[instr] = offset;
                    offset         += (uint)instr.GetSize();
                }
                BodySize = offset;
            }
コード例 #2
0
            public void Write(WindowsPdbWriter pdbWriter, IList <Instruction> instrs)
            {
                checkedPdbDocs.Clear();
                while (true)
                {
                    PdbDocument currPdbDoc = null;
                    bool        otherDocsAvailable = false;
                    int         index = 0, instrOffset = 0;
                    Instruction instr = null;
                    for (int i = 0; i < instrs.Count; i++, instrOffset += instr.GetSize())
                    {
                        instr = instrs[i];
                        var seqp = instr.SequencePoint;
                        if (seqp is null || seqp.Document is null)
                        {
                            continue;
                        }
                        if (checkedPdbDocs.ContainsKey(seqp.Document))
                        {
                            continue;
                        }
                        if (currPdbDoc is null)
                        {
                            currPdbDoc = seqp.Document;
                        }
                        else if (currPdbDoc != seqp.Document)
                        {
                            otherDocsAvailable = true;
                            continue;
                        }

                        if (index >= instrOffsets.Length)
                        {
                            int newSize = index * 2;
                            if (newSize < 64)
                            {
                                newSize = 64;
                            }
                            Array.Resize(ref instrOffsets, newSize);
                            Array.Resize(ref startLines, newSize);
                            Array.Resize(ref startColumns, newSize);
                            Array.Resize(ref endLines, newSize);
                            Array.Resize(ref endColumns, newSize);
                        }

                        instrOffsets[index] = instrOffset;
                        startLines[index]   = seqp.StartLine;
                        startColumns[index] = seqp.StartColumn;
                        endLines[index]     = seqp.EndLine;
                        endColumns[index]   = seqp.EndColumn;
                        index++;
                    }
                    if (index != 0)
                    {
                        pdbWriter.writer.DefineSequencePoints(pdbWriter.Add(currPdbDoc), (uint)index, instrOffsets, startLines, startColumns, endLines, endColumns);
                    }

                    if (!otherDocsAvailable)
                    {
                        break;
                    }
                    if (currPdbDoc is not null)
                    {
                        checkedPdbDocs.Add(currPdbDoc, true);
                    }
                }
            }