MessageNode.st
changeset 4221 b8d132c3e4bb
parent 4182 369c02a9555a
child 4235 fa13c6aa5831
equal deleted inserted replaced
4219:6c713d7fde5e 4221:b8d132c3e4bb
    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