Author: martin
Date: 2007-11-20 14:47:04 -0500 (Tue, 20 Nov 2007)
New Revision: 90020

Modified:
   trunk/debugger/ChangeLog
   trunk/debugger/backend/BreakpointHandle.cs
   trunk/debugger/backend/Inferior.cs
   trunk/debugger/backend/MonoThreadManager.cs
   trunk/debugger/backend/SingleSteppingEngine.cs
   trunk/debugger/backend/ThreadServant.cs
   trunk/debugger/backend/arch/CoreFile.cs
   trunk/debugger/backend/server/library.c
   trunk/debugger/backend/server/server.h
   trunk/debugger/backend/server/x86_64-arch.c
   trunk/debugger/classes/Thread.cs
   trunk/debugger/languages/TargetFunctionType.cs
   trunk/debugger/languages/mono/MonoClassType.cs
   trunk/debugger/languages/mono/MonoFunctionType.cs
   trunk/debugger/languages/mono/MonoLanguageBackend.cs
   trunk/debugger/languages/mono/MonoStringType.cs
   trunk/debugger/languages/native/NativeFunctionType.cs
   trunk/debugger/test/testsuite/TestDelegate.cs
Log:
2007-11-20  Martin Baulig  <[EMAIL PROTECTED]>

        * test/testsuite/TestDelegate.cs: Temporarily disable this.

        * backend/SingleSteppingEngine.cs
        (OperationExecuteInstruction): Make this a separate operation
        since we need to resume the target after executing the instruction
        if we're not single-stepping.
        (OperationActivateBreakpoints): Use the new breakpoint code.

        * languages/TargetFunctionType.cs
        (TargetFunctionType.InsertBreakpoint): Take a
        `FunctionBreakpointHandle' argument, not `MethodLoadedHandler'.



Modified: trunk/debugger/ChangeLog
===================================================================
--- trunk/debugger/ChangeLog    2007-11-20 19:34:24 UTC (rev 90019)
+++ trunk/debugger/ChangeLog    2007-11-20 19:47:04 UTC (rev 90020)
@@ -1,3 +1,17 @@
+2007-11-20  Martin Baulig  <[EMAIL PROTECTED]>
+
+       * test/testsuite/TestDelegate.cs: Temporarily disable this.
+
+       * backend/SingleSteppingEngine.cs
+       (OperationExecuteInstruction): Make this a separate operation
+       since we need to resume the target after executing the instruction
+       if we're not single-stepping.
+       (OperationActivateBreakpoints): Use the new breakpoint code.
+
+       * languages/TargetFunctionType.cs
+       (TargetFunctionType.InsertBreakpoint): Take a
+       `FunctionBreakpointHandle' argument, not `MethodLoadedHandler'.
+
 2007-11-19  Martin Baulig  <[EMAIL PROTECTED]>
 
        * frontend/Main.cs

Modified: trunk/debugger/backend/BreakpointHandle.cs
===================================================================
--- trunk/debugger/backend/BreakpointHandle.cs  2007-11-20 19:34:24 UTC (rev 
90019)
+++ trunk/debugger/backend/BreakpointHandle.cs  2007-11-20 19:47:04 UTC (rev 
90020)
@@ -121,7 +121,7 @@
                        if (has_load_handler)
                                return;
 
-                       has_load_handler = function.InsertBreakpoint (target, 
MethodLoaded);
+                       has_load_handler = function.InsertBreakpoint (target, 
this);
                }
 
                internal void MethodLoaded (TargetMemoryAccess target, Method 
method)

Modified: trunk/debugger/backend/Inferior.cs
===================================================================
--- trunk/debugger/backend/Inferior.cs  2007-11-20 19:34:24 UTC (rev 90019)
+++ trunk/debugger/backend/Inferior.cs  2007-11-20 19:47:04 UTC (rev 90020)
@@ -102,7 +102,7 @@
                static extern TargetError mono_debugger_server_call_method 
(IntPtr handle, long method_address, long method_argument1, long 
method_argument2, long callback_argument);
 
                [DllImport("monodebuggerserver")]
