pascalabcnet/VisualPascalABCNETLinux/MonoDebugging/Client/BreakEventInfo.cs

160 lines
5.2 KiB
C#
Raw Normal View History

2023-04-10 22:04:27 +03:00
//
// BreakEventInfo.cs
//
// Author:
// Lluis Sanchez Gual <lluis@novell.com>
//
// Copyright (c) 2011 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;
namespace Mono.Debugging.Client
{
/// <summary>
/// This class can be used to manage and get information about a breakpoint
/// at debug-time. It is intended to be used by DebuggerSession subclasses.
/// </summary>
public class BreakEventInfo
{
DebuggerSession session;
int adjustedColumn = -1;
int adjustedLine = -1;
/// <summary>
/// Gets or sets the implementation specific handle of the breakpoint
/// </summary>
public object Handle { get; set; }
/// <summary>
/// Break event that this instance represents
/// </summary>
public BreakEvent BreakEvent { get; internal set; }
/// <summary>
/// Gets the status of the break event
/// </summary>
public BreakEventStatus Status { get; private set; }
public Breakpoint Breakpoint { get; set; }
/// <summary>
/// Gets a description of the status
/// </summary>
public string StatusMessage { get; private set; }
internal void AttachSession (DebuggerSession s, BreakEvent ev)
{
session = s;
BreakEvent = ev;
session.NotifyBreakEventStatusChanged (BreakEvent);
if (adjustedLine != -1 || adjustedColumn != -1)
session.AdjustBreakpointLocation ((Breakpoint)BreakEvent, adjustedLine, adjustedColumn);
}
/// <summary>
/// Adjusts the location of a breakpoint
/// </summary>
/// <param name='newLine'>
/// New line.
/// </param>
/// <remarks>
/// This method can be used to temporarily change source code line of the breakpoint.
/// This is useful, for example, when two adjacent lines are mapped to a single
/// native offset. If the breakpoint is set to the first of those lines, the debugger
/// might end stopping in the second line, because it has the same native offset.
/// To avoid this confusion situation, the debugger implementation may decide to
/// adjust the position of the breakpoint, and move it to the second line.
/// This line adjustment has effect only during the debug session, and is automatically
/// reset when it terminates.
/// </remarks>
public void AdjustBreakpointLocation (int newLine, int newColumn)
{
if (session != null) {
session.AdjustBreakpointLocation ((Breakpoint)BreakEvent, newLine, newColumn);
} else {
adjustedColumn = newColumn;
adjustedLine = newLine;
}
}
/// <summary>
/// Increments the hit count.
/// </summary>
/// <returns><c>true</c> if the break event should trigger, or <c>false</c> otherwise.</returns>
public bool HitCountReached
{
get {
switch (BreakEvent.HitCountMode) {
case HitCountMode.LessThan:
return BreakEvent.CurrentHitCount < BreakEvent.HitCount;
case HitCountMode.LessThanOrEqualTo:
return BreakEvent.CurrentHitCount <= BreakEvent.HitCount;
case HitCountMode.EqualTo:
return BreakEvent.CurrentHitCount == BreakEvent.HitCount;
case HitCountMode.GreaterThan:
return BreakEvent.CurrentHitCount > BreakEvent.HitCount;
case HitCountMode.GreaterThanOrEqualTo:
return BreakEvent.CurrentHitCount >= BreakEvent.HitCount;
case HitCountMode.MultipleOf:
return (BreakEvent.CurrentHitCount % BreakEvent.HitCount) == 0;
default:
return true;
}
}
}
public void IncrementHitCount ()
{
if (BreakEvent.HitCountMode != HitCountMode.None) {
BreakEvent.CurrentHitCount++;
BreakEvent.NotifyUpdate ();
}
}
public void SetStatus (BreakEventStatus s, string statusMessage)
{
if (s != Status) {
Status = s;
StatusMessage = statusMessage;
if (session != null)
session.NotifyBreakEventStatusChanged (BreakEvent);
}
}
public bool RunCustomBreakpointAction (string actionId)
{
var h = session.CustomBreakEventHitHandler;
return h != null && h (actionId, BreakEvent);
}
public void UpdateLastTraceValue (string value)
{
BreakEvent.LastTraceValue = value;
BreakEvent.NotifyUpdate ();
if (value != null) {
if (session.BreakpointTraceHandler != null)
session.BreakpointTraceHandler (BreakEvent, value);
else
session.OnTargetDebug (0, "", value + Environment.NewLine);
}
}
}
}