diff --git a/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs b/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs index 6ebae5811..5003825bc 100644 --- a/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs +++ b/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs @@ -567,6 +567,7 @@ enum CmdAssembly { enum CmdModule { GET_INFO = 1, + APPLY_CHANGES = 2, } enum CmdMethod { @@ -2357,6 +2358,11 @@ internal ModuleInfo Module_GetInfo (long id) { return info; } + + internal void Module_ApplyChanges (long id, long dmeta_id, long dil_id, long dpdb_id) { + SendReceive (CommandSet.MODULE, (int)CmdModule.APPLY_CHANGES, new PacketWriter().WriteId (id).WriteId (dmeta_id).WriteId (dil_id).WriteId (dpdb_id)); + } + /* * ASSEMBLY */ diff --git a/Mono.Debugger.Soft/Mono.Debugger.Soft/ModuleMirror.cs b/Mono.Debugger.Soft/Mono.Debugger.Soft/ModuleMirror.cs index 03dfcc19a..d585c1599 100644 --- a/Mono.Debugger.Soft/Mono.Debugger.Soft/ModuleMirror.cs +++ b/Mono.Debugger.Soft/Mono.Debugger.Soft/ModuleMirror.cs @@ -70,5 +70,13 @@ public string SourceLink { return info.SourceLink; } } + + // Apply a hot reload delta to the current module + // Since protocol version 2.60 + public void ApplyChanges (ArrayMirror dmeta, ArrayMirror dIL, Value dPDB) { + /* dPDB is Value because it can be ArrayMirror or PrimitiveValue (vm, null) */ + vm.CheckProtocolVersion (2, 60); + vm.conn.Module_ApplyChanges (id, dmeta.Id, dIL.Id, dPDB.Id); + } } } diff --git a/Mono.Debugging.Soft/SoftDebuggerSession.cs b/Mono.Debugging.Soft/SoftDebuggerSession.cs index 4e7235de9..3d4bb739d 100644 --- a/Mono.Debugging.Soft/SoftDebuggerSession.cs +++ b/Mono.Debugging.Soft/SoftDebuggerSession.cs @@ -3304,6 +3304,19 @@ public AssemblyLine[] Disassemble (StackFrame frame, int firstLine, int count) return lines.ToArray (); } + public void ApplyChanges (ModuleMirror module, byte[] metadataDelta, byte[] ilDelta, byte[] pdbDelta = null) + { + var rootDomain = VirtualMachine.RootDomain; + var metadataArray = rootDomain.CreateByteArray (metadataDelta); + var ilArray = rootDomain.CreateByteArray (ilDelta); + Value pdbArray; + if (pdbDelta == null) + pdbArray = VirtualMachine.CreateValue (null); + else + pdbArray = rootDomain.CreateByteArray (pdbDelta); + + module.ApplyChanges (metadataArray, ilArray, pdbArray); + } static string EscapeString (string text) { var escaped = new StringBuilder ();