-               static extern TargetError mono_debugger_server_call_method_1 
(IntPtr handle, long method_address, long method_argument, long data_argument, 
string string_argument, long callback_argument);
+               static extern TargetError mono_debugger_server_call_method_1 
(IntPtr handle, long method_address, long method_argument, long data_argument, 
long data_argument2, string string_argument, long callback_argument);
 
                [DllImport("monodebuggerserver")]
                static extern TargetError mono_debugger_server_call_method_2 
(IntPtr handle, long method_address, int data_size, IntPtr data, long 
callback_argument);
@@ -334,16 +334,16 @@
                        }
                }
 
-               public void CallMethod (TargetAddress method, long arg1, long 
arg2,
-                                       string arg3, long callback_arg)
+               public void CallMethod (TargetAddress method, long arg1, long 
arg2, long arg3,
+                                       string arg4, long callback_arg)
                {
                        check_disposed ();
 
                        TargetState old_state = change_target_state 
(TargetState.Running);
                        try {
                                check_error (mono_debugger_server_call_method_1 
(
-                                       server_handle, method.Address, arg1, 
arg2,
-                                       arg3, callback_arg));
+                                       server_handle, method.Address, arg1, 
arg2, arg3,
+                                       arg4, callback_arg));
                        } catch {
                                change_target_state (old_state);
                                throw;

Modified: trunk/debugger/backend/MonoThreadManager.cs
===================================================================
--- trunk/debugger/backend/MonoThreadManager.cs 2007-11-20 19:34:24 UTC (rev 
90019)
+++ trunk/debugger/backend/MonoThreadManager.cs 2007-11-20 19:47:04 UTC (rev 
90020)
@@ -45,6 +45,7 @@
                UnloadModule,
                DomainCreate,
                DomainUnload,
+               ClassInitialized,
 
                Trampoline      = 256
        }
@@ -285,6 +286,9 @@
                                        resume_target = false;
                                        return false;
 
+                               case NotificationType.ClassInitialized:
+                                       break;
+
                                default: {
                                        TargetAddress data = new TargetAddress (
                                                inferior.AddressDomain, 
cevent.Data1);
@@ -317,12 +321,13 @@
        internal class MonoDebuggerInfo
        {
                // These constants must match up with those in 
mono/mono/metadata/mono-debug.h
-               public const int  MinDynamicVersion = 64;
-               public const int  MaxDynamicVersion = 64;
+               public const int  MinDynamicVersion = 65;
+               public const int  MaxDynamicVersion = 65;
                public const long DynamicMagic      = 0x7aff65af4253d427;
 
+               public readonly int MonoTrampolineNum;
+               public readonly TargetAddress MonoTrampolineCode;
                public readonly TargetAddress NotificationAddress;
-               public readonly TargetAddress MonoTrampolineCode;
                public readonly TargetAddress SymbolTable;
                public readonly int SymbolTableSize;
                public readonly TargetAddress CompileMethod;
@@ -333,8 +338,11 @@
                public readonly TargetAddress ClassGetStaticFieldData;
                public readonly TargetAddress LookupClass;
                public readonly TargetAddress RunFinally;
-               public readonly TargetAddress InsertBreakpoint;
+               public readonly TargetAddress InsertMethodBreakpoint;
+               public readonly TargetAddress InsertSourceBreakpoint;
                public readonly TargetAddress RemoveBreakpoint;
+               public readonly TargetAddress RegisterClassInitCallback;
+               public readonly TargetAddress RemoveClassInitCallback;
                public readonly TargetAddress Attach;
                public readonly TargetAddress Detach;
                public readonly TargetAddress Initialize;
@@ -381,10 +389,9 @@
                        reader.Offset = 16;
 
                        SymbolTableSize           = reader.ReadInteger ();
-
-                       reader.Offset = 24;
+                       MonoTrampolineNum         = reader.ReadInteger ();
+                       MonoTrampolineCode        = reader.ReadAddress ();
                        NotificationAddress       = reader.ReadAddress ();
-                       MonoTrampolineCode        = reader.ReadAddress ();
                        SymbolTable               = reader.ReadAddress ();
                        TargetAddress metadata_info = reader.ReadAddress ();
                        CompileMethod             = reader.ReadAddress ();
@@ -400,9 +407,14 @@
 
                        CreateString              = reader.ReadAddress ();
                        LookupClass               = reader.ReadAddress ();
-                       InsertBreakpoint          = reader.ReadAddress ();
+
+                       InsertMethodBreakpoint    = reader.ReadAddress ();
+                       InsertSourceBreakpoint    = reader.ReadAddress ();
                        RemoveBreakpoint          = reader.ReadAddress ();
 
+                       RegisterClassInitCallback = reader.ReadAddress ();
+                       RemoveClassInitCallback   = reader.ReadAddress ();
+
                        DebuggerVersion           = reader.ReadAddress ();
                        ThreadTable               = reader.ReadAddress ();
 

Modified: trunk/debugger/backend/SingleSteppingEngine.cs
===================================================================
--- trunk/debugger/backend/SingleSteppingEngine.cs      2007-11-20 19:34:24 UTC 
(rev 90019)
+++ trunk/debugger/backend/SingleSteppingEngine.cs      2007-11-20 19:47:04 UTC 
(rev 90020)
@@ -941,7 +941,7 @@
                                return true;
                        }
 
-                       inferior.ExecuteInstruction (instruction.Code, true);
+                       PushOperation (new OperationExecuteInstruction (this, 
instruction));
                        return true;
                }
 
