author | Claus Gittinger <cg@exept.de> |
Mon, 27 Jan 2020 12:51:03 +0100 | |
changeset 4618 | 9978e42e49f0 |
parent 4467 | 4698a67f4800 |
child 4723 | 524785227024 |
permissions | -rw-r--r-- |
3116 | 1 |
"{ Package: 'stx:libcomp' }" |
2 |
||
4361 | 3 |
"{ NameSpace: Smalltalk }" |
4 |
||
3116 | 5 |
Parser variableSubclass:#BreakpointAnalyzer |
6 |
instanceVariableNames:'messageSendMap' |
|
7 |
classVariableNames:'' |
|
8 |
poolDictionaries:'' |
|
9 |
category:'System-Compiler-Debugging' |
|
10 |
! |
|
11 |
||
12 |
||
13 |
!BreakpointAnalyzer methodsFor:'accessing'! |
|
14 |
||
15 |
messageSendMap |
|
16 |
^ messageSendMap |
|
17 |
! ! |
|
18 |
||
19 |
!BreakpointAnalyzer methodsFor:'code generation hooks'! |
|
20 |
||
21 |
messageNodeRewriteHookFor:aMessageNode |
|
22 |
"invoked whenever a message send node has been generated; |
|
23 |
gives subclasses a chance to rewrite (instrument) it" |
|
24 |
||
4361 | 25 |
(messageSendMap at:(aMessageNode line) ifAbsentPut:[Bag new]) |
26 |
add:(aMessageNode selector). |
|
3116 | 27 |
|
28 |
^ aMessageNode |
|
29 |
||
30 |
"Created: / 15-04-2013 / 15:32:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
3130
bde0df5a7c1d
defined source container
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3116
diff
changeset
|
31 |
"Modified: / 16-04-2013 / 23:07:13 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
4361 | 32 |
"Modified (format): / 20-02-2019 / 10:49:33 / Claus Gittinger" |
3116 | 33 |
! ! |
34 |
||
35 |
!BreakpointAnalyzer methodsFor:'initialization'! |
|
36 |
||
37 |
initialize |
|
38 |
super initialize. |
|
39 |
messageSendMap := Dictionary new. |
|
40 |
||
41 |
"Created: / 15-04-2013 / 15:29:14 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
42 |
! ! |
|
43 |
||
3151
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
44 |
!BreakpointAnalyzer methodsFor:'private'! |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
45 |
|
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
46 |
genMakeArrayWith:elementExpressions |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
47 |
"return a node to generate an array at runtime. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
48 |
Will generate: |
4467 | 49 |
literal shallowCopy (if all elements are literals) |
50 |
or else: |
|
51 |
Array with:el1 ... with:elN (if N <= 8) |
|
3151
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
52 |
or: |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
53 |
(Array new at:1 put:el1; ... at:N put:elN; yourself) (otherwise) |
4467 | 54 |
|
55 |
SIGH: duplicate code here, because the other implementation is on the class side, |
|
56 |
and shared by JavaScriptParser and regular Parser. |
|
3151
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
57 |
" |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
58 |
|
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
59 |
|numEl arrRec sel expr| |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
60 |
|
4467 | 61 |
(elementExpressions conform:#isConstant) ifTrue:[ |
62 |
arrRec := ConstantNode type:#Array value:(elementExpressions collect:#value as:Array) from:-1 to:-1. "/ position -1 means artifitial node |
|
63 |
^ self messageNodeRewriteHookFor:(MessageNode receiver:arrRec selector:#shallowCopy). |
|
64 |
]. |
|
65 |
||
3151
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
66 |
arrRec := VariableNode globalNamed:#Array. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
67 |
arrRec startPosition: -1 endPosition: -1. "/ -1 means artifitial node |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
68 |
|
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
69 |
numEl := elementExpressions size. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
70 |
|
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
71 |
(numEl between:1 and:8) ifTrue:[ |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
72 |
sel := #( |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
73 |
#'with:' |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
74 |
#'with:with:' |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
75 |
#'with:with:with:' |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
76 |
#'with:with:with:with:' |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
77 |
#'with:with:with:with:with:' |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
78 |
#'with:with:with:with:with:with:' |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
79 |
#'with:with:with:with:with:with:with:' |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
80 |
#'with:with:with:with:with:with:with:with:' |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
81 |
) at:numEl. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
82 |
|
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
83 |
^ self messageNodeRewriteHookFor:(MessageNode |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
84 |
receiver:arrRec |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
85 |
selector:sel |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
86 |
args:elementExpressions). |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
87 |
]. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
88 |
|
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
89 |
"/ array creation expression ... |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
90 |
expr := MessageNode |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
91 |
receiver:arrRec |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
92 |
selector:#new: |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
93 |
arg:(ConstantNode type:#Integer value:numEl from: -1 to: -1). "/ -1 means artifitial node |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
94 |
expr := self messageNodeRewriteHookFor:expr. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
95 |
|
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
96 |
numEl == 0 ifTrue:[ |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
97 |
^ expr. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
98 |
]. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
99 |
"/ followed by a bunch of #at:put: messages... |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
100 |
elementExpressions keysAndValuesDo:[:idx :e | |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
101 |
expr := (idx == 1 ifTrue:[MessageNode] ifFalse:[CascadeNode]) |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
102 |
receiver:expr |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
103 |
selector:#at:put: |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
104 |
arg1:(ConstantNode type:#Integer value:idx from: -1 to:-1)"/ -1 means artifitial node |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
105 |
arg2:e |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
106 |
fold:false. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
107 |
expr := self messageNodeRewriteHookFor:expr. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
108 |
]. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
109 |
"/ followed by a #yourself: message... |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
110 |
expr := CascadeNode |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
111 |
receiver:expr |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
112 |
selector:#yourself. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
113 |
expr := self messageNodeRewriteHookFor:expr. |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
114 |
^ expr |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
115 |
|
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
116 |
"Modified: / 24-04-2013 / 21:09:27 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
117 |
! ! |
4053541783fd
Also count messages for artificial sends used to instantiate
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
3130
diff
changeset
|
118 |
|
3116 | 119 |
!BreakpointAnalyzer class methodsFor:'documentation'! |
120 |
||
121 |
version |
|
4361 | 122 |
^ '$Header$' |
3116 | 123 |
! |
124 |
||
125 |
version_CVS |
|
4361 | 126 |
^ '$Header$' |
3116 | 127 |
! ! |
128 |