[Pkg-cli-apps-commits] [SCM] monodevelop branch, master-experimental, updated. debian/2.4+dfsg-1-1-g86e83af
Jo Shields
directhex at apebox.org
Fri Sep 10 19:10:22 UTC 2010
The following commit has been merged in the master-experimental branch:
commit 86e83af972f805d00869d52c7c59454f24eb0706
Author: Jo Shields <directhex at apebox.org>
Date: Fri Sep 10 20:08:54 2010 +0100
Build against system Mono.Debugger.Soft, since we have a new enough Mono to use it
diff --git a/debian/changelog b/debian/changelog
index 1561afc..008e7e7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+monodevelop (2.4+dfsg-2) UNRELEASED; urgency=low
+
+ * debian/patches/inject_Mono.Debugger.Soft_source.patch,
+ debian/patches/use_system_Mono.Debugger.Soft.patch,
+ debian/control:
+ + Build against system Soft Debugger, since we now have a new
+ enough Mono to match MonoDevelop's required API
+
+ -- Jo Shields <directhex at apebox.org> Fri, 10 Sep 2010 16:54:48 +0100
+
monodevelop (2.4+dfsg-1) experimental; urgency=low
* New upstream release
diff --git a/debian/control b/debian/control
index 21b7ad9..ec37fc1 100644
--- a/debian/control
+++ b/debian/control
@@ -23,6 +23,7 @@ Build-Depends-Indep: cli-common-dev (>= 0.5.7),
libmono-addins-gui-cil-dev (>= 0.4),
libmetacity-dev,
libsvn-dev,
+ libmono-debugger-soft0.0-cil (>= 2.6.7),
libapr1-dev,
libgtkspell-dev,
mono-xsp-base,
diff --git a/debian/patches/inject_Mono.Debugger.Soft_source.patch b/debian/patches/inject_Mono.Debugger.Soft_source.patch
deleted file mode 100644
index 2fe8429..0000000
--- a/debian/patches/inject_Mono.Debugger.Soft_source.patch
+++ /dev/null
@@ -1,9009 +0,0 @@
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AbsentInformationException.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AbsentInformationException.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class AbsentInformationException : Exception {
-+
-+ public AbsentInformationException () : base ("Debug information is not available for this frame.") {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AppDomainCreateEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AppDomainCreateEvent.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class AppDomainCreateEvent : Event {
-+ AppDomainMirror domain;
-+ long id;
-+
-+ internal AppDomainCreateEvent (VirtualMachine vm, int req_id, long thread_id, long id) : base (EventType.AppDomainCreate, vm, req_id, thread_id) {
-+ this.id = id;
-+ }
-+
-+ public AppDomainMirror Domain {
-+ get {
-+ if (domain == null)
-+ domain = vm.GetDomain (id);
-+ return domain;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AppDomainMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AppDomainMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,95 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class AppDomainMirror : Mirror
-+ {
-+ string friendly_name;
-+ AssemblyMirror entry_assembly, corlib;
-+
-+ internal AppDomainMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ public string FriendlyName {
-+ get {
-+ if (friendly_name == null)
-+ friendly_name = vm.conn.Domain_GetName (id);
-+ return friendly_name;
-+ }
-+ }
-+
-+ // Not cached
-+ public AssemblyMirror[] GetAssemblies () {
-+ long[] ids = vm.conn.Domain_GetAssemblies (id);
-+ AssemblyMirror[] assemblies = new AssemblyMirror [ids.Length];
-+ // FIXME: Uniqueness
-+ for (int i = 0; i < ids.Length; ++i)
-+ assemblies [i] = vm.GetAssembly (ids [i]);
-+ return assemblies;
-+ }
-+
-+ // This returns null when called before the first AssemblyLoad event
-+ public AssemblyMirror GetEntryAssembly () {
-+ if (entry_assembly == null) {
-+ long ass_id = vm.conn.Domain_GetEntryAssembly (id);
-+
-+ entry_assembly = vm.GetAssembly (ass_id);
-+ }
-+ return entry_assembly;
-+ }
-+
-+ public AssemblyMirror Corlib {
-+ get {
-+ if (corlib == null) {
-+ long ass_id = vm.conn.Domain_GetCorlib (id);
-+
-+ corlib = vm.GetAssembly (ass_id);
-+ }
-+ return corlib;
-+ }
-+ }
-+
-+ public StringMirror CreateString (string s) {
-+ if (s == null)
-+ throw new ArgumentNullException ("s");
-+
-+ return vm.GetObject<StringMirror> (vm.conn.Domain_CreateString (id, s));
-+ }
-+
-+ public ObjectMirror CreateBoxedValue (Value value) {
-+ if (value == null)
-+ throw new ArgumentNullException ("value");
-+ if (!(value is PrimitiveValue) && !(value is StructMirror))
-+ throw new ArgumentException ("Value must be a PrimitiveValue or a StructMirror", "value");
-+ if ((value is PrimitiveValue) && (value as PrimitiveValue).Value == null)
-+ return null;
-+
-+ TypeMirror t = null;
-+ if (value is PrimitiveValue)
-+ t = GetCorrespondingType ((value as PrimitiveValue).Value.GetType ());
-+ else
-+ t = (value as StructMirror).Type;
-+
-+ return vm.GetObject<ObjectMirror> (vm.conn.Domain_CreateBoxedValue (id, t.Id, vm.EncodeValue (value)));
-+ }
-+
-+ TypeMirror[] primitiveTypes = new TypeMirror [32];
-+
-+ public TypeMirror GetCorrespondingType (Type t) {
-+ if (t == null)
-+ throw new ArgumentNullException ("t");
-+ TypeCode tc = Type.GetTypeCode (t);
-+
-+ if (tc == TypeCode.Empty || tc == TypeCode.Object)
-+ throw new ArgumentException ("t must be a primitive type", "t");
-+
-+ int tc_index = (int)tc;
-+ if (primitiveTypes [tc_index] == null) {
-+ primitiveTypes [tc_index] = Corlib.GetType ("System." + t.Name, false, false);
-+ if (primitiveTypes [tc_index] == null)
-+ throw new NotImplementedException ();
-+ }
-+ return primitiveTypes [tc_index];
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AppDomainUnloadEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AppDomainUnloadEvent.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class AppDomainUnloadEvent : Event {
-+ AppDomainMirror domain;
-+ long id;
-+
-+ internal AppDomainUnloadEvent (VirtualMachine vm, int req_id, long thread_id, long id) : base (EventType.AppDomainUnload, vm, req_id, thread_id) {
-+ this.id = id;
-+ }
-+
-+ public AppDomainMirror Domain {
-+ get {
-+ if (domain == null)
-+ domain = vm.GetDomain (id);
-+ return domain;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ArrayMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ArrayMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,140 @@
-+using System;
-+using System.Collections;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ArrayMirror : ObjectMirror, IEnumerable {
-+
-+ public int[] lengths;
-+ public int[] lower_bounds;
-+ public int rank;
-+
-+ internal ArrayMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ public int Length {
-+ get {
-+ GetLengths ();
-+
-+ int length = lengths [0];
-+
-+ for (int i = 1; i < Rank; i++) {
-+ length *= lengths [i];
-+ }
-+
-+ return length;
-+ }
-+ }
-+
-+ public int Rank {
-+ get {
-+ GetLengths ();
-+
-+ return rank;
-+ }
-+ }
-+
-+ public int GetLength (int dimension) {
-+ GetLengths ();
-+
-+ if (dimension < 0 || dimension >= Rank)
-+ throw new ArgumentOutOfRangeException ("dimension");
-+
-+ return lengths [dimension];
-+ }
-+
-+ public int GetLowerBound (int dimension) {
-+ GetLengths ();
-+
-+ if (dimension < 0 || dimension >= Rank)
-+ throw new ArgumentOutOfRangeException ("dimension");
-+
-+ return lower_bounds [dimension];
-+ }
-+
-+ void GetLengths () {
-+ if (lengths == null)
-+ lengths = vm.conn.Array_GetLength (id, out this.rank, out this.lower_bounds);
-+ }
-+
-+ public Value this [int index] {
-+ get {
-+ // FIXME: Multiple dimensions
-+ if (index < 0 || index > Length - 1)
-+ throw new IndexOutOfRangeException ();
-+ return vm.DecodeValue (vm.conn.Array_GetValues (id, index, 1) [0]);
-+ }
-+ set {
-+ // FIXME: Multiple dimensions
-+ if (index < 0 || index > Length - 1)
-+ throw new IndexOutOfRangeException ();
-+ vm.conn.Array_SetValues (id, index, new ValueImpl [] { vm.EncodeValue (value) });
-+ }
-+ }
-+
-+ public IList<Value> GetValues (int index, int length) {
-+ // FIXME: Multiple dimensions
-+ if (index < 0 || index > Length - length)
-+ throw new IndexOutOfRangeException ();
-+ return vm.DecodeValues (vm.conn.Array_GetValues (id, index, length));
-+ }
-+
-+ public void SetValues (int index, Value[] values) {
-+ if (values == null)
-+ throw new ArgumentNullException ("values");
-+ // FIXME: Multiple dimensions
-+ if (index < 0 || index > Length - values.Length)
-+ throw new IndexOutOfRangeException ();
-+ vm.conn.Array_SetValues (id, index, vm.EncodeValues (values));
-+ }
-+
-+ IEnumerator IEnumerable.GetEnumerator ()
-+ {
-+ return new SimpleEnumerator (this);
-+ }
-+
-+ internal class SimpleEnumerator : IEnumerator, ICloneable
-+ {
-+ ArrayMirror arr;
-+ int pos, length;
-+
-+ public SimpleEnumerator (ArrayMirror arr)
-+ {
-+ this.arr = arr;
-+ this.pos = -1;
-+ this.length = arr.Length;
-+ }
-+
-+ public object Current {
-+ get {
-+ if (pos < 0 )
-+ throw new InvalidOperationException ("Enumeration has not started.");
-+ if (pos >= length)
-+ throw new InvalidOperationException ("Enumeration has already ended");
-+ return arr [pos];
-+ }
-+ }
-+
-+ public bool MoveNext()
-+ {
-+ if (pos < length)
-+ pos++;
-+ if(pos < length)
-+ return true;
-+ else
-+ return false;
-+ }
-+
-+ public void Reset()
-+ {
-+ pos = -1;
-+ }
-+
-+ public object Clone ()
-+ {
-+ return MemberwiseClone ();
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AssemblyLoadEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AssemblyLoadEvent.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class AssemblyLoadEvent : Event {
-+ AssemblyMirror assembly;
-+ long id;
-+
-+ internal AssemblyLoadEvent (VirtualMachine vm, int req_id, long thread_id, long id) : base (EventType.AssemblyLoad, vm, req_id, thread_id) {
-+ this.id = id;
-+ }
-+
-+ public AssemblyMirror Assembly {
-+ get {
-+ if (assembly == null)
-+ assembly = vm.GetAssembly (id);
-+ return assembly;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AssemblyMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AssemblyMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,100 @@
-+using System;
-+using System.Reflection;
-+using Mono.Debugger;
-+using Mono.Cecil;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class AssemblyMirror : Mirror
-+ {
-+ string location;
-+ MethodMirror entry_point;
-+ bool entry_point_set;
-+ ModuleMirror main_module;
-+ AssemblyName aname;
-+ AssemblyDefinition meta;
-+
-+ internal AssemblyMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ public string Location {
-+ get {
-+ if (location == null)
-+ location = vm.conn.Assembly_GetLocation (id);
-+ return location;
-+ }
-+ }
-+
-+ public MethodMirror EntryPoint {
-+ get {
-+ if (!entry_point_set) {
-+ long mid = vm.conn.Assembly_GetEntryPoint (id);
-+
-+ if (mid != 0)
-+ entry_point = vm.GetMethod (mid);
-+ entry_point_set = true;
-+ }
-+ return entry_point;
-+ }
-+ }
-+
-+ public ModuleMirror ManifestModule {
-+ get {
-+ if (main_module == null) {
-+ main_module = vm.GetModule (vm.conn.Assembly_GetManifestModule (id));
-+ }
-+ return main_module;
-+ }
-+ }
-+
-+ public virtual AssemblyName GetName () {
-+ if (aname == null) {
-+ string name = vm.conn.Assembly_GetName (id);
-+ aname = new AssemblyName (name);
-+ }
-+ return aname;
-+ }
-+
-+ public ObjectMirror GetAssemblyObject () {
-+ return vm.GetObject (vm.conn.Assembly_GetObject (id));
-+ }
-+
-+ public TypeMirror GetType (string name, bool throwOnError, bool ignoreCase)
-+ {
-+ if (name == null)
-+ throw new ArgumentNullException (name);
-+ if (name.Length == 0)
-+ throw new ArgumentException ("name", "Name cannot be empty");
-+
-+ if (throwOnError)
-+ throw new NotImplementedException ();
-+ return vm.GetType (vm.conn.Assembly_GetType (id, name, ignoreCase));
-+ }
-+
-+ public TypeMirror GetType (String name, Boolean throwOnError)
-+ {
-+ return GetType (name, throwOnError, false);
-+ }
-+
-+ public TypeMirror GetType (String name) {
-+ return GetType (name, false, false);
-+ }
-+
-+ /*
-+ * An optional Cecil assembly which could be used to access metadata instead
-+ * of reading it from the debuggee.
-+ */
-+ public AssemblyDefinition Metadata {
-+ get {
-+ return meta;
-+ }
-+ set {
-+ if (value.MainModule.Name != ManifestModule.Name)
-+ throw new ArgumentException ("The supplied assembly is named '" + value.MainModule.Name + "', while the assembly in the debuggee is named '" + ManifestModule.Name + "'.");
-+ if (value.MainModule.Mvid != ManifestModule.ModuleVersionId)
-+ throw new ArgumentException ("The supplied assembly's main module has guid '" + value.MainModule.Mvid + ", while the assembly in the debuggee has guid '" + ManifestModule.ModuleVersionId + "'.", "value");
-+ meta = value;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AssemblyUnloadEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/AssemblyUnloadEvent.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class AssemblyUnloadEvent : Event {
-+ AssemblyMirror assembly;
-+ long id;
-+
-+ internal AssemblyUnloadEvent (VirtualMachine vm, int req_id, long thread_id, long id) : base (EventType.AssemblyUnload, vm, req_id, thread_id) {
-+ this.id = id;
-+ }
-+
-+ public AssemblyMirror Assembly {
-+ get {
-+ if (assembly == null)
-+ assembly = vm.GetAssembly (id);
-+ return assembly;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/BreakpointEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/BreakpointEvent.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class BreakpointEvent : Event {
-+ MethodMirror method;
-+ long id;
-+
-+ internal BreakpointEvent (VirtualMachine vm, int req_id, long thread_id, long id, long loc) : base (EventType.Breakpoint, vm, req_id, thread_id) {
-+ this.id = id;
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ if (method == null)
-+ method = vm.GetMethod (id);
-+ return method;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/BreakpointEventRequest.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/BreakpointEventRequest.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,28 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Linq;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public sealed class BreakpointEventRequest : EventRequest {
-+
-+ MethodMirror method;
-+ long location;
-+
-+ internal BreakpointEventRequest (VirtualMachine vm, MethodMirror method, long location) : base (vm, EventType.Breakpoint) {
-+ if (method == null)
-+ throw new ArgumentNullException ("method");
-+ CheckMirror (vm, method);
-+ if (method.Locations.Count > 0 && !method.Locations.Any (l => l.ILOffset == location))
-+ throw new ArgumentException ("A breakpoint can only be set at an IL offset which is equal to the ILOffset property of one of the locations in method.Locations", "location");
-+ this.method = method;
-+ this.location = location;
-+ }
-+
-+ public override void Enable () {
-+ var mods = new List <Modifier> ();
-+ mods.Add (new LocationModifier () { Method = method.Id, Location = location });
-+ SendReq (mods);
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Connection.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Connection.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,1793 @@
-+using System;
-+using System.IO;
-+using System.Net;
-+using System.Net.Sockets;
-+using System.Threading;
-+using System.Collections.Generic;
-+using System.Text;
-+using Mono.Cecil.Metadata;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class VersionInfo {
-+ public string VMVersion {
-+ get; set;
-+ }
-+
-+ public int MajorVersion {
-+ get; set;
-+ }
-+
-+ public int MinorVersion {
-+ get; set;
-+ }
-+ }
-+
-+ class DebugInfo {
-+ public int max_il_offset;
-+ public string filename;
-+ public int[] il_offsets;
-+ public int[] line_numbers;
-+ }
-+
-+ struct FrameInfo {
-+ public long id;
-+ public long method;
-+ public int il_offset;
-+ public StackFrameFlags flags;
-+ }
-+
-+ class TypeInfo {
-+ public string ns, name, full_name;
-+ public long assembly, module, base_type, element_type;
-+ public int token, rank, attributes;
-+ public bool is_byref, is_pointer, is_primitive, is_valuetype, is_enum;
-+ public long[] nested;
-+ }
-+
-+ class MethodInfo {
-+ public int attributes, iattributes, token;
-+ }
-+
-+ class MethodBodyInfo {
-+ public byte[] il;
-+ }
-+
-+ struct ParamInfo {
-+ public int call_conv;
-+ public int param_count;
-+ public int generic_param_count;
-+ public long ret_type;
-+ public long[] param_types;
-+ public string[] param_names;
-+ }
-+
-+ struct LocalsInfo {
-+ public long[] types;
-+ public string[] names;
-+ public int[] live_range_start;
-+ public int[] live_range_end;
-+ }
-+
-+ struct PropInfo {
-+ public long id;
-+ public string name;
-+ public long get_method, set_method;
-+ public int attrs;
-+ }
-+
-+ class CattrNamedArgInfo {
-+ public bool is_property;
-+ public long id;
-+ public ValueImpl value;
-+ }
-+
-+ class CattrInfo {
-+ public long ctor_id;
-+ public ValueImpl[] ctor_args;
-+ public CattrNamedArgInfo[] named_args;
-+ }
-+
-+ class ThreadInfo {
-+ public bool is_thread_pool;
-+ }
-+
-+ enum ValueTypeId {
-+ VALUE_TYPE_ID_NULL = 0xf0,
-+ VALUE_TYPE_ID_TYPE = 0xf1
-+ }
-+
-+ enum InvokeFlags {
-+ NONE = 0x0,
-+ DISABLE_BREAKPOINTS = 0x1,
-+ SINGLE_THREADED = 0x2
-+ }
-+
-+ class ValueImpl {
-+ public ElementType Type; /* or one of the VALUE_TYPE_ID constants */
-+ public long Objid;
-+ public object Value;
-+ public long Klass; // For ElementType.ValueType
-+ public ValueImpl[] Fields; // for ElementType.ValueType
-+ public bool IsEnum; // For ElementType.ValueType
-+ public long Id; /* For VALUE_TYPE_ID_TYPE */
-+ }
-+
-+ class ModuleInfo {
-+ public string Name, ScopeName, FQName, Guid;
-+ public long Assembly;
-+ }
-+
-+ enum TokenType {
-+ STRING = 0,
-+ TYPE = 1,
-+ FIELD = 2,
-+ METHOD = 3,
-+ UNKNOWN = 4
-+ }
-+
-+ enum StackFrameFlags {
-+ DEBUGGER_INVOKE = 1
-+ }
-+
-+ class ResolvedToken {
-+ public TokenType Type;
-+ public string Str;
-+ public long Id;
-+ }
-+
-+ class Modifier {
-+ }
-+
-+ class CountModifier : Modifier {
-+ public int Count {
-+ get; set;
-+ }
-+ }
-+
-+ class LocationModifier : Modifier {
-+ public long Method {
-+ get; set;
-+ }
-+
-+ public long Location {
-+ get; set;
-+ }
-+ }
-+
-+ class StepModifier : Modifier {
-+ public long Thread {
-+ get; set;
-+ }
-+
-+ public int Depth {
-+ get; set;
-+ }
-+
-+ public int Size {
-+ get; set;
-+ }
-+ }
-+
-+ class ThreadModifier : Modifier {
-+ public long Thread {
-+ get; set;
-+ }
-+ }
-+
-+ class ExceptionModifier : Modifier {
-+ public long Type {
-+ get; set;
-+ }
-+ public bool Caught {
-+ get; set;
-+ }
-+ public bool Uncaught {
-+ get; set;
-+ }
-+ }
-+
-+ class AssemblyModifier : Modifier {
-+ public long[] Assemblies {
-+ get; set;
-+ }
-+ }
-+
-+ public enum ErrorCode {
-+ NONE = 0,
-+ INVALID_OBJECT = 20,
-+ INVALID_FIELDID = 25,
-+ INVALID_FRAMEID = 30,
-+ NOT_IMPLEMENTED = 100,
-+ NOT_SUSPENDED = 101,
-+ INVALID_ARGUMENT = 102,
-+ ERR_UNLOADED = 103,
-+ ERR_NO_INVOCATION = 104,
-+ ABSENT_INFORMATION = 105
-+ }
-+
-+ public class ErrorHandlerEventArgs : EventArgs {
-+
-+ public ErrorCode ErrorCode {
-+ get; set;
-+ }
-+ }
-+
-+ /*
-+ * Represents the connection to the debuggee
-+ */
-+ class Connection
-+ {
-+ /*
-+ * The protocol and the packet format is based on JDWP, the differences
-+ * are in the set of supported events, and the commands.
-+ */
-+ public const string HANDSHAKE_STRING = "DWP-Handshake";
-+
-+ public const int HEADER_LENGTH = 11;
-+
-+ /*
-+ * Th version of the wire-protocol implemented by the library. The library
-+ * and the debuggee can communicate if they implement the same major version.
-+ * If they implement a different minor version, they can communicate, but some
-+ * features might not be available. This allows older clients to communicate
-+ * with newer runtimes, and vice versa.
-+ */
-+ public const int MAJOR_VERSION = 2;
-+ public const int MINOR_VERSION = 1;
-+
-+ enum WPSuspendPolicy {
-+ NONE = 0,
-+ EVENT_THREAD = 1,
-+ ALL = 2
-+ }
-+
-+ enum CommandSet {
-+ VM = 1,
-+ OBJECT_REF = 9,
-+ STRING_REF = 10,
-+ THREAD = 11,
-+ ARRAY_REF = 13,
-+ EVENT_REQUEST = 15,
-+ STACK_FRAME = 16,
-+ APPDOMAIN = 20,
-+ ASSEMBLY = 21,
-+ METHOD = 22,
-+ TYPE = 23,
-+ MODULE = 24,
-+ EVENT = 64
-+ }
-+
-+ enum EventKind {
-+ VM_START = 0,
-+ VM_DEATH = 1,
-+ THREAD_START = 2,
-+ THREAD_DEATH = 3,
-+ APPDOMAIN_CREATE = 4, // Not in JDI
-+ APPDOMAIN_UNLOAD = 5, // Not in JDI
-+ METHOD_ENTRY = 6,
-+ METHOD_EXIT = 7,
-+ ASSEMBLY_LOAD = 8,
-+ ASSEMBLY_UNLOAD = 9,
-+ BREAKPOINT = 10,
-+ STEP = 11,
-+ TYPE_LOAD = 12,
-+ EXCEPTION = 13
-+ }
-+
-+ enum ModifierKind {
-+ COUNT = 1,
-+ THREAD_ONLY = 3,
-+ LOCATION_ONLY = 7,
-+ EXCEPTION_ONLY = 8,
-+ STEP = 10,
-+ ASSEMBLY_ONLY = 11
-+ }
-+
-+ enum CmdVM {
-+ VERSION = 1,
-+ ALL_THREADS = 2,
-+ SUSPEND = 3,
-+ RESUME = 4,
-+ EXIT = 5,
-+ DISPOSE = 6,
-+ INVOKE_METHOD = 7,
-+ SET_PROTOCOL_VERSION = 8,
-+ ABORT_INVOKE = 9
-+ }
-+
-+ enum CmdEvent {
-+ COMPOSITE = 100
-+ }
-+
-+ enum CmdThread {
-+ GET_FRAME_INFO = 1,
-+ GET_NAME = 2,
-+ GET_STATE = 3,
-+ GET_INFO = 4,
-+ /* FIXME: Merge into GET_INFO when the major protocol version is increased */
-+ GET_ID = 5
-+ }
-+
-+ enum CmdEventRequest {
-+ SET = 1,
-+ CLEAR = 2,
-+ CLEAR_ALL_BREAKPOINTS = 3
-+ }
-+
-+ enum CmdAppDomain {
-+ GET_ROOT_DOMAIN = 1,
-+ GET_FRIENDLY_NAME = 2,
-+ GET_ASSEMBLIES = 3,
-+ GET_ENTRY_ASSEMBLY = 4,
-+ CREATE_STRING = 5,
-+ GET_CORLIB = 6,
-+ CREATE_BOXED_VALUE = 7
-+ }
-+
-+ enum CmdAssembly {
-+ GET_LOCATION = 1,
-+ GET_ENTRY_POINT = 2,
-+ GET_MANIFEST_MODULE = 3,
-+ GET_OBJECT = 4,
-+ GET_TYPE = 5,
-+ GET_NAME = 6
-+ }
-+
-+ enum CmdModule {
-+ GET_INFO = 1,
-+ }
-+
-+ enum CmdMethod {
-+ GET_NAME = 1,
-+ GET_DECLARING_TYPE = 2,
-+ GET_DEBUG_INFO = 3,
-+ GET_PARAM_INFO = 4,
-+ GET_LOCALS_INFO = 5,
-+ GET_INFO = 6,
-+ GET_BODY = 7,
-+ RESOLVE_TOKEN = 8
-+ }
-+
-+ enum CmdType {
-+ GET_INFO = 1,
-+ GET_METHODS = 2,
-+ GET_FIELDS = 3,
-+ GET_VALUES = 4,
-+ GET_OBJECT = 5,
-+ GET_SOURCE_FILES = 6,
-+ SET_VALUES = 7,
-+ IS_ASSIGNABLE_FROM = 8,
-+ GET_PROPERTIES = 9,
-+ GET_CATTRS = 10,
-+ GET_FIELD_CATTRS = 11,
-+ GET_PROPERTY_CATTRS = 12,
-+ /* FIXME: Merge into GET_SOURCE_FILES when the major protocol version is increased */
-+ GET_SOURCE_FILES_2 = 13
-+ }
-+
-+ enum CmdStackFrame {
-+ GET_VALUES = 1,
-+ GET_THIS = 2,
-+ SET_VALUES = 3
-+ }
-+
-+ enum CmdArrayRef {
-+ GET_LENGTH = 1,
-+ GET_VALUES = 2,
-+ SET_VALUES = 3
-+ }
-+
-+ enum CmdStringRef {
-+ GET_VALUE = 1
-+ }
-+
-+ enum CmdObjectRef {
-+ GET_TYPE = 1,
-+ GET_VALUES = 2,
-+ IS_COLLECTED = 3,
-+ GET_ADDRESS = 4,
-+ GET_DOMAIN = 5,
-+ SET_VALUES = 6
-+ }
-+
-+ class Header {
-+ public int id;
-+ public int command_set;
-+ public int command;
-+ public int flags;
-+ }
-+
-+ public static int GetPacketLength (byte[] header) {
-+ int offset = 0;
-+ return decode_int (header, ref offset);
-+ }
-+
-+ public static bool IsReplyPacket (byte[] packet) {
-+ int offset = 8;
-+ return decode_byte (packet, ref offset) == 0x80;
-+ }
-+
-+ public static int GetPacketId (byte[] packet) {
-+ int offset = 4;
-+ return decode_int (packet, ref offset);
-+ }
-+
-+ static int decode_byte (byte[] packet, ref int offset) {
-+ return packet [offset++];
-+ }
-+
-+ static int decode_short (byte[] packet, ref int offset) {
-+ int res = ((int)packet [offset] << 8) | (int)packet [offset + 1];
-+ offset += 2;
-+ return res;
-+ }
-+
-+ static int decode_int (byte[] packet, ref int offset) {
-+ int res = ((int)packet [offset] << 24) | ((int)packet [offset + 1] << 16) | ((int)packet [offset + 2] << 8) | (int)packet [offset + 3];
-+ offset += 4;
-+ return res;
-+ }
-+
-+ static long decode_id (byte[] packet, ref int offset) {
-+ return decode_int (packet, ref offset);
-+ }
-+
-+ static long decode_long (byte[] packet, ref int offset) {
-+ uint high = (uint)decode_int (packet, ref offset);
-+ uint low = (uint)decode_int (packet, ref offset);
-+
-+ return (long)(((ulong)high << 32) | (ulong)low);
-+ }
-+
-+ public static SuspendPolicy decode_suspend_policy (int suspend_policy) {
-+ switch ((WPSuspendPolicy)suspend_policy) {
-+ case WPSuspendPolicy.NONE:
-+ return SuspendPolicy.None;
-+ case WPSuspendPolicy.EVENT_THREAD:
-+ return SuspendPolicy.EventThread;
-+ case WPSuspendPolicy.ALL:
-+ return SuspendPolicy.All;
-+ default:
-+ throw new NotImplementedException ();
-+ }
-+ }
-+
-+ static Header decode_command_header (byte[] packet) {
-+ int offset = 0;
-+ Header res = new Header ();
-+
-+ decode_int (packet, ref offset);
-+ res.id = decode_int (packet, ref offset);
-+ res.flags = decode_byte (packet, ref offset);
-+ res.command_set = decode_byte (packet, ref offset);
-+ res.command = decode_byte (packet, ref offset);
-+
-+ return res;
-+ }
-+
-+ static void encode_byte (byte[] buf, int b, ref int offset) {
-+ buf [offset] = (byte)b;
-+ offset ++;
-+ }
-+
-+ static void encode_int (byte[] buf, int i, ref int offset) {
-+ buf [offset] = (byte)((i >> 24) & 0xff);
-+ buf [offset + 1] = (byte)((i >> 16) & 0xff);
-+ buf [offset + 2] = (byte)((i >> 8) & 0xff);
-+ buf [offset + 3] = (byte)((i >> 0) & 0xff);
-+ offset += 4;
-+ }
-+
-+ static void encode_id (byte[] buf, long id, ref int offset) {
-+ encode_int (buf, (int)id, ref offset);
-+ }
-+
-+ static void encode_long (byte[] buf, long l, ref int offset) {
-+ encode_int (buf, (int)((l >> 32) & 0xffffffff), ref offset);
-+ encode_int (buf, (int)(l & 0xffffffff), ref offset);
-+ }
-+
-+ public static byte[] EncodePacket (int id, int commandSet, int command, byte[] data, int dataLen) {
-+ byte[] buf = new byte [dataLen + 11];
-+ int offset = 0;
-+
-+ encode_int (buf, buf.Length, ref offset);
-+ encode_int (buf, id, ref offset);
-+ encode_byte (buf, 0, ref offset);
-+ encode_byte (buf, commandSet, ref offset);
-+ encode_byte (buf, command, ref offset);
-+
-+ for (int i = 0; i < dataLen; ++i)
-+ buf [offset + i] = data [i];
-+
-+ return buf;
-+ }
-+
-+ class PacketReader {
-+ byte[] packet;
-+ int offset;
-+
-+ public PacketReader (byte[] packet) {
-+ this.packet = packet;
-+
-+ // For event packets
-+ Header header = decode_command_header (packet);
-+ CommandSet = (CommandSet)header.command_set;
-+ Command = header.command;
-+
-+ // For reply packets
-+ offset = 0;
-+ ReadInt (); // length
-+ ReadInt (); // id
-+ ReadByte (); // flags
-+ ErrorCode = ReadShort ();
-+ }
-+
-+ public CommandSet CommandSet {
-+ get; set;
-+ }
-+
-+ public int Command {
-+ get; set;
-+ }
-+
-+ public int ErrorCode {
-+ get; set;
-+ }
-+
-+ public int Offset {
-+ get {
-+ return offset;
-+ }
-+ }
-+
-+ public int ReadByte () {
-+ return decode_byte (packet, ref offset);
-+ }
-+
-+ public int ReadShort () {
-+ return decode_short (packet, ref offset);
-+ }
-+
-+ public int ReadInt () {
-+ return decode_int (packet, ref offset);
-+ }
-+
-+ public long ReadId () {
-+ return decode_id (packet, ref offset);
-+ }
-+
-+ public long ReadLong () {
-+ return decode_long (packet, ref offset);
-+ }
-+
-+ public float ReadFloat () {
-+ float f = DataConverter.FloatFromBE (packet, offset);
-+ offset += 4;
-+ return f;
-+ }
-+
-+ public double ReadDouble () {
-+ double d = DataConverter.DoubleFromBE (packet, offset);
-+ offset += 8;
-+ return d;
-+ }
-+
-+ public string ReadString () {
-+ int len = decode_int (packet, ref offset);
-+ string res = new String (Encoding.UTF8.GetChars (packet, offset, len));
-+ offset += len;
-+ return res;
-+ }
-+
-+ public ValueImpl ReadValue () {
-+ ElementType etype = (ElementType)ReadByte ();
-+
-+ switch (etype) {
-+ case ElementType.Void:
-+ return new ValueImpl { Type = etype };
-+ case ElementType.I1:
-+ return new ValueImpl { Type = etype, Value = (sbyte)ReadInt () };
-+ case ElementType.U1:
-+ return new ValueImpl { Type = etype, Value = (byte)ReadInt () };
-+ case ElementType.Boolean:
-+ return new ValueImpl { Type = etype, Value = ReadInt () != 0 };
-+ case ElementType.I2:
-+ return new ValueImpl { Type = etype, Value = (short)ReadInt () };
-+ case ElementType.U2:
-+ return new ValueImpl { Type = etype, Value = (ushort)ReadInt () };
-+ case ElementType.Char:
-+ return new ValueImpl { Type = etype, Value = (char)ReadInt () };
-+ case ElementType.I4:
-+ return new ValueImpl { Type = etype, Value = ReadInt () };
-+ case ElementType.U4:
-+ return new ValueImpl { Type = etype, Value = (uint)ReadInt () };
-+ case ElementType.I8:
-+ return new ValueImpl { Type = etype, Value = ReadLong () };
-+ case ElementType.U8:
-+ return new ValueImpl { Type = etype, Value = (ulong)ReadLong () };
-+ case ElementType.R4:
-+ return new ValueImpl { Type = etype, Value = ReadFloat () };
-+ case ElementType.R8:
-+ return new ValueImpl { Type = etype, Value = ReadDouble () };
-+ case ElementType.I:
-+ case ElementType.U:
-+ case ElementType.Ptr:
-+ // FIXME: The client and the debuggee might have different word sizes
-+ return new ValueImpl { Type = etype, Value = ReadLong () };
-+ case ElementType.String:
-+ case ElementType.SzArray:
-+ case ElementType.Class:
-+ case ElementType.Array:
-+ case ElementType.Object:
-+ long objid = ReadId ();
-+ return new ValueImpl () { Type = etype, Objid = objid };
-+ case ElementType.ValueType:
-+ bool is_enum = ReadByte () == 1;
-+ long klass = ReadId ();
-+ long nfields = ReadInt ();
-+ ValueImpl[] fields = new ValueImpl [nfields];
-+ for (int i = 0; i < nfields; ++i)
-+ fields [i] = ReadValue ();
-+ return new ValueImpl () { Type = etype, Klass = klass, Fields = fields, IsEnum = is_enum };
-+ case (ElementType)ValueTypeId.VALUE_TYPE_ID_NULL:
-+ return new ValueImpl { Type = etype };
-+ case (ElementType)ValueTypeId.VALUE_TYPE_ID_TYPE:
-+ return new ValueImpl () { Type = etype, Id = ReadId () };
-+ default:
-+ throw new NotImplementedException ("Unable to handle type " + etype);
-+ }
-+ }
-+ }
-+
-+ class PacketWriter {
-+
-+ byte[] data;
-+ int offset;
-+
-+ public PacketWriter () {
-+ // FIXME:
-+ data = new byte [1024];
-+ offset = 0;
-+ }
-+
-+ public PacketWriter WriteByte (byte val) {
-+ encode_byte (data, val, ref offset);
-+ return this;
-+ }
-+
-+ public PacketWriter WriteInt (int val) {
-+ encode_int (data, val, ref offset);
-+ return this;
-+ }
-+
-+ public PacketWriter WriteId (long id) {
-+ encode_id (data, id, ref offset);
-+ return this;
-+ }
-+
-+ public PacketWriter WriteLong (long val) {
-+ encode_long (data, val, ref offset);
-+ return this;
-+ }
-+
-+ public PacketWriter WriteFloat (float f) {
-+ byte[] b = DataConverter.GetBytesBE (f);
-+ for (int i = 0; i < 4; ++i)
-+ data [offset + i] = b [i];
-+ offset += 4;
-+ return this;
-+ }
-+
-+ public PacketWriter WriteDouble (double d) {
-+ byte[] b = DataConverter.GetBytesBE (d);
-+ for (int i = 0; i < 8; ++i)
-+ data [offset + i] = b [i];
-+ offset += 8;
-+ return this;
-+ }
-+
-+ public PacketWriter WriteInts (int[] ids) {
-+ for (int i = 0; i < ids.Length; ++i)
-+ WriteInt (ids [i]);
-+ return this;
-+ }
-+
-+ public PacketWriter WriteIds (long[] ids) {
-+ for (int i = 0; i < ids.Length; ++i)
-+ WriteId (ids [i]);
-+ return this;
-+ }
-+
-+ public PacketWriter WriteString (string s) {
-+ encode_int (data, s.Length, ref offset);
-+ byte[] b = Encoding.UTF8.GetBytes (s);
-+ Buffer.BlockCopy (b, 0, data, offset, b.Length);
-+ offset += b.Length;
-+ return this;
-+ }
-+
-+ public PacketWriter WriteBool (bool val) {
-+ WriteByte (val ? (byte)1 : (byte)0);
-+ return this;
-+ }
-+
-+ public PacketWriter WriteValue (ValueImpl v) {
-+ ElementType t;
-+
-+ if (v.Value != null)
-+ t = TypeCodeToElementType (Type.GetTypeCode (v.Value.GetType ()));
-+ else
-+ t = v.Type;
-+ WriteByte ((byte)t);
-+ switch (t) {
-+ case ElementType.Boolean:
-+ WriteInt ((bool)v.Value ? 1 : 0);
-+ break;
-+ case ElementType.Char:
-+ WriteInt ((int)(char)v.Value);
-+ break;
-+ case ElementType.I1:
-+ WriteInt ((int)(sbyte)v.Value);
-+ break;
-+ case ElementType.U1:
-+ WriteInt ((int)(byte)v.Value);
-+ break;
-+ case ElementType.I2:
-+ WriteInt ((int)(short)v.Value);
-+ break;
-+ case ElementType.U2:
-+ WriteInt ((int)(ushort)v.Value);
-+ break;
-+ case ElementType.I4:
-+ WriteInt ((int)(int)v.Value);
-+ break;
-+ case ElementType.U4:
-+ WriteInt ((int)(uint)v.Value);
-+ break;
-+ case ElementType.I8:
-+ WriteLong ((long)(long)v.Value);
-+ break;
-+ case ElementType.U8:
-+ WriteLong ((long)(ulong)v.Value);
-+ break;
-+ case ElementType.R4:
-+ WriteFloat ((float)v.Value);
-+ break;
-+ case ElementType.R8:
-+ WriteDouble ((double)v.Value);
-+ break;
-+ case ElementType.String:
-+ case ElementType.SzArray:
-+ case ElementType.Class:
-+ case ElementType.Array:
-+ case ElementType.Object:
-+ WriteId (v.Objid);
-+ break;
-+ case ElementType.ValueType:
-+ // FIXME:
-+ if (v.IsEnum)
-+ throw new NotImplementedException ();
-+ WriteByte (0);
-+ WriteId (v.Klass);
-+ WriteInt (v.Fields.Length);
-+ for (int i = 0; i < v.Fields.Length; ++i)
-+ WriteValue (v.Fields [i]);
-+ break;
-+ case (ElementType)ValueTypeId.VALUE_TYPE_ID_NULL:
-+ break;
-+ default:
-+ throw new NotImplementedException ();
-+ }
-+
-+ return this;
-+ }
-+
-+ public PacketWriter WriteValues (ValueImpl[] values) {
-+ for (int i = 0; i < values.Length; ++i)
-+ WriteValue (values [i]);
-+ return this;
-+ }
-+
-+ public byte[] Data {
-+ get {
-+ return data;
-+ }
-+ }
-+
-+ public int Offset {
-+ get {
-+ return offset;
-+ }
-+ }
-+ }
-+
-+ delegate void ReplyCallback (int packet_id, byte[] packet);
-+
-+ Socket socket;
-+ bool closed;
-+ Thread receiver_thread;
-+ Dictionary<int, byte[]> reply_packets;
-+ Dictionary<int, ReplyCallback> reply_cbs;
-+ object reply_packets_monitor;
-+
-+ public event EventHandler<ErrorHandlerEventArgs> ErrorHandler;
-+
-+ public Connection (Socket socket) {
-+ this.socket = socket;
-+ //socket.SetSocketOption (SocketOptionLevel.IP, SocketOptionName.NoDelay, 1);
-+ closed = false;
-+ reply_packets = new Dictionary<int, byte[]> ();
-+ reply_cbs = new Dictionary<int, ReplyCallback> ();
-+ reply_packets_monitor = new Object ();
-+ }
-+
-+ int Receive (byte[] buf, int buf_offset, int len) {
-+ int offset = 0;
-+
-+ while (offset < len) {
-+ int n = socket.Receive (buf, buf_offset + offset, len - offset, SocketFlags.None);
-+
-+ if (n == 0)
-+ return offset;
-+ offset += n;
-+ }
-+
-+ return offset;
-+ }
-+
-+ public VersionInfo Version;
-+
-+ // Do the wire protocol handshake
-+ public void Connect () {
-+ byte[] buf = new byte [HANDSHAKE_STRING.Length];
-+ char[] cbuf = new char [buf.Length];
-+
-+ // FIXME: Add a timeout
-+ int n = Receive (buf, 0, buf.Length);
-+ if (n == 0)
-+ throw new IOException ("DWP Handshake failed.");
-+ for (int i = 0; i < buf.Length; ++i)
-+ cbuf [i] = (char)buf [i];
-+
-+ if (new String (cbuf) != HANDSHAKE_STRING)
-+ throw new IOException ("DWP Handshake failed.");
-+
-+ socket.Send (buf);
-+
-+ receiver_thread = new Thread (new ThreadStart (receiver_thread_main));
-+ receiver_thread.Start ();
-+
-+ Version = VM_GetVersion ();
-+
-+ //
-+ // Tell the debuggee our protocol version, so newer debuggees can work
-+ // with older clients
-+ //
-+
-+ //
-+ // Older debuggees might not support this request
-+ EventHandler<ErrorHandlerEventArgs> OrigErrorHandler = ErrorHandler;
-+ ErrorHandler = null;
-+ ErrorHandler += delegate (object sender, ErrorHandlerEventArgs args) {
-+ throw new NotSupportedException ();
-+ };
-+ try {
-+ VM_SetProtocolVersion (MAJOR_VERSION, MINOR_VERSION);
-+ } catch (NotSupportedException) {
-+ }
-+ ErrorHandler = OrigErrorHandler;
-+ }
-+
-+ public EndPoint EndPoint {
-+ get {
-+ return socket.RemoteEndPoint;
-+ }
-+ }
-+
-+ public byte[] ReadPacket () {
-+ // FIXME: Throw ClosedConnectionException () if the connection is closed
-+ // FIXME: Throw ClosedConnectionException () if another thread closes the connection
-+ // FIXME: Locking
-+ byte[] header = new byte [HEADER_LENGTH];
-+
-+ int len = Receive (header, 0, header.Length);
-+ if (len == 0)
-+ return new byte [0];
-+ if (len != HEADER_LENGTH) {
-+ // FIXME:
-+ throw new IOException ("Packet of length " + len + " is read.");
-+ }
-+
-+ int packetLength = GetPacketLength (header);
-+ if (packetLength < 11)
-+ throw new IOException ("Invalid packet length.");
-+
-+ if (packetLength == 11) {
-+ return header;
-+ } else {
-+ byte[] buf = new byte [packetLength];
-+ for (int i = 0; i < header.Length; ++i)
-+ buf [i] = header [i];
-+ len = Receive (buf, header.Length, packetLength - header.Length);
-+ if (len != packetLength - header.Length)
-+ throw new IOException ();
-+ return buf;
-+ }
-+ }
-+
-+ public void WritePacket (byte[] packet) {
-+ // FIXME: Throw ClosedConnectionException () if the connection is closed
-+ // FIXME: Throw ClosedConnectionException () if another thread closes the connection
-+ // FIXME: Locking
-+ socket.Send (packet);
-+ }
-+
-+ public void Close () {
-+ closed = true;
-+ }
-+
-+ public bool IsClosed {
-+ get {
-+ return closed;
-+ }
-+ }
-+
-+ bool disconnected;
-+
-+ void receiver_thread_main () {
-+ while (true) {
-+ try {
-+ bool res = ReceivePacket ();
-+ if (!res)
-+ break;
-+ } catch (Exception ex) {
-+ Console.WriteLine (ex);
-+ break;
-+ }
-+ }
-+
-+ lock (reply_packets_monitor) {
-+ disconnected = true;
-+ Monitor.PulseAll (reply_packets_monitor);
-+ }
-+ EventHandler.VMDisconnect (0, 0, null);
-+ }
-+
-+ bool ReceivePacket () {
-+ byte[] packet = ReadPacket ();
-+
-+ if (packet.Length == 0) {
-+ return false;
-+ }
-+
-+ if (IsReplyPacket (packet)) {
-+ int id = GetPacketId (packet);
-+ ReplyCallback cb = null;
-+ lock (reply_packets_monitor) {
-+ reply_cbs.TryGetValue (id, out cb);
-+ if (cb == null) {
-+ reply_packets [id] = packet;
-+ Monitor.PulseAll (reply_packets_monitor);
-+ }
-+ }
-+
-+ if (cb != null)
-+ cb.Invoke (id, packet);
-+ } else {
-+ PacketReader r = new PacketReader (packet);
-+
-+ if (r.CommandSet == CommandSet.EVENT && r.Command == (int)CmdEvent.COMPOSITE) {
-+ r.ReadByte (); // suspend_policy
-+ int nevents = r.ReadInt ();
-+
-+ for (int i = 0; i < nevents; ++i) {
-+ EventKind kind = (EventKind)r.ReadByte ();
-+ int req_id = r.ReadInt ();
-+
-+ if (kind == EventKind.VM_START) {
-+ long thread_id = r.ReadId ();
-+ EventHandler.VMStart (req_id, thread_id, null);
-+ } else if (kind == EventKind.VM_DEATH) {
-+ EventHandler.VMDeath (req_id, 0, null);
-+ } else if (kind == EventKind.THREAD_START) {
-+ long thread_id = r.ReadId ();
-+ EventHandler.ThreadStart (req_id, thread_id, thread_id);
-+ } else if (kind == EventKind.THREAD_DEATH) {
-+ long thread_id = r.ReadId ();
-+ EventHandler.ThreadDeath (req_id, thread_id, thread_id);
-+ } else if (kind == EventKind.ASSEMBLY_LOAD) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ EventHandler.AssemblyLoad (req_id, thread_id, id);
-+ } else if (kind == EventKind.ASSEMBLY_UNLOAD) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ EventHandler.AssemblyUnload (req_id, thread_id, id);
-+ } else if (kind == EventKind.TYPE_LOAD) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ EventHandler.TypeLoad (req_id, thread_id, id);
-+ } else if (kind == EventKind.METHOD_ENTRY) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ EventHandler.MethodEntry (req_id, thread_id, id);
-+ } else if (kind == EventKind.METHOD_EXIT) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ EventHandler.MethodExit (req_id, thread_id, id);
-+ } else if (kind == EventKind.BREAKPOINT) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ long loc = r.ReadLong ();
-+ EventHandler.Breakpoint (req_id, thread_id, id, loc);
-+ } else if (kind == EventKind.STEP) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ long loc = r.ReadLong ();
-+ EventHandler.Step (req_id, thread_id, id, loc);
-+ } else if (kind == EventKind.EXCEPTION) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ long loc = 0; // FIXME
-+ EventHandler.Exception (req_id, thread_id, id, loc);
-+ } else if (kind == EventKind.APPDOMAIN_CREATE) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ EventHandler.AppDomainCreate (req_id, thread_id, id);
-+ } else if (kind == EventKind.APPDOMAIN_UNLOAD) {
-+ long thread_id = r.ReadId ();
-+ long id = r.ReadId ();
-+ EventHandler.AppDomainUnload (req_id, thread_id, id);
-+ } else {
-+ throw new NotImplementedException ("Unknown event kind: " + kind);
-+ }
-+ }
-+ }
-+ }
-+
-+ return true;
-+ }
-+
-+ public IEventHandler EventHandler {
-+ get; set;
-+ }
-+
-+ /* Send a request and call cb when a result is received */
-+ int Send (CommandSet command_set, int command, PacketWriter packet, Action<PacketReader> cb) {
-+ int id = IdGenerator;
-+
-+ lock (reply_packets_monitor) {
-+ reply_cbs [id] = delegate (int packet_id, byte[] p) {
-+ /* Run the callback on a tp thread to avoid blocking the receive thread */
-+ PacketReader r = new PacketReader (p);
-+ cb.BeginInvoke (r, null, null);
-+ };
-+ }
-+
-+ if (packet == null)
-+ WritePacket (EncodePacket (id, (int)command_set, command, null, 0));
-+ else
-+ WritePacket (EncodePacket (id, (int)command_set, command, packet.Data, packet.Offset));
-+
-+ return id;
-+ }
-+
-+ PacketReader SendReceive (CommandSet command_set, int command, PacketWriter packet) {
-+ int id = IdGenerator;
-+
-+ if (packet == null)
-+ WritePacket (EncodePacket (id, (int)command_set, command, null, 0));
-+ else
-+ WritePacket (EncodePacket (id, (int)command_set, command, packet.Data, packet.Offset));
-+
-+ int packetId = id;
-+
-+ /* Wait for the reply packet */
-+ while (true) {
-+ lock (reply_packets_monitor) {
-+ if (reply_packets.ContainsKey (packetId)) {
-+ byte[] reply = reply_packets [packetId];
-+ reply_packets.Remove (packetId);
-+ PacketReader r = new PacketReader (reply);
-+ if (r.ErrorCode != 0) {
-+ if (ErrorHandler != null)
-+ ErrorHandler (this, new ErrorHandlerEventArgs () { ErrorCode = (ErrorCode)r.ErrorCode });
-+ throw new NotImplementedException ("No error handler set.");
-+ } else {
-+ return r;
-+ }
-+ } else {
-+ if (disconnected)
-+ throw new VMDisconnectedException ();
-+ Monitor.Wait (reply_packets_monitor);
-+ }
-+ }
-+ }
-+ }
-+
-+ PacketReader SendReceive (CommandSet command_set, int command) {
-+ return SendReceive (command_set, command, null);
-+ }
-+
-+ int packet_id_generator;
-+
-+ int IdGenerator {
-+ get {
-+ return Interlocked.Increment (ref packet_id_generator);
-+ }
-+ }
-+
-+ CattrInfo[] ReadCattrs (PacketReader r) {
-+ CattrInfo[] res = new CattrInfo [r.ReadInt ()];
-+ for (int i = 0; i < res.Length; ++i) {
-+ CattrInfo info = new CattrInfo ();
-+ info.ctor_id = r.ReadId ();
-+ info.ctor_args = new ValueImpl [r.ReadInt ()];
-+ for (int j = 0; j < info.ctor_args.Length; ++j) {
-+ info.ctor_args [j] = r.ReadValue ();
-+ }
-+ info.named_args = new CattrNamedArgInfo [r.ReadInt ()];
-+ for (int j = 0; j < info.named_args.Length; ++j) {
-+ CattrNamedArgInfo arg = new CattrNamedArgInfo ();
-+ int arg_type = r.ReadByte ();
-+ arg.is_property = arg_type == 0x54;
-+ arg.id = r.ReadId ();
-+ arg.value = r.ReadValue ();
-+ info.named_args [j] = arg;
-+ }
-+ res [i] = info;
-+ }
-+ return res;
-+ }
-+
-+ static ElementType TypeCodeToElementType (TypeCode c) {
-+ switch (c) {
-+ case TypeCode.Boolean:
-+ return ElementType.Boolean;
-+ case TypeCode.Char:
-+ return ElementType.Char;
-+ case TypeCode.SByte:
-+ return ElementType.I1;
-+ case TypeCode.Byte:
-+ return ElementType.U1;
-+ case TypeCode.Int16:
-+ return ElementType.I2;
-+ case TypeCode.UInt16:
-+ return ElementType.U2;
-+ case TypeCode.Int32:
-+ return ElementType.I4;
-+ case TypeCode.UInt32:
-+ return ElementType.U4;
-+ case TypeCode.Int64:
-+ return ElementType.I8;
-+ case TypeCode.UInt64:
-+ return ElementType.U8;
-+ case TypeCode.Single:
-+ return ElementType.R4;
-+ case TypeCode.Double:
-+ return ElementType.R8;
-+ default:
-+ throw new NotImplementedException ();
-+ }
-+ }
-+
-+ /*
-+ * Implementation of debugger commands
-+ */
-+
-+ public VersionInfo VM_GetVersion () {
-+ var res = SendReceive (CommandSet.VM, (int)CmdVM.VERSION, null);
-+ VersionInfo info = new VersionInfo ();
-+ info.VMVersion = res.ReadString ();
-+ info.MajorVersion = res.ReadInt ();
-+ info.MinorVersion = res.ReadInt ();
-+ return info;
-+ }
-+
-+ public void VM_SetProtocolVersion (int major, int minor) {
-+ SendReceive (CommandSet.VM, (int)CmdVM.SET_PROTOCOL_VERSION, new PacketWriter ().WriteInt (major).WriteInt (minor));
-+ }
-+
-+ public long[] VM_GetThreads () {
-+ var res = SendReceive (CommandSet.VM, (int)CmdVM.ALL_THREADS, null);
-+ int len = res.ReadInt ();
-+ long[] arr = new long [len];
-+ for (int i = 0; i < len; ++i)
-+ arr [i] = res.ReadId ();
-+ return arr;
-+ }
-+
-+ public void VM_Suspend () {
-+ SendReceive (CommandSet.VM, (int)CmdVM.SUSPEND);
-+ }
-+
-+ public void VM_Resume () {
-+ SendReceive (CommandSet.VM, (int)CmdVM.RESUME);
-+ }
-+
-+ public void VM_Exit (int exitCode) {
-+ SendReceive (CommandSet.VM, (int)CmdVM.EXIT, new PacketWriter ().WriteInt (exitCode));
-+ }
-+
-+ public void VM_Dispose () {
-+ SendReceive (CommandSet.VM, (int)CmdVM.DISPOSE);
-+ }
-+
-+ public ValueImpl VM_InvokeMethod (long thread, long method, ValueImpl this_arg, ValueImpl[] arguments, InvokeFlags flags, out ValueImpl exc) {
-+ exc = null;
-+ PacketReader r = SendReceive (CommandSet.VM, (int)CmdVM.INVOKE_METHOD, new PacketWriter ().WriteId (thread).WriteInt ((int)flags).WriteId (method).WriteValue (this_arg).WriteInt (arguments.Length).WriteValues (arguments));
-+ if (r.ReadByte () == 0) {
-+ exc = r.ReadValue ();
-+ return null;
-+ } else {
-+ return r.ReadValue ();
-+ }
-+ }
-+
-+ public delegate void InvokeMethodCallback (ValueImpl v, ValueImpl exc, ErrorCode error, object state);
-+
-+ public int VM_BeginInvokeMethod (long thread, long method, ValueImpl this_arg, ValueImpl[] arguments, InvokeFlags flags, InvokeMethodCallback callback, object state) {
-+ return Send (CommandSet.VM, (int)CmdVM.INVOKE_METHOD, new PacketWriter ().WriteId (thread).WriteInt ((int)flags).WriteId (method).WriteValue (this_arg).WriteInt (arguments.Length).WriteValues (arguments), delegate (PacketReader r) {
-+ ValueImpl v, exc;
-+
-+ if (r.ErrorCode != 0) {
-+ callback (null, null, (ErrorCode)r.ErrorCode, state);
-+ } else {
-+ if (r.ReadByte () == 0) {
-+ exc = r.ReadValue ();
-+ v = null;
-+ } else {
-+ v = r.ReadValue ();
-+ exc = null;
-+ }
-+
-+ callback (v, exc, 0, state);
-+ }
-+ });
-+ }
-+
-+ public void VM_AbortInvoke (long thread, int id)
-+ {
-+ SendReceive (CommandSet.VM, (int)CmdVM.ABORT_INVOKE, new PacketWriter ().WriteId (thread).WriteInt (id));
-+ }
-+
-+ /*
-+ * DOMAIN
-+ */
-+
-+ public long RootDomain {
-+ get {
-+ return SendReceive (CommandSet.APPDOMAIN, (int)CmdAppDomain.GET_ROOT_DOMAIN, null).ReadId ();
-+ }
-+ }
-+
-+ public string Domain_GetName (long id) {
-+ return SendReceive (CommandSet.APPDOMAIN, (int)CmdAppDomain.GET_FRIENDLY_NAME, new PacketWriter ().WriteId (id)).ReadString ();
-+ }
-+
-+ public long[] Domain_GetAssemblies (long id) {
-+ var res = SendReceive (CommandSet.APPDOMAIN, (int)CmdAppDomain.GET_ASSEMBLIES, new PacketWriter ().WriteId (id));
-+ int count = res.ReadInt ();
-+ long[] assemblies = new long [count];
-+ for (int i = 0; i < count; ++i)
-+ assemblies [i] = res.ReadId ();
-+ return assemblies;
-+ }
-+
-+ public long Domain_GetEntryAssembly (long id) {
-+ return SendReceive (CommandSet.APPDOMAIN, (int)CmdAppDomain.GET_ENTRY_ASSEMBLY, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public long Domain_GetCorlib (long id) {
-+ return SendReceive (CommandSet.APPDOMAIN, (int)CmdAppDomain.GET_CORLIB, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public long Domain_CreateString (long id, string s) {
-+ return SendReceive (CommandSet.APPDOMAIN, (int)CmdAppDomain.CREATE_STRING, new PacketWriter ().WriteId (id).WriteString (s)).ReadId ();
-+ }
-+
-+ public long Domain_CreateBoxedValue (long id, long type_id, ValueImpl v) {
-+ return SendReceive (CommandSet.APPDOMAIN, (int)CmdAppDomain.CREATE_BOXED_VALUE, new PacketWriter ().WriteId (id).WriteId (type_id).WriteValue (v)).ReadId ();
-+ }
-+
-+ /*
-+ * METHOD
-+ */
-+
-+ public string Method_GetName (long id) {
-+ return SendReceive (CommandSet.METHOD, (int)CmdMethod.GET_NAME, new PacketWriter ().WriteId (id)).ReadString ();
-+ }
-+
-+ public long Method_GetDeclaringType (long id) {
-+ return SendReceive (CommandSet.METHOD, (int)CmdMethod.GET_DECLARING_TYPE, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public DebugInfo Method_GetDebugInfo (long id) {
-+ var res = SendReceive (CommandSet.METHOD, (int)CmdMethod.GET_DEBUG_INFO, new PacketWriter ().WriteId (id));
-+
-+ DebugInfo info = new DebugInfo ();
-+ info.max_il_offset = res.ReadInt ();
-+ info.filename = res.ReadString ();
-+
-+ int n_il_offsets = res.ReadInt ();
-+ info.il_offsets = new int [n_il_offsets];
-+ info.line_numbers = new int [n_il_offsets];
-+ for (int i = 0; i < n_il_offsets; ++i) {
-+ info.il_offsets [i] = res.ReadInt ();
-+ info.line_numbers [i] = res.ReadInt ();
-+ }
-+
-+ return info;
-+ }
-+
-+ public ParamInfo Method_GetParamInfo (long id) {
-+ var res = SendReceive (CommandSet.METHOD, (int)CmdMethod.GET_PARAM_INFO, new PacketWriter ().WriteId (id));
-+
-+ ParamInfo info = new ParamInfo ();
-+ info.call_conv = res.ReadInt ();
-+ info.param_count = res.ReadInt ();
-+ info.generic_param_count = res.ReadInt ();
-+ info.ret_type = res.ReadId ();
-+ info.param_types = new long [info.param_count];
-+ for (int i = 0; i < info.param_count; ++i)
-+ info.param_types [i] = res.ReadId ();
-+ info.param_names = new string [info.param_count];
-+ for (int i = 0; i < info.param_count; ++i)
-+ info.param_names [i] = res.ReadString ();
-+
-+ return info;
-+ }
-+
-+ public LocalsInfo Method_GetLocalsInfo (long id) {
-+ var res = SendReceive (CommandSet.METHOD, (int)CmdMethod.GET_LOCALS_INFO, new PacketWriter ().WriteId (id));
-+
-+ LocalsInfo info = new LocalsInfo ();
-+ int nlocals = res.ReadInt ();
-+ info.types = new long [nlocals];
-+ for (int i = 0; i < nlocals; ++i)
-+ info.types [i] = res.ReadId ();
-+ info.names = new string [nlocals];
-+ for (int i = 0; i < nlocals; ++i)
-+ info.names [i] = res.ReadString ();
-+ info.live_range_start = new int [nlocals];
-+ info.live_range_end = new int [nlocals];
-+ for (int i = 0; i < nlocals; ++i) {
-+ info.live_range_start [i] = res.ReadInt ();
-+ info.live_range_end [i] = res.ReadInt ();
-+ }
-+
-+ return info;
-+ }
-+
-+ public MethodInfo Method_GetInfo (long id) {
-+ var res = SendReceive (CommandSet.METHOD, (int)CmdMethod.GET_INFO, new PacketWriter ().WriteId (id));
-+
-+ MethodInfo info = new MethodInfo ();
-+ info.attributes = res.ReadInt ();
-+ info.iattributes = res.ReadInt ();
-+ info.token = res.ReadInt ();
-+
-+ return info;
-+ }
-+
-+ public MethodBodyInfo Method_GetBody (long id) {
-+ var res = SendReceive (CommandSet.METHOD, (int)CmdMethod.GET_BODY, new PacketWriter ().WriteId (id));
-+
-+ MethodBodyInfo info = new MethodBodyInfo ();
-+ info.il = new byte [res.ReadInt ()];
-+ for (int i = 0; i < info.il.Length; ++i)
-+ info.il [i] = (byte)res.ReadByte ();
-+
-+ return info;
-+ }
-+
-+ public ResolvedToken Method_ResolveToken (long id, int token) {
-+ var res = SendReceive (CommandSet.METHOD, (int)CmdMethod.RESOLVE_TOKEN, new PacketWriter ().WriteId (id).WriteInt (token));
-+
-+ TokenType type = (TokenType)res.ReadByte ();
-+ switch (type) {
-+ case TokenType.STRING:
-+ return new ResolvedToken () { Type = type, Str = res.ReadString () };
-+ case TokenType.TYPE:
-+ case TokenType.METHOD:
-+ case TokenType.FIELD:
-+ return new ResolvedToken () { Type = type, Id = res.ReadId () };
-+ case TokenType.UNKNOWN:
-+ return new ResolvedToken () { Type = type };
-+ default:
-+ throw new NotImplementedException ();
-+ }
-+ }
-+
-+ /*
-+ * THREAD
-+ */
-+
-+ public string Thread_GetName (long id) {
-+ return SendReceive (CommandSet.THREAD, (int)CmdThread.GET_NAME, new PacketWriter ().WriteId (id)).ReadString ();
-+ }
-+
-+ public FrameInfo[] Thread_GetFrameInfo (long id, int start_frame, int length) {
-+ var res = SendReceive (CommandSet.THREAD, (int)CmdThread.GET_FRAME_INFO, new PacketWriter ().WriteId (id).WriteInt (start_frame).WriteInt (length));
-+ int count = res.ReadInt ();
-+
-+ var frames = new FrameInfo [count];
-+ for (int i = 0; i < count; ++i) {
-+ frames [i].id = res.ReadInt ();
-+ frames [i].method = res.ReadId ();
-+ frames [i].il_offset = res.ReadInt ();
-+ frames [i].flags = (StackFrameFlags)res.ReadByte ();
-+ }
-+ return frames;
-+ }
-+
-+ public int Thread_GetState (long id) {
-+ return SendReceive (CommandSet.THREAD, (int)CmdThread.GET_STATE, new PacketWriter ().WriteId (id)).ReadInt ();
-+ }
-+
-+ public ThreadInfo Thread_GetInfo (long id) {
-+ PacketReader r = SendReceive (CommandSet.THREAD, (int)CmdThread.GET_INFO, new PacketWriter ().WriteId (id));
-+
-+ ThreadInfo res = new ThreadInfo () { is_thread_pool = r.ReadByte () > 0 ? true : false };
-+
-+ return res;
-+ }
-+
-+ public long Thread_GetId (long id) {
-+ return SendReceive (CommandSet.THREAD, (int)CmdThread.GET_ID, new PacketWriter ().WriteId (id)).ReadLong ();
-+ }
-+
-+ /*
-+ * MODULE
-+ */
-+
-+ public ModuleInfo Module_GetInfo (long id) {
-+ PacketReader r = SendReceive (CommandSet.MODULE, (int)CmdModule.GET_INFO, new PacketWriter ().WriteId (id));
-+ ModuleInfo info = new ModuleInfo { Name = r.ReadString (), ScopeName = r.ReadString (), FQName = r.ReadString (), Guid = r.ReadString (), Assembly = r.ReadId () };
-+ return info;
-+ }
-+
-+ /*
-+ * ASSEMBLY
-+ */
-+
-+ public string Assembly_GetLocation (long id) {
-+ return SendReceive (CommandSet.ASSEMBLY, (int)CmdAssembly.GET_LOCATION, new PacketWriter ().WriteId (id)).ReadString ();
-+ }
-+
-+ public long Assembly_GetEntryPoint (long id) {
-+ return SendReceive (CommandSet.ASSEMBLY, (int)CmdAssembly.GET_ENTRY_POINT, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public long Assembly_GetManifestModule (long id) {
-+ return SendReceive (CommandSet.ASSEMBLY, (int)CmdAssembly.GET_MANIFEST_MODULE, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public long Assembly_GetObject (long id) {
-+ return SendReceive (CommandSet.ASSEMBLY, (int)CmdAssembly.GET_OBJECT, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public long Assembly_GetType (long id, string name, bool ignoreCase) {
-+ return SendReceive (CommandSet.ASSEMBLY, (int)CmdAssembly.GET_TYPE, new PacketWriter ().WriteId (id).WriteString (name).WriteBool (ignoreCase)).ReadId ();
-+ }
-+
-+ public string Assembly_GetName (long id) {
-+ return SendReceive (CommandSet.ASSEMBLY, (int)CmdAssembly.GET_NAME, new PacketWriter ().WriteId (id)).ReadString ();
-+ }
-+
-+ /*
-+ * TYPE
-+ */
-+
-+ public TypeInfo Type_GetInfo (long id) {
-+ PacketReader r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_INFO, new PacketWriter ().WriteId (id));
-+ TypeInfo res = new TypeInfo ();
-+
-+ res.ns = r.ReadString ();
-+ res.name = r.ReadString ();
-+ res.full_name = r.ReadString ();
-+ res.assembly = r.ReadId ();
-+ res.module = r.ReadId ();
-+ res.base_type = r.ReadId ();
-+ res.element_type = r.ReadId ();
-+ res.token = r.ReadInt ();
-+ res.rank = r.ReadByte ();
-+ res.attributes = r.ReadInt ();
-+ int b = r.ReadByte ();
-+ res.is_byref = (b & 1) != 0;
-+ res.is_pointer = (b & 2) != 0;
-+ res.is_primitive = (b & 4) != 0;
-+ res.is_valuetype = (b & 8) != 0;
-+ res.is_enum = (b & 16) != 0;
-+
-+ int nested_len = r.ReadInt ();
-+ res.nested = new long [nested_len];
-+ for (int i = 0; i < nested_len; ++i)
-+ res.nested [i] = r.ReadId ();
-+
-+ return res;
-+ }
-+
-+ public long[] Type_GetMethods (long id) {
-+ PacketReader r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_METHODS, new PacketWriter ().WriteId (id));
-+
-+ int n = r.ReadInt ();
-+ long[] res = new long [n];
-+ for (int i = 0; i < n; ++i)
-+ res [i] = r.ReadId ();
-+ return res;
-+ }
-+
-+ public long[] Type_GetFields (long id, out string[] names, out long[] types, out int[] attrs) {
-+ PacketReader r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_FIELDS, new PacketWriter ().WriteId (id));
-+
-+ int n = r.ReadInt ();
-+ long[] res = new long [n];
-+ names = new string [n];
-+ types = new long [n];
-+ attrs = new int [n];
-+ for (int i = 0; i < n; ++i) {
-+ res [i] = r.ReadId ();
-+ names [i] = r.ReadString ();
-+ types [i] = r.ReadId ();
-+ attrs [i] = r.ReadInt ();
-+ }
-+ return res;
-+ }
-+
-+ public PropInfo[] Type_GetProperties (long id) {
-+ PacketReader r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_PROPERTIES, new PacketWriter ().WriteId (id));
-+
-+ int n = r.ReadInt ();
-+ PropInfo[] res = new PropInfo [n];
-+ for (int i = 0; i < n; ++i) {
-+ res [i] = new PropInfo ();
-+ res [i].id = r.ReadId ();
-+ res [i].name = r.ReadString ();
-+ res [i].get_method = r.ReadId ();
-+ res [i].set_method = r.ReadId ();
-+ res [i].attrs = r.ReadInt ();
-+ }
-+
-+ return res;
-+ }
-+
-+ public long Type_GetObject (long id) {
-+ return SendReceive (CommandSet.TYPE, (int)CmdType.GET_OBJECT, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public ValueImpl[] Type_GetValues (long id, long[] fields) {
-+ int len = fields.Length;
-+ PacketReader r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_VALUES, new PacketWriter ().WriteId (id).WriteInt (len).WriteIds (fields));
-+
-+ ValueImpl[] res = new ValueImpl [len];
-+ for (int i = 0; i < len; ++i)
-+ res [i] = r.ReadValue ();
-+ return res;
-+ }
-+
-+ public void Type_SetValues (long id, long[] fields, ValueImpl[] values) {
-+ SendReceive (CommandSet.TYPE, (int)CmdType.SET_VALUES, new PacketWriter ().WriteId (id).WriteInt (fields.Length).WriteIds (fields).WriteValues (values));
-+ }
-+
-+ public string[] Type_GetSourceFiles (long id, bool return_full_paths) {
-+ var r = SendReceive (CommandSet.TYPE, return_full_paths ? (int)CmdType.GET_SOURCE_FILES_2 : (int)CmdType.GET_SOURCE_FILES, new PacketWriter ().WriteId (id));
-+ int len = r.ReadInt ();
-+ string[] res = new string [len];
-+ for (int i = 0; i < len; ++i)
-+ res [i] = r.ReadString ();
-+ return res;
-+ }
-+
-+ public bool Type_IsAssignableFrom (long id, long c_id) {
-+ return SendReceive (CommandSet.TYPE, (int)CmdType.IS_ASSIGNABLE_FROM, new PacketWriter ().WriteId (id).WriteId (c_id)).ReadByte () > 0;
-+ }
-+
-+ public CattrInfo[] Type_GetCustomAttributes (long id, long attr_type_id, bool inherit) {
-+ PacketReader r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_CATTRS, new PacketWriter ().WriteId (id).WriteId (attr_type_id));
-+ return ReadCattrs (r);
-+ }
-+
-+ public CattrInfo[] Type_GetFieldCustomAttributes (long id, long field_id, long attr_type_id, bool inherit) {
-+ PacketReader r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_FIELD_CATTRS, new PacketWriter ().WriteId (id).WriteId (field_id).WriteId (attr_type_id));
-+ return ReadCattrs (r);
-+ }
-+
-+ public CattrInfo[] Type_GetPropertyCustomAttributes (long id, long field_id, long attr_type_id, bool inherit) {
-+ PacketReader r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_PROPERTY_CATTRS, new PacketWriter ().WriteId (id).WriteId (field_id).WriteId (attr_type_id));
-+ return ReadCattrs (r);
-+ }
-+
-+ /*
-+ * EVENTS
-+ */
-+
-+ public int EnableEvent (EventType etype, SuspendPolicy suspend_policy, List<Modifier> mods) {
-+ var w = new PacketWriter ().WriteByte ((byte)etype).WriteByte ((byte)suspend_policy);
-+ if (mods != null) {
-+ if (mods.Count > 255)
-+ throw new NotImplementedException ();
-+ w.WriteByte ((byte)mods.Count);
-+ foreach (Modifier mod in mods) {
-+ if (mod is CountModifier) {
-+ w.WriteByte ((byte)ModifierKind.COUNT);
-+ w.WriteInt ((mod as CountModifier).Count);
-+ } else if (mod is LocationModifier) {
-+ w.WriteByte ((byte)ModifierKind.LOCATION_ONLY);
-+ w.WriteId ((mod as LocationModifier).Method);
-+ w.WriteLong ((mod as LocationModifier).Location);
-+ } else if (mod is StepModifier) {
-+ w.WriteByte ((byte)ModifierKind.STEP);
-+ w.WriteId ((mod as StepModifier).Thread);
-+ w.WriteInt ((mod as StepModifier).Size);
-+ w.WriteInt ((mod as StepModifier).Depth);
-+ } else if (mod is ThreadModifier) {
-+ w.WriteByte ((byte)ModifierKind.THREAD_ONLY);
-+ w.WriteId ((mod as ThreadModifier).Thread);
-+ } else if (mod is ExceptionModifier) {
-+ var em = mod as ExceptionModifier;
-+ w.WriteByte ((byte)ModifierKind.EXCEPTION_ONLY);
-+ w.WriteId (em.Type);
-+ if (Version.MajorVersion > 2 || Version.MinorVersion > 0) {
-+ /* This is only supported in protocol version 2.1 */
-+ w.WriteBool (em.Caught);
-+ w.WriteBool (em.Uncaught);
-+ } else if (!em.Caught || !em.Uncaught) {
-+ throw new NotSupportedException ("This request is not supported by the protocol version implemented by the debuggee.");
-+ }
-+ } else if (mod is AssemblyModifier) {
-+ w.WriteByte ((byte)ModifierKind.ASSEMBLY_ONLY);
-+ var amod = (mod as AssemblyModifier);
-+ w.WriteInt (amod.Assemblies.Length);
-+ foreach (var id in amod.Assemblies)
-+ w.WriteId (id);
-+ } else {
-+ throw new NotImplementedException ();
-+ }
-+ }
-+ } else {
-+ w.WriteByte (0);
-+ }
-+ return SendReceive (CommandSet.EVENT_REQUEST, (int)CmdEventRequest.SET, w).ReadInt ();
-+ }
-+
-+ public void ClearEventRequest (EventType etype, int req_id) {
-+ SendReceive (CommandSet.EVENT_REQUEST, (int)CmdEventRequest.CLEAR, new PacketWriter ().WriteByte ((byte)etype).WriteInt (req_id));
-+ }
-+
-+ public void ClearAllBreakpoints () {
-+ SendReceive (CommandSet.EVENT_REQUEST, (int)CmdEventRequest.CLEAR_ALL_BREAKPOINTS, new PacketWriter ());
-+ }
-+
-+ /*
-+ * STACK FRAME
-+ */
-+ public ValueImpl StackFrame_GetThis (long thread_id, long id) {
-+ PacketReader r = SendReceive (CommandSet.STACK_FRAME, (int)CmdStackFrame.GET_THIS, new PacketWriter ().WriteId (thread_id).WriteId (id));
-+ return r.ReadValue ();
-+ }
-+
-+ public ValueImpl[] StackFrame_GetValues (long thread_id, long id, int[] pos) {
-+ /* pos < 0 -> argument at pos (-pos) - 1 */
-+ /* pos >= 0 -> local at pos */
-+ int len = pos.Length;
-+ PacketReader r = SendReceive (CommandSet.STACK_FRAME, (int)CmdStackFrame.GET_VALUES, new PacketWriter ().WriteId (thread_id).WriteId (id).WriteInt (len).WriteInts (pos));
-+
-+ ValueImpl[] res = new ValueImpl [len];
-+ for (int i = 0; i < len; ++i)
-+ res [i] = r.ReadValue ();
-+ return res;
-+ }
-+
-+ public void StackFrame_SetValues (long thread_id, long id, int[] pos, ValueImpl[] values) {
-+ /* pos < 0 -> argument at pos (-pos) - 1 */
-+ /* pos >= 0 -> local at pos */
-+ int len = pos.Length;
-+ SendReceive (CommandSet.STACK_FRAME, (int)CmdStackFrame.SET_VALUES, new PacketWriter ().WriteId (thread_id).WriteId (id).WriteInt (len).WriteInts (pos).WriteValues (values));
-+ }
-+
-+ /*
-+ * ARRAYS
-+ */
-+ public int[] Array_GetLength (long id, out int rank, out int[] lower_bounds) {
-+ var r = SendReceive (CommandSet.ARRAY_REF, (int)CmdArrayRef.GET_LENGTH, new PacketWriter ().WriteId (id));
-+ rank = r.ReadInt ();
-+ int[] res = new int [rank];
-+ lower_bounds = new int [rank];
-+ for (int i = 0; i < rank; ++i) {
-+ res [i] = r.ReadInt ();
-+ lower_bounds [i] = r.ReadInt ();
-+ }
-+ return res;
-+ }
-+
-+ public ValueImpl[] Array_GetValues (long id, int index, int len) {
-+ var r = SendReceive (CommandSet.ARRAY_REF, (int)CmdArrayRef.GET_VALUES, new PacketWriter ().WriteId (id).WriteInt (index).WriteInt (len));
-+ ValueImpl[] res = new ValueImpl [len];
-+ for (int i = 0; i < len; ++i)
-+ res [i] = r.ReadValue ();
-+ return res;
-+ }
-+
-+ public void Array_SetValues (long id, int index, ValueImpl[] values) {
-+ SendReceive (CommandSet.ARRAY_REF, (int)CmdArrayRef.SET_VALUES, new PacketWriter ().WriteId (id).WriteInt (index).WriteInt (values.Length).WriteValues (values));
-+ }
-+
-+ /*
-+ * STRINGS
-+ */
-+ public string String_GetValue (long id) {
-+ return SendReceive (CommandSet.STRING_REF, (int)CmdStringRef.GET_VALUE, new PacketWriter ().WriteId (id)).ReadString ();
-+ }
-+
-+ /*
-+ * OBJECTS
-+ */
-+ public long Object_GetType (long id) {
-+ return SendReceive (CommandSet.OBJECT_REF, (int)CmdObjectRef.GET_TYPE, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public long Object_GetDomain (long id) {
-+ return SendReceive (CommandSet.OBJECT_REF, (int)CmdObjectRef.GET_DOMAIN, new PacketWriter ().WriteId (id)).ReadId ();
-+ }
-+
-+ public ValueImpl[] Object_GetValues (long id, long[] fields) {
-+ int len = fields.Length;
-+ PacketReader r = SendReceive (CommandSet.OBJECT_REF, (int)CmdObjectRef.GET_VALUES, new PacketWriter ().WriteId (id).WriteInt (len).WriteIds (fields));
-+
-+ ValueImpl[] res = new ValueImpl [len];
-+ for (int i = 0; i < len; ++i)
-+ res [i] = r.ReadValue ();
-+ return res;
-+ }
-+
-+ public void Object_SetValues (long id, long[] fields, ValueImpl[] values) {
-+ SendReceive (CommandSet.OBJECT_REF, (int)CmdObjectRef.SET_VALUES, new PacketWriter ().WriteId (id).WriteInt (fields.Length).WriteIds (fields).WriteValues (values));
-+ }
-+
-+ public bool Object_IsCollected (long id) {
-+ return SendReceive (CommandSet.OBJECT_REF, (int)CmdObjectRef.IS_COLLECTED, new PacketWriter ().WriteId (id)).ReadInt () == 1;
-+ }
-+
-+ public long Object_GetAddress (long id) {
-+ return SendReceive (CommandSet.OBJECT_REF, (int)CmdObjectRef.GET_ADDRESS, new PacketWriter ().WriteId (id)).ReadLong ();
-+ }
-+
-+ }
-+
-+ /* This is the interface exposed by the debugger towards the debugger agent */
-+ interface IEventHandler
-+ {
-+ void VMStart (int req_id, long thread_id, string vm_uri);
-+
-+ void VMDeath (int req_id, long thread_id, string vm_uri);
-+
-+ void VMDisconnect (int req_id, long thread_id, string vm_uri);
-+
-+ void ThreadStart (int req_id, long thread_id, long id);
-+
-+ void ThreadDeath (int req_id, long thread_id, long id);
-+
-+ void AssemblyLoad (int req_id, long thread_id, long id);
-+
-+ void AssemblyUnload (int req_id, long thread_id, long id);
-+
-+ void TypeLoad (int req_id, long thread_id, long id);
-+
-+ void MethodEntry (int req_id, long thread_id, long id);
-+
-+ void MethodExit (int req_id, long thread_id, long id);
-+
-+ void Breakpoint (int req_id, long thread_id, long method_id, long loc);
-+
-+ void Step (int req_id, long thread_id, long method_id, long loc);
-+
-+ void Exception (int req_id, long thread_id, long exc_id, long loc);
-+
-+ void AppDomainCreate (int req_id, long thread_id, long id);
-+
-+ void AppDomainUnload (int req_id, long thread_id, long id);
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/CustomAttributeDataMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/CustomAttributeDataMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,143 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Runtime.CompilerServices;
-+using System.Runtime.InteropServices;
-+using System.Reflection;
-+using System.Text;
-+using Mono.Cecil.Metadata;
-+
-+namespace Mono.Debugger.Soft {
-+
-+ public sealed class CustomAttributeDataMirror {
-+ MethodMirror ctorInfo;
-+ IList<CustomAttributeTypedArgumentMirror> ctorArgs;
-+ IList<CustomAttributeNamedArgumentMirror> namedArgs;
-+
-+ internal CustomAttributeDataMirror (MethodMirror ctorInfo, object [] ctorArgs, object [] namedArgs)
-+ {
-+ this.ctorInfo = ctorInfo;
-+
-+ this.ctorArgs = Array.AsReadOnly<CustomAttributeTypedArgumentMirror>
-+ (ctorArgs != null ? UnboxValues<CustomAttributeTypedArgumentMirror> (ctorArgs) : new CustomAttributeTypedArgumentMirror [0]);
-+
-+ this.namedArgs = Array.AsReadOnly<CustomAttributeNamedArgumentMirror>
-+ (namedArgs != null ? UnboxValues<CustomAttributeNamedArgumentMirror> (namedArgs) : new CustomAttributeNamedArgumentMirror [0]);
-+ }
-+
-+ [ComVisible (true)]
-+ public MethodMirror Constructor {
-+ get {
-+ return ctorInfo;
-+ }
-+ }
-+
-+ [ComVisible (true)]
-+ public IList<CustomAttributeTypedArgumentMirror> ConstructorArguments {
-+ get {
-+ return ctorArgs;
-+ }
-+ }
-+
-+ public IList<CustomAttributeNamedArgumentMirror> NamedArguments {
-+ get {
-+ return namedArgs;
-+ }
-+ }
-+
-+ public override string ToString ()
-+ {
-+ StringBuilder sb = new StringBuilder ();
-+
-+ sb.Append ("[" + ctorInfo.DeclaringType.FullName + "(");
-+ if (ctorArgs != null) {
-+ for (int i = 0; i < ctorArgs.Count; i++) {
-+ sb.Append (ctorArgs [i].ToString ());
-+ if (i + 1 < ctorArgs.Count)
-+ sb.Append (", ");
-+ }
-+ }
-+
-+ if (namedArgs != null) {
-+ if (namedArgs.Count > 0)
-+ sb.Append (", ");
-+
-+ for (int j = 0; j < namedArgs.Count; j++) {
-+ sb.Append (namedArgs [j].ToString ());
-+ if (j + 1 < namedArgs.Count)
-+ sb.Append (", ");
-+ }
-+ }
-+ sb.AppendFormat (")]");
-+
-+ return sb.ToString ();
-+ }
-+
-+ static T [] UnboxValues<T> (object [] values)
-+ {
-+ T [] retval = new T [values.Length];
-+ for (int i = 0; i < values.Length; i++)
-+ retval [i] = (T) values [i];
-+
-+ return retval;
-+ }
-+
-+ /*
-+ * Construct a normal object from the value, so accessing the cattr doesn't
-+ * require remoting calls.
-+ */
-+ static CustomAttributeTypedArgumentMirror CreateArg (VirtualMachine vm, ValueImpl vi) {
-+ object val;
-+
-+ /* Instead of receiving a mirror of the Type object, we receive the id of the type */
-+ if (vi.Type == (ElementType)ValueTypeId.VALUE_TYPE_ID_TYPE)
-+ val = vm.GetType (vi.Id);
-+ else {
-+ Value v = vm.DecodeValue (vi);
-+ if (v is PrimitiveValue)
-+ val = (v as PrimitiveValue).Value;
-+ else if (v is StringMirror)
-+ val = (v as StringMirror).Value;
-+ else
-+ // FIXME:
-+ val = v;
-+ }
-+ return new CustomAttributeTypedArgumentMirror (null, val);
-+ }
-+
-+ internal static CustomAttributeDataMirror[] Create (VirtualMachine vm, CattrInfo[] info) {
-+ var res = new CustomAttributeDataMirror [info.Length];
-+ for (int i = 0; i < info.Length; ++i) {
-+ CattrInfo attr = info [i];
-+ MethodMirror ctor = vm.GetMethod (attr.ctor_id);
-+ var ctor_args = new object [attr.ctor_args.Length];
-+ for (int j = 0; j < ctor_args.Length; ++j)
-+ ctor_args [j] = CreateArg (vm, attr.ctor_args [j]);
-+ var named_args = new object [attr.named_args.Length];
-+ for (int j = 0; j < named_args.Length; ++j) {
-+ CattrNamedArgInfo arg = attr.named_args [j];
-+ CustomAttributeTypedArgumentMirror val;
-+
-+ val = CreateArg (vm, arg.value);
-+
-+ if (arg.is_property) {
-+ foreach (var prop in ctor.DeclaringType.GetProperties ()) {
-+ if (prop.Id == arg.id)
-+ named_args [j] = new CustomAttributeNamedArgumentMirror (prop, null, val);
-+ }
-+ } else {
-+ foreach (var field in ctor.DeclaringType.GetFields ()) {
-+ if (field.Id == arg.id)
-+ named_args [j] = new CustomAttributeNamedArgumentMirror (null, field, val);
-+ }
-+ }
-+ if (named_args [j] == null)
-+ throw new NotImplementedException ();
-+ }
-+ res [i] = new CustomAttributeDataMirror (vm.GetMethod (attr.ctor_id), ctor_args, named_args);
-+ }
-+
-+ return res;
-+ }
-+ }
-+
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/CustomAttributeNamedArgumentMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/CustomAttributeNamedArgumentMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,37 @@
-+using System;
-+using System.Runtime.InteropServices;
-+using System.Reflection;
-+
-+namespace Mono.Debugger.Soft {
-+
-+ public struct CustomAttributeNamedArgumentMirror {
-+ CustomAttributeTypedArgumentMirror arg;
-+ PropertyInfoMirror prop;
-+ FieldInfoMirror field;
-+
-+ internal CustomAttributeNamedArgumentMirror (PropertyInfoMirror prop, FieldInfoMirror field, CustomAttributeTypedArgumentMirror arg)
-+ {
-+ this.arg = arg;
-+ this.prop = prop;
-+ this.field = field;
-+ }
-+
-+ public PropertyInfoMirror Property {
-+ get {
-+ return prop;
-+ }
-+ }
-+
-+ public FieldInfoMirror Field {
-+ get {
-+ return field;
-+ }
-+ }
-+
-+ public CustomAttributeTypedArgumentMirror TypedValue {
-+ get {
-+ return arg;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/CustomAttributeTypedArgumentMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/CustomAttributeTypedArgumentMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,59 @@
-+using System;
-+using System.Runtime.InteropServices;
-+using System.Collections.ObjectModel;
-+using System.Reflection;
-+
-+namespace Mono.Debugger.Soft {
-+
-+ public struct CustomAttributeTypedArgumentMirror {
-+ Type type;
-+ object value;
-+
-+ internal CustomAttributeTypedArgumentMirror (Type type, object value)
-+ {
-+ this.type = type;
-+ this.value = value;
-+
-+ if (value != null)
-+ this.type = value.GetType ();
-+ else
-+ this.type = typeof (void);
-+
-+ // MS seems to convert arrays into a ReadOnlyCollection
-+ if (value is Array) {
-+ Array a = (Array)value;
-+
-+ Type etype = a.GetType ().GetElementType ();
-+ CustomAttributeTypedArgumentMirror[] new_value = new CustomAttributeTypedArgumentMirror [a.GetLength (0)];
-+ for (int i = 0; i < new_value.Length; ++i)
-+ new_value [i] = new CustomAttributeTypedArgumentMirror (etype, a.GetValue (i));
-+ this.value = new ReadOnlyCollection <CustomAttributeTypedArgumentMirror> (new_value);
-+ }
-+ }
-+
-+ public Type ArgumentType {
-+ get {
-+ return type;
-+ }
-+ }
-+
-+ public object Value {
-+ get {
-+ return value;
-+ }
-+ }
-+
-+ public override string ToString ()
-+ {
-+ string val = value != null ? value.ToString () : String.Empty;
-+ if (ArgumentType == typeof (string))
-+ return "\"" + val + "\"";
-+ if (ArgumentType == typeof (Type))
-+ return "typeof (" + val + ")";
-+ if (ArgumentType.IsEnum)
-+ return "(" + ArgumentType.Name + ")" + val;
-+
-+ return val;
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/DataConverter.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/DataConverter.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,1836 @@
-+//
-+// Authors:
-+// Miguel de Icaza (miguel at novell.com)
-+//
-+// See the following url for documentation:
-+// http://www.mono-project.com/Mono_DataConvert
-+//
-+// Compilation Options:
-+// MONO_DATACONVERTER_PUBLIC:
-+// Makes the class public instead of the default internal.
-+//
-+// MONO_DATACONVERTER_STATIC_METHODS:
-+// Exposes the public static methods.
-+//
-+// TODO:
-+// Support for "DoubleWordsAreSwapped" for ARM devices
-+//
-+// Copyright (C) 2006 Novell, Inc (http://www.novell.com)
-+//
-+// Permission is hereby granted, free of charge, to any person obtaining
-+// a copy of this software and associated documentation files (the
-+// "Software"), to deal in the Software without restriction, including
-+// without limitation the rights to use, copy, modify, merge, publish,
-+// distribute, sublicense, and/or sell copies of the Software, and to
-+// permit persons to whom the Software is furnished to do so, subject to
-+// the following conditions:
-+//
-+// The above copyright notice and this permission notice shall be
-+// included in all copies or substantial portions of the Software.
-+//
-+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+//
-+using System;
-+using System.Collections;
-+using System.Text;
-+
-+#pragma warning disable 3021
-+
-+namespace Mono {
-+
-+#if MONO_DATACONVERTER_PUBLIC
-+ unsafe public abstract class DataConverter {
-+#else
-+ unsafe internal abstract class DataConverter {
-+
-+// Disables the warning: CLS compliance checking will not be performed on
-+// `XXXX' because it is not visible from outside this assembly
-+#pragma warning disable 3019
-+#endif
-+ static DataConverter SwapConv = new SwapConverter ();
-+ static DataConverter CopyConv = new CopyConverter ();
-+
-+ public static readonly bool IsLittleEndian = BitConverter.IsLittleEndian;
-+
-+ public abstract double GetDouble (byte [] data, int index);
-+ public abstract float GetFloat (byte [] data, int index);
-+ public abstract long GetInt64 (byte [] data, int index);
-+ public abstract int GetInt32 (byte [] data, int index);
-+
-+ public abstract short GetInt16 (byte [] data, int index);
-+
-+ [CLSCompliant (false)]
-+ public abstract uint GetUInt32 (byte [] data, int index);
-+ [CLSCompliant (false)]
-+ public abstract ushort GetUInt16 (byte [] data, int index);
-+ [CLSCompliant (false)]
-+ public abstract ulong GetUInt64 (byte [] data, int index);
-+
-+ public abstract void PutBytes (byte [] dest, int destIdx, double value);
-+ public abstract void PutBytes (byte [] dest, int destIdx, float value);
-+ public abstract void PutBytes (byte [] dest, int destIdx, int value);
-+ public abstract void PutBytes (byte [] dest, int destIdx, long value);
-+ public abstract void PutBytes (byte [] dest, int destIdx, short value);
-+
-+ [CLSCompliant (false)]
-+ public abstract void PutBytes (byte [] dest, int destIdx, ushort value);
-+ [CLSCompliant (false)]
-+ public abstract void PutBytes (byte [] dest, int destIdx, uint value);
-+ [CLSCompliant (false)]
-+ public abstract void PutBytes (byte [] dest, int destIdx, ulong value);
-+
-+ public byte[] GetBytes (double value)
-+ {
-+ byte [] ret = new byte [8];
-+ PutBytes (ret, 0, value);
-+ return ret;
-+ }
-+
-+ public byte[] GetBytes (float value)
-+ {
-+ byte [] ret = new byte [4];
-+ PutBytes (ret, 0, value);
-+ return ret;
-+ }
-+
-+ public byte[] GetBytes (int value)
-+ {
-+ byte [] ret = new byte [4];
-+ PutBytes (ret, 0, value);
-+ return ret;
-+ }
-+
-+ public byte[] GetBytes (long value)
-+ {
-+ byte [] ret = new byte [8];
-+ PutBytes (ret, 0, value);
-+ return ret;
-+ }
-+
-+ public byte[] GetBytes (short value)
-+ {
-+ byte [] ret = new byte [2];
-+ PutBytes (ret, 0, value);
-+ return ret;
-+ }
-+
-+ [CLSCompliant (false)]
-+ public byte[] GetBytes (ushort value)
-+ {
-+ byte [] ret = new byte [2];
-+ PutBytes (ret, 0, value);
-+ return ret;
-+ }
-+
-+ [CLSCompliant (false)]
-+ public byte[] GetBytes (uint value)
-+ {
-+ byte [] ret = new byte [4];
-+ PutBytes (ret, 0, value);
-+ return ret;
-+ }
-+
-+ [CLSCompliant (false)]
-+ public byte[] GetBytes (ulong value)
-+ {
-+ byte [] ret = new byte [8];
-+ PutBytes (ret, 0, value);
-+ return ret;
-+ }
-+
-+ static public DataConverter LittleEndian {
-+ get {
-+ return BitConverter.IsLittleEndian ? CopyConv : SwapConv;
-+ }
-+ }
-+
-+ static public DataConverter BigEndian {
-+ get {
-+ return BitConverter.IsLittleEndian ? SwapConv : CopyConv;
-+ }
-+ }
-+
-+ static public DataConverter Native {
-+ get {
-+ return CopyConv;
-+ }
-+ }
-+
-+ static int Align (int current, int align)
-+ {
-+ return ((current + align - 1) / align) * align;
-+ }
-+
-+ class PackContext {
-+ // Buffer
-+ public byte [] buffer;
-+ int next;
-+
-+ public string description;
-+ public int i; // position in the description
-+ public DataConverter conv;
-+ public int repeat;
-+
-+ //
-+ // if align == -1, auto align to the size of the byte array
-+ // if align == 0, do not do alignment
-+ // Any other values aligns to that particular size
-+ //
-+ public int align;
-+
-+ public void Add (byte [] group)
-+ {
-+ //Console.WriteLine ("Adding {0} bytes to {1} (next={2}", group.Length,
-+ // buffer == null ? "null" : buffer.Length.ToString (), next);
-+
-+ if (buffer == null){
-+ buffer = group;
-+ next = group.Length;
-+ return;
-+ }
-+ if (align != 0){
-+ if (align == -1)
-+ next = Align (next, group.Length);
-+ else
-+ next = Align (next, align);
-+ align = 0;
-+ }
-+
-+ if (next + group.Length > buffer.Length){
-+ byte [] nb = new byte [System.Math.Max (next, 16) * 2 + group.Length];
-+ Array.Copy (buffer, nb, buffer.Length);
-+ Array.Copy (group, 0, nb, next, group.Length);
-+ next = next + group.Length;
-+ buffer = nb;
-+ } else {
-+ Array.Copy (group, 0, buffer, next, group.Length);
-+ next += group.Length;
-+ }
-+ }
-+
-+ public byte [] Get ()
-+ {
-+ if (buffer == null)
-+ return new byte [0];
-+
-+ if (buffer.Length != next){
-+ byte [] b = new byte [next];
-+ Array.Copy (buffer, b, next);
-+ return b;
-+ }
-+ return buffer;
-+ }
-+ }
-+
-+ //
-+ // Format includes:
-+ // Control:
-+ // ^ Switch to big endian encoding
-+ // _ Switch to little endian encoding
-+ // % Switch to host (native) encoding
-+ // ! aligns the next data type to its natural boundary (for strings this is 4).
-+ //
-+ // Types:
-+ // s Int16
-+ // S UInt16
-+ // i Int32
-+ // I UInt32
-+ // l Int64
-+ // L UInt64
-+ // f float
-+ // d double
-+ // b byte
-+ // c 1-byte signed character
-+ // C 1-byte unsigned character
-+ // z8 string encoded as UTF8 with 1-byte null terminator
-+ // z6 string encoded as UTF16 with 2-byte null terminator
-+ // z7 string encoded as UTF7 with 1-byte null terminator
-+ // zb string encoded as BigEndianUnicode with 2-byte null terminator
-+ // z3 string encoded as UTF32 with 4-byte null terminator
-+ // z4 string encoded as UTF32 big endian with 4-byte null terminator
-+ // $8 string encoded as UTF8
-+ // $6 string encoded as UTF16
-+ // $7 string encoded as UTF7
-+ // $b string encoded as BigEndianUnicode
-+ // $3 string encoded as UTF32
-+ // $4 string encoded as UTF-32 big endian encoding
-+ // x null byte
-+ //
-+ // Repeats, these are prefixes:
-+ // N a number between 1 and 9, indicates a repeat count (process N items
-+ // with the following datatype
-+ // [N] For numbers larger than 9, use brackets, for example [20]
-+ // * Repeat the next data type until the arguments are exhausted
-+ //
-+ static public byte [] Pack (string description, params object [] args)
-+ {
-+ int argn = 0;
-+ PackContext b = new PackContext ();
-+ b.conv = CopyConv;
-+ b.description = description;
-+
-+ for (b.i = 0; b.i < description.Length; ){
-+ object oarg;
-+
-+ if (argn < args.Length)
-+ oarg = args [argn];
-+ else {
-+ if (b.repeat != 0)
-+ break;
-+
-+ oarg = null;
-+ }
-+
-+ int save = b.i;
-+
-+ if (PackOne (b, oarg)){
-+ argn++;
-+ if (b.repeat > 0){
-+ if (--b.repeat > 0)
-+ b.i = save;
-+ else
-+ b.i++;
-+ } else
-+ b.i++;
-+ } else
-+ b.i++;
-+ }
-+ return b.Get ();
-+ }
-+
-+ static public byte [] PackEnumerable (string description, IEnumerable args)
-+ {
-+ PackContext b = new PackContext ();
-+ b.conv = CopyConv;
-+ b.description = description;
-+
-+ IEnumerator enumerator = args.GetEnumerator ();
-+ bool ok = enumerator.MoveNext ();
-+
-+ for (b.i = 0; b.i < description.Length; ){
-+ object oarg;
-+
-+ if (ok)
-+ oarg = enumerator.Current;
-+ else {
-+ if (b.repeat != 0)
-+ break;
-+ oarg = null;
-+ }
-+
-+ int save = b.i;
-+
-+ if (PackOne (b, oarg)){
-+ ok = enumerator.MoveNext ();
-+ if (b.repeat > 0){
-+ if (--b.repeat > 0)
-+ b.i = save;
-+ else
-+ b.i++;
-+ } else
-+ b.i++;
-+ } else
-+ b.i++;
-+ }
-+ return b.Get ();
-+ }
-+
-+ //
-+ // Packs one datum `oarg' into the buffer `b', using the string format
-+ // in `description' at position `i'
-+ //
-+ // Returns: true if we must pick the next object from the list
-+ //
-+ static bool PackOne (PackContext b, object oarg)
-+ {
-+ int n;
-+
-+ switch (b.description [b.i]){
-+ case '^':
-+ b.conv = BigEndian;
-+ return false;
-+ case '_':
-+ b.conv = LittleEndian;
-+ return false;
-+ case '%':
-+ b.conv = Native;
-+ return false;
-+
-+ case '!':
-+ b.align = -1;
-+ return false;
-+
-+ case 'x':
-+ b.Add (new byte [] { 0 });
-+ return false;
-+
-+ // Type Conversions
-+ case 'i':
-+ b.Add (b.conv.GetBytes (Convert.ToInt32 (oarg)));
-+ break;
-+
-+ case 'I':
-+ b.Add (b.conv.GetBytes (Convert.ToUInt32 (oarg)));
-+ break;
-+
-+ case 's':
-+ b.Add (b.conv.GetBytes (Convert.ToInt16 (oarg)));
-+ break;
-+
-+ case 'S':
-+ b.Add (b.conv.GetBytes (Convert.ToUInt16 (oarg)));
-+ break;
-+
-+ case 'l':
-+ b.Add (b.conv.GetBytes (Convert.ToInt64 (oarg)));
-+ break;
-+
-+ case 'L':
-+ b.Add (b.conv.GetBytes (Convert.ToUInt64 (oarg)));
-+ break;
-+
-+ case 'f':
-+ b.Add (b.conv.GetBytes (Convert.ToSingle (oarg)));
-+ break;
-+
-+ case 'd':
-+ b.Add (b.conv.GetBytes (Convert.ToDouble (oarg)));
-+ break;
-+
-+ case 'b':
-+ b.Add (new byte [] { Convert.ToByte (oarg) });
-+ break;
-+
-+ case 'c':
-+ b.Add (new byte [] { (byte) (Convert.ToSByte (oarg)) });
-+ break;
-+
-+ case 'C':
-+ b.Add (new byte [] { Convert.ToByte (oarg) });
-+ break;
-+
-+ // Repeat acount;
-+ case '1': case '2': case '3': case '4': case '5':
-+ case '6': case '7': case '8': case '9':
-+ b.repeat = ((short) b.description [b.i]) - ((short) '0');
-+ return false;
-+
-+ case '*':
-+ b.repeat = Int32.MaxValue;
-+ return false;
-+
-+ case '[':
-+ int count = -1, j;
-+
-+ for (j = b.i+1; j < b.description.Length; j++){
-+ if (b.description [j] == ']')
-+ break;
-+ n = ((short) b.description [j]) - ((short) '0');
-+ if (n >= 0 && n <= 9){
-+ if (count == -1)
-+ count = n;
-+ else
-+ count = count * 10 + n;
-+ }
-+ }
-+ if (count == -1)
-+ throw new ArgumentException ("invalid size specification");
-+ b.i = j;
-+ b.repeat = count;
-+ return false;
-+
-+ case '$': case 'z':
-+ bool add_null = b.description [b.i] == 'z';
-+ b.i++;
-+ if (b.i >= b.description.Length)
-+ throw new ArgumentException ("$ description needs a type specified", "description");
-+ char d = b.description [b.i];
-+ Encoding e;
-+
-+ switch (d){
-+ case '8':
-+ e = Encoding.UTF8;
-+ n = 1;
-+ break;
-+ case '6':
-+ e = Encoding.Unicode;
-+ n = 2;
-+ break;
-+ case '7':
-+ e = Encoding.UTF7;
-+ n = 1;
-+ break;
-+ case 'b':
-+ e = Encoding.BigEndianUnicode;
-+ n = 2;
-+ break;
-+ case '3':
-+ e = Encoding.GetEncoding (12000);
-+ n = 4;
-+ break;
-+ case '4':
-+ e = Encoding.GetEncoding (12001);
-+ n = 4;
-+ break;
-+
-+ default:
-+ throw new ArgumentException ("Invalid format for $ specifier", "description");
-+ }
-+ if (b.align == -1)
-+ b.align = 4;
-+ b.Add (e.GetBytes (Convert.ToString (oarg)));
-+ if (add_null)
-+ b.Add (new byte [n]);
-+ break;
-+ default:
-+ throw new ArgumentException (String.Format ("invalid format specified `{0}'",
-+ b.description [b.i]));
-+ }
-+ return true;
-+ }
-+
-+ static bool Prepare (byte [] buffer, ref int idx, int size, ref bool align)
-+ {
-+ if (align){
-+ idx = Align (idx, size);
-+ align = false;
-+ }
-+ if (idx + size > buffer.Length){
-+ idx = buffer.Length;
-+ return false;
-+ }
-+ return true;
-+ }
-+
-+ static public IList Unpack (string description, byte [] buffer, int startIndex)
-+ {
-+ DataConverter conv = CopyConv;
-+ ArrayList result = new ArrayList ();
-+ int idx = startIndex;
-+ bool align = false;
-+ int repeat = 0, n;
-+
-+ for (int i = 0; i < description.Length && idx < buffer.Length; ){
-+ int save = i;
-+
-+ switch (description [i]){
-+ case '^':
-+ conv = BigEndian;
-+ break;
-+ case '_':
-+ conv = LittleEndian;
-+ break;
-+ case '%':
-+ conv = Native;
-+ break;
-+ case 'x':
-+ idx++;
-+ break;
-+
-+ case '!':
-+ align = true;
-+ break;
-+
-+ // Type Conversions
-+ case 'i':
-+ if (Prepare (buffer, ref idx, 4, ref align)){
-+ result.Add (conv.GetInt32 (buffer, idx));
-+ idx += 4;
-+ }
-+ break;
-+
-+ case 'I':
-+ if (Prepare (buffer, ref idx, 4, ref align)){
-+ result.Add (conv.GetUInt32 (buffer, idx));
-+ idx += 4;
-+ }
-+ break;
-+
-+ case 's':
-+ if (Prepare (buffer, ref idx, 2, ref align)){
-+ result.Add (conv.GetInt16 (buffer, idx));
-+ idx += 2;
-+ }
-+ break;
-+
-+ case 'S':
-+ if (Prepare (buffer, ref idx, 2, ref align)){
-+ result.Add (conv.GetUInt16 (buffer, idx));
-+ idx += 2;
-+ }
-+ break;
-+
-+ case 'l':
-+ if (Prepare (buffer, ref idx, 8, ref align)){
-+ result.Add (conv.GetInt64 (buffer, idx));
-+ idx += 8;
-+ }
-+ break;
-+
-+ case 'L':
-+ if (Prepare (buffer, ref idx, 8, ref align)){
-+ result.Add (conv.GetUInt64 (buffer, idx));
-+ idx += 8;
-+ }
-+ break;
-+
-+ case 'f':
-+ if (Prepare (buffer, ref idx, 4, ref align)){
-+ result.Add (conv.GetDouble (buffer, idx));
-+ idx += 4;
-+ }
-+ break;
-+
-+ case 'd':
-+ if (Prepare (buffer, ref idx, 8, ref align)){
-+ result.Add (conv.GetDouble (buffer, idx));
-+ idx += 8;
-+ }
-+ break;
-+
-+ case 'b':
-+ if (Prepare (buffer, ref idx, 1, ref align)){
-+ result.Add (buffer [idx]);
-+ idx++;
-+ }
-+ break;
-+
-+ case 'c': case 'C':
-+ if (Prepare (buffer, ref idx, 1, ref align)){
-+ char c;
-+
-+ if (description [i] == 'c')
-+ c = ((char) ((sbyte)buffer [idx]));
-+ else
-+ c = ((char) ((byte)buffer [idx]));
-+
-+ result.Add (c);
-+ idx++;
-+ }
-+ break;
-+
-+ // Repeat acount;
-+ case '1': case '2': case '3': case '4': case '5':
-+ case '6': case '7': case '8': case '9':
-+ repeat = ((short) description [i]) - ((short) '0');
-+ save = i + 1;
-+ break;
-+
-+ case '*':
-+ repeat = Int32.MaxValue;
-+ break;
-+
-+ case '[':
-+ int count = -1, j;
-+
-+ for (j = i+1; j < description.Length; j++){
-+ if (description [j] == ']')
-+ break;
-+ n = ((short) description [j]) - ((short) '0');
-+ if (n >= 0 && n <= 9){
-+ if (count == -1)
-+ count = n;
-+ else
-+ count = count * 10 + n;
-+ }
-+ }
-+ if (count == -1)
-+ throw new ArgumentException ("invalid size specification");
-+ i = j;
-+ repeat = count;
-+ break;
-+
-+ case '$': case 'z':
-+ // bool with_null = description [i] == 'z';
-+ i++;
-+ if (i >= description.Length)
-+ throw new ArgumentException ("$ description needs a type specified", "description");
-+ char d = description [i];
-+ Encoding e;
-+ if (align){
-+ idx = Align (idx, 4);
-+ align = false;
-+ }
-+ if (idx >= buffer.Length)
-+ break;
-+
-+ switch (d){
-+ case '8':
-+ e = Encoding.UTF8;
-+ n = 1;
-+ break;
-+ case '6':
-+ e = Encoding.Unicode;
-+ n = 2;
-+ break;
-+ case '7':
-+ e = Encoding.UTF7;
-+ n = 1;
-+ break;
-+ case 'b':
-+ e = Encoding.BigEndianUnicode;
-+ n = 2;
-+ break;
-+ case '3':
-+ e = Encoding.GetEncoding (12000);
-+ n = 4;
-+ break;
-+ case '4':
-+ e = Encoding.GetEncoding (12001);
-+ n = 4;
-+ break;
-+
-+ default:
-+ throw new ArgumentException ("Invalid format for $ specifier", "description");
-+ }
-+ int k = idx;
-+ switch (n){
-+ case 1:
-+ for (; k < buffer.Length && buffer [k] != 0; k++)
-+ ;
-+ result.Add (e.GetChars (buffer, idx, k-idx));
-+ if (k == buffer.Length)
-+ idx = k;
-+ else
-+ idx = k+1;
-+ break;
-+
-+ case 2:
-+ for (; k < buffer.Length; k++){
-+ if (k+1 == buffer.Length){
-+ k++;
-+ break;
-+ }
-+ if (buffer [k] == 0 && buffer [k+1] == 0)
-+ break;
-+ }
-+ result.Add (e.GetChars (buffer, idx, k-idx));
-+ if (k == buffer.Length)
-+ idx = k;
-+ else
-+ idx = k+2;
-+ break;
-+
-+ case 4:
-+ for (; k < buffer.Length; k++){
-+ if (k+3 >= buffer.Length){
-+ k = buffer.Length;
-+ break;
-+ }
-+ if (buffer[k]==0 && buffer[k+1] == 0 && buffer[k+2] == 0 && buffer[k+3]== 0)
-+ break;
-+ }
-+ result.Add (e.GetChars (buffer, idx, k-idx));
-+ if (k == buffer.Length)
-+ idx = k;
-+ else
-+ idx = k+4;
-+ break;
-+ }
-+ break;
-+ default:
-+ throw new ArgumentException (String.Format ("invalid format specified `{0}'",
-+ description [i]));
-+ }
-+
-+ if (repeat > 0){
-+ if (--repeat > 0)
-+ i = save;
-+ } else
-+ i++;
-+ }
-+ return result;
-+ }
-+
-+ internal void Check (byte [] dest, int destIdx, int size)
-+ {
-+ if (dest == null)
-+ throw new ArgumentNullException ("dest");
-+ if (destIdx < 0 || destIdx > dest.Length - size)
-+ throw new ArgumentException ("destIdx");
-+ }
-+
-+ class CopyConverter : DataConverter {
-+ public override double GetDouble (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+ double ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 8; i++)
-+ b [i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override ulong GetUInt64 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ulong ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 8; i++)
-+ b [i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override long GetInt64 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ long ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 8; i++)
-+ b [i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override float GetFloat (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ float ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 4; i++)
-+ b [i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override int GetInt32 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ int ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 4; i++)
-+ b [i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override uint GetUInt32 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ uint ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 4; i++)
-+ b [i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override short GetInt16 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ short ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 2; i++)
-+ b [i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override ushort GetUInt16 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ushort ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 2; i++)
-+ b [i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, double value)
-+ {
-+ Check (dest, destIdx, 8);
-+ fixed (byte *target = &dest [destIdx]){
-+ long *source = (long *) &value;
-+
-+ *((long *)target) = *source;
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, float value)
-+ {
-+ Check (dest, destIdx, 4);
-+ fixed (byte *target = &dest [destIdx]){
-+ uint *source = (uint *) &value;
-+
-+ *((uint *)target) = *source;
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, int value)
-+ {
-+ Check (dest, destIdx, 4);
-+ fixed (byte *target = &dest [destIdx]){
-+ uint *source = (uint *) &value;
-+
-+ *((uint *)target) = *source;
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, uint value)
-+ {
-+ Check (dest, destIdx, 4);
-+ fixed (byte *target = &dest [destIdx]){
-+ uint *source = (uint *) &value;
-+
-+ *((uint *)target) = *source;
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, long value)
-+ {
-+ Check (dest, destIdx, 8);
-+ fixed (byte *target = &dest [destIdx]){
-+ long *source = (long *) &value;
-+
-+ *((long*)target) = *source;
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, ulong value)
-+ {
-+ Check (dest, destIdx, 8);
-+ fixed (byte *target = &dest [destIdx]){
-+ ulong *source = (ulong *) &value;
-+
-+ *((ulong *) target) = *source;
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, short value)
-+ {
-+ Check (dest, destIdx, 2);
-+ fixed (byte *target = &dest [destIdx]){
-+ ushort *source = (ushort *) &value;
-+
-+ *((ushort *)target) = *source;
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, ushort value)
-+ {
-+ Check (dest, destIdx, 2);
-+ fixed (byte *target = &dest [destIdx]){
-+ ushort *source = (ushort *) &value;
-+
-+ *((ushort *)target) = *source;
-+ }
-+ }
-+ }
-+
-+ class SwapConverter : DataConverter {
-+ public override double GetDouble (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ double ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 8; i++)
-+ b [7-i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override ulong GetUInt64 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ulong ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 8; i++)
-+ b [7-i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override long GetInt64 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ long ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 8; i++)
-+ b [7-i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override float GetFloat (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ float ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 4; i++)
-+ b [3-i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override int GetInt32 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ int ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 4; i++)
-+ b [3-i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override uint GetUInt32 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ uint ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 4; i++)
-+ b [3-i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override short GetInt16 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ short ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 2; i++)
-+ b [1-i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override ushort GetUInt16 (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ushort ret;
-+ byte *b = (byte *)&ret;
-+
-+ for (int i = 0; i < 2; i++)
-+ b [1-i] = data [index+i];
-+
-+ return ret;
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, double value)
-+ {
-+ Check (dest, destIdx, 8);
-+
-+ fixed (byte *target = &dest [destIdx]){
-+ byte *source = (byte *) &value;
-+
-+ for (int i = 0; i < 8; i++)
-+ target [i] = source [7-i];
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, float value)
-+ {
-+ Check (dest, destIdx, 4);
-+
-+ fixed (byte *target = &dest [destIdx]){
-+ byte *source = (byte *) &value;
-+
-+ for (int i = 0; i < 4; i++)
-+ target [i] = source [3-i];
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, int value)
-+ {
-+ Check (dest, destIdx, 4);
-+
-+ fixed (byte *target = &dest [destIdx]){
-+ byte *source = (byte *) &value;
-+
-+ for (int i = 0; i < 4; i++)
-+ target [i] = source [3-i];
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, uint value)
-+ {
-+ Check (dest, destIdx, 4);
-+
-+ fixed (byte *target = &dest [destIdx]){
-+ byte *source = (byte *) &value;
-+
-+ for (int i = 0; i < 4; i++)
-+ target [i] = source [3-i];
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, long value)
-+ {
-+ Check (dest, destIdx, 8);
-+
-+ fixed (byte *target = &dest [destIdx]){
-+ byte *source = (byte *) &value;
-+
-+ for (int i = 0; i < 8; i++)
-+ target [i] = source [7-i];
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, ulong value)
-+ {
-+ Check (dest, destIdx, 8);
-+
-+ fixed (byte *target = &dest [destIdx]){
-+ byte *source = (byte *) &value;
-+
-+ for (int i = 0; i < 4; i++)
-+ target [i] = source [7-i];
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, short value)
-+ {
-+ Check (dest, destIdx, 2);
-+
-+ fixed (byte *target = &dest [destIdx]){
-+ byte *source = (byte *) &value;
-+
-+ for (int i = 0; i < 2; i++)
-+ target [i] = source [1-i];
-+ }
-+ }
-+
-+ public override void PutBytes (byte [] dest, int destIdx, ushort value)
-+ {
-+ Check (dest, destIdx, 2);
-+
-+ fixed (byte *target = &dest [destIdx]){
-+ byte *source = (byte *) &value;
-+
-+ for (int i = 0; i < 2; i++)
-+ target [i] = source [1-i];
-+ }
-+ }
-+ }
-+
-+#if MONO_DATACONVERTER_STATIC_METHODS
-+ static unsafe void PutBytesLE (byte *dest, byte *src, int count)
-+ {
-+ int i = 0;
-+
-+ if (BitConverter.IsLittleEndian){
-+ for (; i < count; i++)
-+ *dest++ = *src++;
-+ } else {
-+ dest += count;
-+ for (; i < count; i++)
-+ *(--dest) = *src++;
-+ }
-+ }
-+
-+ static unsafe void PutBytesBE (byte *dest, byte *src, int count)
-+ {
-+ int i = 0;
-+
-+ if (BitConverter.IsLittleEndian){
-+ dest += count;
-+ for (; i < count; i++)
-+ *(--dest) = *src++;
-+ } else {
-+ for (; i < count; i++)
-+ *dest++ = *src++;
-+ }
-+ }
-+
-+ static unsafe void PutBytesNative (byte *dest, byte *src, int count)
-+ {
-+ int i = 0;
-+
-+ for (; i < count; i++)
-+ dest [i-count] = *src++;
-+ }
-+
-+ static public unsafe double DoubleFromLE (byte[] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ double ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesLE ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe float FloatFromLE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ float ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesLE ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe long Int64FromLE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ long ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesLE ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe ulong UInt64FromLE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ulong ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesLE ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe int Int32FromLE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ int ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesLE ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe uint UInt32FromLE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ uint ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesLE ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe short Int16FromLE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ short ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesLE ((byte *) &ret, src, 2);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe ushort UInt16FromLE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ushort ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesLE ((byte *) &ret, src, 2);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe double DoubleFromBE (byte[] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ double ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesBE ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe float FloatFromBE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ float ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesBE ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe long Int64FromBE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ long ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesBE ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe ulong UInt64FromBE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ulong ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesBE ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe int Int32FromBE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ int ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesBE ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe uint UInt32FromBE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ uint ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesBE ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe short Int16FromBE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ short ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesBE ((byte *) &ret, src, 2);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe ushort UInt16FromBE (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ushort ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesBE ((byte *) &ret, src, 2);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe double DoubleFromNative (byte[] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ double ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesNative ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe float FloatFromNative (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ float ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesNative ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe long Int64FromNative (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ long ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesNative ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe ulong UInt64FromNative (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 8)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ulong ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesNative ((byte *) &ret, src, 8);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe int Int32FromNative (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ int ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesNative ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe uint UInt32FromNative (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 4)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ uint ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesNative ((byte *) &ret, src, 4);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe short Int16FromNative (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ short ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesNative ((byte *) &ret, src, 2);
-+ }
-+ return ret;
-+ }
-+
-+ static public unsafe ushort UInt16FromNative (byte [] data, int index)
-+ {
-+ if (data == null)
-+ throw new ArgumentNullException ("data");
-+ if (data.Length - index < 2)
-+ throw new ArgumentException ("index");
-+ if (index < 0)
-+ throw new ArgumentException ("index");
-+
-+ ushort ret;
-+ fixed (byte *src = &data[index]){
-+ PutBytesNative ((byte *) &ret, src, 2);
-+ }
-+ return ret;
-+ }
-+
-+ unsafe static byte[] GetBytesPtr (byte *ptr, int count)
-+ {
-+ byte [] ret = new byte [count];
-+
-+ for (int i = 0; i < count; i++) {
-+ ret [i] = ptr [i];
-+ }
-+
-+ return ret;
-+ }
-+
-+ unsafe static byte[] GetBytesSwap (bool swap, byte *ptr, int count)
-+ {
-+ byte [] ret = new byte [count];
-+
-+ if (swap){
-+ int t = count-1;
-+ for (int i = 0; i < count; i++) {
-+ ret [t-i] = ptr [i];
-+ }
-+ } else {
-+ for (int i = 0; i < count; i++) {
-+ ret [i] = ptr [i];
-+ }
-+ }
-+ return ret;
-+ }
-+
-+ unsafe public static byte[] GetBytesNative (bool value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 1);
-+ }
-+
-+ unsafe public static byte[] GetBytesNative (char value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 2);
-+ }
-+
-+ unsafe public static byte[] GetBytesNative (short value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 2);
-+ }
-+
-+ unsafe public static byte[] GetBytesNative (int value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 4);
-+ }
-+
-+ unsafe public static byte[] GetBytesNative (long value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 8);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesNative (ushort value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 2);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesNative (uint value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 4);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesNative (ulong value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 8);
-+ }
-+
-+ unsafe public static byte[] GetBytesNative (float value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 4);
-+ }
-+
-+ unsafe public static byte[] GetBytesNative (double value)
-+ {
-+ return GetBytesPtr ((byte *) &value, 8);
-+ }
-+
-+ unsafe public static byte[] GetBytesLE (bool value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 1);
-+ }
-+
-+ unsafe public static byte[] GetBytesLE (char value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 2);
-+ }
-+
-+ unsafe public static byte[] GetBytesLE (short value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 2);
-+ }
-+
-+ unsafe public static byte[] GetBytesLE (int value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 4);
-+ }
-+
-+ unsafe public static byte[] GetBytesLE (long value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 8);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesLE (ushort value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 2);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesLE (uint value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 4);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesLE (ulong value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 8);
-+ }
-+
-+ unsafe public static byte[] GetBytesLE (float value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 4);
-+ }
-+
-+ unsafe public static byte[] GetBytesLE (double value)
-+ {
-+ return GetBytesSwap (!BitConverter.IsLittleEndian, (byte *) &value, 8);
-+ }
-+
-+ unsafe public static byte[] GetBytesBE (bool value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 1);
-+ }
-+
-+ unsafe public static byte[] GetBytesBE (char value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 2);
-+ }
-+
-+ unsafe public static byte[] GetBytesBE (short value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 2);
-+ }
-+
-+ unsafe public static byte[] GetBytesBE (int value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 4);
-+ }
-+
-+ unsafe public static byte[] GetBytesBE (long value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 8);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesBE (ushort value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 2);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesBE (uint value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 4);
-+ }
-+
-+ [CLSCompliant (false)]
-+ unsafe public static byte[] GetBytesBE (ulong value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 8);
-+ }
-+
-+ unsafe public static byte[] GetBytesBE (float value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 4);
-+ }
-+
-+ unsafe public static byte[] GetBytesBE (double value)
-+ {
-+ return GetBytesSwap (BitConverter.IsLittleEndian, (byte *) &value, 8);
-+ }
-+#endif
-+
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/EnumMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/EnumMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,48 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ /*
-+ * Represents an enum value in the debuggee
-+ */
-+ public class EnumMirror : StructMirror {
-+
-+ internal EnumMirror (VirtualMachine vm, TypeMirror type, Value[] fields) : base (vm, type, fields) {
-+ }
-+
-+ internal EnumMirror (VirtualMachine vm, TypeMirror type, PrimitiveValue value) : base (vm, type, new Value[] { value }) {
-+ if (type == null)
-+ throw new ArgumentNullException ("type");
-+ if (value == null)
-+ throw new ArgumentNullException ("value");
-+ if (!type.IsEnum)
-+ throw new ArgumentException ("type must be an enum type", "type");
-+ TypeMirror t = type.EnumUnderlyingType;
-+ if (value.Value == null || !value.Value.GetType ().IsPrimitive || t != vm.RootDomain.GetCorrespondingType (value.Value.GetType ()))
-+ throw new ArgumentException ("Value '" + value.Value + "' does not match the type of the enum.");
-+ }
-+
-+ public object Value {
-+ get {
-+ return ((PrimitiveValue)Fields [0]).Value;
-+ }
-+ set {
-+ SetField (0, vm.CreateValue (value));
-+ }
-+ }
-+
-+ public string StringValue {
-+ get {
-+ foreach (FieldInfoMirror f in Type.GetFields ()) {
-+ if (f.IsStatic) {
-+ object v = (Type.GetValue (f) as EnumMirror).Value;
-+ if (f.IsStatic && v.Equals (Value))
-+ return f.Name;
-+ }
-+ }
-+ return Value.ToString ();
-+ }
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Event.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Event.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,50 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public abstract class Event {
-+ protected VirtualMachine vm;
-+ EventType evtype;
-+ ThreadMirror thread;
-+ int req_id;
-+ long thread_id;
-+
-+ internal Event (EventType evtype, VirtualMachine vm, int req_id, long thread_id) {
-+ this.evtype = evtype;
-+ this.vm = vm;
-+ this.req_id = req_id;
-+ this.thread_id = thread_id;
-+ }
-+
-+ internal Event (EventType evtype, VirtualMachine vm) {
-+ this.evtype = evtype;
-+ this.vm = vm;
-+ this.thread_id = -1;
-+ }
-+
-+ public EventType EventType {
-+ get {
-+ return evtype;
-+ }
-+ }
-+
-+ public override string ToString () {
-+ return evtype.ToString ();
-+ }
-+
-+ public ThreadMirror Thread {
-+ get {
-+ if (thread_id == -1)
-+ return null;
-+ if (thread == null)
-+ thread = vm.GetThread (thread_id);
-+ return thread;
-+ }
-+ }
-+
-+ public EventRequest Request {
-+ get {
-+ return vm.GetRequest (req_id);
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/EventQueueImpl.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/EventQueueImpl.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,133 @@
-+#if FALSE
-+using System;
-+using System.Collections;
-+using System.Collections.Generic;
-+using System.IO;
-+using System.Threading;
-+using Mono.Debugger;
-+using Mono.Debugger.Requests;
-+using Mono.Debugger.Events;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ class EventQueueImpl : MirrorImpl, EventQueue
-+ {
-+ bool disconnected;
-+ Dictionary<int, byte[]> reply_packets;
-+ Thread receiver_thread;
-+ Queue queue;
-+ object queue_monitor;
-+ object reply_packets_monitor;
-+
-+ public EventQueueImpl (VirtualMachineImpl vm) : base (vm) {
-+ reply_packets = new Dictionary<int, byte[]> ();
-+ reply_packets_monitor = new Object ();
-+
-+ queue = new Queue ();
-+ queue_monitor = new Object ();
-+ receiver_thread = new Thread (new ThreadStart (receiver_thread_main));
-+ receiver_thread.Start ();
-+ }
-+
-+ public EventSet Remove () {
-+ if (disconnected)
-+ // FIXME: VMDisconnectedException
-+ throw new IOException ();
-+
-+ lock (queue_monitor) {
-+ if (queue.Count == 0)
-+ Monitor.Wait (queue_monitor);
-+ return (EventSet)queue.Dequeue ();
-+ }
-+ }
-+
-+ public EventSet Remove (int timeout) {
-+ throw new NotImplementedException ();
-+ }
-+
-+ Event DecodeEventInfo (WireProtocol.EventInfo info) {
-+ EventRequest req = FindRequest (info.requestId);
-+ if (info.eventKind == WireProtocol.EVENT_VM_START) {
-+ WireProtocol.VMStartEventInfo einfo = (WireProtocol.VMStartEventInfo)info;
-+ return new VMStartEventImpl (vm, req, new ThreadReferenceImpl (vm, einfo.thread), new AppDomainMirrorImpl (vm, einfo.domain));
-+ } else if (info.eventKind == WireProtocol.EVENT_VM_DEATH) {
-+ return new VMDeathEventImpl (vm, req);
-+ } else if (info.eventKind == WireProtocol.EVENT_THREAD_START) {
-+ WireProtocol.ThreadStartEventInfo einfo = (WireProtocol.ThreadStartEventInfo)info;
-+ return new ThreadStartEventImpl (vm, req, new ThreadReferenceImpl (vm, einfo.thread));
-+ } else if (info.eventKind == WireProtocol.EVENT_THREAD_DEATH) {
-+ WireProtocol.ThreadDeathEventInfo einfo = (WireProtocol.ThreadDeathEventInfo)info;
-+ return new ThreadDeathEventImpl (vm, req, new ThreadReferenceImpl (vm, einfo.thread));
-+ } else {
-+ throw new NotImplementedException ();
-+ }
-+ }
-+
-+ EventRequest FindRequest (int requestId) {
-+ if (requestId == 0)
-+ return null;
-+ else
-+ return ((EventRequestManagerImpl)vm.EventRequestManager).FindRequest (requestId);
-+ }
-+
-+ // Wait for the reply for a command packet
-+ public byte[] WaitForReply (int packetId) {
-+ while (true) {
-+ lock (reply_packets_monitor) {
-+ if (reply_packets.ContainsKey (packetId)) {
-+ byte[] reply = reply_packets [packetId];
-+ reply_packets.Remove (packetId);
-+ return reply;
-+ } else {
-+ Monitor.Wait (reply_packets_monitor);
-+ }
-+ }
-+ }
-+ }
-+
-+ void add_event_set (EventSet set) {
-+ lock (queue_monitor) {
-+ queue.Enqueue (set);
-+ Monitor.Pulse (queue_monitor);
-+ }
-+ }
-+
-+ void receiver_thread_main () {
-+
-+ Connection conn = vm.Connection;
-+
-+ while (true) {
-+ byte[] packet = conn.ReadPacket ();
-+
-+ if (packet.Length == 0) {
-+ disconnected = true;
-+
-+ VMDisconnectEventImpl ev = new VMDisconnectEventImpl (vm, null);
-+ add_event_set (new EventSetImpl (vm, new Event [] { ev }, SuspendPolicy.SuspendNone));
-+ break;
-+ }
-+
-+ if (WireProtocol.IsReplyPacket (packet)) {
-+ /* Reply packet */
-+ int id = WireProtocol.GetPacketId (packet);
-+ lock (reply_packets_monitor) {
-+ reply_packets [id] = packet;
-+ Monitor.PulseAll (reply_packets_monitor);
-+ }
-+ } else {
-+ WireProtocol.Packet decoded = WireProtocol.DecodePacket (packet);
-+ if (decoded is WireProtocol.Event.CompositePacket) {
-+ WireProtocol.Event.CompositePacket p = (WireProtocol.Event.CompositePacket)decoded;
-+ Event[] events = new Event [p.events.Length];
-+ for (int i = 0; i < p.events.Length; ++i) {
-+ events [i] = DecodeEventInfo (p.events [i]);
-+ }
-+
-+ add_event_set (new EventSetImpl (vm, events, p.suspendPolicy));
-+ }
-+ }
-+ }
-+ }
-+ }
-+}
-+#endif
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/EventRequest.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/EventRequest.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,142 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Linq;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public abstract class EventRequest {
-+ protected int id;
-+ protected EventType etype;
-+ protected bool enabled;
-+ protected VirtualMachine vm;
-+ protected SuspendPolicy suspend;
-+ protected int count;
-+ protected ThreadMirror thread;
-+ protected IList<AssemblyMirror> assembly_filter;
-+
-+ internal EventRequest (VirtualMachine vm, EventType etype) {
-+ this.vm = vm;
-+ this.etype = etype;
-+ this.suspend = SuspendPolicy.All;
-+ }
-+
-+ internal EventRequest (EventType etype, int id) {
-+ this.id = id;
-+ this.etype = etype;
-+ }
-+
-+ internal int Id {
-+ get {
-+ return id;
-+ }
-+ set {
-+ id = value;
-+ }
-+ }
-+
-+ public EventType EventType {
-+ get {
-+ return etype;
-+ }
-+ }
-+
-+ public bool Enabled {
-+ get {
-+ return enabled;
-+ }
-+ set {
-+ if (value != enabled) {
-+ if (value)
-+ Enable ();
-+ else
-+ Disable ();
-+ }
-+ }
-+ }
-+
-+ public int Count {
-+ get {
-+ return count;
-+ }
-+ set {
-+ CheckDisabled ();
-+ count = value;
-+ }
-+ }
-+
-+ public ThreadMirror Thread {
-+ get {
-+ return thread;
-+ }
-+ set {
-+ CheckDisabled ();
-+ if (value != null && value.VirtualMachine != vm)
-+ throw new VMMismatchException ();
-+ thread = value;
-+ }
-+ }
-+
-+ public IList<AssemblyMirror> AssemblyFilter {
-+ get {
-+ return assembly_filter;
-+ }
-+ set {
-+ CheckDisabled ();
-+ if (value != null) {
-+ foreach (var ass in value)
-+ if (ass == null)
-+ throw new ArgumentException ("one of the elements of the array is null.");
-+ }
-+ assembly_filter = value;
-+ }
-+ }
-+
-+ /*
-+ * Every time an EventRequest object is enabled, a new JDWP event request
-+ * is created, and the event request's id changes.
-+ */
-+ internal void SendReq (List<Modifier> mods) {
-+ if (!enabled) {
-+ if (Count > 0)
-+ mods.Add (new CountModifier () { Count = Count });
-+ if (Thread != null)
-+ mods.Add (new ThreadModifier () { Thread = Thread.Id });
-+ if (AssemblyFilter != null)
-+ mods.Add (new AssemblyModifier () { Assemblies = AssemblyFilter.Select (x => x.Id ).ToArray () });
-+ id = vm.conn.EnableEvent (EventType, suspend, mods);
-+ SetEnabled (id);
-+ }
-+ }
-+
-+ public virtual void Enable () {
-+ SendReq (new List<Modifier> ());
-+ }
-+
-+ public void Disable () {
-+ if (enabled) {
-+ vm.conn.ClearEventRequest (etype, id);
-+ enabled = false;
-+ // FIXME: This causes problems because Events can still reference
-+ // the old id
-+ //vm.RemoveRequest (this, id);
-+ id = -1;
-+ }
-+ }
-+
-+ protected void SetEnabled (int id) {
-+ this.id = id;
-+ enabled = true;
-+ vm.AddRequest (this, id);
-+ }
-+
-+ protected void CheckDisabled () {
-+ if (Enabled)
-+ throw new InvalidOperationException ("Request objects can only be modified while they are disabled.");
-+ }
-+
-+ protected void CheckMirror (VirtualMachine vm, Mirror m) {
-+ if (vm != m.VirtualMachine)
-+ throw new VMMismatchException ();
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/EventType.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/EventType.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,23 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ // Keep it in sync with debugger-agent.h
-+ public enum EventType {
-+ VMStart = 0,
-+ VMDeath = 1,
-+ ThreadStart = 2,
-+ ThreadDeath = 3,
-+ AppDomainCreate = 4,
-+ AppDomainUnload = 5,
-+ MethodEntry = 6,
-+ MethodExit = 7,
-+ AssemblyLoad = 8,
-+ AssemblyUnload = 9,
-+ Breakpoint = 10,
-+ Step = 11,
-+ TypeLoad = 12,
-+ Exception = 13,
-+ // Not part of the wire protocol
-+ VMDisconnect = 99
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ExceptionEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ExceptionEvent.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ExceptionEvent : Event {
-+ ObjectMirror exc;
-+ long exc_id;
-+
-+ internal ExceptionEvent (VirtualMachine vm, int req_id, long thread_id, long exc_id, long loc) : base (EventType.Exception, vm, req_id, thread_id) {
-+ this.exc_id = exc_id;
-+ }
-+
-+ public ObjectMirror Exception {
-+ get {
-+ if (exc == null)
-+ exc = vm.GetObject (exc_id);
-+ return exc;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ExceptionEventRequest.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ExceptionEventRequest.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,35 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public sealed class ExceptionEventRequest : EventRequest {
-+
-+ TypeMirror exc_type;
-+ bool caught, uncaught;
-+
-+ internal ExceptionEventRequest (VirtualMachine vm, TypeMirror exc_type, bool caught, bool uncaught) : base (vm, EventType.Exception) {
-+ if (exc_type != null) {
-+ CheckMirror (vm, exc_type);
-+ TypeMirror exception_type = vm.RootDomain.Corlib.GetType ("System.Exception", false, false);
-+ if (!exception_type.IsAssignableFrom (exc_type))
-+ throw new ArgumentException ("The exception type does not inherit from System.Exception", "exc_type");
-+ }
-+ this.exc_type = exc_type;
-+ this.caught = caught;
-+ this.uncaught = uncaught;
-+ }
-+
-+ public TypeMirror ExceptionType {
-+ get {
-+ return exc_type;
-+ }
-+ }
-+
-+ public override void Enable () {
-+ var mods = new List <Modifier> ();
-+ mods.Add (new ExceptionModifier () { Type = exc_type != null ? exc_type.Id : 0, Caught = caught, Uncaught = uncaught });
-+ SendReq (mods);
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/FieldInfoMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/FieldInfoMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,159 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Text;
-+using System.Reflection;
-+using C = Mono.Cecil;
-+using Mono.Cecil.Metadata;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class FieldInfoMirror : Mirror {
-+
-+ TypeMirror parent;
-+ string name;
-+ TypeMirror type;
-+ FieldAttributes attrs;
-+ CustomAttributeDataMirror[] cattrs;
-+
-+ public FieldInfoMirror (TypeMirror parent, long id, string name, TypeMirror type, FieldAttributes attrs) : base (parent.VirtualMachine, id) {
-+ this.parent = parent;
-+ this.name = name;
-+ this.type = type;
-+ this.attrs = attrs;
-+ }
-+
-+ public TypeMirror DeclaringType {
-+ get {
-+ return parent;
-+ }
-+ }
-+
-+ public string Name {
-+ get {
-+ return name;
-+ }
-+ }
-+
-+ public TypeMirror FieldType {
-+ get {
-+ return type;
-+ }
-+ }
-+
-+ public FieldAttributes Attributes {
-+ get {
-+ return attrs;
-+ }
-+ }
-+
-+ public bool IsLiteral
-+ {
-+ get {return (Attributes & FieldAttributes.Literal) != 0;}
-+ }
-+
-+ public bool IsStatic
-+ {
-+ get {return (Attributes & FieldAttributes.Static) != 0;}
-+ }
-+
-+ public bool IsInitOnly
-+ {
-+ get {return (Attributes & FieldAttributes.InitOnly) != 0;}
-+ }
-+
-+ public Boolean IsPublic
-+ {
-+ get
-+ {
-+ return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Public;
-+ }
-+ }
-+
-+ public Boolean IsPrivate
-+ {
-+ get
-+ {
-+ return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Private;
-+ }
-+ }
-+
-+ public Boolean IsFamily
-+ {
-+ get
-+ {
-+ return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Family;
-+ }
-+ }
-+
-+ public Boolean IsAssembly
-+ {
-+ get
-+ {
-+ return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Assembly;
-+ }
-+ }
-+
-+ public Boolean IsFamilyAndAssembly
-+ {
-+ get {
-+ return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.FamANDAssem;
-+ }
-+ }
-+
-+ public Boolean IsFamilyOrAssembly
-+ {
-+ get
-+ {
-+ return (Attributes & FieldAttributes.FieldAccessMask) == FieldAttributes.FamORAssem;
-+ }
-+ }
-+
-+ public Boolean IsPinvokeImpl
-+ {
-+ get
-+ {
-+ return (Attributes & FieldAttributes.PinvokeImpl) == FieldAttributes.PinvokeImpl;
-+ }
-+ }
-+
-+ public Boolean IsSpecialName
-+ {
-+ get
-+ {
-+ return (Attributes & FieldAttributes.SpecialName) == FieldAttributes.SpecialName;
-+ }
-+ }
-+
-+ public Boolean IsNotSerialized
-+ {
-+ get
-+ {
-+ return (Attributes & FieldAttributes.NotSerialized) == FieldAttributes.NotSerialized;
-+ }
-+ }
-+
-+ public CustomAttributeDataMirror[] GetCustomAttributes (bool inherit) {
-+ return GetCAttrs (null, inherit);
-+ }
-+
-+ public CustomAttributeDataMirror[] GetCustomAttributes (TypeMirror attributeType, bool inherit) {
-+ if (attributeType == null)
-+ throw new ArgumentNullException ("attributeType");
-+ return GetCAttrs (attributeType, inherit);
-+ }
-+
-+ CustomAttributeDataMirror[] GetCAttrs (TypeMirror type, bool inherit) {
-+ // FIXME: Handle inherit
-+ if (cattrs == null) {
-+ CattrInfo[] info = vm.conn.Type_GetFieldCustomAttributes (DeclaringType.Id, id, 0, false);
-+ cattrs = CustomAttributeDataMirror.Create (vm, info);
-+ }
-+ var res = new List<CustomAttributeDataMirror> ();
-+ foreach (var attr in cattrs)
-+ if (type == null || attr.Constructor.DeclaringType == type)
-+ res.Add (attr);
-+ return res.ToArray ();
-+ }
-+ }
-+}
-+
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/IInvokeAsyncResult.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/IInvokeAsyncResult.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public interface IInvokeAsyncResult : IAsyncResult
-+ {
-+ void Abort ();
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ILInstruction.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ILInstruction.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,67 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Text;
-+using Mono.Cecil.Cil;
-+using Mono.Cecil.Metadata;
-+using System.IO;
-+using System.Reflection;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ /*
-+ * This is similar to the Instruction class in Cecil, we can't use that
-+ * as its constructor is internal.
-+ */
-+ public class ILInstruction
-+ {
-+ int offset;
-+ OpCode opcode;
-+ object operand;
-+ ILInstruction prev, next;
-+
-+ internal ILInstruction (int offset, OpCode opcode, object operand) {
-+ this.offset = offset;
-+ this.opcode = opcode;
-+ this.operand = operand;
-+ }
-+
-+ public int Offset {
-+ get {
-+ return offset;
-+ }
-+ }
-+
-+ public OpCode OpCode {
-+ get {
-+ return opcode;
-+ }
-+ }
-+
-+ public Object Operand {
-+ get {
-+ return operand;
-+ }
-+ set {
-+ operand = value;
-+ }
-+ }
-+
-+ public ILInstruction Next {
-+ get {
-+ return next;
-+ }
-+ set {
-+ next = value;
-+ }
-+ }
-+
-+ public ILInstruction Previous {
-+ get {
-+ return prev;
-+ }
-+ set {
-+ prev = value;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/IMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/IMirror.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,20 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ /*
-+ * A Mirror represents a runtime object in the remote virtual machine. Calling
-+ * methods/properties of mirror objects potentially involves a remoting call,
-+ * which
-+ * has some overhead, and may also fail. Values of properties which are
-+ * constant (like Type.Name) are cached locally, so only the first call is
-+ * affected.
-+ * FIXME: Thread safety in the api ?
-+ */
-+ public interface IMirror
-+ {
-+ VirtualMachine VirtualMachine {
-+ get;
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ITargetProcess.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ITargetProcess.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,74 @@
-+using System;
-+using System.Diagnostics;
-+using System.IO;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public interface ITargetProcess
-+ {
-+ event System.EventHandler Exited;
-+ StreamReader StandardOutput { get; }
-+ StreamReader StandardError { get; }
-+ bool HasExited { get; }
-+ void Kill ();
-+ int Id { get; }
-+ string ProcessName { get; }
-+ }
-+
-+ internal class ProcessWrapper: ITargetProcess
-+ {
-+ Process process;
-+
-+ public ProcessWrapper (Process process)
-+ {
-+ this.process = process;
-+ }
-+
-+ public Process Process {
-+ get { return process; }
-+ }
-+
-+ public event System.EventHandler Exited {
-+ add { process.Exited += value; }
-+ remove { process.Exited -= value; }
-+ }
-+
-+ public StreamReader StandardOutput {
-+ get {
-+ return process.StandardOutput;
-+ }
-+ }
-+
-+ public StreamReader StandardError {
-+ get {
-+ return process.StandardError;
-+ }
-+ }
-+
-+ public bool HasExited {
-+ get {
-+ return process.HasExited;
-+ }
-+ }
-+
-+ public void Kill ()
-+ {
-+ process.Kill ();
-+ }
-+
-+ public int Id {
-+ get {
-+ return process.Id;
-+ }
-+ }
-+
-+ public string ProcessName {
-+ get {
-+ return process.ProcessName;
-+ }
-+ }
-+
-+
-+
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/InvalidStackFrameException.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/InvalidStackFrameException.cs 2010-06-16 12:45:23.061079066 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class InvalidStackFrameException : Exception {
-+
-+ public InvalidStackFrameException () : base ("The requested operation cannot be completed because the specified stack frame is no longer valid.") {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/InvocationException.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/InvocationException.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,20 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class InvocationException : Exception {
-+
-+ ObjectMirror exception;
-+
-+ public InvocationException (ObjectMirror exception) {
-+ this.exception = exception;
-+ }
-+
-+ public ObjectMirror Exception {
-+ get {
-+ return exception;
-+ }
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/InvokeOptions.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/InvokeOptions.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,18 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ [Flags]
-+ public enum InvokeOptions {
-+ None = 0,
-+ /*
-+ * Disable breakpoints on the thread doing the invoke
-+ */
-+ DisableBreakpoints = 1,
-+ /*
-+ * Only resume the target thread during the invoke
-+ */
-+ SingleThreaded = 2
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/LocalVariable.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/LocalVariable.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,79 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class LocalVariable : Mirror {
-+
-+ MethodMirror method;
-+ string name;
-+ int index;
-+ long type_id;
-+ TypeMirror t;
-+ bool is_arg;
-+ int live_range_start, live_range_end;
-+
-+ internal LocalVariable (VirtualMachine vm, MethodMirror method, int index, long type_id, string name, int live_range_start, int live_range_end, bool is_arg) : base (vm, 0) {
-+ this.method = method;
-+ this.index = index;
-+ this.name = name;
-+ this.type_id = type_id;
-+ this.is_arg = is_arg;
-+ this.live_range_start = live_range_start;
-+ this.live_range_end = live_range_end;
-+ }
-+
-+ public string Name {
-+ get {
-+ return name;
-+ }
-+ }
-+
-+ public int Index {
-+ get {
-+ return index;
-+ }
-+ }
-+
-+ public TypeMirror Type {
-+ get {
-+ if (t == null)
-+ t = vm.GetType (type_id);
-+ return t;
-+ }
-+ }
-+
-+ public bool IsArg {
-+ get {
-+ return is_arg;
-+ }
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ return method;
-+ }
-+ }
-+
-+ internal int LiveRangeStart {
-+ get {
-+ return live_range_start;
-+ }
-+ }
-+
-+ internal int LiveRangeEnd {
-+ get {
-+ return live_range_end;
-+ }
-+ }
-+
-+ internal int GetValueIndex {
-+ get {
-+ if (IsArg)
-+ return (-Index) - 1;
-+ else
-+ return Index;
-+ }
-+ }
-+ }
-+}
-+
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Location.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Location.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,51 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class Location : Mirror
-+ {
-+ MethodMirror method;
-+ //long native_addr;
-+ int il_offset;
-+ string source_file;
-+ int line_number;
-+ //int column_number;
-+
-+ internal Location (VirtualMachine vm, MethodMirror method, long native_addr, int il_offset, string source_file, int line_number, int column_number) : base (vm, 0) {
-+ this.method = method;
-+ //this.native_addr = native_addr;
-+ this.il_offset = il_offset;
-+ this.source_file = source_file;
-+ this.line_number = line_number;
-+ //this.column_number = column_number;
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ return method;
-+ }
-+ }
-+
-+ public int ILOffset {
-+ get {
-+ return il_offset;
-+ }
-+ }
-+
-+ public string SourceFile {
-+ get {
-+ return source_file;
-+ }
-+ }
-+
-+ public int LineNumber {
-+ get {
-+ return line_number;
-+ }
-+ }
-+
-+ public override string ToString () {
-+ return String.Format ("{0}+0x{1:x} at {2}:{3}", Method.FullName, ILOffset, SourceFile, LineNumber);
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodBodyMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodBodyMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,203 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Text;
-+using Mono.Cecil.Cil;
-+using Mono.Cecil.Metadata;
-+using System.IO;
-+using System.Reflection;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class MethodBodyMirror : Mirror
-+ {
-+ MethodMirror method;
-+ byte[] il;
-+
-+ internal MethodBodyMirror (VirtualMachine vm, MethodMirror method, byte[] il) : base (vm, 0) {
-+ this.method = method;
-+ this.il = il;
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ return method;
-+ }
-+ }
-+
-+ public byte[] GetILAsByteArray () {
-+ return il;
-+ }
-+
-+ public List<ILInstruction> Instructions {
-+ get {
-+ return ReadCilBody (new BinaryReader (new MemoryStream (il)), il.Length);
-+ }
-+ }
-+
-+ static bool opcodes_inited;
-+
-+ static OpCode [] OneByteOpCode = new OpCode [0xe0 + 1];
-+ static OpCode [] TwoBytesOpCode = new OpCode [0x1e + 1];
-+
-+ // Adapted from Cecil
-+ List<ILInstruction> ReadCilBody (BinaryReader br, int code_size)
-+ {
-+ long start = br.BaseStream.Position;
-+ ILInstruction last = null;
-+ //GenericContext context = new GenericContext (body.Method);
-+ List<ILInstruction> code = new List<ILInstruction> ();
-+
-+ var by_offset = new Dictionary<int, ILInstruction> ();
-+
-+ if (!opcodes_inited) {
-+ foreach (FieldInfo fi in typeof (OpCodes).GetFields (BindingFlags.Static|BindingFlags.Public)) {
-+ var val = (OpCode)fi.GetValue (null);
-+
-+ if (val.Op1 == 0xff)
-+ OneByteOpCode [val.Op2] = val;
-+ else
-+ TwoBytesOpCode [val.Op2] = val;
-+ }
-+ opcodes_inited = true;
-+ }
-+
-+ while (br.BaseStream.Position < start + code_size) {
-+ OpCode op;
-+ long offset = br.BaseStream.Position - start;
-+ int cursor = br.ReadByte ();
-+ int token;
-+ ResolvedToken t;
-+
-+ if (cursor == 0xfe)
-+ op = TwoBytesOpCode [br.ReadByte ()];
-+ else
-+ op = OneByteOpCode [cursor];
-+
-+ ILInstruction instr = new ILInstruction ((int)offset, op, null);
-+
-+ by_offset [instr.Offset] = instr;
-+
-+ switch (op.OperandType) {
-+ case OperandType.InlineNone :
-+ break;
-+ case OperandType.InlineSwitch :
-+ uint length = br.ReadUInt32 ();
-+ int [] branches = new int [length];
-+ int [] buf = new int [length];
-+ for (int i = 0; i < length; i++)
-+ buf [i] = br.ReadInt32 ();
-+ for (int i = 0; i < length; i++)
-+ branches [i] = Convert.ToInt32 (br.BaseStream.Position - start + buf [i]);
-+ instr.Operand = branches;
-+ break;
-+ case OperandType.ShortInlineBrTarget :
-+ sbyte sbrtgt = br.ReadSByte ();
-+ instr.Operand = Convert.ToInt32 (br.BaseStream.Position - start + sbrtgt);
-+ break;
-+ case OperandType.InlineBrTarget :
-+ int brtgt = br.ReadInt32 ();
-+ instr.Operand = Convert.ToInt32 (br.BaseStream.Position - start + brtgt);
-+ break;
-+ case OperandType.ShortInlineI :
-+ if (op == OpCodes.Ldc_I4_S)
-+ instr.Operand = br.ReadSByte ();
-+ else
-+ instr.Operand = br.ReadByte ();
-+ break;
-+ case OperandType.ShortInlineVar :
-+ br.ReadByte ();
-+ //instr.Operand = GetVariable (body, br.ReadByte ());
-+ break;
-+ case OperandType.ShortInlineParam :
-+ br.ReadByte ();
-+ //instr.Operand = GetParameter (body, br.ReadByte ());
-+ break;
-+ case OperandType.InlineSig :
-+ br.ReadInt32 ();
-+ //instr.Operand = GetCallSiteAt (br.ReadInt32 (), context);
-+ break;
-+ case OperandType.InlineI :
-+ br.ReadInt32 ();
-+ //instr.Operand = br.ReadInt32 ();
-+ break;
-+ case OperandType.InlineVar :
-+ br.ReadInt16 ();
-+ //instr.Operand = GetVariable (body, br.ReadInt16 ());
-+ break;
-+ case OperandType.InlineParam :
-+ br.ReadInt16 ();
-+ //instr.Operand = GetParameter (body, br.ReadInt16 ());
-+ break;
-+ case OperandType.InlineI8 :
-+ instr.Operand = br.ReadInt64 ();
-+ break;
-+ case OperandType.ShortInlineR :
-+ instr.Operand = br.ReadSingle ();
-+ break;
-+ case OperandType.InlineR :
-+ instr.Operand = br.ReadDouble ();
-+ break;
-+ case OperandType.InlineString :
-+ token = br.ReadInt32 ();
-+ t = vm.conn.Method_ResolveToken (Method.Id, token);
-+ if (t.Type == TokenType.STRING)
-+ instr.Operand = t.Str;
-+ break;
-+ case OperandType.InlineField :
-+ case OperandType.InlineMethod :
-+ case OperandType.InlineType :
-+ case OperandType.InlineTok :
-+ token = br.ReadInt32 ();
-+
-+ t = vm.conn.Method_ResolveToken (Method.Id, token);
-+
-+ switch (t.Type) {
-+ case TokenType.TYPE:
-+ instr.Operand = vm.GetType (t.Id);
-+ break;
-+ case TokenType.FIELD:
-+ // FIXME: No vm.GetField ()
-+ //instr.Operand = vm.GetField (t.Id);
-+ break;
-+ case TokenType.METHOD:
-+ instr.Operand = vm.GetMethod (t.Id);
-+ break;
-+ case TokenType.UNKNOWN:
-+ break;
-+ default:
-+ throw new NotImplementedException ("Unknown token type: " + t.Type);
-+ }
-+ break;
-+ }
-+
-+ if (last != null) {
-+ last.Next = instr;
-+ instr.Previous = last;
-+ }
-+
-+ last = instr;
-+
-+ code.Add (instr);
-+ }
-+
-+ // resolve branches
-+ foreach (ILInstruction i in code) {
-+ switch (i.OpCode.OperandType) {
-+ case OperandType.ShortInlineBrTarget:
-+ case OperandType.InlineBrTarget:
-+ i.Operand = by_offset [(int)i.Operand];
-+ break;
-+ case OperandType.InlineSwitch:
-+ int [] lbls = (int []) i.Operand;
-+ ILInstruction [] instrs = new ILInstruction [lbls.Length];
-+ for (int j = 0; j < lbls.Length; j++)
-+ instrs [j] = by_offset [lbls [j]];
-+ i.Operand = instrs;
-+ break;
-+ }
-+ }
-+
-+ return code;
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodEntryEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodEntryEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class MethodEntryEvent : Event {
-+ MethodMirror method;
-+ long id;
-+
-+ internal MethodEntryEvent (VirtualMachine vm, int req_id, long thread_id, long id) : base (EventType.MethodEntry, vm, req_id, thread_id) {
-+ this.id = id;
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ if (method == null)
-+ method = vm.GetMethod (id);
-+ return method;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodEntryEventRequest.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodEntryEventRequest.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public sealed class MethodEntryEventRequest : EventRequest {
-+
-+ internal MethodEntryEventRequest (VirtualMachine vm) : base (vm, EventType.MethodEntry) {
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodExitEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodExitEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class MethodExitEvent : Event {
-+ MethodMirror method;
-+ long id;
-+
-+ internal MethodExitEvent (VirtualMachine vm, int req_id, long thread_id, long id) : base (EventType.MethodExit, vm, req_id, thread_id) {
-+ this.id = id;
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ if (method == null)
-+ method = vm.GetMethod (id);
-+ return method;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodExitEventRequest.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodExitEventRequest.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public sealed class MethodExitEventRequest : EventRequest {
-+
-+ internal MethodExitEventRequest (VirtualMachine vm) : base (vm, EventType.MethodExit) {
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,290 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Text;
-+using System.Reflection;
-+using C = Mono.Cecil;
-+using Mono.Cecil.Metadata;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class MethodMirror : Mirror
-+ {
-+ string name;
-+ MethodInfo info;
-+ TypeMirror declaring_type;
-+ DebugInfo debug_info;
-+ C.MethodDefinition meta;
-+ ParameterInfoMirror[] param_info;
-+ ParameterInfoMirror ret_param;
-+ LocalVariable[] locals;
-+ IList<Location> locations;
-+ MethodBodyMirror body;
-+
-+ internal MethodMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ public string Name {
-+ get {
-+ if (name == null)
-+ name = vm.conn.Method_GetName (id);
-+ return name;
-+ }
-+ }
-+
-+ public TypeMirror DeclaringType {
-+ get {
-+ if (declaring_type == null)
-+ declaring_type = vm.GetType (vm.conn.Method_GetDeclaringType (id));
-+ return declaring_type;
-+ }
-+ }
-+
-+ public TypeMirror ReturnType {
-+ get {
-+ return ReturnParameter.ParameterType;
-+ }
-+ }
-+
-+ // FIXME:
-+ public string FullName {
-+ get {
-+ string type_namespace = DeclaringType.Namespace;
-+ string type_name = DeclaringType.Name;
-+ StringBuilder sb = new StringBuilder ();
-+ sb.Append (ReturnType.Name);
-+ sb.Append (' ');
-+ if (type_namespace == String.Empty)
-+ sb.Append (type_name + ":" + Name + " ()");
-+ else
-+ sb.Append (type_namespace + "." + type_name + ":" + Name + " ()");
-+ return sb.ToString ();
-+ }
-+ }
-+
-+ void GetInfo () {
-+ if (info == null)
-+ info = vm.conn.Method_GetInfo (id);
-+ }
-+
-+ public int MetadataToken {
-+ get {
-+ GetInfo ();
-+ return info.token;
-+ }
-+ }
-+
-+ public MethodAttributes Attributes {
-+ get {
-+ GetInfo ();
-+ return (MethodAttributes)info.attributes;
-+ }
-+ }
-+
-+ public bool IsPublic {
-+ get {
-+ return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public;
-+ }
-+ }
-+ public bool IsPrivate {
-+ get {
-+ return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Private;
-+ }
-+ }
-+ public bool IsFamily {
-+ get {
-+ return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Family;
-+ }
-+ }
-+ public bool IsAssembly {
-+ get {
-+ return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Assembly;
-+ }
-+ }
-+ public bool IsFamilyAndAssembly {
-+ get {
-+ return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.FamANDAssem;
-+ }
-+ }
-+ public bool IsFamilyOrAssembly {
-+ get {
-+ return (Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.FamORAssem;
-+ }
-+ }
-+ public bool IsStatic {
-+ get {
-+ return (Attributes & MethodAttributes.Static) != 0;
-+ }
-+ }
-+ public bool IsFinal {
-+ get {
-+ return (Attributes & MethodAttributes.Final) != 0;
-+ }
-+ }
-+ public bool IsVirtual {
-+ get {
-+ return (Attributes & MethodAttributes.Virtual) != 0;
-+ }
-+ }
-+ public bool IsHideBySig {
-+ get {
-+ return (Attributes & MethodAttributes.HideBySig) != 0;
-+ }
-+ }
-+ public bool IsAbstract {
-+ get {
-+ return (Attributes & MethodAttributes.Abstract) != 0;
-+ }
-+ }
-+ public bool IsSpecialName {
-+ get {
-+ return (Attributes & MethodAttributes.SpecialName) != 0;
-+ }
-+ }
-+
-+ public bool IsConstructor {
-+ get {
-+ int attr = (int)Attributes;
-+ return ((attr & (int)MethodAttributes.RTSpecialName) != 0
-+ && (Name == ".ctor"));
-+ }
-+ }
-+
-+ public ParameterInfoMirror[] GetParameters () {
-+ if (param_info == null) {
-+ var pi = vm.conn.Method_GetParamInfo (id);
-+ param_info = new ParameterInfoMirror [pi.param_count];
-+ // Return
-+ ret_param = new ParameterInfoMirror (this, -1, vm.GetType (pi.ret_type), null, ParameterAttributes.Retval);
-+ // FIXME: this
-+ // FIXME: Attributes
-+ for (int i = 0; i < pi.param_count; ++i) {
-+ param_info [i] = new ParameterInfoMirror (this, i, vm.GetType (pi.param_types [i]), pi.param_names [i], 0);
-+ }
-+ }
-+
-+ return param_info;
-+ }
-+
-+ public ParameterInfoMirror ReturnParameter {
-+ get {
-+ if (ret_param == null)
-+ GetParameters ();
-+ return ret_param;
-+ }
-+ }
-+
-+ public LocalVariable[] GetLocals () {
-+ if (locals == null) {
-+ var li = vm.conn.Method_GetLocalsInfo (id);
-+ // Add the arguments as well
-+ var pi = vm.conn.Method_GetParamInfo (id);
-+
-+ locals = new LocalVariable [pi.param_count + li.names.Length];
-+
-+ for (int i = 0; i < pi.param_count; ++i)
-+ locals [i] = new LocalVariable (vm, this, i, pi.param_types [i], pi.param_names [i], -1, -1, true);
-+
-+ for (int i = 0; i < li.names.Length; ++i)
-+ locals [i + pi.param_count] = new LocalVariable (vm, this, i, li.types [i], li.names [i], li.live_range_start [i], li.live_range_end [i], false);
-+ }
-+ return locals;
-+ }
-+
-+ public LocalVariable GetLocal (string name) {
-+ if (name == null)
-+ throw new ArgumentNullException ("name");
-+
-+ GetLocals ();
-+
-+ LocalVariable res = null;
-+ for (int i = 0; i < locals.Length; ++i) {
-+ if (locals [i].Name == name) {
-+ if (res != null)
-+ throw new AmbiguousMatchException ("More that one local has the name '" + name + "'.");
-+ res = locals [i];
-+ }
-+ }
-+
-+ return res;
-+ }
-+
-+ public MethodBodyMirror GetMethodBody () {
-+ if (body == null) {
-+ MethodBodyInfo info = vm.conn.Method_GetBody (id);
-+
-+ body = new MethodBodyMirror (vm, this, info.il);
-+ }
-+ return body;
-+ }
-+
-+ public IList<int> ILOffsets {
-+ get {
-+ if (debug_info == null)
-+ debug_info = vm.conn.Method_GetDebugInfo (id);
-+ return Array.AsReadOnly (debug_info.il_offsets);
-+ }
-+ }
-+
-+ public IList<int> LineNumbers {
-+ get {
-+ if (debug_info == null)
-+ debug_info = vm.conn.Method_GetDebugInfo (id);
-+ return Array.AsReadOnly (debug_info.line_numbers);
-+ }
-+ }
-+
-+ public string SourceFile {
-+ get {
-+ if (debug_info == null)
-+ debug_info = vm.conn.Method_GetDebugInfo (id);
-+ return debug_info.filename;
-+ }
-+ }
-+
-+ public IList<Location> Locations {
-+ get {
-+ if (locations == null) {
-+ var il_offsets = ILOffsets;
-+ var line_numbers = LineNumbers;
-+ IList<Location> res = new Location [ILOffsets.Count];
-+ for (int i = 0; i < il_offsets.Count; ++i)
-+ res [i] = new Location (vm, this, -1, il_offsets [i], SourceFile, line_numbers [i], 0);
-+ locations = res;
-+ }
-+ return locations;
-+ }
-+ }
-+
-+ internal int il_offset_to_line_number (int il_offset) {
-+ if (debug_info == null)
-+ debug_info = vm.conn.Method_GetDebugInfo (id);
-+
-+ // FIXME: Optimize this
-+ for (int i = debug_info.il_offsets.Length - 1; i >= 0; --i) {
-+ if (debug_info.il_offsets [i] <= il_offset)
-+ return debug_info.line_numbers [i];
-+ }
-+ return -1;
-+ }
-+
-+ public Location LocationAtILOffset (int il_offset) {
-+ IList<Location> locs = Locations;
-+
-+ // FIXME: Optimize this
-+ for (int i = locs.Count - 1; i >= 0; --i) {
-+ if (locs [i].ILOffset <= il_offset)
-+ return locs [i];
-+ }
-+
-+ return null;
-+ }
-+
-+ public C.MethodDefinition Metadata {
-+ get {
-+ if (meta == null)
-+ meta = (C.MethodDefinition)DeclaringType.Assembly.Metadata.MainModule.LookupByToken (new MetadataToken (MetadataToken));
-+ return meta;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Mirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Mirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,39 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public abstract class Mirror : IMirror
-+ {
-+ protected VirtualMachine vm;
-+ protected long id; // The id used in the protocol
-+
-+ internal Mirror (VirtualMachine vm, long id) {
-+ this.vm = vm;
-+ this.id = id;
-+ }
-+
-+ internal Mirror () {
-+ }
-+
-+ public VirtualMachine VirtualMachine {
-+ get {
-+ return vm;
-+ }
-+ }
-+
-+ internal long Id {
-+ get {
-+ return id;
-+ }
-+ }
-+
-+ protected void SetVirtualMachine (VirtualMachine vm) {
-+ this.vm = vm;
-+ }
-+
-+ protected void CheckMirror (Mirror m) {
-+ if (vm != m.VirtualMachine)
-+ throw new VMMismatchException ();
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ModuleMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ModuleMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,66 @@
-+using System;
-+using Mono.Debugger;
-+using Mono.Cecil;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ModuleMirror : Mirror
-+ {
-+ ModuleInfo info;
-+ Guid guid;
-+ AssemblyMirror assembly;
-+
-+ internal ModuleMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ void ReadInfo () {
-+ if (info == null)
-+ info = vm.conn.Module_GetInfo (id);
-+ }
-+
-+ public string Name {
-+ get {
-+ ReadInfo ();
-+ return info.Name;
-+ }
-+ }
-+
-+ public string ScopeName {
-+ get {
-+ ReadInfo ();
-+ return info.ScopeName;
-+ }
-+ }
-+
-+ public string FullyQualifiedName {
-+ get {
-+ ReadInfo ();
-+ return info.FQName;
-+ }
-+ }
-+
-+ public Guid ModuleVersionId {
-+ get {
-+ if (guid == Guid.Empty) {
-+ ReadInfo ();
-+ guid = new Guid (info.Guid);
-+ }
-+ return guid;
-+ }
-+ }
-+
-+ public AssemblyMirror Assembly {
-+ get {
-+ if (assembly == null) {
-+ ReadInfo ();
-+ if (info.Assembly == 0)
-+ return null;
-+ assembly = vm.GetAssembly (info.Assembly);
-+ }
-+ return assembly;
-+ }
-+ }
-+
-+ // FIXME: Add function to query the guid, check in Metadata
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ObjectCollectedException.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ObjectCollectedException.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ObjectCollectedException : Exception {
-+
-+ public ObjectCollectedException () : base ("The requested operation cannot be completed because the object has been garbage collected.") {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ObjectMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ObjectMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,259 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Runtime.Remoting.Messaging;
-+using System.Threading;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ObjectMirror : Value {
-+
-+ internal ObjectMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ public TypeMirror Type {
-+ get {
-+ return vm.GetType (vm.conn.Object_GetType (id));
-+ }
-+ }
-+
-+ public AppDomainMirror Domain {
-+ get {
-+ return vm.GetDomain (vm.conn.Object_GetDomain (id));
-+ }
-+ }
-+
-+ public bool IsCollected {
-+ get {
-+ return vm.conn.Object_IsCollected (id);
-+ }
-+ }
-+
-+ public Value GetValue (FieldInfoMirror field) {
-+ return GetValues (new FieldInfoMirror [] { field }) [0];
-+ }
-+
-+ public Value[] GetValues (IList<FieldInfoMirror> fields) {
-+ if (fields == null)
-+ throw new ArgumentNullException ("fields");
-+ foreach (FieldInfoMirror f in fields) {
-+ if (f == null)
-+ throw new ArgumentNullException ("field");
-+ CheckMirror (f);
-+ }
-+ long[] ids = new long [fields.Count];
-+ for (int i = 0; i < fields.Count; ++i)
-+ ids [i] = fields [i].Id;
-+ try {
-+ return vm.DecodeValues (vm.conn.Object_GetValues (id, ids));
-+ } catch (CommandException ex) {
-+ if (ex.ErrorCode == ErrorCode.INVALID_FIELDID)
-+ throw new ArgumentException ("One of the fields is not valid for this type.", "fields");
-+ else
-+ throw;
-+ }
-+ }
-+
-+ public void SetValues (IList<FieldInfoMirror> fields, Value[] values) {
-+ if (fields == null)
-+ throw new ArgumentNullException ("fields");
-+ if (values == null)
-+ throw new ArgumentNullException ("values");
-+ foreach (FieldInfoMirror f in fields) {
-+ if (f == null)
-+ throw new ArgumentNullException ("field");
-+ CheckMirror (f);
-+ }
-+ foreach (Value v in values) {
-+ if (v == null)
-+ throw new ArgumentNullException ("values");
-+ CheckMirror (v);
-+ }
-+ long[] ids = new long [fields.Count];
-+ for (int i = 0; i < fields.Count; ++i)
-+ ids [i] = fields [i].Id;
-+ try {
-+ vm.conn.Object_SetValues (id, ids, vm.EncodeValues (values));
-+ } catch (CommandException ex) {
-+ if (ex.ErrorCode == ErrorCode.INVALID_FIELDID)
-+ throw new ArgumentException ("One of the fields is not valid for this type.", "fields");
-+ else if (ex.ErrorCode == ErrorCode.INVALID_ARGUMENT)
-+ throw new ArgumentException ("One of the values is not valid for its field.", "values");
-+ else
-+ throw;
-+ }
-+ }
-+
-+ public void SetValue (FieldInfoMirror field, Value value) {
-+ SetValues (new FieldInfoMirror [] { field }, new Value [] { value });
-+ }
-+
-+ /*
-+ * The current address of the object. It can change during garbage
-+ * collections. Use a long since the debuggee might have a different
-+ * pointer size.
-+ */
-+ public long Address {
-+ get {
-+ return vm.conn.Object_GetAddress (id);
-+ }
-+ }
-+
-+ public Value InvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments) {
-+ return InvokeMethod (vm, thread, method, this, arguments, InvokeOptions.None);
-+ }
-+
-+ public Value InvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options) {
-+ return InvokeMethod (vm, thread, method, this, arguments, options);
-+ }
-+
-+ [Obsolete ("Use the overload without the 'vm' argument")]
-+ public IAsyncResult BeginInvokeMethod (VirtualMachine vm, ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options, AsyncCallback callback, object state) {
-+ return BeginInvokeMethod (vm, thread, method, this, arguments, options, callback, state);
-+ }
-+
-+ public IAsyncResult BeginInvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options, AsyncCallback callback, object state) {
-+ return BeginInvokeMethod (vm, thread, method, this, arguments, options, callback, state);
-+ }
-+
-+ public Value EndInvokeMethod (IAsyncResult asyncResult) {
-+ return EndInvokeMethodInternal (asyncResult);
-+ }
-+
-+ /*
-+ * Common implementation for invokes
-+ */
-+
-+ class InvokeAsyncResult : IInvokeAsyncResult {
-+
-+ public object AsyncState {
-+ get; set;
-+ }
-+
-+ public WaitHandle AsyncWaitHandle {
-+ get; set;
-+ }
-+
-+ public bool CompletedSynchronously {
-+ get {
-+ return false;
-+ }
-+ }
-+
-+ public bool IsCompleted {
-+ get; set;
-+ }
-+
-+ public AsyncCallback Callback {
-+ get; set;
-+ }
-+
-+ public ErrorCode ErrorCode {
-+ get; set;
-+ }
-+
-+ public VirtualMachine VM {
-+ get; set;
-+ }
-+
-+ public ThreadMirror Thread {
-+ get; set;
-+ }
-+
-+ public ValueImpl Value {
-+ get; set;
-+ }
-+
-+ public ValueImpl Exception {
-+ get; set;
-+ }
-+
-+ public int ID {
-+ get; set;
-+ }
-+
-+ public void Abort ()
-+ {
-+ if (ID == 0) // Ooops
-+ return;
-+
-+ ObjectMirror.AbortInvoke (VM, Thread, ID);
-+ }
-+ }
-+
-+ internal static IInvokeAsyncResult BeginInvokeMethod (VirtualMachine vm, ThreadMirror thread, MethodMirror method, Value this_obj, IList<Value> arguments, InvokeOptions options, AsyncCallback callback, object state) {
-+ if (thread == null)
-+ throw new ArgumentNullException ("thread");
-+ if (method == null)
-+ throw new ArgumentNullException ("method");
-+ if (arguments == null)
-+ arguments = new Value [0];
-+
-+ InvokeFlags f = InvokeFlags.NONE;
-+
-+ if ((options & InvokeOptions.DisableBreakpoints) != 0)
-+ f |= InvokeFlags.DISABLE_BREAKPOINTS;
-+ if ((options & InvokeOptions.SingleThreaded) != 0)
-+ f |= InvokeFlags.SINGLE_THREADED;
-+
-+ InvokeAsyncResult r = new InvokeAsyncResult { AsyncState = state, AsyncWaitHandle = new ManualResetEvent (false), VM = vm, Thread = thread, Callback = callback };
-+
-+ r.ID = vm.conn.VM_BeginInvokeMethod (thread.Id, method.Id, this_obj != null ? vm.EncodeValue (this_obj) : vm.EncodeValue (vm.CreateValue (null)), vm.EncodeValues (arguments), f, InvokeCB, r);
-+
-+ return r;
-+ }
-+
-+ // This is called when the result of an invoke is received
-+ static void InvokeCB (ValueImpl v, ValueImpl exc, ErrorCode error, object state) {
-+ InvokeAsyncResult r = (InvokeAsyncResult)state;
-+
-+ if (error != 0) {
-+ r.ErrorCode = error;
-+ } else {
-+ r.Value = v;
-+ r.Exception = exc;
-+ }
-+
-+ r.IsCompleted = true;
-+ ((ManualResetEvent)r.AsyncWaitHandle).Set ();
-+
-+ if (r.Callback != null)
-+ r.Callback.BeginInvoke (r, null, null);
-+ }
-+
-+ internal static Value EndInvokeMethodInternal (IAsyncResult asyncResult) {
-+ if (asyncResult == null)
-+ throw new ArgumentNullException ("asyncResult");
-+
-+ InvokeAsyncResult r = (InvokeAsyncResult)asyncResult;
-+
-+ if (!r.IsCompleted)
-+ r.AsyncWaitHandle.WaitOne ();
-+
-+ if (r.ErrorCode != 0) {
-+ try {
-+ r.VM.ErrorHandler (null, new ErrorHandlerEventArgs () { ErrorCode = r.ErrorCode });
-+ } catch (CommandException ex) {
-+ if (ex.ErrorCode == ErrorCode.INVALID_ARGUMENT)
-+ throw new ArgumentException ("Incorrect number or types of arguments", "arguments");
-+ else
-+ throw;
-+ }
-+ throw new NotImplementedException ();
-+ } else {
-+ if (r.Exception != null)
-+ throw new InvocationException ((ObjectMirror)r.VM.DecodeValue (r.Exception));
-+ else
-+ return r.VM.DecodeValue (r.Value);
-+ }
-+ }
-+
-+ internal static Value InvokeMethod (VirtualMachine vm, ThreadMirror thread, MethodMirror method, Value this_obj, IList<Value> arguments, InvokeOptions options) {
-+ return EndInvokeMethodInternal (BeginInvokeMethod (vm, thread, method, this_obj, arguments, options, null, null));
-+ }
-+
-+ internal static void AbortInvoke (VirtualMachine vm, ThreadMirror thread, int id)
-+ {
-+ vm.conn.VM_AbortInvoke (thread.Id, id);
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ParameterInfoMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ParameterInfoMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,64 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Text;
-+using System.Reflection;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ParameterInfoMirror : Mirror {
-+
-+ MethodMirror method;
-+ TypeMirror type;
-+ string name;
-+ int pos;
-+ ParameterAttributes attrs;
-+
-+ internal ParameterInfoMirror (MethodMirror method, int pos, TypeMirror type, string name, ParameterAttributes attrs) : base (method.VirtualMachine, 0) {
-+ this.method = method;
-+ this.pos = pos;
-+ this.type = type;
-+ this.name = name;
-+ this.attrs = attrs;
-+ }
-+
-+ public TypeMirror ParameterType {
-+ get {
-+ return type;
-+ }
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ return method;
-+ }
-+ }
-+
-+ public string Name {
-+ get {
-+ return name;
-+ }
-+ }
-+
-+ public int Position {
-+ get {
-+ return pos;
-+ }
-+ }
-+
-+ public ParameterAttributes Attributes {
-+ get {
-+ return attrs;
-+ }
-+ }
-+
-+ public bool IsRetval {
-+ get {
-+ return (Attributes & ParameterAttributes.Retval) != 0;
-+ }
-+ }
-+
-+ public override string ToString () {
-+ return String.Format ("ParameterInfo ({0})", Name);
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/PrimitiveValue.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/PrimitiveValue.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,39 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ /*
-+ * Represents a value of a primitive type in the debuggee
-+ */
-+ public class PrimitiveValue : Value {
-+
-+ object value;
-+
-+ public PrimitiveValue (VirtualMachine vm, object value) : base (vm, 0) {
-+ this.value = value;
-+ }
-+
-+ public object Value {
-+ get {
-+ return value;
-+ }
-+ }
-+
-+ public override bool Equals (object obj) {
-+ if (value == obj)
-+ return true;
-+ if (obj != null && obj is PrimitiveValue)
-+ return value == (obj as PrimitiveValue).Value;
-+ return base.Equals (obj);
-+ }
-+
-+ public override int GetHashCode () {
-+ return base.GetHashCode ();
-+ }
-+
-+ public override string ToString () {
-+ return "PrimitiveValue<" + Value + ">";
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/PropertyInfoMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/PropertyInfoMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,117 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Text;
-+using System.Reflection;
-+using C = Mono.Cecil;
-+using Mono.Cecil.Metadata;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class PropertyInfoMirror : Mirror {
-+
-+ TypeMirror parent;
-+ string name;
-+ PropertyAttributes attrs;
-+ MethodMirror get_method, set_method;
-+ CustomAttributeDataMirror[] cattrs;
-+
-+ public PropertyInfoMirror (TypeMirror parent, long id, string name, MethodMirror get_method, MethodMirror set_method, PropertyAttributes attrs) : base (parent.VirtualMachine, id) {
-+ this.parent = parent;
-+ this.name = name;
-+ this.attrs = attrs;
-+ this.get_method = get_method;
-+ this.set_method = set_method;
-+ }
-+
-+ public TypeMirror DeclaringType {
-+ get {
-+ return parent;
-+ }
-+ }
-+
-+ public string Name {
-+ get {
-+ return name;
-+ }
-+ }
-+
-+ public TypeMirror PropertyType {
-+ get {
-+ if (get_method != null)
-+ return get_method.ReturnType;
-+ else {
-+ ParameterInfoMirror[] parameters = set_method.GetParameters ();
-+
-+ return parameters [parameters.Length - 1].ParameterType;
-+ }
-+ }
-+ }
-+
-+ public PropertyAttributes Attributes {
-+ get {
-+ return attrs;
-+ }
-+ }
-+
-+ public bool IsSpecialName {
-+ get {return (Attributes & PropertyAttributes.SpecialName) != 0;}
-+ }
-+
-+ public MethodMirror GetGetMethod ()
-+ {
-+ return GetGetMethod (false);
-+ }
-+
-+ public MethodMirror GetGetMethod (bool nonPublic)
-+ {
-+ if (get_method != null && (nonPublic || get_method.IsPublic))
-+ return get_method;
-+ else
-+ return null;
-+ }
-+
-+ public MethodMirror GetSetMethod ()
-+ {
-+ return GetSetMethod (false);
-+ }
-+
-+ public MethodMirror GetSetMethod (bool nonPublic)
-+ {
-+ if (set_method != null && (nonPublic || set_method.IsPublic))
-+ return set_method;
-+ else
-+ return null;
-+ }
-+
-+ public ParameterInfoMirror[] GetIndexParameters()
-+ {
-+ if (get_method != null)
-+ return get_method.GetParameters ();
-+ return new ParameterInfoMirror [0];
-+ }
-+
-+ public CustomAttributeDataMirror[] GetCustomAttributes (bool inherit) {
-+ return GetCAttrs (null, inherit);
-+ }
-+
-+ public CustomAttributeDataMirror[] GetCustomAttributes (TypeMirror attributeType, bool inherit) {
-+ if (attributeType == null)
-+ throw new ArgumentNullException ("attributeType");
-+ return GetCAttrs (attributeType, inherit);
-+ }
-+
-+ CustomAttributeDataMirror[] GetCAttrs (TypeMirror type, bool inherit) {
-+ // FIXME: Handle inherit
-+ if (cattrs == null) {
-+ CattrInfo[] info = vm.conn.Type_GetPropertyCustomAttributes (DeclaringType.Id, id, 0, false);
-+ cattrs = CustomAttributeDataMirror.Create (vm, info);
-+ }
-+ var res = new List<CustomAttributeDataMirror> ();
-+ foreach (var attr in cattrs)
-+ if (type == null || attr.Constructor.DeclaringType == type)
-+ res.Add (attr);
-+ return res.ToArray ();
-+ }
-+ }
-+}
-+
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StackFrame.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StackFrame.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,189 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Linq;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class StackFrame : Mirror
-+ {
-+ ThreadMirror thread;
-+ MethodMirror method;
-+ int il_offset;
-+ Location location;
-+ StackFrameFlags flags;
-+
-+ /*
-+ * FIXME: Decide on the way to request/handle debugging information:
-+ * - request the info in bulk for all frames/on demand for individual frames
-+ * - request the info from the runtime/request only the il offset, and compute
-+ * everything else based on this info using the method debug info.
-+ */
-+
-+ internal StackFrame (VirtualMachine vm, long id, ThreadMirror thread, MethodMirror method, int il_offset, StackFrameFlags flags) : base (vm, id) {
-+ this.thread = thread;
-+ this.method = method;
-+ this.il_offset = il_offset;
-+ this.flags = flags;
-+ }
-+
-+ public ThreadMirror Thread {
-+ get {
-+ return thread;
-+ }
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ return method;
-+ }
-+ }
-+
-+ public Location Location {
-+ get {
-+ if (location == null) {
-+ int line_number;
-+
-+ if (il_offset == -1)
-+ line_number = -1;
-+ else
-+ line_number = method.il_offset_to_line_number (il_offset);
-+
-+ location = new Location (vm, Method, 0, il_offset, method.SourceFile, line_number, 0);
-+ }
-+ return location;
-+ }
-+ }
-+
-+ public string FileName {
-+ get {
-+ return Location.SourceFile;
-+ }
-+ }
-+
-+ public int ILOffset {
-+ get {
-+ return Location.ILOffset;
-+ }
-+ }
-+
-+ public int LineNumber {
-+ get {
-+ return Location.LineNumber;
-+ }
-+ }
-+
-+ public bool IsDebuggerInvoke {
-+ get {
-+ return (flags & StackFrameFlags.DEBUGGER_INVOKE) != 0;
-+ }
-+ }
-+
-+ public Value GetValue (ParameterInfoMirror param) {
-+ if (param == null)
-+ throw new ArgumentNullException ("param");
-+ if (param.Method != Method)
-+ throw new ArgumentException ("Parameter doesn't belong to this frame's method.");
-+ if (param.IsRetval)
-+ throw new ArgumentException ("Parameter represents the method return value.");
-+
-+ // FIXME: Liveness
-+ // FIXME: Allow returning the frame return value if possible
-+ return vm.DecodeValue (vm.conn.StackFrame_GetValues (thread.Id, Id, new int [] { (- param.Position) - 1 })[0]);
-+ }
-+
-+ public Value GetValue (LocalVariable var) {
-+ if (var == null)
-+ throw new ArgumentNullException ("var");
-+ if (var.Method != Method)
-+ throw new ArgumentException ("Local variable doesn't belong to this frame's method.");
-+
-+ // FIXME: Liveness
-+ // FIXME: Check for return value
-+ // FIXME: Allow returning the frame return value if possible
-+ return vm.DecodeValue (vm.conn.StackFrame_GetValues (thread.Id, Id, new int [] { var.GetValueIndex } )[0]);
-+ }
-+
-+ public Value[] GetValues (LocalVariable[] vars) {
-+ if (vars == null)
-+ throw new ArgumentNullException ("vars");
-+ for (int i = 0; i < vars.Length; ++i) {
-+ if (vars [i] == null)
-+ throw new ArgumentNullException ("vars");
-+ if (vars [i].Method != Method)
-+ throw new ArgumentException ("Local variable doesn't belong to this frame's method.");
-+ }
-+ int[] pos = new int [vars.Length];
-+ for (int i = 0; i < vars.Length; ++i)
-+ pos [i] = vars [i].GetValueIndex;
-+ return vm.DecodeValues (vm.conn.StackFrame_GetValues (thread.Id, Id, pos));
-+ }
-+
-+ public Value GetArgument (int pos) {
-+ return GetValue (Method.GetParameters () [pos]);
-+ }
-+
-+ public Value GetThis () {
-+ return vm.DecodeValue (vm.conn.StackFrame_GetThis (thread.Id, Id));
-+ }
-+
-+ public void SetValue (LocalVariable var, Value value) {
-+ if (var == null)
-+ throw new ArgumentNullException ("var");
-+ if (var.Method != Method)
-+ throw new ArgumentException ("Local variable doesn't belong to this frame's method.");
-+ if (value == null)
-+ throw new ArgumentNullException ("value");
-+ CheckMirror (value);
-+ // FIXME: Liveness
-+ // FIXME: Check for return value
-+ try {
-+ vm.conn.StackFrame_SetValues (thread.Id, Id, new int [] { var.GetValueIndex }, new ValueImpl [] { vm.EncodeValue (value) });
-+ } catch (CommandException ex) {
-+ if (ex.ErrorCode == ErrorCode.INVALID_ARGUMENT)
-+ throw new ArgumentException ("Value does not match the type of the local variable.");
-+ else
-+ throw;
-+ }
-+ }
-+
-+ public void SetValue (ParameterInfoMirror param, Value value) {
-+ if (param == null)
-+ throw new ArgumentNullException ("param");
-+ if (param.Method != Method)
-+ throw new ArgumentException ("Parameter doesn't belong to this frame's method.");
-+ if (param.IsRetval)
-+ throw new ArgumentException ("Parameter represents the method return value.");
-+ if (value == null)
-+ throw new ArgumentNullException ("value");
-+ CheckMirror (value);
-+
-+ // FIXME: Liveness
-+ // FIXME: Allow setting the frame return value if possible
-+ try {
-+ vm.conn.StackFrame_SetValues (thread.Id, Id, new int [] { (- param.Position) - 1 }, new ValueImpl [] { vm.EncodeValue (value) });
-+ } catch (CommandException ex) {
-+ if (ex.ErrorCode == ErrorCode.INVALID_ARGUMENT)
-+ throw new ArgumentException ("Value does not match the type of the variable.");
-+ else
-+ throw;
-+ }
-+ }
-+
-+ public IList<LocalVariable> GetVisibleVariables () {
-+ if (Location.ILOffset == -1)
-+ throw new AbsentInformationException ();
-+
-+ return Method.GetLocals ().Where (l => l.LiveRangeStart <= location.ILOffset && l.LiveRangeEnd >= location.ILOffset).ToList ();
-+ }
-+
-+ public LocalVariable GetVisibleVariableByName (string name) {
-+ if (name == null)
-+ throw new ArgumentNullException ("name");
-+
-+ if (Location.ILOffset == -1)
-+ throw new AbsentInformationException ();
-+
-+ return Method.GetLocals ().Where (l => l.LiveRangeStart <= location.ILOffset && l.LiveRangeEnd >= location.ILOffset && l.Name == name).FirstOrDefault ();
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StepEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StepEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,27 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class StepEvent : Event {
-+ MethodMirror method;
-+ long id, loc;
-+
-+ internal StepEvent (VirtualMachine vm, int req_id, long thread_id, long id, long loc) : base (EventType.Step, vm, req_id, thread_id) {
-+ this.id = id;
-+ this.loc = loc;
-+ }
-+
-+ public MethodMirror Method {
-+ get {
-+ if (method == null)
-+ method = vm.GetMethod (id);
-+ return method;
-+ }
-+ }
-+
-+ public long Location {
-+ get {
-+ return loc;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StepEventRequest.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StepEventRequest.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,64 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public enum StepDepth {
-+ Into = 0,
-+ Over = 1,
-+ Out = 2
-+ }
-+
-+ public enum StepSize {
-+ Min = 0,
-+ Line = 1
-+ }
-+
-+ public sealed class StepEventRequest : EventRequest {
-+
-+ ThreadMirror step_thread;
-+ StepDepth depth;
-+ StepSize size;
-+
-+ internal StepEventRequest (VirtualMachine vm, ThreadMirror thread) : base (vm, EventType.Step) {
-+ if (thread == null)
-+ throw new ArgumentNullException ("thread");
-+ CheckMirror (vm, thread);
-+ this.step_thread = thread;
-+ Depth = StepDepth.Into;
-+ Size = StepSize.Min;
-+ }
-+
-+ public override void Enable () {
-+ var mods = new List <Modifier> ();
-+ mods.Add (new StepModifier () { Thread = step_thread.Id, Depth = (int)Depth, Size = (int)Size });
-+ SendReq (mods);
-+ }
-+
-+ public new ThreadMirror Thread {
-+ get {
-+ return step_thread;
-+ }
-+ }
-+
-+ public StepDepth Depth {
-+ get {
-+ return depth;
-+ }
-+ set {
-+ CheckDisabled ();
-+ depth = value;
-+ }
-+ }
-+
-+ public StepSize Size {
-+ get {
-+ return size;
-+ }
-+ set {
-+ CheckDisabled ();
-+ size = value;
-+ }
-+ }
-+ }
-+}
-\ No newline at end of file
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StringMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StringMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,17 @@
-+using System;
-+using System.Collections;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class StringMirror : ObjectMirror {
-+
-+ internal StringMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ public string Value {
-+ get {
-+ return vm.conn.String_GetValue (id);
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StructMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/StructMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,71 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ /*
-+ * Represents a valuetype value in the debuggee
-+ */
-+ public class StructMirror : Value {
-+
-+ TypeMirror type;
-+ Value[] fields;
-+
-+ internal StructMirror (VirtualMachine vm, TypeMirror type, Value[] fields) : base (vm, 0) {
-+ this.type = type;
-+ this.fields = fields;
-+ }
-+
-+ public TypeMirror Type {
-+ get {
-+ return type;
-+ }
-+ }
-+
-+ public Value[] Fields {
-+ get {
-+ return fields;
-+ }
-+ }
-+
-+ public Value this [String field] {
-+ get {
-+ FieldInfoMirror[] field_info = Type.GetFields ();
-+ int nf = 0;
-+ for (int i = 0; i < field_info.Length; ++i) {
-+ if (!field_info [i].IsStatic) {
-+ if (field_info [i].Name == field)
-+ return Fields [nf];
-+ nf++;
-+ }
-+ }
-+ throw new ArgumentException ("Unknown struct field '" + field + "'.", "field");
-+ }
-+ }
-+
-+ internal void SetField (int index, Value value) {
-+ fields [index] = value;
-+ }
-+
-+ public Value InvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments) {
-+ return ObjectMirror.InvokeMethod (vm, thread, method, this, arguments, InvokeOptions.None);
-+ }
-+
-+ public Value InvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options) {
-+ return ObjectMirror.InvokeMethod (vm, thread, method, this, arguments, options);
-+ }
-+
-+ [Obsolete ("Use the overload without the 'vm' argument")]
-+ public IAsyncResult BeginInvokeMethod (VirtualMachine vm, ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options, AsyncCallback callback, object state) {
-+ return ObjectMirror.BeginInvokeMethod (vm, thread, method, this, arguments, options, callback, state);
-+ }
-+
-+ public IAsyncResult BeginInvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options, AsyncCallback callback, object state) {
-+ return ObjectMirror.BeginInvokeMethod (vm, thread, method, this, arguments, options, callback, state);
-+ }
-+
-+ public Value EndInvokeMethod (IAsyncResult asyncResult) {
-+ return ObjectMirror.EndInvokeMethodInternal (asyncResult);
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/SuspendPolicy.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/SuspendPolicy.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ // Keep it in sync with debugger-agent.h
-+ public enum SuspendPolicy {
-+ None = 0,
-+ EventThread = 1,
-+ All = 2
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ThreadDeathEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ThreadDeathEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,8 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ThreadDeathEvent : Event {
-+ internal ThreadDeathEvent (VirtualMachine vm, int req_id, long id) : base (EventType.ThreadDeath, vm, req_id, id) {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ThreadMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ThreadMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,65 @@
-+using System;
-+using System.Threading;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ThreadMirror : ObjectMirror
-+ {
-+ string name;
-+
-+ internal ThreadMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ // FIXME: Cache, invalidate when the thread/runtime is resumed
-+ public StackFrame[] GetFrames () {
-+ FrameInfo[] frame_info = vm.conn.Thread_GetFrameInfo (id, 0, -1);
-+
-+ StackFrame[] frames = new StackFrame [frame_info.Length];
-+ for (int i = 0; i < frame_info.Length; ++i) {
-+ FrameInfo info = (FrameInfo)frame_info [i];
-+ MethodMirror method = vm.GetMethod (info.method);
-+ frames [i] = new StackFrame (vm, info.id, this, method, info.il_offset, info.flags);
-+ }
-+
-+ return frames;
-+ }
-+
-+ public string Name {
-+ get {
-+ if (name == null)
-+ name = vm.conn.Thread_GetName (id);
-+ return name;
-+ }
-+ }
-+
-+ public new long Id {
-+ get {
-+ return id;
-+ }
-+ }
-+
-+ public ThreadState ThreadState {
-+ get {
-+ return (ThreadState)vm.conn.Thread_GetState (id);
-+ }
-+ }
-+
-+ public bool IsThreadPoolThread {
-+ get {
-+ ThreadInfo info = vm.conn.Thread_GetInfo (id);
-+
-+ return info.is_thread_pool;
-+ }
-+ }
-+
-+ /*
-+ * Return a unique identifier for this thread, multiple ThreadMirror objects
-+ * may have the same ThreadId because of appdomains.
-+ */
-+ public long ThreadId {
-+ get {
-+ return vm.conn.Thread_GetId (id);
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ThreadStartEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/ThreadStartEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,8 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class ThreadStartEvent : Event {
-+ internal ThreadStartEvent (VirtualMachine vm, int req_id, long id) : base (EventType.ThreadStart, vm, req_id, id) {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/TypeLoadEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/TypeLoadEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,20 @@
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class TypeLoadEvent : Event {
-+ TypeMirror type;
-+ long id;
-+
-+ internal TypeLoadEvent (VirtualMachine vm, int req_id, long thread_id, long id) : base (EventType.TypeLoad, vm, req_id, thread_id) {
-+ this.id = id;
-+ }
-+
-+ public TypeMirror Type {
-+ get {
-+ if (type == null)
-+ type = vm.GetType (id);
-+ return type;
-+ }
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/TypeMirror.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/TypeMirror.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,650 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Reflection;
-+using C = Mono.Cecil;
-+using Mono.Cecil.Metadata;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ /*
-+ * Represents a type in the remote virtual machine.
-+ * It might be better to make this a subclass of Type, but that could be
-+ * difficult as some of our methods like GetMethods () return Mirror objects.
-+ */
-+ public class TypeMirror : Mirror
-+ {
-+ MethodMirror[] methods;
-+ AssemblyMirror ass;
-+ ModuleMirror module;
-+ C.TypeDefinition meta;
-+ FieldInfoMirror[] fields;
-+ PropertyInfoMirror[] properties;
-+ TypeInfo info;
-+ TypeMirror base_type, element_type;
-+ TypeMirror[] nested;
-+ CustomAttributeDataMirror[] cattrs;
-+
-+ internal const BindingFlags DefaultBindingFlags =
-+ BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance;
-+
-+ internal TypeMirror (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+
-+ public string Name {
-+ get {
-+ return GetInfo ().name;
-+ }
-+ }
-+
-+ public string Namespace {
-+ get {
-+ return GetInfo ().ns;
-+ }
-+ }
-+
-+ public AssemblyMirror Assembly {
-+ get {
-+ if (ass == null) {
-+ ass = vm.GetAssembly (GetInfo ().assembly);
-+ }
-+ return ass;
-+ }
-+ }
-+
-+ public ModuleMirror Module {
-+ get {
-+ if (module == null) {
-+ module = vm.GetModule (GetInfo ().module);
-+ }
-+ return module;
-+ }
-+ }
-+
-+ public int MetadataToken {
-+ get {
-+ return GetInfo ().token;
-+ }
-+ }
-+
-+ public TypeAttributes Attributes {
-+ get {
-+ return (TypeAttributes)GetInfo ().attributes;
-+ }
-+ }
-+
-+ public TypeMirror BaseType {
-+ get {
-+ // FIXME: base_type could be null for object/interfaces
-+ if (base_type == null) {
-+ base_type = vm.GetType (GetInfo ().base_type);
-+ }
-+ return base_type;
-+ }
-+ }
-+
-+ public int GetArrayRank () {
-+ GetInfo ();
-+ if (info.rank == 0)
-+ throw new ArgumentException ("Type must be an array type.");
-+ return info.rank;
-+ }
-+
-+
-+ public bool IsAbstract {
-+ get {
-+ return (Attributes & TypeAttributes.Abstract) != 0;
-+ }
-+ }
-+
-+ public bool IsAnsiClass {
-+ get {
-+ return (Attributes & TypeAttributes.StringFormatMask)
-+ == TypeAttributes.AnsiClass;
-+ }
-+ }
-+
-+ public bool IsArray {
-+ get {
-+ return IsArrayImpl ();
-+ }
-+ }
-+
-+ public bool IsAutoClass {
-+ get {
-+ return (Attributes & TypeAttributes.StringFormatMask) == TypeAttributes.AutoClass;
-+ }
-+ }
-+
-+ public bool IsAutoLayout {
-+ get {
-+ return (Attributes & TypeAttributes.LayoutMask) == TypeAttributes.AutoLayout;
-+ }
-+ }
-+
-+ public bool IsByRef {
-+ get {
-+ return IsByRefImpl ();
-+ }
-+ }
-+
-+ public bool IsClass {
-+ get {
-+ if (IsInterface)
-+ return false;
-+
-+ return !IsValueType;
-+ }
-+ }
-+
-+ public bool IsCOMObject {
-+ get {
-+ return IsCOMObjectImpl ();
-+ }
-+ }
-+
-+ public bool IsContextful {
-+ get {
-+ return IsContextfulImpl ();
-+ }
-+ }
-+
-+ public bool IsEnum {
-+ get {
-+ return GetInfo ().is_enum;
-+ }
-+ }
-+
-+ public bool IsExplicitLayout {
-+ get {
-+ return (Attributes & TypeAttributes.LayoutMask) == TypeAttributes.ExplicitLayout;
-+ }
-+ }
-+
-+ public bool IsImport {
-+ get {
-+ return (Attributes & TypeAttributes.Import) != 0;
-+ }
-+ }
-+
-+ public bool IsInterface {
-+ get {
-+ return (Attributes & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface;
-+ }
-+ }
-+
-+ public bool IsLayoutSequential {
-+ get {
-+ return (Attributes & TypeAttributes.LayoutMask) == TypeAttributes.SequentialLayout;
-+ }
-+ }
-+
-+ public bool IsMarshalByRef {
-+ get {
-+ return IsMarshalByRefImpl ();
-+ }
-+ }
-+
-+ public bool IsNestedAssembly {
-+ get {
-+ return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedAssembly;
-+ }
-+ }
-+
-+ public bool IsNestedFamANDAssem {
-+ get {
-+ return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedFamANDAssem;
-+ }
-+ }
-+
-+ public bool IsNestedFamily {
-+ get {
-+ return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedFamily;
-+ }
-+ }
-+
-+ public bool IsNestedFamORAssem {
-+ get {
-+ return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedFamORAssem;
-+ }
-+ }
-+
-+ public bool IsNestedPrivate {
-+ get {
-+ return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPrivate;
-+ }
-+ }
-+
-+ public bool IsNestedPublic {
-+ get {
-+ return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic;
-+ }
-+ }
-+
-+ public bool IsNotPublic {
-+ get {
-+ return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NotPublic;
-+ }
-+ }
-+
-+ public bool IsPointer {
-+ get {
-+ return IsPointerImpl ();
-+ }
-+ }
-+
-+ public bool IsPrimitive {
-+ get {
-+ return IsPrimitiveImpl ();
-+ }
-+ }
-+
-+ public bool IsPublic {
-+ get {
-+ return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.Public;
-+ }
-+ }
-+
-+ public bool IsSealed {
-+ get {
-+ return (Attributes & TypeAttributes.Sealed) != 0;
-+ }
-+ }
-+
-+ public bool IsSerializable {
-+ get {
-+ if ((Attributes & TypeAttributes.Serializable) != 0)
-+ return true;
-+
-+ // FIXME:
-+ return false;
-+ }
-+ }
-+
-+ public bool IsSpecialName {
-+ get {
-+ return (Attributes & TypeAttributes.SpecialName) != 0;
-+ }
-+ }
-+
-+ public bool IsUnicodeClass {
-+ get {
-+ return (Attributes & TypeAttributes.StringFormatMask) == TypeAttributes.UnicodeClass;
-+ }
-+ }
-+
-+ public bool IsValueType {
-+ get {
-+ return IsValueTypeImpl ();
-+ }
-+ }
-+
-+ public bool HasElementType {
-+ get {
-+ return HasElementTypeImpl ();
-+ }
-+ }
-+
-+ public TypeMirror GetElementType () {
-+ GetInfo ();
-+ if (element_type == null && info.element_type != 0)
-+ element_type = vm.GetType (info.element_type);
-+ return element_type;
-+ }
-+
-+ public string FullName {
-+ get {
-+ return GetInfo ().full_name;
-+ }
-+ }
-+
-+ public string CSharpName {
-+ get {
-+ if (IsArray) {
-+ if (GetArrayRank () == 1)
-+ return GetElementType ().CSharpName + "[]";
-+ else {
-+ string ranks = "";
-+ for (int i = 0; i < GetArrayRank (); ++i)
-+ ranks += ',';
-+ return GetElementType ().CSharpName + "[" + ranks + "]";
-+ }
-+ }
-+ if (IsPrimitive) {
-+ switch (Name) {
-+ case "Byte":
-+ return "byte";
-+ case "Int32":
-+ return "int";
-+ case "Boolean":
-+ return "bool";
-+ default:
-+ return FullName;
-+ }
-+ }
-+ // FIXME: Only do this for real corlib types
-+ if (Namespace == "System") {
-+ string s = Name;
-+ switch (s) {
-+ case "String":
-+ return "string";
-+ default:
-+ return FullName;
-+ }
-+ } else {
-+ return FullName;
-+ }
-+ }
-+ }
-+
-+ public MethodMirror[] GetMethods () {
-+ if (methods == null) {
-+ long[] ids = vm.conn.Type_GetMethods (id);
-+ MethodMirror[] m = new MethodMirror [ids.Length];
-+ for (int i = 0; i < ids.Length; ++i) {
-+ m [i] = vm.GetMethod (ids [i]);
-+ }
-+ methods = m;
-+ }
-+ return methods;
-+ }
-+
-+ // FIXME: Sync this with Type
-+ public MethodMirror GetMethod (string name) {
-+ foreach (var m in GetMethods ())
-+ if (m.Name == name)
-+ return m;
-+ return null;
-+ }
-+
-+ public FieldInfoMirror[] GetFields () {
-+ if (fields != null)
-+ return fields;
-+
-+ string[] names;
-+ long[] types;
-+ int[] attrs;
-+ long[] ids = vm.conn.Type_GetFields (id, out names, out types, out attrs);
-+
-+ FieldInfoMirror[] res = new FieldInfoMirror [ids.Length];
-+ for (int i = 0; i < res.Length; ++i)
-+ res [i] = new FieldInfoMirror (this, ids [i], names [i], vm.GetType (types [i]), (FieldAttributes)attrs [i]);
-+
-+ fields = res;
-+ return fields;
-+ }
-+
-+ public FieldInfoMirror GetField (string name) {
-+ if (name == null)
-+ throw new ArgumentNullException ("name");
-+ foreach (var f in GetFields ())
-+ if (f.Name == name)
-+ return f;
-+ return null;
-+ }
-+
-+ public TypeMirror[] GetNestedTypes ()
-+ {
-+ return GetNestedTypes (DefaultBindingFlags);
-+ }
-+
-+ public TypeMirror[] GetNestedTypes (BindingFlags bindingAttr) {
-+ if (nested != null)
-+ return nested;
-+
-+ // FIXME: bindingAttr
-+ GetInfo ();
-+ var arr = new TypeMirror [info.nested.Length];
-+ for (int i = 0; i < arr.Length; ++i)
-+ arr [i] = vm.GetType (info.nested [i]);
-+ nested = arr;
-+
-+ return nested;
-+ }
-+
-+ public PropertyInfoMirror[] GetProperties () {
-+ return GetProperties (DefaultBindingFlags);
-+ }
-+
-+ public PropertyInfoMirror[] GetProperties (BindingFlags bindingAttr) {
-+ if (properties != null)
-+ return properties;
-+
-+ PropInfo[] info = vm.conn.Type_GetProperties (id);
-+
-+ PropertyInfoMirror[] res = new PropertyInfoMirror [info.Length];
-+ for (int i = 0; i < res.Length; ++i)
-+ res [i] = new PropertyInfoMirror (this, info [i].id, info [i].name, vm.GetMethod (info [i].get_method), vm.GetMethod (info [i].set_method), (PropertyAttributes)info [i].attrs);
-+
-+ properties = res;
-+ return properties;
-+ }
-+
-+ public PropertyInfoMirror GetProperty (string name) {
-+ if (name == null)
-+ throw new ArgumentNullException ("name");
-+ foreach (var p in GetProperties ())
-+ if (p.Name == name)
-+ return p;
-+ return null;
-+ }
-+
-+ public virtual bool IsAssignableFrom (TypeMirror c) {
-+ if (c == null)
-+ throw new ArgumentNullException ("c");
-+
-+ CheckMirror (c);
-+
-+ // This is complex so do it in the debuggee
-+ return vm.conn.Type_IsAssignableFrom (id, c.Id);
-+ }
-+
-+ public Value GetValue (FieldInfoMirror field) {
-+ return GetValues (new FieldInfoMirror [] { field }) [0];
-+ }
-+
-+ public Value[] GetValues (IList<FieldInfoMirror> fields) {
-+ if (fields == null)
-+ throw new ArgumentNullException ("fields");
-+ foreach (FieldInfoMirror f in fields) {
-+ if (f == null)
-+ throw new ArgumentNullException ("field");
-+ CheckMirror (f);
-+ }
-+ long[] ids = new long [fields.Count];
-+ for (int i = 0; i < fields.Count; ++i)
-+ ids [i] = fields [i].Id;
-+ try {
-+ return vm.DecodeValues (vm.conn.Type_GetValues (id, ids));
-+ } catch (CommandException ex) {
-+ if (ex.ErrorCode == ErrorCode.INVALID_FIELDID)
-+ throw new ArgumentException ("One of the fields is not valid for this type.", "fields");
-+ else
-+ throw;
-+ }
-+ }
-+
-+ public void SetValues (IList<FieldInfoMirror> fields, Value[] values) {
-+ if (fields == null)
-+ throw new ArgumentNullException ("fields");
-+ if (values == null)
-+ throw new ArgumentNullException ("values");
-+ foreach (FieldInfoMirror f in fields) {
-+ if (f == null)
-+ throw new ArgumentNullException ("field");
-+ CheckMirror (f);
-+ }
-+ foreach (Value v in values) {
-+ if (v == null)
-+ throw new ArgumentNullException ("values");
-+ CheckMirror (v);
-+ }
-+ long[] ids = new long [fields.Count];
-+ for (int i = 0; i < fields.Count; ++i)
-+ ids [i] = fields [i].Id;
-+ try {
-+ vm.conn.Type_SetValues (id, ids, vm.EncodeValues (values));
-+ } catch (CommandException ex) {
-+ if (ex.ErrorCode == ErrorCode.INVALID_FIELDID)
-+ throw new ArgumentException ("One of the fields is not valid for this type.", "fields");
-+ else
-+ throw;
-+ }
-+ }
-+
-+ public void SetValue (FieldInfoMirror field, Value value) {
-+ SetValues (new FieldInfoMirror [] { field }, new Value [] { value });
-+ }
-+
-+ public ObjectMirror GetTypeObject () {
-+ return vm.GetObject (vm.conn.Type_GetObject (id));
-+ }
-+
-+ /*
-+ * Return a list of source files without path info, where methods of
-+ * this type are defined. Return an empty list if the information is not
-+ * available.
-+ * This can be used by a debugger to find out which types occur in a
-+ * given source file, to filter the list of methods whose locations
-+ * have to be checked when placing breakpoints.
-+ */
-+ public string[] GetSourceFiles () {
-+ return GetSourceFiles (false);
-+ }
-+
-+ public string[] GetSourceFiles (bool return_full_paths) {
-+ return vm.conn.Type_GetSourceFiles (id, return_full_paths);
-+ }
-+
-+ public C.TypeDefinition Metadata {
-+ get {
-+ if (meta == null) {
-+ if (Assembly.Metadata == null || MetadataToken == 0)
-+ return null;
-+ meta = (C.TypeDefinition)Assembly.Metadata.MainModule.LookupByToken (new MetadataToken (MetadataToken));
-+ }
-+ return meta;
-+ }
-+ }
-+
-+ TypeInfo GetInfo () {
-+ if (info == null)
-+ info = vm.conn.Type_GetInfo (id);
-+ return info;
-+ }
-+
-+ protected virtual TypeAttributes GetAttributeFlagsImpl () {
-+ return (TypeAttributes)GetInfo ().attributes;
-+ }
-+
-+ protected virtual bool HasElementTypeImpl () {
-+ return IsArray || IsByRef || IsPointer;
-+ }
-+
-+ protected virtual bool IsArrayImpl () {
-+ return GetInfo ().rank > 0;
-+ }
-+
-+ protected virtual bool IsByRefImpl () {
-+ return GetInfo ().is_byref;
-+ }
-+
-+ protected virtual bool IsCOMObjectImpl () {
-+ return false;
-+ }
-+
-+ protected virtual bool IsPointerImpl () {
-+ return GetInfo ().is_pointer;
-+ }
-+
-+ protected virtual bool IsPrimitiveImpl () {
-+ return GetInfo ().is_primitive;
-+ }
-+
-+ protected virtual bool IsValueTypeImpl ()
-+ {
-+ return GetInfo ().is_valuetype;
-+ }
-+
-+ protected virtual bool IsContextfulImpl ()
-+ {
-+ // FIXME:
-+ return false;
-+ }
-+
-+ protected virtual bool IsMarshalByRefImpl ()
-+ {
-+ // FIXME:
-+ return false;
-+ }
-+
-+ // Same as Enum.GetUnderlyingType ()
-+ public TypeMirror EnumUnderlyingType {
-+ get {
-+ if (!IsEnum)
-+ throw new ArgumentException ("Type is not an enum type.");
-+ foreach (FieldInfoMirror f in GetFields ()) {
-+ if (!f.IsStatic)
-+ return f.FieldType;
-+ }
-+ throw new NotImplementedException ();
-+ }
-+ }
-+
-+ /*
-+ * Creating the custom attributes themselves could modify the behavior of the
-+ * debuggee, so we return objects similar to the CustomAttributeData objects
-+ * used by the reflection-only functionality on .net.
-+ */
-+ public CustomAttributeDataMirror[] GetCustomAttributes (bool inherit) {
-+ return GetCAttrs (null, inherit);
-+ }
-+
-+ public CustomAttributeDataMirror[] GetCustomAttributes (TypeMirror attributeType, bool inherit) {
-+ if (attributeType == null)
-+ throw new ArgumentNullException ("attributeType");
-+ return GetCAttrs (attributeType, inherit);
-+ }
-+
-+ CustomAttributeDataMirror[] GetCAttrs (TypeMirror type, bool inherit) {
-+ // FIXME: Handle inherit
-+ if (cattrs == null) {
-+ CattrInfo[] info = vm.conn.Type_GetCustomAttributes (id, 0, false);
-+ cattrs = CustomAttributeDataMirror.Create (vm, info);
-+ }
-+ var res = new List<CustomAttributeDataMirror> ();
-+ foreach (var attr in cattrs)
-+ if (type == null || attr.Constructor.DeclaringType == type)
-+ res.Add (attr);
-+ return res.ToArray ();
-+ }
-+
-+ public Value InvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments) {
-+ return ObjectMirror.InvokeMethod (vm, thread, method, null, arguments, InvokeOptions.None);
-+ }
-+
-+ public Value InvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options) {
-+ return ObjectMirror.InvokeMethod (vm, thread, method, null, arguments, options);
-+ }
-+
-+ [Obsolete ("Use the overload without the 'vm' argument")]
-+ public IAsyncResult BeginInvokeMethod (VirtualMachine vm, ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options, AsyncCallback callback, object state) {
-+ return ObjectMirror.BeginInvokeMethod (vm, thread, method, null, arguments, options, callback, state);
-+ }
-+
-+ public IAsyncResult BeginInvokeMethod (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options, AsyncCallback callback, object state) {
-+ return ObjectMirror.BeginInvokeMethod (vm, thread, method, null, arguments, options, callback, state);
-+ }
-+
-+ public Value EndInvokeMethod (IAsyncResult asyncResult) {
-+ return ObjectMirror.EndInvokeMethodInternal (asyncResult);
-+ }
-+
-+ public Value NewInstance (ThreadMirror thread, MethodMirror method, IList<Value> arguments) {
-+ return ObjectMirror.InvokeMethod (vm, thread, method, null, arguments, InvokeOptions.None);
-+ }
-+
-+ public Value NewInstance (ThreadMirror thread, MethodMirror method, IList<Value> arguments, InvokeOptions options) {
-+ return ObjectMirror.InvokeMethod (vm, thread, method, null, arguments, options);
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMDeathEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMDeathEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class VMDeathEvent : Event
-+ {
-+ public VMDeathEvent (VirtualMachine vm, int req_id) : base (EventType.VMDeath, vm, req_id, -1) {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMDisconnectEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMDisconnectEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class VMDisconnectEvent : Event
-+ {
-+ public VMDisconnectEvent (VirtualMachine vm, int req_id) : base (EventType.VMDisconnect, vm, req_id, -1) {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMDisconnectedException.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMDisconnectedException.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class VMDisconnectedException : Exception {
-+
-+ public VMDisconnectedException () : base () {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMMismatchException.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMMismatchException.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class VMMismatchException : Exception
-+ {
-+ public VMMismatchException () : base () {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMStartEvent.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VMStartEvent.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,10 @@
-+using System;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class VMStartEvent : Event
-+ {
-+ public VMStartEvent (VirtualMachine vm, int req_id, long thread_id) : base (EventType.VMStart, vm, req_id, thread_id) {
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Value.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Value.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,14 @@
-+using System;
-+using System.Collections.Generic;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public abstract class Value : Mirror {
-+
-+ // FIXME: Add a 'Value' field
-+
-+ internal Value (VirtualMachine vm, long id) : base (vm, id) {
-+ }
-+ }
-+}
-+
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VirtualMachine.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VirtualMachine.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,571 @@
-+using System;
-+using System.IO;
-+using System.Threading;
-+using System.Net;
-+using System.Diagnostics;
-+using System.Collections;
-+using System.Collections.Generic;
-+using Mono.Cecil.Metadata;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class VirtualMachine : Mirror
-+ {
-+ Queue queue;
-+ object queue_monitor;
-+ object startup_monitor;
-+ AppDomainMirror root_domain;
-+ Dictionary<int, EventRequest> requests;
-+ ITargetProcess process;
-+
-+ internal Connection conn;
-+
-+ VersionInfo version;
-+
-+ internal VirtualMachine (ITargetProcess process, Connection conn) : base () {
-+ SetVirtualMachine (this);
-+ queue = new Queue ();
-+ queue_monitor = new Object ();
-+ startup_monitor = new Object ();
-+ requests = new Dictionary <int, EventRequest> ();
-+ this.conn = conn;
-+ this.process = process;
-+ conn.ErrorHandler += ErrorHandler;
-+ }
-+
-+ // The standard output of the process is available normally through Process
-+ public StreamReader StandardOutput { get; set; }
-+ public StreamReader StandardError { get; set; }
-+
-+
-+ public Process Process {
-+ get {
-+ ProcessWrapper pw = process as ProcessWrapper;
-+ if (pw == null)
-+ throw new InvalidOperationException ("Process instance not available");
-+ return pw.Process;
-+ }
-+ }
-+
-+ public ITargetProcess TargetProcess {
-+ get {
-+ return process;
-+ }
-+ }
-+
-+ public AppDomainMirror RootDomain {
-+ get {
-+ return root_domain;
-+ }
-+ }
-+
-+ public EndPoint EndPoint {
-+ get {
-+ return conn.EndPoint;
-+ }
-+ }
-+
-+ public VersionInfo Version {
-+ get {
-+ return version;
-+ }
-+ }
-+
-+ public Event GetNextEvent () {
-+ lock (queue_monitor) {
-+ if (queue.Count == 0)
-+ Monitor.Wait (queue_monitor);
-+ return (Event)queue.Dequeue ();
-+ }
-+ }
-+
-+ public Event GetNextEvent (int timeout) {
-+ throw new NotImplementedException ();
-+ }
-+
-+ public T GetNextEvent<T> () where T : Event {
-+ return GetNextEvent () as T;
-+ }
-+
-+ public void Suspend () {
-+ conn.VM_Suspend ();
-+ }
-+
-+ public void Resume () {
-+ try {
-+ conn.VM_Resume ();
-+ } catch (CommandException ex) {
-+ if (ex.ErrorCode == ErrorCode.NOT_SUSPENDED)
-+ throw new InvalidOperationException ("The vm is not suspended.");
-+ else
-+ throw;
-+ }
-+ }
-+
-+ public void Exit (int exitCode) {
-+ conn.VM_Exit (exitCode);
-+ }
-+
-+ public void Dispose () {
-+ conn.VM_Dispose ();
-+ conn.Close ();
-+ notify_vm_event (EventType.VMDisconnect, 0, 0, null);
-+ }
-+
-+ public IList<ThreadMirror> GetThreads () {
-+ long[] ids = vm.conn.VM_GetThreads ();
-+ ThreadMirror[] res = new ThreadMirror [ids.Length];
-+ for (int i = 0; i < ids.Length; ++i)
-+ res [i] = GetThread (ids [i]);
-+ return res;
-+ }
-+
-+ // Same as the mirrorOf methods in JDI
-+ public PrimitiveValue CreateValue (object value) {
-+ if (value == null)
-+ return new PrimitiveValue (vm, null);
-+
-+ if (!value.GetType ().IsPrimitive)
-+ throw new ArgumentException ("value must be of a primitive type instead of '" + value.GetType () + "'", "value");
-+
-+ return new PrimitiveValue (vm, value);
-+ }
-+
-+ public EnumMirror CreateEnumMirror (TypeMirror type, PrimitiveValue value) {
-+ return new EnumMirror (this, type, value);
-+ }
-+
-+ //
-+ // Methods to create event request objects
-+ //
-+ public BreakpointEventRequest CreateBreakpointRequest (MethodMirror method, long il_offset) {
-+ return new BreakpointEventRequest (this, method, il_offset);
-+ }
-+
-+ public BreakpointEventRequest CreateBreakpointRequest (Location loc) {
-+ if (loc == null)
-+ throw new ArgumentNullException ("loc");
-+ CheckMirror (loc);
-+ return new BreakpointEventRequest (this, loc.Method, loc.ILOffset);
-+ }
-+
-+ public StepEventRequest CreateStepRequest (ThreadMirror thread) {
-+ return new StepEventRequest (this, thread);
-+ }
-+
-+ public MethodEntryEventRequest CreateMethodEntryRequest () {
-+ return new MethodEntryEventRequest (this);
-+ }
-+
-+ public MethodExitEventRequest CreateMethodExitRequest () {
-+ return new MethodExitEventRequest (this);
-+ }
-+
-+ public ExceptionEventRequest CreateExceptionRequest (TypeMirror exc_type) {
-+ return new ExceptionEventRequest (this, exc_type, true, true);
-+ }
-+
-+ public ExceptionEventRequest CreateExceptionRequest (TypeMirror exc_type, bool caught, bool uncaught) {
-+ return new ExceptionEventRequest (this, exc_type, caught, uncaught);
-+ }
-+
-+ public void EnableEvents (params EventType[] events) {
-+ foreach (EventType etype in events)
-+ conn.EnableEvent (etype, SuspendPolicy.All, null);
-+ }
-+
-+ public BreakpointEventRequest SetBreakpoint (MethodMirror method, long il_offset) {
-+ BreakpointEventRequest req = CreateBreakpointRequest (method, il_offset);
-+
-+ req.Enable ();
-+
-+ return req;
-+ }
-+
-+ public void ClearAllBreakpoints () {
-+ conn.ClearAllBreakpoints ();
-+ }
-+
-+ internal void queue_event (Event e) {
-+ lock (queue_monitor) {
-+ queue.Enqueue (e);
-+ Monitor.Pulse (queue_monitor);
-+ }
-+ }
-+
-+ internal void ErrorHandler (object sender, ErrorHandlerEventArgs args) {
-+ switch (args.ErrorCode) {
-+ case ErrorCode.INVALID_OBJECT:
-+ throw new ObjectCollectedException ();
-+ case ErrorCode.INVALID_FRAMEID:
-+ throw new InvalidStackFrameException ();
-+ case ErrorCode.NOT_SUSPENDED:
-+ throw new InvalidOperationException ("The vm is not suspended.");
-+ case ErrorCode.NOT_IMPLEMENTED:
-+ throw new NotSupportedException ("This request is not supported by the protocol version implemented by the debuggee.");
-+ case ErrorCode.ABSENT_INFORMATION:
-+ throw new AbsentInformationException ();
-+ default:
-+ throw new CommandException (args.ErrorCode);
-+ }
-+ }
-+
-+ /* Wait for the debuggee to start up and connect to it */
-+ internal void connect () {
-+ conn.Connect ();
-+
-+ // Test the connection
-+ version = conn.Version;
-+ if (version.MajorVersion != Connection.MAJOR_VERSION)
-+ throw new NotSupportedException (String.Format ("The debuggee implements protocol version {0}.{1}, while {2}.{3} is required.", version.MajorVersion, version.MinorVersion, Connection.MAJOR_VERSION, Connection.MINOR_VERSION));
-+
-+ long root_domain_id = conn.RootDomain;
-+ root_domain = GetDomain (root_domain_id);
-+ }
-+
-+ internal void notify_vm_event (EventType evtype, int req_id, long thread_id, string vm_uri) {
-+ //Console.WriteLine ("Event: " + evtype + "(" + vm_uri + ")");
-+
-+ switch (evtype) {
-+ case EventType.VMStart:
-+ /* Notify the main thread that the debuggee started up */
-+ lock (startup_monitor) {
-+ Monitor.Pulse (startup_monitor);
-+ }
-+ queue_event (new VMStartEvent (vm, req_id, thread_id));
-+ break;
-+ case EventType.VMDeath:
-+ queue_event (new VMDeathEvent (vm, req_id));
-+ break;
-+ case EventType.VMDisconnect:
-+ queue_event (new VMDisconnectEvent (vm, req_id));
-+ break;
-+ default:
-+ throw new Exception ();
-+ }
-+ }
-+
-+ //
-+ // Methods to create instances of mirror objects
-+ //
-+
-+ /*
-+ class MirrorCache<T> {
-+ static Dictionary <long, T> mirrors;
-+ static object mirror_lock = new object ();
-+
-+ internal static T GetMirror (VirtualMachine vm, long id) {
-+ lock (mirror_lock) {
-+ if (mirrors == null)
-+ mirrors = new Dictionary <long, T> ();
-+ T obj;
-+ if (!mirrors.TryGetValue (id, out obj)) {
-+ obj = CreateMirror (vm, id);
-+ mirrors [id] = obj;
-+ }
-+ return obj;
-+ }
-+ }
-+
-+ internal static T CreateMirror (VirtualMachine vm, long id) {
-+ }
-+ }
-+ */
-+
-+ // FIXME: When to remove items from the cache ?
-+
-+ Dictionary <long, MethodMirror> methods;
-+ object methods_lock = new object ();
-+
-+ internal MethodMirror GetMethod (long id) {
-+ lock (methods_lock) {
-+ if (methods == null)
-+ methods = new Dictionary <long, MethodMirror> ();
-+ MethodMirror obj;
-+ if (id == 0)
-+ return null;
-+ if (!methods.TryGetValue (id, out obj)) {
-+ obj = new MethodMirror (this, id);
-+ methods [id] = obj;
-+ }
-+ return obj;
-+ }
-+ }
-+
-+ Dictionary <long, AssemblyMirror> assemblies;
-+ object assemblies_lock = new object ();
-+
-+ internal AssemblyMirror GetAssembly (long id) {
-+ lock (assemblies_lock) {
-+ if (assemblies == null)
-+ assemblies = new Dictionary <long, AssemblyMirror> ();
-+ AssemblyMirror obj;
-+ if (id == 0)
-+ return null;
-+ if (!assemblies.TryGetValue (id, out obj)) {
-+ obj = new AssemblyMirror (this, id);
-+ assemblies [id] = obj;
-+ }
-+ return obj;
-+ }
-+ }
-+
-+ Dictionary <long, ModuleMirror> modules;
-+ object modules_lock = new object ();
-+
-+ internal ModuleMirror GetModule (long id) {
-+ lock (modules_lock) {
-+ if (modules == null)
-+ modules = new Dictionary <long, ModuleMirror> ();
-+ ModuleMirror obj;
-+ if (id == 0)
-+ return null;
-+ if (!modules.TryGetValue (id, out obj)) {
-+ obj = new ModuleMirror (this, id);
-+ modules [id] = obj;
-+ }
-+ return obj;
-+ }
-+ }
-+
-+ Dictionary <long, AppDomainMirror> domains;
-+ object domains_lock = new object ();
-+
-+ internal AppDomainMirror GetDomain (long id) {
-+ lock (domains_lock) {
-+ if (domains == null)
-+ domains = new Dictionary <long, AppDomainMirror> ();
-+ AppDomainMirror obj;
-+ if (id == 0)
-+ return null;
-+ if (!domains.TryGetValue (id, out obj)) {
-+ obj = new AppDomainMirror (this, id);
-+ domains [id] = obj;
-+ }
-+ return obj;
-+ }
-+ }
-+
-+ Dictionary <long, TypeMirror> types;
-+ object types_lock = new object ();
-+
-+ internal TypeMirror GetType (long id) {
-+ lock (types_lock) {
-+ if (types == null)
-+ types = new Dictionary <long, TypeMirror> ();
-+ TypeMirror obj;
-+ if (id == 0)
-+ return null;
-+ if (!types.TryGetValue (id, out obj)) {
-+ obj = new TypeMirror (this, id);
-+ types [id] = obj;
-+ }
-+ return obj;
-+ }
-+ }
-+
-+ Dictionary <long, ObjectMirror> objects;
-+ object objects_lock = new object ();
-+
-+ internal T GetObject<T> (long id, long domain_id, long type_id) where T : ObjectMirror {
-+ lock (objects_lock) {
-+ if (objects == null)
-+ objects = new Dictionary <long, ObjectMirror> ();
-+ ObjectMirror obj;
-+ if (!objects.TryGetValue (id, out obj)) {
-+ /*
-+ * Obtain the domain/type of the object to determine the type of
-+ * object we need to create.
-+ */
-+ if (domain_id == 0)
-+ domain_id = conn.Object_GetDomain (id);
-+ AppDomainMirror d = GetDomain (domain_id);
-+
-+ if (type_id == 0)
-+ type_id = conn.Object_GetType (id);
-+ TypeMirror t = GetType (type_id);
-+
-+ if (t.Assembly == d.Corlib && t.Namespace == "System.Threading" && t.Name == "Thread")
-+ obj = new ThreadMirror (this, id);
-+ else if (t.Assembly == d.Corlib && t.Namespace == "System" && t.Name == "String")
-+ obj = new StringMirror (this, id);
-+ else if (typeof (T) == typeof (ArrayMirror))
-+ obj = new ArrayMirror (this, id);
-+ else
-+ obj = new ObjectMirror (this, id);
-+ objects [id] = obj;
-+ }
-+ return (T)obj;
-+ }
-+ }
-+
-+ internal T GetObject<T> (long id) where T : ObjectMirror {
-+ return GetObject<T> (id, 0, 0);
-+ }
-+
-+ internal ObjectMirror GetObject (long objid) {
-+ return GetObject<ObjectMirror> (objid);
-+ }
-+
-+ internal ThreadMirror GetThread (long id) {
-+ return GetObject <ThreadMirror> (id);
-+ }
-+
-+ object requests_lock = new object ();
-+
-+ internal void AddRequest (EventRequest req, int id) {
-+ lock (requests_lock) {
-+ requests [id] = req;
-+ }
-+ }
-+
-+ internal void RemoveRequest (EventRequest req, int id) {
-+ lock (requests_lock) {
-+ requests.Remove (id);
-+ }
-+ }
-+
-+ internal EventRequest GetRequest (int id) {
-+ lock (requests_lock) {
-+ return requests [id];
-+ }
-+ }
-+
-+ internal Value DecodeValue (ValueImpl v) {
-+ if (v.Value != null)
-+ return new PrimitiveValue (this, v.Value);
-+
-+ switch (v.Type) {
-+ case ElementType.Void:
-+ return null;
-+ case ElementType.SzArray:
-+ case ElementType.Array:
-+ return GetObject<ArrayMirror> (v.Objid);
-+ case ElementType.String:
-+ return GetObject<StringMirror> (v.Objid);
-+ case ElementType.Class:
-+ case ElementType.Object:
-+ return GetObject (v.Objid);
-+ case ElementType.ValueType:
-+ if (v.IsEnum)
-+ return new EnumMirror (this, GetType (v.Klass), DecodeValues (v.Fields));
-+ else
-+ return new StructMirror (this, GetType (v.Klass), DecodeValues (v.Fields));
-+ case (ElementType)ValueTypeId.VALUE_TYPE_ID_NULL:
-+ return new PrimitiveValue (this, null);
-+ default:
-+ throw new NotImplementedException ("" + v.Type);
-+ }
-+ }
-+
-+ internal Value[] DecodeValues (ValueImpl[] values) {
-+ Value[] res = new Value [values.Length];
-+ for (int i = 0; i < values.Length; ++i)
-+ res [i] = DecodeValue (values [i]);
-+ return res;
-+ }
-+
-+ internal ValueImpl EncodeValue (Value v) {
-+ if (v is PrimitiveValue) {
-+ object val = (v as PrimitiveValue).Value;
-+ if (val == null)
-+ return new ValueImpl { Type = (ElementType)ValueTypeId.VALUE_TYPE_ID_NULL, Objid = 0 };
-+ else
-+ return new ValueImpl { Value = val };
-+ } else if (v is ObjectMirror) {
-+ return new ValueImpl { Type = ElementType.Object, Objid = (v as ObjectMirror).Id };
-+ } else if (v is StructMirror) {
-+ return new ValueImpl { Type = ElementType.ValueType, Klass = (v as StructMirror).Type.Id, Fields = EncodeValues ((v as StructMirror).Fields) };
-+ } else {
-+ throw new NotSupportedException ();
-+ }
-+ }
-+
-+ internal ValueImpl[] EncodeValues (IList<Value> values) {
-+ ValueImpl[] res = new ValueImpl [values.Count];
-+ for (int i = 0; i < values.Count; ++i)
-+ res [i] = EncodeValue (values [i]);
-+ return res;
-+ }
-+ }
-+
-+ class EventHandler : MarshalByRefObject, IEventHandler
-+ {
-+ VirtualMachine vm;
-+
-+ public EventHandler (VirtualMachine vm) {
-+ this.vm = vm;
-+ }
-+
-+ public void VMStart (int req_id, long thread_id, string vm_uri) {
-+ vm.notify_vm_event (EventType.VMStart, req_id, thread_id, vm_uri);
-+ }
-+
-+ public void VMDeath (int req_id, long thread_id, string vm_uri) {
-+ vm.notify_vm_event (EventType.VMDeath, req_id, thread_id, vm_uri);
-+ }
-+
-+ public void VMDisconnect (int req_id, long thread_id, string vm_uri) {
-+ vm.notify_vm_event (EventType.VMDisconnect, req_id, thread_id, vm_uri);
-+ }
-+
-+ public void ThreadStart (int req_id, long thread_id, long id) {
-+ vm.queue_event (new ThreadStartEvent (vm, req_id, id));
-+ }
-+
-+ public void ThreadDeath (int req_id, long thread_id, long id) {
-+ vm.queue_event (new ThreadDeathEvent (vm, req_id, id));
-+ }
-+
-+ public void AssemblyLoad (int req_id, long thread_id, long id) {
-+ vm.queue_event (new AssemblyLoadEvent (vm, req_id, thread_id, id));
-+ }
-+
-+ public void AssemblyUnload (int req_id, long thread_id, long id) {
-+ vm.queue_event (new AssemblyUnloadEvent (vm, req_id, thread_id, id));
-+ }
-+
-+ public void TypeLoad (int req_id, long thread_id, long id) {
-+ vm.queue_event (new TypeLoadEvent (vm, req_id, thread_id, id));
-+ }
-+
-+ public void MethodEntry (int req_id, long thread_id, long id) {
-+ vm.queue_event (new MethodEntryEvent (vm, req_id, thread_id, id));
-+ }
-+
-+ public void MethodExit (int req_id, long thread_id, long id) {
-+ vm.queue_event (new MethodExitEvent (vm, req_id, thread_id, id));
-+ }
-+
-+ public void Breakpoint (int req_id, long thread_id, long id, long loc) {
-+ vm.queue_event (new BreakpointEvent (vm, req_id, thread_id, id, loc));
-+ }
-+
-+ public void Step (int req_id, long thread_id, long id, long loc) {
-+ vm.queue_event (new StepEvent (vm, req_id, thread_id, id, loc));
-+ }
-+
-+ public void Exception (int req_id, long thread_id, long id, long loc) {
-+ vm.queue_event (new ExceptionEvent (vm, req_id, thread_id, id, loc));
-+ }
-+
-+ public void AppDomainCreate (int req_id, long thread_id, long id) {
-+ vm.queue_event (new AppDomainCreateEvent (vm, req_id, thread_id, id));
-+ }
-+
-+ public void AppDomainUnload (int req_id, long thread_id, long id) {
-+ vm.queue_event (new AppDomainUnloadEvent (vm, req_id, thread_id, id));
-+ }
-+ }
-+
-+ internal class CommandException : Exception {
-+
-+ public CommandException (ErrorCode error_code) : base ("Debuggee returned error code " + error_code + ".") {
-+ ErrorCode = error_code;
-+ }
-+
-+ public ErrorCode ErrorCode {
-+ get; set;
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VirtualMachineManager.cs
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/VirtualMachineManager.cs 2010-06-16 12:45:23.071079918 +0100
-@@ -0,0 +1,239 @@
-+using System;
-+using System.Collections.Generic;
-+using System.Diagnostics;
-+using System.IO;
-+using System.Net;
-+using System.Net.Sockets;
-+using System.Runtime.Remoting.Messaging;
-+
-+namespace Mono.Debugger.Soft
-+{
-+ public class LaunchOptions {
-+ public string AgentArgs {
-+ get; set;
-+ }
-+
-+ public bool Valgrind {
-+ get; set;
-+ }
-+
-+ public ProcessLauncher CustomProcessLauncher {
-+ get; set;
-+ }
-+
-+ public TargetProcessLauncher CustomTargetProcessLauncher {
-+ get; set;
-+ }
-+
-+ public delegate Process ProcessLauncher (ProcessStartInfo info);
-+ public delegate ITargetProcess TargetProcessLauncher (ProcessStartInfo info);
-+ }
-+
-+ public class VirtualMachineManager
-+ {
-+ private delegate VirtualMachine LaunchCallback (ITargetProcess p, ProcessStartInfo info, Socket socket);
-+ private delegate VirtualMachine ListenCallback (Socket dbg_sock, Socket con_sock);
-+
-+ internal VirtualMachineManager () {
-+ }
-+
-+ public static VirtualMachine LaunchInternal (Process p, ProcessStartInfo info, Socket socket)
-+ {
-+ return LaunchInternal (new ProcessWrapper (p), info, socket);
-+ }
-+
-+ public static VirtualMachine LaunchInternal (ITargetProcess p, ProcessStartInfo info, Socket socket) {
-+ Socket accepted = null;
-+ try {
-+ accepted = socket.Accept ();
-+ } catch (Exception) {
-+ throw;
-+ }
-+
-+ Connection conn = new Connection (accepted);
-+
-+ VirtualMachine vm = new VirtualMachine (p, conn);
-+
-+ if (info.RedirectStandardOutput)
-+ vm.StandardOutput = p.StandardOutput;
-+
-+ if (info.RedirectStandardError)
-+ vm.StandardError = p.StandardError;
-+
-+ conn.EventHandler = new EventHandler (vm);
-+
-+ vm.connect ();
-+
-+ return vm;
-+ }
-+
-+ public static IAsyncResult BeginLaunch (ProcessStartInfo info, AsyncCallback callback, LaunchOptions options = null) {
-+ if (info == null)
-+ throw new ArgumentNullException ("info");
-+
-+ Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-+ socket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
-+ socket.Listen (1000);
-+ IPEndPoint ep = (IPEndPoint) socket.LocalEndPoint;
-+
-+ // We need to inject our arguments into the psi
-+ info.Arguments = string.Format ("{0} --debug --debugger-agent=transport=dt_socket,address={1}:{2}{3} {4}",
-+ options == null || !options.Valgrind ? "" : info.FileName,
-+ ep.Address,
-+ ep.Port,
-+ options == null || options.AgentArgs == null ? "" : "," + options.AgentArgs,
-+ info.Arguments);
-+
-+ if (options != null && options.Valgrind)
-+ info.FileName = "valgrind";
-+
-+ ITargetProcess p;
-+ if (options != null && options.CustomProcessLauncher != null)
-+ p = new ProcessWrapper (options.CustomProcessLauncher (info));
-+ else if (options != null && options.CustomTargetProcessLauncher != null)
-+ p = options.CustomTargetProcessLauncher (info);
-+ else
-+ p = new ProcessWrapper (Process.Start (info));
-+
-+ p.Exited += delegate (object sender, EventArgs eargs) {
-+ socket.Close ();
-+ };
-+
-+ LaunchCallback c = new LaunchCallback (LaunchInternal);
-+ return c.BeginInvoke (p, info, socket, callback, socket);
-+ }
-+
-+ public static VirtualMachine EndLaunch (IAsyncResult asyncResult) {
-+ if (asyncResult == null)
-+ throw new ArgumentNullException ("asyncResult");
-+
-+ if (!asyncResult.IsCompleted)
-+ asyncResult.AsyncWaitHandle.WaitOne ();
-+
-+ AsyncResult async = (AsyncResult) asyncResult;
-+ LaunchCallback cb = (LaunchCallback) async.AsyncDelegate;
-+ return cb.EndInvoke (asyncResult);
-+ }
-+
-+ public static VirtualMachine Launch (ProcessStartInfo info, LaunchOptions options = null) {
-+ return EndLaunch (BeginLaunch (info, null, options));
-+ }
-+
-+ public static VirtualMachine Launch (string[] args, LaunchOptions options = null) {
-+ ProcessStartInfo pi = new ProcessStartInfo ("mono");
-+ pi.Arguments = String.Join (" ", args);
-+
-+ return Launch (pi, options);
-+ }
-+
-+ public static VirtualMachine ListenInternal (Socket dbg_sock, Socket con_sock) {
-+ Socket con_acc = null;
-+ Socket dbg_acc = null;
-+
-+ if (con_sock != null) {
-+ try {
-+ con_acc = con_sock.Accept ();
-+ } catch (Exception) {
-+ try {
-+ dbg_sock.Close ();
-+ } catch {}
-+ throw;
-+ }
-+ }
-+
-+ try {
-+ dbg_acc = dbg_sock.Accept ();
-+ } catch (Exception) {
-+ if (con_sock != null) {
-+ try {
-+ con_sock.Close ();
-+ con_acc.Close ();
-+ } catch {}
-+ }
-+ throw;
-+ }
-+
-+ if (con_sock != null) {
-+ con_sock.Disconnect (false);
-+ con_sock.Close ();
-+ }
-+
-+ dbg_sock.Disconnect (false);
-+ dbg_sock.Close ();
-+
-+ Connection conn = new Connection (dbg_acc);
-+
-+ VirtualMachine vm = new VirtualMachine (null, conn);
-+
-+ if (con_acc != null) {
-+ vm.StandardOutput = new StreamReader (new NetworkStream (con_acc));
-+ vm.StandardError = null;
-+ }
-+
-+ conn.EventHandler = new EventHandler (vm);
-+
-+ vm.connect ();
-+
-+ return vm;
-+ }
-+
-+ public static IAsyncResult BeginListen (IPEndPoint dbg_ep, AsyncCallback callback) {
-+ return BeginListen (dbg_ep, null, callback);
-+ }
-+
-+ public static IAsyncResult BeginListen (IPEndPoint dbg_ep, IPEndPoint con_ep, AsyncCallback callback) {
-+ Socket dbg_sock = null;
-+ Socket con_sock = null;
-+
-+ dbg_sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-+ dbg_sock.Bind (dbg_ep);
-+ dbg_sock.Listen (1000);
-+
-+ if (con_ep != null) {
-+ con_sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-+ con_sock.Bind (con_ep);
-+ con_sock.Listen (1000);
-+ }
-+
-+ ListenCallback c = new ListenCallback (ListenInternal);
-+ return c.BeginInvoke (dbg_sock, con_sock, callback, con_sock ?? dbg_sock);
-+ }
-+
-+ public static VirtualMachine EndListen (IAsyncResult asyncResult) {
-+ if (asyncResult == null)
-+ throw new ArgumentNullException ("asyncResult");
-+
-+ if (!asyncResult.IsCompleted)
-+ asyncResult.AsyncWaitHandle.WaitOne ();
-+
-+ AsyncResult async = (AsyncResult) asyncResult;
-+ ListenCallback cb = (ListenCallback) async.AsyncDelegate;
-+ return cb.EndInvoke (asyncResult);
-+ }
-+
-+ public static VirtualMachine Listen (IPEndPoint dbg_ep, IPEndPoint con_ep = null) {
-+ return EndListen (BeginListen (dbg_ep, con_ep, null));
-+ }
-+
-+ /*
-+ * Connect to a virtual machine listening at the specified address.
-+ */
-+ public static VirtualMachine Connect (IPEndPoint endpoint) {
-+ if (endpoint == null)
-+ throw new ArgumentNullException ("endpoint");
-+
-+ Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-+ socket.Connect (endpoint);
-+
-+ Connection conn = new Connection (socket);
-+
-+ VirtualMachine vm = new VirtualMachine (null, conn);
-+
-+ conn.EventHandler = new EventHandler (vm);
-+
-+ vm.connect ();
-+
-+ return vm;
-+ }
-+ }
-+}
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Makefile.am
-===================================================================
---- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/Makefile.am 2010-06-16 12:45:20.441071007 +0100
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Makefile.am 2010-06-16 12:45:23.071079918 +0100
-@@ -1,4 +1,5 @@
- SUBDIRS = \
-+ Mono.Debugger.Soft \
- Mono.Debugging.Soft \
- MonoDevelop.Debugger.Soft \
- MonoDevelop.Debugger.Soft.AspNet \
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Makefile.am
-===================================================================
---- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Makefile.am 2010-06-16 12:46:05.430171228 +0100
-@@ -0,0 +1,106 @@
-+ADDIN_BUILD = $(top_builddir)/build/AddIns/MonoDevelop.Debugger.Soft
-+ASSEMBLY = $(ADDIN_BUILD)/Mono.Debugger.Soft.dll
-+
-+SIGNING_KEY=$(top_srcdir)/src/core/Mono.Debugging/mono.debugging.snk
-+
-+CECIL_ASM_SRC = /usr/lib/mono-cecil/Mono.Cecil.dll
-+CECIL_ASM = $(ADDIN_BUILD)/Mono.Cecil.dll
-+
-+REFS = \
-+ -r:System \
-+ -r:System.Core \
-+ -r:/usr/lib/mono-cecil/Mono.Cecil.dll
-+
-+FILES = \
-+ AbsentInformationException.cs \
-+ AppDomainCreateEvent.cs \
-+ AppDomainMirror.cs \
-+ AppDomainUnloadEvent.cs \
-+ ArrayMirror.cs \
-+ AssemblyLoadEvent.cs \
-+ AssemblyMirror.cs \
-+ AssemblyUnloadEvent.cs \
-+ BreakpointEvent.cs \
-+ BreakpointEventRequest.cs \
-+ Connection.cs \
-+ CustomAttributeDataMirror.cs \
-+ CustomAttributeNamedArgumentMirror.cs \
-+ CustomAttributeTypedArgumentMirror.cs \
-+ DataConverter.cs \
-+ EnumMirror.cs \
-+ Event.cs \
-+ EventQueueImpl.cs \
-+ EventRequest.cs \
-+ EventType.cs \
-+ ExceptionEvent.cs \
-+ ExceptionEventRequest.cs \
-+ FieldInfoMirror.cs \
-+ IInvokeAsyncResult.cs \
-+ ILInstruction.cs \
-+ IMirror.cs \
-+ InvalidStackFrameException.cs \
-+ InvocationException.cs \
-+ InvokeOptions.cs \
-+ ITargetProcess.cs \
-+ LocalVariable.cs \
-+ Location.cs \
-+ MethodBodyMirror.cs \
-+ MethodEntryEvent.cs \
-+ MethodEntryEventRequest.cs \
-+ MethodExitEvent.cs \
-+ MethodExitEventRequest.cs \
-+ MethodMirror.cs \
-+ Mirror.cs \
-+ ModuleMirror.cs \
-+ ObjectCollectedException.cs \
-+ ObjectMirror.cs \
-+ ParameterInfoMirror.cs \
-+ PrimitiveValue.cs \
-+ PropertyInfoMirror.cs \
-+ StackFrame.cs \
-+ StepEvent.cs \
-+ StepEventRequest.cs \
-+ StringMirror.cs \
-+ StructMirror.cs \
-+ SuspendPolicy.cs \
-+ ThreadDeathEvent.cs \
-+ ThreadMirror.cs \
-+ ThreadStartEvent.cs \
-+ TypeLoadEvent.cs \
-+ TypeMirror.cs \
-+ Value.cs \
-+ VirtualMachine.cs \
-+ VirtualMachineManager.cs \
-+ VMDeathEvent.cs \
-+ VMDisconnectedException.cs \
-+ VMDisconnectEvent.cs \
-+ VMMismatchException.cs \
-+ VMStartEvent.cs
-+
-+RES =
-+
-+CSC_FLAGS = -unsafe -D:MONO_DATACONVERTER_STATIC_METHODS
-+
-+all: $(ASSEMBLY) $(ASSEMBLY).mdb $(DATA_FILE_BUILD) $(SIGNING_KEY)
-+
-+$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS) $(CECIL_ASM)
-+ mkdir -p $(ADDIN_BUILD)
-+ $(CSC) $(CSC_FLAGS) -debug -out:$@ -keyfile:$(SIGNING_KEY) -target:library $(REFS) $(build_deps) \
-+ $(build_resources:%=/resource:%) $(build_sources)
-+
-+$(ASSEMBLY).mdb: $(ASSEMBLY)
-+
-+$(CECIL_ASM): $(CECIL_ASM_SRC)
-+ mkdir -p $(ADDIN_BUILD)
-+ cp $^ $@
-+
-+check: all
-+
-+assemblydir = $(MD_ADDIN_DIR)/MonoDevelop.Debugger.Soft
-+assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb $(CECIL_ASM)
-+
-+CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb
-+EXTRA_DIST = $(FILES) $(RES)
-+
-+include $(top_srcdir)/Makefile.include
-+
-Index: monodevelop.git/configure.in
-===================================================================
---- monodevelop.git.orig/configure.in 2010-06-16 12:45:20.481069734 +0100
-+++ monodevelop.git/configure.in 2010-06-16 12:45:23.071079918 +0100
-@@ -372,6 +372,7 @@
- src/addins/MonoDevelop.Refactoring/Makefile
- src/addins/MonoDevelop.Debugger/Makefile
- src/addins/MonoDevelop.Debugger.Soft/Makefile
-+src/addins/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft/Makefile
- src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Makefile
- src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/Makefile
- src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/Makefile
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Makefile.am
-===================================================================
---- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Makefile.am 2010-06-16 12:45:20.451070531 +0100
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Makefile.am 2010-06-16 12:45:23.071079918 +0100
-@@ -2,16 +2,13 @@
- ASSEMBLY = $(ADDIN_BUILD)/Mono.Debugging.Soft.dll
-
- DBG_ASM = $(ADDIN_BUILD)/Mono.Debugger.Soft.dll
--DBG_ASM_SRC = $(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll
--DBG_MDB = $(DBG_ASM).mdb
--DBG_MDB_SRC = $(DBG_ASM_SRC).mdb
-
- SIGNING_KEY=$(top_srcdir)/src/core/Mono.Debugging/mono.debugging.snk
-
- DEPS = $(top_builddir)/build/bin/Mono.Debugging.dll
-
- REFS = \
-- -r:$(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll \
-+ -r:$(DBG_ASM) \
- -r:System \
- -r:System.Core
-
-@@ -32,28 +29,20 @@
-
- all: $(ASSEMBLY) $(ASSEMBLY).mdb $(DATA_FILE_BUILD) $(SIGNING_KEY)
-
--$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS) $(DBG_ASM) $(DBG_MDB)
-+$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS) $(DBG_ASM)
- mkdir -p $(ADDIN_BUILD)
- $(CSC) $(CSC_FLAGS) -debug -out:$@ -keycontainer:$(SIGNING_KEY) -target:library $(REFS) $(build_deps) \
- $(build_resources:%=/resource:%) $(build_sources)
-
--$(DBG_ASM): $(DBG_ASM_SRC)
-- mkdir -p $(ADDIN_BUILD)
-- cp $^ $@
--
--$(DBG_MDB): $(DBG_MDB_SRC)
-- mkdir -p $(ADDIN_BUILD)
-- cp $^ $@
--
- $(ASSEMBLY).mdb: $(ASSEMBLY)
-
- check: all
-
- assemblydir = $(MD_ADDIN_DIR)/MonoDevelop.Debugger.Soft
--assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb $(DBG_ASM) $(DBG_MDB)
-+assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb
-
--CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb $(DBG_ASM) $(DBG_MDB)
--EXTRA_DIST = $(FILES) $(RES) $(DBG_ASM_SRC) $(DBG_MDB_SRC)
-+CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb
-+EXTRA_DIST = $(FILES) $(RES)
-
- include $(top_srcdir)/Makefile.include
-
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/Makefile.am
-===================================================================
---- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/Makefile.am 2010-06-16 12:45:20.461070893 +0100
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/Makefile.am 2010-06-16 12:45:23.071079918 +0100
-@@ -13,7 +13,7 @@
- REFS = \
- $(GLIB_SHARP_LIBS) \
- $(GTK_SHARP_LIBS) \
-- -r:$(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll \
-+ -r:$(top_builddir)/build/AddIns/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft.dll \
- -r:System \
- -r:System.Core
-
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/Makefile.am
-===================================================================
---- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/Makefile.am 2010-06-16 12:45:20.431080143 +0100
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/Makefile.am 2010-06-16 12:45:23.071079918 +0100
-@@ -14,7 +14,7 @@
- REFS = \
- $(GLIB_SHARP_LIBS) \
- $(GTK_SHARP_LIBS) \
-- -r:$(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll \
-+ -r:$(top_builddir)/build/AddIns/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft.dll \
- -r:System \
- -r:System.Core
-
-Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.Moonlight/Makefile.am
-===================================================================
---- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.Moonlight/Makefile.am 2010-06-16 12:45:19.971079987 +0100
-+++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.Moonlight/Makefile.am 2010-06-16 12:45:23.071079918 +0100
-@@ -14,7 +14,7 @@
- REFS = \
- $(GLIB_SHARP_LIBS) \
- $(GTK_SHARP_LIBS) \
-- -r:$(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll \
-+ -r:$(top_builddir)/build/AddIns/MonoDevelop.Debugger.Soft/Mono.Debugger.Soft.dll \
- -r:System \
- -r:System.Core
-
diff --git a/debian/patches/series b/debian/patches/series
index d32e14b..5a1181d 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,5 +1,5 @@
#stetic_widget_corruption_r144546.patch -p3
-inject_Mono.Debugger.Soft_source.patch
+use_system_Mono.Debugger.Soft.patch
link_system_nunit.patch
use_libsvn1.patch
use_libapr1.patch
diff --git a/debian/patches/use_system_Mono.Debugger.Soft.patch b/debian/patches/use_system_Mono.Debugger.Soft.patch
new file mode 100644
index 0000000..f4d6e8c
--- /dev/null
+++ b/debian/patches/use_system_Mono.Debugger.Soft.patch
@@ -0,0 +1,94 @@
+Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Makefile.am
+===================================================================
+--- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Makefile.am 2010-09-10 19:21:37.624328300 +0100
++++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Makefile.am 2010-09-10 19:48:06.716850531 +0100
+@@ -2,16 +2,14 @@
+ ASSEMBLY = $(ADDIN_BUILD)/Mono.Debugging.Soft.dll
+
+ DBG_ASM = $(ADDIN_BUILD)/Mono.Debugger.Soft.dll
+-DBG_ASM_SRC = $(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll
+-DBG_MDB = $(DBG_ASM).mdb
+-DBG_MDB_SRC = $(DBG_ASM_SRC).mdb
++DBG_ASM_SRC = /usr/lib/mono/2.0/Mono.Debugger.Soft.dll
+
+ SIGNING_KEY=$(top_srcdir)/src/core/Mono.Debugging/mono.debugging.snk
+
+ DEPS = $(top_builddir)/build/bin/Mono.Debugging.dll
+
+ REFS = \
+- -r:$(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll \
++ -r:$(DBG_ASM) \
+ -r:System \
+ -r:System.Core
+
+@@ -32,7 +30,7 @@
+
+ all: $(ASSEMBLY) $(ASSEMBLY).mdb $(DATA_FILE_BUILD) $(SIGNING_KEY)
+
+-$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS) $(DBG_ASM) $(DBG_MDB)
++$(ASSEMBLY): $(build_sources) $(build_resources) $(DEPS) $(DBG_ASM)
+ mkdir -p $(ADDIN_BUILD)
+ $(CSC) $(CSC_FLAGS) -debug -out:$@ -keycontainer:$(SIGNING_KEY) -target:library $(REFS) $(build_deps) \
+ $(build_resources:%=/resource:%) $(build_sources)
+@@ -41,19 +39,15 @@
+ mkdir -p $(ADDIN_BUILD)
+ cp $^ $@
+
+-$(DBG_MDB): $(DBG_MDB_SRC)
+- mkdir -p $(ADDIN_BUILD)
+- cp $^ $@
+-
+ $(ASSEMBLY).mdb: $(ASSEMBLY)
+
+ check: all
+
+ assemblydir = $(MD_ADDIN_DIR)/MonoDevelop.Debugger.Soft
+-assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb $(DBG_ASM) $(DBG_MDB)
++assembly_DATA = $(ASSEMBLY) $(ASSEMBLY).mdb $(DBG_ASM)
+
+-CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb $(DBG_ASM) $(DBG_MDB)
+-EXTRA_DIST = $(FILES) $(RES) $(DBG_ASM_SRC) $(DBG_MDB_SRC)
++CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb $(DBG_ASM)
++EXTRA_DIST = $(FILES) $(RES)
+
+ include $(top_srcdir)/Makefile.include
+
+Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/Makefile.am
+===================================================================
+--- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/Makefile.am 2010-09-10 19:21:37.594331820 +0100
++++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.AspNet/Makefile.am 2010-09-10 19:48:06.726850824 +0100
+@@ -14,7 +14,7 @@
+ REFS = \
+ $(GLIB_SHARP_LIBS) \
+ $(GTK_SHARP_LIBS) \
+- -r:$(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll \
++ -r:$(ADDIN_BUILD)/Mono.Debugger.Soft.dll \
+ -r:System \
+ -r:System.Core
+
+Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.Moonlight/Makefile.am
+===================================================================
+--- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.Moonlight/Makefile.am 2010-09-10 19:21:37.574328440 +0100
++++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft.Moonlight/Makefile.am 2010-09-10 19:48:06.736850838 +0100
+@@ -14,7 +14,7 @@
+ REFS = \
+ $(GLIB_SHARP_LIBS) \
+ $(GTK_SHARP_LIBS) \
+- -r:$(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll \
++ -r:$(ADDIN_BUILD)/Mono.Debugger.Soft.dll \
+ -r:System \
+ -r:System.Core
+
+Index: monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/Makefile.am
+===================================================================
+--- monodevelop.git.orig/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/Makefile.am 2010-09-10 19:48:32.926829600 +0100
++++ monodevelop.git/src/addins/MonoDevelop.Debugger.Soft/MonoDevelop.Debugger.Soft/Makefile.am 2010-09-10 19:48:48.805040862 +0100
+@@ -13,7 +13,7 @@
+ REFS = \
+ $(GLIB_SHARP_LIBS) \
+ $(GTK_SHARP_LIBS) \
+- -r:$(top_srcdir)/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/Mono.Debugger.Soft.dll \
++ -r:$(ADDIN_BUILD)/Mono.Debugger.Soft.dll \
+ -r:System \
+ -r:System.Core
+
--
monodevelop
More information about the Pkg-cli-apps-commits
mailing list