@@ -1217,6 +1217,9 @@
 
                void remove_temporary_breakpoint ()
                {
+                       Report.Debug (DebugFlags.SSE, "{0} remove temp 
breakpoint {1}",
+                                     this, temp_breakpoint_id);
+
                        if (temp_breakpoint_id != 0) {
                                inferior.RemoveBreakpoint (temp_breakpoint_id);
                                temp_breakpoint_id = 0;
@@ -1590,10 +1593,10 @@
                }
 
                public override CommandResult CallMethod (TargetAddress method, 
long arg1, long arg2,
-                                                         string 
string_argument)
+                                                         long arg3, string 
string_argument)
                {
                        return StartOperation (new OperationCallMethod (
-                               this, method, arg1, arg2, string_argument));
+                               this, method, arg1, arg2, arg3, 
string_argument));
                }
 
                public override CommandResult CallMethod (TargetAddress method, 
long arg1, long arg2)
@@ -1698,7 +1701,7 @@
                }
 
                internal override void InsertBreakpoint (BreakpointHandle 
handle,
-                                                       TargetAddress address, 
int domain)
+                                                        TargetAddress address, 
int domain)
                {
                        SendCommand (delegate {
                                process.BreakpointManager.InsertBreakpoint (
@@ -2174,21 +2177,24 @@
 
        protected class OperationActivateBreakpoints : Operation
        {
+               MonoLanguageBackend language;
+
                public OperationActivateBreakpoints (SingleSteppingEngine sse, 
Queue pending)
                        : base (sse, null)
                {
                        this.pending_events = pending;
+                       this.language = sse.process.MonoLanguage;
                }
 
-               public override bool IsSourceOperation {
-                       get { return true; }
-               }
-
                protected override void DoExecute ()
                {
                        do_execute ();
                }
 
+               public override bool IsSourceOperation {
+                       get { return false; }
+               }
+
                Queue pending_events;
                bool completed;
 
@@ -2197,15 +2203,24 @@
                {
                        args = null;
 
+                       Report.Debug (DebugFlags.SSE,
+                                     "{0} activate breakpoints: {1}", sse, 
completed);
+
                        while (!completed) {
                                if (do_execute ())
                                        return EventResult.Running;
 
+                               Report.Debug (DebugFlags.SSE,
+                                             "{0} activate breakpoints done - 
continue", sse);
 
+                               return EventResult.ResumeOperation;
+
                                sse.do_continue ();
                                return EventResult.Running;
                        }
 
+                       Report.Debug (DebugFlags.SSE,
+                                     "{0} activate breakpoints completed", 
sse);
                        return EventResult.AskParent;
                }
 
@@ -2226,63 +2241,44 @@
                        Report.Debug (DebugFlags.SSE,
                                      "{0} activate breakpoints: {1}", sse, 
handle);
 
-                       sse.PushOperation (new OperationMethodBreakpoint (
-                               sse, handle.Function, handle.MethodLoaded));
+                       sse.PushOperation (new OperationInsertBreakpoint (sse, 
handle));
                        return true;
                }
        }
 
-       protected class OperationMethodBreakpoint : OperationCallback
+       protected class OperationInsertBreakpoint : OperationCallback
        {
-               public readonly MonoFunctionType Function;
-               public readonly MethodLoadedHandler Handler;
+               public readonly FunctionBreakpointHandle Handle;
 
-               MonoLanguageBackend language;
-               int index;
-
-               bool class_resolved;
-
-               public OperationMethodBreakpoint (SingleSteppingEngine sse, 
TargetFunctionType func,
-                                                 MethodLoadedHandler handler)
-                       : base (sse)
+               public OperationInsertBreakpoint (SingleSteppingEngine sse,
+                                                 FunctionBreakpointHandle 
handle)
+                       : base (sse, null)
                {
-                       this.Function = (MonoFunctionType) func;
-                       this.Handler = handler;
+                       this.Handle = handle;
                }
 
                protected override void DoExecute ()
                {
-                       language = sse.process.MonoLanguage;
+                       MonoDebuggerInfo info = 
sse.ProcessServant.MonoManager.MonoDebuggerInfo;
+                       MonoLanguageBackend mono = sse.process.MonoLanguage;
 
-                       TargetAddress image = Function.MonoClass.File.MonoImage;
+                       MonoFunctionType func = (MonoFunctionType) 
Handle.Function;
+                       TargetAddress image = func.MonoClass.File.MonoImage;
+                       int index = MonoLanguageBackend.GetUniqueID ();
 
-                       inferior.CallMethod (sse.MonoDebuggerInfo.LookupClass, 
image.Address,
-                                            0, Function.MonoClass.Name, ID);
+                       mono.RegisterMethodLoadHandler (index, 
Handle.MethodLoaded);
+
+                       inferior.CallMethod (
+                               info.InsertSourceBreakpoint, image.Address,
+                               func.Token, index, func.MonoClass.Name, ID);
                }
 
                protected override EventResult CallbackCompleted (long data1, 
long data2)
                {
                        Report.Debug (DebugFlags.SSE,
-                                     "{0} method breakpoint callback: {1} 
{2:x} {3:x} {4}",
-                                     sse, inferior.CurrentFrame, data1, data2, 
class_resolved);
+                                     "{0} insert breakpoint done: {1:x} {2:x}",
+                                     sse, data1, data2);
 
-                       if (!class_resolved) {
-                               TargetAddress klass = new TargetAddress 
(inferior.AddressDomain, data1);
-                               MonoClassInfo info = 
Function.MonoClass.ClassResolved (sse.Client, klass);
-                               TargetAddress method = info.GetMethodAddress 
(inferior, Function.Token);
-
-                               index = MonoLanguageBackend.GetUniqueID ();
-
-                               inferior.CallMethod 
(sse.MonoDebuggerInfo.InsertBreakpoint,
-                                                    method.Address, index, ID);
-
-                               language.RegisterMethodLoadHandler (index, 
Handler);
-
-                               class_resolved = true;
-                               return EventResult.Running;
-                       }
-
-                       RestoreStack ();
                        return EventResult.AskParent;
                }
        }
@@ -2495,6 +2491,40 @@
                }
        }
 
+       protected class OperationExecuteInstruction : Operation
+       {
+               public readonly Instruction Instruction;
+
+               public OperationExecuteInstruction (SingleSteppingEngine sse, 
Instruction insn)
+                       : base (sse, null)
+               {
+                       this.Instruction = insn;
+               }
+
+               public override bool IsSourceOperation {
+                       get { return false; }
+               }
+
+               protected override void DoExecute ()
+               {
+                       Report.Debug (DebugFlags.SSE,
+                                     "{0} executing instruction: {1}", sse, 
Instruction);
+
+                       inferior.ExecuteInstruction (Instruction.Code, true);
+               }
+
+               protected override EventResult DoProcessEvent 
(Inferior.ChildEvent cevent,
+                                                              out 
TargetEventArgs args)
+               {
+                       Report.Debug (DebugFlags.SSE,
+                                     "{0} executed instruction {1} at {2}: 
{3}",
+                                     sse, Instruction, inferior.CurrentFrame, 
cevent);
+
+                       args = null;
+                       return EventResult.ResumeOperation;
+               }
+       }
+
        protected abstract class OperationStepBase : Operation
        {
                protected OperationStepBase (SingleSteppingEngine sse, 
CommandResult result)
@@ -2791,6 +2821,14 @@
                                sse.do_continue ();
                }
 
+               protected override bool ResumeOperation ()
+               {
+                       Report.Debug (DebugFlags.SSE, "{0} resuming operation 
{1}", sse, this);
+
+                       sse.do_continue ();
+                       return true;
+               }
+
                protected override EventResult DoProcessEvent 
(Inferior.ChildEvent cevent,
                                                               out 
TargetEventArgs args)
                {
@@ -3049,7 +3087,7 @@
                                              "{0} rti resolving class 
{1}:{2:x}", sse, image, token);
 
                                inferior.CallMethod (
-                                       sse.MonoDebuggerInfo.LookupClass, 
image.Address, 0,
+                                       sse.MonoDebuggerInfo.LookupClass, 
image.Address, 0, 0,
                                        Function.MonoClass.Name, ID);
                                return;
                        }
@@ -3285,17 +3323,19 @@
                public readonly TargetAddress Method;
                public readonly long Argument1;
                public readonly long Argument2;
+               public readonly long Argument3;
                public readonly string StringArgument;
 
                public OperationCallMethod (SingleSteppingEngine sse,
-                                           TargetAddress method, long arg1, 
long arg2,
+                                           TargetAddress method, long arg1, 
long arg2, long arg3,
                                            string sarg)
                        : base (sse)
                {
-                       this.Type = CallMethodType.LongString;
+                       this.Type = CallMethodType.LongLongLongString;
                        this.Method = method;
                        this.Argument1 = arg1;
                        this.Argument2 = arg2;
+                       this.Argument3 = arg3;
                        this.StringArgument = sarg;
                }
 
@@ -3316,8 +3356,8 @@
                                inferior.CallMethod (Method, Argument1, 
Argument2, ID);
                                break;
 
-                       case CallMethodType.LongString:
-                               inferior.CallMethod (Method, Argument1, 
Argument2,
+                       case CallMethodType.LongLongLongString:
+                               inferior.CallMethod (Method, Argument1, 
Argument2, Argument3,
                                                     StringArgument, ID);
                                break;
 
@@ -3559,6 +3599,7 @@
                protected override bool DoProcessEvent ()
                {
                        TargetAddress current_frame = inferior.CurrentFrame;
+
                        Report.Debug (DebugFlags.SSE, "{0} wrapper stopped at 
{1} ({2}:{3})",
                                      sse, current_frame, method.StartAddress, 
method.EndAddress);
                        if ((current_frame < method.StartAddress) || 
(current_frame > method.EndAddress))
@@ -3692,6 +3733,6 @@
        internal enum CallMethodType
        {
                LongLong,
-               LongString
+               LongLongLongString
        }
 }

Modified: trunk/debugger/backend/ThreadServant.cs
===================================================================
--- trunk/debugger/backend/ThreadServant.cs     2007-11-20 19:34:24 UTC (rev 
90019)
+++ trunk/debugger/backend/ThreadServant.cs     2007-11-20 19:47:04 UTC (rev 
90020)
@@ -212,7 +212,7 @@
                                                          long arg2);
 
                public abstract CommandResult CallMethod (TargetAddress method, 
long arg1,
-                                                         long arg2, string 
string_arg);
+                                                         long arg2, long arg3, 
string string_arg);
 
                public abstract CommandResult Return (bool run_finally);
 

Modified: trunk/debugger/backend/arch/CoreFile.cs
===================================================================
--- trunk/debugger/backend/arch/CoreFile.cs     2007-11-20 19:34:24 UTC (rev 
90019)
+++ trunk/debugger/backend/arch/CoreFile.cs     2007-11-20 19:47:04 UTC (rev 
90020)
@@ -586,7 +586,7 @@
                        }
 
                        public override CommandResult CallMethod (TargetAddress 
method,
-                                                                 long arg1, 
long arg2,
+                                                                 long arg1, 
long arg2, long arg3,
                                                                  string 
string_arg)
                        {
                                throw new InvalidOperationException ();

Modified: trunk/debugger/backend/server/library.c
===================================================================
--- trunk/debugger/backend/server/library.c     2007-11-20 19:34:24 UTC (rev 
90019)
+++ trunk/debugger/backend/server/library.c     2007-11-20 19:47:04 UTC (rev 
90020)
@@ -209,14 +209,15 @@
 ServerCommandError
 mono_debugger_server_call_method_1 (ServerHandle *handle, guint64 
method_address,
                                    guint64 method_argument, guint64 
data_argument,
-                                   const gchar *string_argument, guint64 
callback_argument)
+                                   guint64 data_argument2, const gchar 
*string_argument,
+                                   guint64 callback_argument)
 {
        if (!global_vtable->call_method_1)
                return COMMAND_ERROR_NOT_IMPLEMENTED;
 
        return (* global_vtable->call_method_1) (
                handle, method_address, method_argument, data_argument,
-               string_argument, callback_argument);
+               data_argument2, string_argument, callback_argument);
 }
 
 ServerCommandError

