/// <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); }); }
/// <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; }