1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
using System;
using System.Collections;
using ST = System.Threading;
using System.Runtime.InteropServices;
using Mono.Debugger.Backend;
namespace Mono.Debugger.Backend
{
// <summary>
// This class maintains the debugger's symbol tables.
// </summary>
internal class SymbolTableManager : DebuggerMarshalByRefObject, ISymbolTable, IDisposable
{
DebuggerSession session;
ArrayList symbol_files;
internal SymbolTableManager (DebuggerSession session)
{
this.session = session;
this.symbol_files = ArrayList.Synchronized (new ArrayList ());
}
internal void AddSymbolFile (SymbolFile symfile)
{
symbol_files.Add (symfile);
}
//
// ISymbolLookup
//
public Method Lookup (TargetAddress address)
{
foreach (SymbolFile symfile in symbol_files) {
if (!symfile.SymbolsLoaded)
continue;
Method method = symfile.SymbolTable.Lookup (address);
if (method != null)
return method;
}
return null;
}
public Symbol SimpleLookup (TargetAddress address, bool exact_match)
{
foreach (SymbolFile symfile in symbol_files) {
Symbol name = symfile.SimpleLookup (address, exact_match);
if (name != null)
return name;
}
return null;
}
//
// ISymbolContainer
//
bool ISymbolContainer.IsContinuous {
get { return false; }
}
TargetAddress ISymbolContainer.StartAddress {
get { throw new InvalidOperationException (); }
}
TargetAddress ISymbolContainer.EndAddress {
get { throw new InvalidOperationException (); }
}
//
// ISymbolTable
//
bool ISymbolTable.HasRanges {
get { return false; }
}
ISymbolRange[] ISymbolTable.SymbolRanges {
get { throw new InvalidOperationException (); }
}
bool ISymbolTable.HasMethods {
get { return false; }
}
Method[] ISymbolTable.Methods {
get { throw new InvalidOperationException (); }
}
bool ISymbolTable.IsLoaded {
get { return true; }
}
void ISymbolTable.UpdateSymbolTable ()
{ }
public event SymbolTableChangedHandler SymbolTableChanged;
//
// IDisposable
//
private bool disposed = false;
private void check_disposed ()
{
if (disposed)
throw new ObjectDisposedException ("SymbolTableManager");
}
protected virtual void Dispose (bool disposing)
{
if (!this.disposed) {
if (disposing) {
symbol_files = ArrayList.Synchronized (new ArrayList ());
}
this.disposed = true;
}
}
public void Dispose ()
{
Dispose (true);
// Take yourself off the Finalization queue
GC.SuppressFinalize (this);
}
~SymbolTableManager ()
{
Dispose (false);
}
}
}
|