Modified: trunk/debugger/backend/server/server.h
===================================================================
--- trunk/debugger/backend/server/server.h      2007-11-20 19:34:24 UTC (rev 
90019)
+++ trunk/debugger/backend/server/server.h      2007-11-20 19:47:04 UTC (rev 
90020)
@@ -236,6 +236,7 @@
                                                       guint64           method,
                                                       guint64           
method_argument,
                                                       guint64           
data_argument,
+                                                      guint64           
data_argument2,
                                                       const gchar      
*string_argument,
                                                       guint64           
callback_argument);
 
@@ -474,6 +475,7 @@
                                           guint64             method_address,
                                           guint64             method_argument,
                                           guint64             data_argument,
+                                          guint64             data_argument2,
                                           const gchar        *string_argument,
                                           guint64             
callback_argument);
 

Modified: trunk/debugger/backend/server/x86_64-arch.c
===================================================================
--- trunk/debugger/backend/server/x86_64-arch.c 2007-11-20 19:34:24 UTC (rev 
90019)
+++ trunk/debugger/backend/server/x86_64-arch.c 2007-11-20 19:47:04 UTC (rev 
90020)
@@ -905,7 +905,8 @@
 static ServerCommandError
 server_ptrace_call_method_1 (ServerHandle *handle, guint64 method_address,
                             guint64 method_argument, guint64 data_argument,
-                            const gchar *string_argument, guint64 
callback_argument)
+                            guint64 data_argument2, const gchar 
*string_argument,
+                            guint64 callback_argument)
 {
        ServerCommandError result = COMMAND_ERROR_NONE;
        ArchInfo *arch = handle->arch;
@@ -944,7 +945,8 @@
        INFERIOR_REG_RIP (arch->current_regs) = method_address;
        INFERIOR_REG_RDI (arch->current_regs) = method_argument;
        INFERIOR_REG_RSI (arch->current_regs) = data_argument;
-       INFERIOR_REG_RDX (arch->current_regs) = new_rsp + static_size;
+       INFERIOR_REG_RDX (arch->current_regs) = data_argument2;
+       INFERIOR_REG_RCX (arch->current_regs) = new_rsp + static_size;
        INFERIOR_REG_RSP (arch->current_regs) = new_rsp;
 
        g_ptr_array_add (arch->callback_stack, cdata);

Modified: trunk/debugger/classes/Thread.cs
===================================================================
--- trunk/debugger/classes/Thread.cs    2007-11-20 19:34:24 UTC (rev 90019)
+++ trunk/debugger/classes/Thread.cs    2007-11-20 19:47:04 UTC (rev 90020)
@@ -559,6 +559,23 @@
                        }
                }
 
