public int FindChildren(IDiaSymbol parent, SymTagEnum symTag, String name, NameSearchOptions compareFlags, out IDiaEnumSymbols enumSymbols) { enumSymbols = null; IntPtr _enumSymbols; int hr; unsafe { fixed (char* _name = name) { hr = S.StdCall<int>(GetVTableMember(8), Punk, parent.Punk, (int)symTag, _name, (int)compareFlags, out _enumSymbols); } } GC.KeepAlive(this); GC.KeepAlive(parent); if (hr != S_OK) return hr; enumSymbols = new IDiaEnumSymbols(_enumSymbols); return hr; }
public int FindChildren(IDiaSymbol parent, SymTagEnum symTag, String name, NameSearchOptions compareFlags, out IDiaEnumSymbols enumSymbols) { enumSymbols = null; IntPtr _enumSymbols; int hr; unsafe { fixed(char *_name = name) { hr = S.StdCall <int>(GetVTableMember(8), Punk, parent.Punk, (int)symTag, _name, (int)compareFlags, out _enumSymbols); } } GC.KeepAlive(this); GC.KeepAlive(parent); if (hr != S_OK) { return(hr); } enumSymbols = new IDiaEnumSymbols(_enumSymbols); return(hr); }
/// <summary> /// Returns global functions defined in this executable that meet the supplied filter /// </summary> public DisposableEnumerable <Symbol> CreateGlobalFunctionIterator(string functionName, NameSearchOptions searchOptions) { return(this.GlobalScope.CreateChildren(SymTagEnum.SymTagFunction, functionName, searchOptions)); }
private IEnumerable <Symbol> CreateChildrenImpl(SymTagEnum symbolTagType, string symbolName, NameSearchOptions searchOptions) { IDiaEnumSymbols enumSymbols = null; try { try { _sym.findChildren(symbolTagType, symbolName, (uint)searchOptions, out enumSymbols); } catch (NotImplementedException) { } if (enumSymbols == null) { yield break; } while (true) { uint celt = 0; IDiaSymbol symbol; enumSymbols.Next(1, out symbol, out celt); if (celt != 1) { break; //No more symbols } yield return(Symbol.Create(symbol)); } } finally { if (enumSymbols != null) { Marshal.ReleaseComObject(enumSymbols); } } }
public DisposableEnumerable <Symbol> CreateChildren(SymTagEnum symbolTagType, string symbolName, NameSearchOptions searchOptions) { this.AssertNotDisposed(); return(new DisposableEnumerable <Symbol>(this.CreateChildrenImpl(symbolTagType, symbolName, searchOptions))); }
// TODO FIX NOW REMOVE private IEnumerable<IDiaSymbol> FindChildren(IDiaSymbol scope, string name = null, NameSearchOptions searchOptions = NameSearchOptions.nsNone) { IDiaEnumSymbols symEnum; m_session.findChildren(scope, SymTagEnum.SymTagNull, name, (uint)searchOptions, out symEnum); uint fetchCount; var ret = new List<IDiaSymbol>(); for (; ; ) { IDiaSymbol sym; symEnum.Next(1, out sym, out fetchCount); if (fetchCount == 0) break; SymTagEnum symTag = (SymTagEnum)sym.symTag; Debug.WriteLine("Got " + sym.name + " symTag " + symTag + " token " + sym.token.ToString("x")); if (symTag == SymTagEnum.SymTagFunction) { if (sym.token != 0) { var sourceLocation = SourceLocationForManagedCode(sym.token, 0); if (sourceLocation != null) Debug.WriteLine("Got Line " + sourceLocation.LineNumber + " file " + sourceLocation.SourceFile); } } if (symTag == SymTagEnum.SymTagCompiland) { var children = (List<IDiaSymbol>)FindChildren(sym, name, searchOptions); Debug.WriteLine("got " + children.Count + " children"); } ret.Add(sym); } return ret; }
// TODO FIX NOW REMOVE internal IEnumerable<string> FindChildrenNames(IDiaSymbol scope, string name = null, NameSearchOptions searchOptions = NameSearchOptions.nsNone) { var syms = FindChildren(m_session.globalScope, name, searchOptions); var ret = new List<string>(); foreach (var sym in syms) ret.Add(sym.name); return ret; }
private IEnumerable<Symbol> CreateChildrenImpl(SymTagEnum symbolTagType, string symbolName, NameSearchOptions searchOptions) { IDiaEnumSymbols enumSymbols = null; try { _sym.findChildren(symbolTagType, symbolName, (uint)searchOptions, out enumSymbols); if (enumSymbols == null) { yield break; } while (true) { uint celt = 0; IDiaSymbol symbol; enumSymbols.Next(1, out symbol, out celt); if (celt != 1) break; //No more symbols yield return Symbol.Create(symbol); } } finally { if (enumSymbols != null) { Marshal.ReleaseComObject(enumSymbols); } } }
public DisposableEnumerable<Symbol> CreateChildren(SymTagEnum symbolTagType, string symbolName, NameSearchOptions searchOptions) { this.AssertNotDisposed(); return new DisposableEnumerable<Symbol>(this.CreateChildrenImpl(symbolTagType, symbolName, searchOptions)); }