a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
108 lines
2.2 KiB
C#
108 lines
2.2 KiB
C#
//
|
|
// Mono.ILASM.DebuggingInfo.cs
|
|
//
|
|
// Author(s):
|
|
// Martin Baulig (martin@ximian.com)
|
|
//
|
|
// Copyright (C) 2004 Novell, Inc.
|
|
//
|
|
|
|
using PEAPI;
|
|
using System;
|
|
using System.IO;
|
|
using System.Collections;
|
|
using Mono.CompilerServices.SymbolWriter;
|
|
|
|
namespace Mono.ILASM {
|
|
|
|
public class SymbolWriter : MonoSymbolWriter
|
|
{
|
|
Mono.ILASM.SourceMethod current_method;
|
|
CompileUnitEntry current_source;
|
|
ArrayList methods;
|
|
|
|
public SymbolWriter (string filename)
|
|
: base (filename)
|
|
{
|
|
methods = new ArrayList ();
|
|
}
|
|
|
|
public Mono.ILASM.SourceMethod BeginMethod (MethodDef method, Location start)
|
|
{
|
|
current_method = new Mono.ILASM.SourceMethod (current_source, method, start);
|
|
methods.Add (current_method);
|
|
return current_method;
|
|
}
|
|
|
|
public void EndMethod (Location end)
|
|
{
|
|
current_method.EndLine = end.line;
|
|
current_method = null;
|
|
}
|
|
|
|
public void BeginSourceFile (string filename)
|
|
{
|
|
SourceFileEntry file = DefineDocument (filename, null, null);
|
|
current_source = DefineCompilationUnit (file);
|
|
}
|
|
|
|
public void EndSourceFile ()
|
|
{
|
|
current_source = null;
|
|
}
|
|
|
|
public void Write (Guid guid)
|
|
{
|
|
foreach (Mono.ILASM.SourceMethod method in methods)
|
|
method.Write (this);
|
|
|
|
WriteSymbolFile (guid);
|
|
}
|
|
}
|
|
|
|
public class SourceMethod : IMethodDef
|
|
{
|
|
CompileUnitEntry file;
|
|
MethodDef method;
|
|
ArrayList lines;
|
|
public int StartLine, EndLine;
|
|
|
|
public SourceMethod (CompileUnitEntry file, MethodDef method, Location start)
|
|
{
|
|
this.file = file;
|
|
this.method = method;
|
|
this.StartLine = start.line;
|
|
|
|
lines = new ArrayList ();
|
|
MarkLocation (start.line, 0);
|
|
}
|
|
|
|
public string Name {
|
|
get { return method.Name; }
|
|
}
|
|
|
|
public int Token {
|
|
get {
|
|
PEAPI.MethodDef pemethod = method.PeapiMethodDef;
|
|
return (int) (((uint) PEAPI.MDTable.Method << 24) | pemethod.Row);
|
|
}
|
|
}
|
|
|
|
public void MarkLocation (int line, uint offset)
|
|
{
|
|
lines.Add (new LineNumberEntry (0, line, (int) offset));
|
|
}
|
|
|
|
public void Write (MonoSymbolWriter writer)
|
|
{
|
|
LineNumberEntry[] the_lines = new LineNumberEntry [lines.Count];
|
|
lines.CopyTo (the_lines, 0);
|
|
|
|
LocalVariableEntry[] locals = method.GetLocalVars ();
|
|
|
|
MethodEntry entry = writer.SymbolFile.DefineMethod (
|
|
file, Token, null, locals, the_lines, null, null, 0, 0);
|
|
}
|
|
}
|
|
}
|