+               public TargetAddress CallMethod (TargetAddress method, long 
arg1, long arg2)
+               {
+                       CommandResult result;
+
+                       lock (this) {
+                               check_alive ();
+                               result = servant.CallMethod (method, arg1, 
arg2);
+                       }
+
+                       result.Wait ();
+
+                       if (result.Result == null)
+                               throw new TargetException 
(TargetError.UnknownError);
+
+                       return (TargetAddress) result.Result;
+               }
+
                public TargetAddress CallMethod (TargetAddress method, 
TargetAddress arg1,
                                                 long arg2)
                {
@@ -578,13 +595,14 @@
                }
 
                public TargetAddress CallMethod (TargetAddress method, 
TargetAddress arg1,
-                                                long arg2, string string_arg)
+                                                long arg2, long arg3, string 
string_arg)
                {
                        CommandResult result;
 
                        lock (this) {
                                check_alive ();
-                               result = servant.CallMethod (method, 
arg1.Address, arg2, string_arg);
+                               result = servant.CallMethod (
+                                       method, arg1.Address, arg2, arg3, 
string_arg);
                        }
 
                        result.Wait ();

Modified: trunk/debugger/languages/TargetFunctionType.cs
===================================================================
--- trunk/debugger/languages/TargetFunctionType.cs      2007-11-20 19:34:24 UTC 
(rev 90019)
+++ trunk/debugger/languages/TargetFunctionType.cs      2007-11-20 19:47:04 UTC 
(rev 90020)
@@ -1,4 +1,5 @@
-using System.Runtime.Serialization;
+using System;
+using Mono.Debugger.Backends;
 
 namespace Mono.Debugger.Languages
 {
@@ -72,7 +73,8 @@
 
                public abstract TargetAddress GetMethodAddress (Thread target);
 
-               internal abstract bool InsertBreakpoint (Thread target, 
MethodLoadedHandler handler);
+               internal abstract bool InsertBreakpoint (Thread target,
+                                                        
FunctionBreakpointHandle handle);
 
                internal abstract void RemoveBreakpoint (Thread target);
        }

Modified: trunk/debugger/languages/mono/MonoClassType.cs
===================================================================
--- trunk/debugger/languages/mono/MonoClassType.cs      2007-11-20 19:34:24 UTC 
(rev 90019)
+++ trunk/debugger/languages/mono/MonoClassType.cs      2007-11-20 19:47:04 UTC 
(rev 90020)
@@ -473,7 +473,7 @@
 
                        TargetAddress klass_address = target.CallMethod (
                                file.MonoLanguage.MonoDebuggerInfo.LookupClass,
-                               file.MonoImage, 0, Name);
+                               file.MonoImage, 0, 0, Name);
 
                        class_info = file.MonoLanguage.ReadClassInfo (target, 
klass_address);
                        if (class_info == null)

