1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2013-2014, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef USER_BREAKPOINT_H
7#define USER_BREAKPOINT_H
8
9
10#include <ObjectList.h>
11#include <Referenceable.h>
12#include <util/DoublyLinkedList.h>
13
14#include "SourceLocation.h"
15#include "String.h"
16#include "Types.h"
17
18
19class Breakpoint;
20class Function;
21class FunctionID;
22class LocatableFile;
23class UserBreakpoint;
24
25
26class UserBreakpointLocation {
27public:
28								UserBreakpointLocation(FunctionID* functionID,
29									LocatableFile* sourceFile,
30									const SourceLocation& sourceLocation,
31									target_addr_t relativeAddress);
32								UserBreakpointLocation(
33									const UserBreakpointLocation& other);
34	virtual						~UserBreakpointLocation();
35
36			FunctionID*			GetFunctionID() const	{ return fFunctionID; }
37			LocatableFile*		SourceFile() const		{ return fSourceFile; }
38			SourceLocation		GetSourceLocation() const
39									{ return fSourceLocation; }
40			target_addr_t		RelativeAddress() const
41									{ return fRelativeAddress; }
42
43			UserBreakpointLocation& operator=(
44									const UserBreakpointLocation& other);
45
46private:
47			FunctionID*			fFunctionID;
48			LocatableFile*		fSourceFile;
49			SourceLocation		fSourceLocation;
50			target_addr_t		fRelativeAddress;
51};
52
53
54class UserBreakpointInstance
55	: public DoublyLinkedListLinkImpl<UserBreakpointInstance> {
56public:
57								UserBreakpointInstance(
58									UserBreakpoint* userBreakpoint,
59									target_addr_t address);
60
61			UserBreakpoint*		GetUserBreakpoint() const
62									{ return fUserBreakpoint; }
63			target_addr_t		Address() const	{ return fAddress; }
64
65			Breakpoint*			GetBreakpoint() const	{ return fBreakpoint; }
66			void				SetBreakpoint(Breakpoint* breakpoint);
67
68private:
69			target_addr_t		fAddress;
70			UserBreakpoint*		fUserBreakpoint;
71			Breakpoint*			fBreakpoint;
72};
73
74
75typedef DoublyLinkedList<UserBreakpointInstance> UserBreakpointInstanceList;
76
77
78class UserBreakpoint : public BReferenceable,
79	public DoublyLinkedListLinkImpl<UserBreakpoint> {
80public:
81								UserBreakpoint(
82									const UserBreakpointLocation& location);
83								~UserBreakpoint();
84
85			const UserBreakpointLocation& Location() const { return fLocation; }
86
87			int32				CountInstances() const;
88			UserBreakpointInstance* InstanceAt(int32 index) const;
89
90			// Note: After known to the BreakpointManager, those can only be
91			// invoked with the breakpoint manager lock held.
92			bool				AddInstance(UserBreakpointInstance* instance);
93			void				RemoveInstance(
94									UserBreakpointInstance* instance);
95			UserBreakpointInstance* RemoveInstanceAt(int32 index);
96
97			bool				IsValid() const		{ return fValid; }
98			void				SetValid(bool valid);
99									// BreakpointManager only
100
101			bool				IsEnabled() const	{ return fEnabled; }
102			void				SetEnabled(bool enabled);
103									// BreakpointManager only
104
105			bool				IsHidden() const	{ return fHidden; }
106			void				SetHidden(bool hidden);
107
108			bool				HasCondition() const
109									{ return !fConditionExpression.IsEmpty(); }
110			const BString&		Condition() const
111									{ return fConditionExpression; }
112			void				SetCondition(
113									const BString& conditionExpression);
114
115private:
116			typedef BObjectList<UserBreakpointInstance> InstanceList;
117
118private:
119			UserBreakpointLocation fLocation;
120			InstanceList		fInstances;
121			bool				fValid;
122			bool				fEnabled;
123			bool				fHidden;
124			BString				fConditionExpression;
125};
126
127
128typedef DoublyLinkedList<UserBreakpoint> UserBreakpointList;
129
130
131#endif	// USER_BREAKPOINT_H
132