Merge pull request #3609 from xmcclure/checked-imageset
[mono.git] / mcs / class / Mono.Debugger.Soft / Mono.Debugger.Soft / Connection.cs
index 753f3910f83d9bd9e76a67093f4f790dd87b986e..a5b902db57322eaff402889d0becf162902b735b 100644 (file)
@@ -117,6 +117,8 @@ namespace Mono.Debugger.Soft
                public string[] names;
                public int[] live_range_start;
                public int[] live_range_end;
+               public int[] scopes_start;
+               public int[] scopes_end;
        }
 
        struct PropInfo {
@@ -382,7 +384,8 @@ namespace Mono.Debugger.Soft
                ERR_UNLOADED = 103,
                ERR_NO_INVOCATION = 104,
                ABSENT_INFORMATION = 105,
-               NO_SEQ_POINT_AT_IL_OFFSET = 106
+               NO_SEQ_POINT_AT_IL_OFFSET = 106,
+               INVOKE_ABORTED = 107
        }
 
        public class ErrorHandlerEventArgs : EventArgs {
@@ -417,7 +420,7 @@ namespace Mono.Debugger.Soft
                 * with newer runtimes, and vice versa.
                 */
                internal const int MAJOR_VERSION = 2;
-               internal const int MINOR_VERSION = 38;
+               internal const int MINOR_VERSION = 44;
 
                enum WPSuspendPolicy {
                        NONE = 0,
@@ -587,6 +590,7 @@ namespace Mono.Debugger.Soft
                        GET_THIS = 2,
                        SET_VALUES = 3,
                        GET_DOMAIN = 4,
+                       SET_THIS = 5,
                }
 
                enum CmdArrayRef {
@@ -801,6 +805,13 @@ namespace Mono.Debugger.Soft
                                return res;
                        }
 
+                       public string ReadUTF16String () {
+                               int len = decode_int (packet, ref offset);
+                               string res = new String (Encoding.Unicode.GetChars (packet, offset, len));
+                               offset += len;
+                               return res;
+                       }
+
                        public ValueImpl ReadValue () {
                                ElementType etype = (ElementType)ReadByte ();
 
@@ -1216,6 +1227,8 @@ namespace Mono.Debugger.Soft
 
                bool disconnected;
 
+               internal ManualResetEvent DisconnectedEvent = new ManualResetEvent (false);
+
                void receiver_thread_main () {
                        while (!closed) {
                                try {
@@ -1232,6 +1245,7 @@ namespace Mono.Debugger.Soft
 
                        lock (reply_packets_monitor) {
                                disconnected = true;
+                               DisconnectedEvent.Set ();
                                Monitor.PulseAll (reply_packets_monitor);
                                TransportClose ();
                        }
@@ -1635,13 +1649,14 @@ namespace Mono.Debugger.Soft
                        SendReceive (CommandSet.VM, (int)CmdVM.SET_PROTOCOL_VERSION, new PacketWriter ().WriteInt (major).WriteInt (minor));
                }
 
-               internal 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;
+               internal void VM_GetThreads (Action<long[]> resultCallaback) {
+                       Send (CommandSet.VM, (int)CmdVM.ALL_THREADS, null, (res) => {
+                               int len = res.ReadInt ();
+                               long[] arr = new long [len];
+                               for (int i = 0; i < len; ++i)
+                                       arr [i] = res.ReadId ();
+                               resultCallaback(arr);
+                       }, 1);
                }
 
                internal void VM_Suspend () {
@@ -1898,6 +1913,19 @@ namespace Mono.Debugger.Soft
                        var res = SendReceive (CommandSet.METHOD, (int)CmdMethod.GET_LOCALS_INFO, new PacketWriter ().WriteId (id));
 
                        LocalsInfo info = new LocalsInfo ();
+
+                       if (Version.AtLeast (2, 43)) {
+                               int nscopes = res.ReadInt ();
+                               info.scopes_start = new int [nscopes];
+                               info.scopes_end = new int [nscopes];
+                               int last_start = 0;
+                               for (int i = 0; i < nscopes; ++i) {
+                                       info.scopes_start [i] = last_start + res.ReadInt ();
+                                       info.scopes_end [i] = info.scopes_start [i] + res.ReadInt ();
+                                       last_start = info.scopes_start [i];
+                               }
+                       }
+
                        int nlocals = res.ReadInt ();
                        info.types = new long [nlocals];
                        for (int i = 0; i < nlocals; ++i)
@@ -2383,6 +2411,10 @@ namespace Mono.Debugger.Soft
                        return SendReceive (CommandSet.STACK_FRAME, (int)CmdStackFrame.GET_DOMAIN, new PacketWriter ().WriteId (thread_id).WriteId (id)).ReadId ();
                }
 
+               internal void StackFrame_SetThis (long thread_id, long id, ValueImpl value) {
+                       SendReceive (CommandSet.STACK_FRAME, (int)CmdStackFrame.SET_THIS, new PacketWriter ().WriteId (thread_id).WriteId (id).WriteValue (value));
+               }
+
                /*
                 * ARRAYS
                 */
@@ -2414,7 +2446,16 @@ namespace Mono.Debugger.Soft
                 * STRINGS
                 */
                internal string String_GetValue (long id) {
-                       return SendReceive (CommandSet.STRING_REF, (int)CmdStringRef.GET_VALUE, new PacketWriter ().WriteId (id)).ReadString ();
+                       var r = SendReceive (CommandSet.STRING_REF, (int)CmdStringRef.GET_VALUE, new PacketWriter ().WriteId (id));
+
+                       bool is_utf16 = false;
+                       if (Version.AtLeast (2, 41))
+                               is_utf16 = r.ReadByte () == 1;
+
+                       if (is_utf16)
+                               return r.ReadUTF16String ();
+                       else
+                               return r.ReadString ();
                }                       
 
                internal int String_GetLength (long id) {
@@ -2475,6 +2516,7 @@ namespace Mono.Debugger.Soft
                {
                        closed = true;
                        disconnected = true;
+                       DisconnectedEvent.Set ();
                        TransportClose ();
                }
        }