Modified: trunk/debugger/languages/mono/MonoFunctionType.cs
===================================================================
--- trunk/debugger/languages/mono/MonoFunctionType.cs   2007-11-20 19:34:24 UTC 
(rev 90019)
+++ trunk/debugger/languages/mono/MonoFunctionType.cs   2007-11-20 19:47:04 UTC 
(rev 90020)
@@ -179,13 +179,11 @@
                        get { return true; }
                }
 
-               internal override bool InsertBreakpoint (Thread target, 
MethodLoadedHandler handler)
+               internal override bool InsertBreakpoint (Thread target,
+                                                        
FunctionBreakpointHandle handle)
                {
-                       TargetAddress method = GetMethodAddress (target);
-
                        load_handler = 
klass.File.MonoLanguage.RegisterMethodLoadHandler (
-                               target, method, handler);
-
+                               target, this, handle);
                        return load_handler > 0;
                }
 

Modified: trunk/debugger/languages/mono/MonoLanguageBackend.cs
===================================================================
--- trunk/debugger/languages/mono/MonoLanguageBackend.cs        2007-11-20 
19:34:24 UTC (rev 90019)
+++ trunk/debugger/languages/mono/MonoLanguageBackend.cs        2007-11-20 
19:47:04 UTC (rev 90020)
@@ -384,15 +384,13 @@
 
                void read_mono_debugger_info (TargetMemoryAccess memory)
                {
-                       trampolines = new TargetAddress [4];
+                       trampolines = new TargetAddress 
[info.MonoTrampolineNum];
+
                        TargetAddress address = info.MonoTrampolineCode;
-                       trampolines [0] = memory.ReadAddress (address);
-                       address += memory.TargetMemoryInfo.TargetAddressSize;
-                       trampolines [1] = memory.ReadAddress (address);
-                       address += memory.TargetMemoryInfo.TargetAddressSize;
-                       trampolines [2] = memory.ReadAddress (address);
-                       address += 2 * 
memory.TargetMemoryInfo.TargetAddressSize;
-                       trampolines [3] = memory.ReadAddress (address);
+                       for (int i = 0; i < trampolines.Length; i++) {
+                               trampolines [i] = memory.ReadAddress (address);
+                               address += 
memory.TargetMemoryInfo.TargetAddressSize;
+                       }
 
                        symfile_by_index = new Hashtable ();
                        symfile_by_image_addr = new Hashtable ();
@@ -723,7 +721,7 @@
                        int index = GetUniqueID ();
 
                        TargetAddress retval = target.CallMethod (
-                               info.InsertBreakpoint, method_address, index);
+                               info.InsertMethodBreakpoint, method_address, 
index);
 
                        if (!retval.IsNull)
                                method_from_jit_info (target, retval, handler);
