Merge branch 'cecil-light'
[mono.git] / mcs / class / Mono.Debugger.Soft / Mono.Debugger.Soft / Connection.cs
index eace25b3cca9268162737291a31f548b110b07e0..74f8c9f1581a5a4bc8969e732bc9091530f7d4b6 100644 (file)
@@ -9,7 +9,7 @@ using Mono.Cecil.Metadata;
 
 namespace Mono.Debugger.Soft
 {
-       class VersionInfo {
+       public class VersionInfo {
                public string VMVersion {
                        get; set;
                }
@@ -103,6 +103,48 @@ namespace Mono.Debugger.Soft
                SINGLE_THREADED = 0x2
        }
 
+       enum ElementType {
+               End              = 0x00,
+               Void            = 0x01,
+               Boolean  = 0x02,
+               Char            = 0x03,
+               I1                = 0x04,
+               U1                = 0x05,
+               I2                = 0x06,
+               U2                = 0x07,
+               I4                = 0x08,
+               U4                = 0x09,
+               I8                = 0x0a,
+               U8                = 0x0b,
+               R4                = 0x0c,
+               R8                = 0x0d,
+               String    = 0x0e,
+               Ptr              = 0x0f,
+               ByRef      = 0x10,
+               ValueType   = 0x11,
+               Class      = 0x12,
+               Var        = 0x13,
+               Array      = 0x14,
+               GenericInst = 0x15,
+               TypedByRef  = 0x16,
+               I                  = 0x18,
+               U                  = 0x19,
+               FnPtr      = 0x1b,
+               Object    = 0x1c,
+               SzArray  = 0x1d,
+               MVar       = 0x1e,
+               CModReqD        = 0x1f,
+               CModOpt  = 0x20,
+               Internal        = 0x21,
+               Modifier        = 0x40,
+               Sentinel        = 0x41,
+               Pinned    = 0x45,
+
+               Type            = 0x50,
+               Boxed      = 0x51,
+               Enum            = 0x55
+       }
+
        class ValueImpl {
                public ElementType Type; /* or one of the VALUE_TYPE_ID constants */
                public long Objid;
@@ -193,6 +235,37 @@ namespace Mono.Debugger.Soft
                }
        }
 
+       class EventInfo {
+               public EventType EventType {
+                       get; set;
+               }
+
+               public int ReqId {
+                       get; set;
+               }
+
+               public SuspendPolicy SuspendPolicy {
+                       get; set;
+               }
+
+               public long ThreadId {
+                       get; set;
+               }
+
+               public long Id {
+                       get; set;
+               }
+
+               public long Location {
+                       get; set;
+               }
+
+               public EventInfo (EventType type, int req_id) {
+                       EventType = type;
+                       ReqId = req_id;
+               }
+       }
+
        public enum ErrorCode {
                NONE = 0,
                INVALID_OBJECT = 20,
@@ -202,7 +275,8 @@ namespace Mono.Debugger.Soft
                NOT_SUSPENDED = 101,
                INVALID_ARGUMENT = 102,
                ERR_UNLOADED = 103,
-               ERR_NO_INVOCATION = 104
+               ERR_NO_INVOCATION = 104,
+               ABSENT_INFORMATION = 105
        }
 
        public class ErrorHandlerEventArgs : EventArgs {
@@ -233,7 +307,7 @@ namespace Mono.Debugger.Soft
                 * with newer runtimes, and vice versa.
                 */
                public const int MAJOR_VERSION = 2;
-               public const int MINOR_VERSION = 1;
+               public const int MINOR_VERSION = 2;
 
                enum WPSuspendPolicy {
                        NONE = 0,
@@ -360,7 +434,9 @@ namespace Mono.Debugger.Soft
                        GET_PROPERTIES = 9,
                        GET_CATTRS = 10,
                        GET_FIELD_CATTRS = 11,
-                       GET_PROPERTY_CATTRS = 12
+                       GET_PROPERTY_CATTRS = 12,
+                       /* FIXME: Merge into GET_SOURCE_FILES when the major protocol version is increased */
+                       GET_SOURCE_FILES_2 = 13
                }
 
                enum CmdStackFrame {
@@ -644,32 +720,48 @@ namespace Mono.Debugger.Soft
                        int offset;
 
                        public PacketWriter () {
-                               // FIXME:
                                data = new byte [1024];
                                offset = 0;
                        }
 
+                       void MakeRoom (int size) {
+                               if (offset + size >= data.Length) {
+                                       int new_len = data.Length * 2;
+                                       while (new_len < offset + size) {
+                                               new_len *= 2;
+                                       }
+                                       byte[] new_data = new byte [new_len];
+                                       Array.Copy (data, new_data, data.Length);
+                                       data = new_data;
+                               }
+                       }
+
                        public PacketWriter WriteByte (byte val) {
+                               MakeRoom (1);
                                encode_byte (data, val, ref offset);
                                return this;
                        }
 
                        public PacketWriter WriteInt (int val) {
+                               MakeRoom (4);
                                encode_int (data, val, ref offset);
                                return this;
                        }
 
                        public PacketWriter WriteId (long id) {
+                               MakeRoom (8);
                                encode_id (data, id, ref offset);
                                return this;
                        }
 
                        public PacketWriter WriteLong (long val) {
+                               MakeRoom (8);
                                encode_long (data, val, ref offset);
                                return this;
                        }
 
                        public PacketWriter WriteFloat (float f) {
+                               MakeRoom (8);
                                byte[] b = DataConverter.GetBytesBE (f);
                                for (int i = 0; i < 4; ++i)
                                        data [offset + i] = b [i];
@@ -678,6 +770,7 @@ namespace Mono.Debugger.Soft
                        }
 
                        public PacketWriter WriteDouble (double d) {
+                               MakeRoom (8);
                                byte[] b = DataConverter.GetBytesBE (d);
                                for (int i = 0; i < 8; ++i)
                                        data [offset + i] = b [i];
@@ -700,6 +793,7 @@ namespace Mono.Debugger.Soft
                        public PacketWriter WriteString (string s) {
                                encode_int (data, s.Length, ref offset);
                                byte[] b = Encoding.UTF8.GetBytes (s);
+                               MakeRoom (b.Length);
                                Buffer.BlockCopy (b, 0, data, offset, b.Length);
                                offset += b.Length;
                                return this;
@@ -976,71 +1070,93 @@ namespace Mono.Debugger.Soft
                                        PacketReader r = new PacketReader (packet);
 
                                        if (r.CommandSet == CommandSet.EVENT && r.Command == (int)CmdEvent.COMPOSITE) {
-                                               r.ReadByte (); // suspend_policy
+                                               int spolicy = r.ReadByte ();
                                                int nevents = r.ReadInt ();
 
+                                               SuspendPolicy suspend_policy = decode_suspend_policy (spolicy);
+
+                                               EventInfo[] events = new EventInfo [nevents];
+
                                                for (int i = 0; i < nevents; ++i) {
                                                        EventKind kind = (EventKind)r.ReadByte ();
                                                        int req_id = r.ReadInt ();
 
+                                                       EventType etype = (EventType)kind;
+
                                                        if (kind == EventKind.VM_START) {
                                                                long thread_id = r.ReadId ();
-                                                               EventHandler.VMStart (req_id, thread_id, null);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id };
+                                                               //EventHandler.VMStart (req_id, thread_id, null);
                                                        } else if (kind == EventKind.VM_DEATH) {
-                                                               EventHandler.VMDeath (req_id, 0, null);
+                                                               //EventHandler.VMDeath (req_id, 0, null);
+                                                               events [i] = new EventInfo (etype, req_id) { };
                                                        } else if (kind == EventKind.THREAD_START) {
                                                                long thread_id = r.ReadId ();
-                                                               EventHandler.ThreadStart (req_id, thread_id, thread_id);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = thread_id };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = thread_id };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id, Location = loc };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id, Location = loc };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id, Location = loc };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+                                                               //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);
+                                                               events [i] = new EventInfo (etype, req_id) { ThreadId = thread_id, Id = id };
+                                                               //EventHandler.AppDomainUnload (req_id, thread_id, id);
                                                        } else {
                                                                throw new NotImplementedException ("Unknown event kind: " + kind);
                                                        }
                                                }
+
+                                               EventHandler.Events (suspend_policy, events);
                                        }
                                }
 
@@ -1569,8 +1685,8 @@ namespace Mono.Debugger.Soft
                        SendReceive (CommandSet.TYPE, (int)CmdType.SET_VALUES, new PacketWriter ().WriteId (id).WriteInt (fields.Length).WriteIds (fields).WriteValues (values));
                }
 
-               public string[] Type_GetSourceFiles (long id) {
-                       var r = SendReceive (CommandSet.TYPE, (int)CmdType.GET_SOURCE_FILES, new PacketWriter ().WriteId (id));
+               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)
@@ -1757,34 +1873,8 @@ namespace Mono.Debugger.Soft
        /* 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 Events (SuspendPolicy suspend_policy, EventInfo[] events);
 
                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);
        }
 }