equal
deleted
inserted
replaced
48 ! ! |
48 ! ! |
49 |
49 |
50 !MessageNode class methodsFor:'instance creation'! |
50 !MessageNode class methodsFor:'instance creation'! |
51 |
51 |
52 receiver:recNode selector:selectorString |
52 receiver:recNode selector:selectorString |
53 ^ (self basicNew) receiver:recNode selector:selectorString args:nil lineno:0 |
53 ^ self receiver:recNode selector:selectorString args:nil lineno:0 |
|
54 |
|
55 "Modified: / 26-03-2018 / 15:34:28 / stefan" |
54 ! |
56 ! |
55 |
57 |
56 receiver:recNode selector:selectorString arg1:arg1Node arg2:arg2Node |
58 receiver:recNode selector:selectorString arg1:arg1Node arg2:arg2Node |
57 ^ self receiver:recNode selector:selectorString arg1:arg1Node arg2:arg2Node fold:nil |
59 ^ self receiver:recNode selector:selectorString arg1:arg1Node arg2:arg2Node fold:nil |
58 ! |
60 ! |
59 |
61 |
60 receiver:recNode selector:selectorString arg1:argNode1 arg2:argNode2 fold:folding |
62 receiver:recNode selector:selectorString arg1:argNode1 arg2:argNode2 fold:folding |
61 |result recVal argVal selector| |
63 |result recVal argVal selector cls| |
62 |
64 |
63 " |
65 " |
64 This is just a demonstration - of how complex constants can be folded. |
66 This is just a demonstration - of how complex constants can be folded. |
65 This was inspired by some discussion in c.l.s about enhancing the language - I prefer |
67 This was inspired by some discussion in c.l.s about enhancing the language - I prefer |
66 enhancing the compiler .... |
68 enhancing the compiler .... |
102 ] |
104 ] |
103 ] |
105 ] |
104 ] |
106 ] |
105 ] |
107 ] |
106 ]. |
108 ]. |
107 ^ (self basicNew) receiver:recNode selector:selectorString args:(Array with:argNode1 with:argNode2) lineno:0 |
109 |
108 |
110 cls := self. |
109 "Modified: 28.6.1997 / 15:16:01 / cg" |
111 cls == MessageNode ifTrue:[ |
|
112 "if sent to MessageNode (and not a concrete class), create concrete nodes" |
|
113 selectorString isUnarySelector ifTrue:[ |
|
114 cls := UnaryNode. |
|
115 ] ifFalse:[selectorString isBinarySelector ifTrue:[ |
|
116 cls := BinaryNode. |
|
117 ]]. |
|
118 ]. |
|
119 |
|
120 ^ self receiver:recNode selector:selectorString args:(Array with:argNode1 with:argNode2) lineno:0 |
|
121 |
|
122 "Modified: / 28-06-1997 / 15:16:01 / cg" |
|
123 "Modified: / 26-03-2018 / 15:34:14 / stefan" |
110 ! |
124 ! |
111 |
125 |
112 receiver:recNode selector:selectorString arg:argNode |
126 receiver:recNode selector:selectorString arg:argNode |
113 ^ self receiver:recNode selector:selectorString arg:argNode fold:nil |
127 ^ self receiver:recNode selector:selectorString arg:argNode fold:nil |
114 ! |
128 ! |
213 |
227 |
214 ] |
228 ] |
215 ]. |
229 ]. |
216 ]. |
230 ]. |
217 |
231 |
218 ^ (self basicNew) receiver:recNode selector:selectorString args:(Array with:argNode) lineno:0 |
232 ^ self receiver:recNode selector:selectorString args:(Array with:argNode) lineno:0 |
219 |
233 |
220 "Modified: / 16-11-1999 / 21:50:33 / cg" |
234 "Modified: / 16-11-1999 / 21:50:33 / cg" |
221 "Modified: / 01-08-2011 / 12:31:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
235 "Modified: / 01-08-2011 / 12:31:59 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
236 "Modified: / 26-03-2018 / 15:34:03 / stefan" |
222 ! |
237 ! |
223 |
238 |
224 receiver:recNode selector:selectorString args:anArray |
239 receiver:recNode selector:selectorString args:anArray |
225 ^ self receiver:recNode selector:selectorString args:anArray fold:nil |
240 ^ self receiver:recNode selector:selectorString args:anArray fold:nil |
226 ! |
241 ! |
269 numArgs > Method maxNumberOfArguments ifTrue:[ |
284 numArgs > Method maxNumberOfArguments ifTrue:[ |
270 ^ ParseErrorNode errorString:'too many arguments for current VM implementation'. |
285 ^ ParseErrorNode errorString:'too many arguments for current VM implementation'. |
271 ]. |
286 ]. |
272 ]. |
287 ]. |
273 |
288 |
274 ^ (self basicNew) receiver:recNode selector:selectorString args:argArray lineno:0 |
289 ^ self receiver:recNode selector:selectorString args:argArray lineno:0 |
275 |
290 |
276 "Modified: / 3.9.1995 / 16:41:39 / claus" |
291 "Modified: / 03-09-1995 / 16:41:39 / claus" |
277 "Modified: / 15.5.1998 / 15:32:05 / cg" |
292 "Modified: / 15-05-1998 / 15:32:05 / cg" |
|
293 "Modified: / 26-03-2018 / 15:33:42 / stefan" |
|
294 ! |
|
295 |
|
296 receiver:recNode selector:selectorString args:argArray lineno:lineNo |
|
297 |cls| |
|
298 |
|
299 cls := self. |
|
300 cls == MessageNode ifTrue:[ |
|
301 "if sent to MessageNode (and not a concrete class), create concrete nodes" |
|
302 selectorString isUnarySelector ifTrue:[ |
|
303 cls := UnaryNode. |
|
304 ] ifFalse:[selectorString isBinarySelector ifTrue:[ |
|
305 cls := BinaryNode. |
|
306 ]]. |
|
307 ]. |
|
308 |
|
309 ^ cls basicNew receiver:recNode selector:selectorString args:argArray lineno:lineNo |
|
310 |
|
311 "Created: / 26-03-2018 / 15:33:29 / stefan" |
278 ! ! |
312 ! ! |
279 |
313 |
280 !MessageNode methodsFor:'accessing'! |
314 !MessageNode methodsFor:'accessing'! |
281 |
315 |
282 arg1 |
316 arg1 |
1604 |
1638 |
1605 elseBlock := otherwiseArg ? (ConstantNode value:nil). |
1639 elseBlock := otherwiseArg ? (ConstantNode value:nil). |
1606 caseValueExpressions with:caseBlocks reverseDo:[:eachCaseValueExpression :eachCaseBlock | |
1640 caseValueExpressions with:caseBlocks reverseDo:[:eachCaseValueExpression :eachCaseBlock | |
1607 |cond| |
1641 |cond| |
1608 |
1642 |
1609 cond := MessageNode receiver:receiver selector:#'=' arg:eachCaseValueExpression. |
1643 cond := BinaryNode receiver:receiver selector:#= arg:eachCaseValueExpression. |
1610 ifMessage := MessageNode |
1644 ifMessage := MessageNode |
1611 receiver:cond |
1645 receiver:cond |
1612 selector:#'ifTrue:ifFalse:' |
1646 selector:#'ifTrue:ifFalse:' |
1613 arg1:eachCaseBlock |
1647 arg1:eachCaseBlock |
1614 arg2:elseBlock. |
1648 arg2:elseBlock. |
1616 ]. |
1650 ]. |
1617 ifMessage codeOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler. |
1651 ifMessage codeOn:aStream inBlock:b valueNeeded:valueNeeded for:aCompiler. |
1618 ^ true |
1652 ^ true |
1619 |
1653 |
1620 "Created: / 25-05-2012 / 11:28:27 / cg" |
1654 "Created: / 25-05-2012 / 11:28:27 / cg" |
|
1655 "Modified: / 26-03-2018 / 15:28:32 / stefan" |
1621 ! |
1656 ! |
1622 |
1657 |
1623 codeForCascadeOn:aStream inBlock:b for:aCompiler |
1658 codeForCascadeOn:aStream inBlock:b for:aCompiler |
1624 "like codeOn, but always leave the receiver instead of the result" |
1659 "like codeOn, but always leave the receiver instead of the result" |
1625 |
1660 |