@@ -739,9 +737,27 @@
 
                internal void RemoveMethodLoadHandler (Thread target, int index)
                {
-                       target.CallMethod (info.RemoveBreakpoint, 
TargetAddress.Null, 0);
+                       target.CallMethod (info.RemoveBreakpoint, index, 0);
                        method_load_handlers.Remove (index);
                }
+
+               internal int RegisterMethodLoadHandler (Thread target, 
MonoFunctionType func,
+                                                       
FunctionBreakpointHandle handle)
+               {
+                       int index = GetUniqueID ();
+
+                       TargetAddress retval = target.CallMethod (
+                               info.InsertSourceBreakpoint, 
func.MonoClass.File.MonoImage,
+                               func.Token, index, func.MonoClass.Name);
+
+                       MethodLoadedHandler handler = handle.MethodLoaded;
+
+                       if (!retval.IsNull)
+                               method_from_jit_info (target, retval, handler);
+
+                       method_load_handlers.Add (index, handler);
+                       return index;
+               }
 #endregion
 
 #region Language implementation

Modified: trunk/debugger/languages/mono/MonoStringType.cs
===================================================================
--- trunk/debugger/languages/mono/MonoStringType.cs     2007-11-20 19:34:24 UTC 
(rev 90019)
+++ trunk/debugger/languages/mono/MonoStringType.cs     2007-11-20 19:47:04 UTC 
(rev 90020)
@@ -69,7 +69,7 @@
                                 throw new ArgumentException ();
 
                         TargetAddress retval = target.CallMethod (
-                               CreateString, TargetAddress.Null, 0, str);
+                               CreateString, TargetAddress.Null, 0, 0, str);
                         TargetLocation location = new AbsoluteTargetLocation 
