1 "{ Package: 'jv:tea/compiler' }" |
1 "{ Package: 'jv:tea/compiler' }" |
2 |
2 |
3 "{ NameSpace: Smalltalk }" |
3 "{ NameSpace: Smalltalk }" |
4 |
4 |
5 TProgramNodeVisitor subclass:#TCompilerPass |
5 TProgramNodeVisitor subclass:#TCompilerPass |
6 instanceVariableNames:'context currentClass currentMethod currentScope' |
6 instanceVariableNames:'context' |
7 classVariableNames:'' |
7 classVariableNames:'' |
8 poolDictionaries:'' |
8 poolDictionaries:'' |
9 category:'Languages-Tea-Compiler-Internals' |
9 category:'Languages-Tea-Compiler-Internals' |
10 ! |
10 ! |
11 |
11 |
87 "Created: / 29-08-2015 / 21:50:53 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
87 "Created: / 29-08-2015 / 21:50:53 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
88 ! ! |
88 ! ! |
89 |
89 |
90 !TCompilerPass methodsFor:'visitor-double dispatching'! |
90 !TCompilerPass methodsFor:'visitor-double dispatching'! |
91 |
91 |
92 acceptBlockNode: aBlockNode |
|
93 currentScope := aBlockNode scope. |
|
94 super acceptBlockNode: aBlockNode |
|
95 |
|
96 "Created: / 02-09-2015 / 07:20:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
97 ! |
|
98 |
|
99 acceptClassDefinition: aTClassDefinition |
92 acceptClassDefinition: aTClassDefinition |
100 self visitDefinition: aTClassDefinition theMetaclass. |
93 self visitDefinition: aTClassDefinition theMetaclass. |
101 |
|
102 currentClass := aTClassDefinition. |
|
103 aTClassDefinition methodDictionary do:[:each | |
94 aTClassDefinition methodDictionary do:[:each | |
104 self visitDefinition: each |
95 self visitDefinition: each |
105 ]. |
96 ]. |
106 currentClass := nil. |
|
107 |
97 |
108 "Created: / 29-08-2015 / 21:50:36 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
98 "Created: / 29-08-2015 / 21:50:36 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
109 "Modified: / 31-08-2015 / 11:03:20 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
99 "Modified: / 23-09-2015 / 06:16:03 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
110 ! |
100 ! |
111 |
101 |
112 acceptCompilationUnitDefinition: aTCompilationUnitDefinition |
102 acceptCompilationUnitDefinition: aTCompilationUnitDefinition |
113 aTCompilationUnitDefinition classes do:[:class | |
103 aTCompilationUnitDefinition classes do:[:class | |
114 self visitDefinition: class. |
104 self visitDefinition: class. |
134 |
124 |
135 "Created: / 02-09-2015 / 07:03:06 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
125 "Created: / 02-09-2015 / 07:03:06 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
136 ! |
126 ! |
137 |
127 |
138 acceptMetaclassDefinition: aTClassDefinition |
128 acceptMetaclassDefinition: aTClassDefinition |
139 currentClass := aTClassDefinition. |
|
140 aTClassDefinition methodDictionary do:[:each | |
129 aTClassDefinition methodDictionary do:[:each | |
141 self visitDefinition: each |
130 self visitDefinition: each |
142 ]. |
131 ]. |
143 currentClass := nil. |
|
144 |
132 |
145 "Created: / 29-08-2015 / 21:54:24 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
133 "Created: / 29-08-2015 / 21:54:24 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
146 "Modified: / 31-08-2015 / 11:03:35 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
134 "Modified: / 23-09-2015 / 06:16:10 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
147 ! |
135 ! |
148 |
136 |
149 acceptMethodDefinition: aTMethodDefinition |
137 acceptMethodDefinition: aTMethodDefinition |
150 currentMethod := aTMethodDefinition. |
|
151 self visitNode: aTMethodDefinition parseTree. |
138 self visitNode: aTMethodDefinition parseTree. |
152 currentMethod := nil. |
|
153 |
139 |
154 "Created: / 29-08-2015 / 21:55:41 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
140 "Created: / 29-08-2015 / 21:55:41 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
155 "Modified: / 31-08-2015 / 11:03:51 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
141 "Modified: / 23-09-2015 / 06:17:07 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
156 ! |
|
157 |
|
158 acceptMethodNode: aMethodNode |
|
159 |
|
160 currentScope := aMethodNode scope. |
|
161 self visitArguments: aMethodNode arguments. |
|
162 self visitNode: aMethodNode returnTypeSpec. |
|
163 "/ If method node contains inline assembly, then visit that inline assembly |
|
164 "/ node but nothing else!! |
|
165 aMethodNode body statements first isInlineAssembly ifTrue:[ |
|
166 self visitNode: aMethodNode body statements first |
|
167 ] ifFalse:[ |
|
168 self visitNode: aMethodNode body |
|
169 ]. |
|
170 |
|
171 "Created: / 02-09-2015 / 07:16:37 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
172 ! |
142 ! |
173 |
143 |
174 acceptSequenceNode: aSequenceNode |
144 acceptSequenceNode: aSequenceNode |
175 | last | |
145 | last | |
176 self passByNode:aSequenceNode. |
146 self passByNode:aSequenceNode. |