forked from pharo-project/pharo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
StHaltAndBreakpointController.class.st
136 lines (117 loc) · 3.87 KB
/
StHaltAndBreakpointController.class.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
"
I provide control over halts messages and breakpoints for activating and deactivating them.
I also tell if a program node has active breakpoints or halts on it.
"
Class {
#name : #StHaltAndBreakpointController,
#superclass : #Object,
#classInstVars : [
'tracer'
],
#category : #'NewTools-Debugger-Breakpoints-Tools-Model'
}
{ #category : #Helpers }
StHaltAndBreakpointController class >> printSkipTextFor: aProgramNode [
^ aProgramNode methodNode source asText
makeBoldFrom: aProgramNode start to: aProgramNode stop;
yourself
]
{ #category : #API }
StHaltAndBreakpointController class >> skipHaltNode: aProgramNode [
self trace: (self printSkipTextFor: aProgramNode)
]
{ #category : #Helpers }
StHaltAndBreakpointController class >> trace: aTextOrString [
self tracer crTrace: aTextOrString
]
{ #category : #Helpers }
StHaltAndBreakpointController class >> tracer [
^ tracer ifNil: [ tracer := Transcript ]
]
{ #category : #Helpers }
StHaltAndBreakpointController class >> tracer: aTracer [
tracer := aTracer
]
{ #category : #API }
StHaltAndBreakpointController >> areHaltsAndBreakpoinsEnabledFor: aProgramNode [
^ aProgramNode enabledForHaltOrBreakpoint
]
{ #category : #control }
StHaltAndBreakpointController >> disableBreakpointNode: aProgramNode [
aProgramNode breakpoints do: [ :bp | bp disable ].
self skipNode: aProgramNode
]
{ #category : #links }
StHaltAndBreakpointController >> disableHaltLink: control [
^ MetaLink new
metaObject: self class;
selector: #skipHaltNode:;
arguments: #(node);
control: control;
yourself
]
{ #category : #control }
StHaltAndBreakpointController >> disableHaltNode: aMessageNode [
self skipNode: aMessageNode
]
{ #category : #API }
StHaltAndBreakpointController >> disableHaltOrBreakpointFor: aProgramNode [
aProgramNode isHaltNode
ifTrue: [ self disableHaltNode: aProgramNode ].
aProgramNode hasBreakpoint
ifTrue: [ self disableBreakpointNode: aProgramNode ]
]
{ #category : #API }
StHaltAndBreakpointController >> disableObjectCentricBreakpoint: anObjectCentricBreakpoint [
anObjectCentricBreakpoint targetInstance ifNil:[^self].
anObjectCentricBreakpoint link condition: [false]; disable
]
{ #category : #control }
StHaltAndBreakpointController >> enableBreakpointNode: aProgramNode [
aProgramNode breakpoints do: [ :bp | bp enable ].
self removeSkipLinksFor: aProgramNode
]
{ #category : #control }
StHaltAndBreakpointController >> enableHaltNode: aMessageNode [
self removeSkipLinksFor: aMessageNode
]
{ #category : #API }
StHaltAndBreakpointController >> enableHaltOrBreakpointFor: aProgramNode [
aProgramNode isHaltNode
ifTrue: [ self enableHaltNode: aProgramNode ].
aProgramNode hasBreakpoint
ifTrue: [ self enableBreakpointNode: aProgramNode ].
aProgramNode enableForHaltOrBreakpoint: true
]
{ #category : #API }
StHaltAndBreakpointController >> enableObjectCentricBreakpoint: anObjectCentricBreakpoint [
anObjectCentricBreakpoint targetInstance ifNil: [ ^ self ].
anObjectCentricBreakpoint link condition: [true]; enable
]
{ #category : #links }
StHaltAndBreakpointController >> installSkipLinkOn: aMessageNode [
| control |
control := aMessageNode isReturn
ifTrue: [ #before ]
ifFalse: [ #instead ].
aMessageNode link: (self disableHaltLink: control)
]
{ #category : #API }
StHaltAndBreakpointController >> isObjectCentricBreakpointEnabled: anObjectCentricBreakpoint [
anObjectCentricBreakpoint targetInstance ifNil: [ ^ false ].
^ anObjectCentricBreakpoint node enabledForHaltOrBreakpoint
]
{ #category : #links }
StHaltAndBreakpointController >> removeSkipLinksFor: aNode [
(aNode links
select:
[ :link | link control = #instead and: [ link metaObject == self class ] ])
do: [ :link | link uninstall ]
]
{ #category : #control }
StHaltAndBreakpointController >> skipNode: aNode [
(self areHaltsAndBreakpoinsEnabledFor: aNode)
ifFalse: [ ^ self ].
aNode enableForHaltOrBreakpoint: false.
self installSkipLinkOn: aNode
]