(retval);
                         return new MonoStringObject (this, location);
                 }

Modified: trunk/debugger/languages/native/NativeFunctionType.cs
===================================================================
--- trunk/debugger/languages/native/NativeFunctionType.cs       2007-11-20 
19:34:24 UTC (rev 90019)
+++ trunk/debugger/languages/native/NativeFunctionType.cs       2007-11-20 
19:47:04 UTC (rev 90020)
@@ -1,5 +1,5 @@
 using System;
-using System.Runtime.Serialization;
+using Mono.Debugger.Backends;
 
 namespace Mono.Debugger.Languages.Native
 {
@@ -116,7 +116,8 @@
                        get { return false; }
                }
 
-               internal override bool InsertBreakpoint (Thread target, 
MethodLoadedHandler handler)
+               internal override bool InsertBreakpoint (Thread target,
+                                                        
FunctionBreakpointHandle handle)
                {
                        throw new InvalidOperationException ();
                }

Modified: trunk/debugger/test/testsuite/TestDelegate.cs
===================================================================
--- trunk/debugger/test/testsuite/TestDelegate.cs       2007-11-20 19:34:24 UTC 
(rev 90019)
+++ trunk/debugger/test/testsuite/TestDelegate.cs       2007-11-20 19:47:04 UTC 
(rev 90020)
@@ -15,7 +15,7 @@
                { }
 
                [Test]
-               [Category("ManagedTypes")]
+               [Category("NotWorking")]
                public void Main ()
                {
                        Process process = Start ();

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to