示例#1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="PdbLocalScope"/> class.
        /// </summary>
        /// <param name="function">Function that contains this scope.</param>
        /// <param name="block">Block symbol read from PDB.</param>
        /// <param name="parent">Parent scope.</param>
        internal PdbLocalScope(PdbFunction function, BlockSymbol block, PdbLocalScope parent = null)
        {
            Function      = function;
            Block         = block;
            Parent        = parent;
            childrenCache = SimpleCache.CreateStruct(() =>
            {
                IEnumerable <BlockSymbol> blocks = Block.Children.OfType <BlockSymbol>();
                int count = blocks.Count();
                IPdbLocalScope[] children = new IPdbLocalScope[count];
                int i = 0;

                foreach (BlockSymbol b in blocks)
                {
                    children[i++] = new PdbLocalScope(Function, b, this);
                }
                return(children);
            });
            constantsCache = SimpleCache.CreateStruct(() =>
            {
                IEnumerable <ConstantSymbol> symbols = Block.Children.OfType <ConstantSymbol>();
                int count = symbols.Count();
                IPdbLocalConstant[] constants = new IPdbLocalConstant[count];
                int i = 0;

                foreach (ConstantSymbol symbol in symbols)
                {
                    constants[i++] = new PdbLocalConstant(this, symbol);
                }
                return(constants);
            });
            variablesCache = SimpleCache.CreateStruct(() =>
            {
                IEnumerable <AttributeSlotSymbol> slots = Block.Children.OfType <AttributeSlotSymbol>();
                int count = slots.Count();
                IPdbLocalVariable[] variables = new IPdbLocalVariable[count];
                int i = 0;

                foreach (AttributeSlotSymbol slot in slots)
                {
                    variables[i++] = new PdbLocalVariable(this, slot);
                }
                return(variables);
            });
        }
示例#2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="PdbFunction"/> class.
        /// </summary>
        /// <param name="pdbFile">Portable PDB file reader.</param>
        /// <param name="procedure">Managed procedure symbol from PDB.</param>
        /// <param name="dbiModule">DBI module descriptor from PDB.</param>
        internal PdbFunction(PdbFile pdbFile, ManagedProcedureSymbol procedure, DbiModuleDescriptor dbiModule)
        {
            PdbFile          = pdbFile;
            Procedure        = procedure;
            DbiModule        = dbiModule;
            localScopesCache = SimpleCache.CreateStruct(() =>
            {
                IEnumerable <BlockSymbol> blocks = Procedure.Children.OfType <BlockSymbol>();
                int count = blocks.Count();
                IPdbLocalScope[] scopes = new IPdbLocalScope[count];
                int i = 0;

                foreach (BlockSymbol block in blocks)
                {
                    scopes[i++] = new PdbLocalScope(this, block);
                }
                return(scopes);
            });
            sequencePointsCache = SimpleCache.CreateStruct(() =>
            {
                var checksums        = DbiModule.DebugSubsectionStream[DebugSubsectionKind.FileChecksums];
                var linesSubsections = dbiModule.DebugSubsectionStream[DebugSubsectionKind.Lines];
                List <IPdbSequencePoint> sequencePoints = new List <IPdbSequencePoint>();

                foreach (LinesSubsection linesSubsection in linesSubsections)
                {
                    foreach (var file in linesSubsection.Files)
                    {
                        var checksum = (FileChecksumSubsection)checksums[file.Index];
                        var source   = PdbFile[checksum];

                        foreach (var line in file.Lines)
                        {
                            sequencePoints.Add(new PdbSequencePoint(this, source, line));
                        }
                    }
                }

                return(sequencePoints);
            });
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbLocalVariable"/> class.
 /// </summary>
 /// <param name="localScope">Local scope where this variable is defined.</param>
 /// <param name="slot">Attribute slot symbol read from PDB.</param>
 internal PdbLocalVariable(PdbLocalScope localScope, AttributeSlotSymbol slot)
 {
     LocalScope = localScope;
     Slot       = slot;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="PdbLocalConstant"/> class.
 /// </summary>
 /// <param name="localScope">Local scope where this contanst is defined.</param>
 /// <param name="constant">Constant symbol read from PDB.</param>
 internal PdbLocalConstant(PdbLocalScope localScope, ConstantSymbol constant)
 {
     LocalScope = localScope;
     Constant   = constant;
 }