MessageNode.st
changeset 1384 0db9682870d9
parent 1382 10281d2f42d1
child 1387 ddc5f8d9b562
equal deleted inserted replaced
1383:3d485eefbb36 1384:0db9682870d9
   316 
   316 
   317 selector
   317 selector
   318     ^ selector
   318     ^ selector
   319 !
   319 !
   320 
   320 
       
   321 selector:s
       
   322     selector := s asSymbolIfInterned ? s.
       
   323 !
       
   324 
   321 selectorPosition
   325 selectorPosition
   322     "return the value of the instance variable 'selectorPosition' (automatically generated)"
   326     "return the value of the instance variable 'selectorPosition' (automatically generated)"
   323 
   327 
   324     ^ selectorPosition
   328     ^ selectorPosition
   325 
   329 
   435 !
   439 !
   436 
   440 
   437 plausibilityCheck
   441 plausibilityCheck
   438     |rec arg1 arg2 arg1Value operand|
   442     |rec arg1 arg2 arg1Value operand|
   439 
   443 
   440     selector := selector asSymbol.
       
   441 
       
   442     (argArray size > 0) ifTrue:[
   444     (argArray size > 0) ifTrue:[
   443         arg1 := argArray at:1
   445         arg1 := argArray at:1
   444     ].
   446     ].
   445 
   447 
   446     "
   448     "
   778 
   780 
   779     noSendDrop := aCompiler class newCodeSet == true.
   781     noSendDrop := aCompiler class newCodeSet == true.
   780 
   782 
   781     realReceiver := self realReceiver.
   783     realReceiver := self realReceiver.
   782     isSuper := realReceiver isSuper.
   784     isSuper := realReceiver isSuper.
   783     selector := selector asSymbol.
       
   784 
   785 
   785     argArray isNil ifTrue:[
   786     argArray isNil ifTrue:[
   786         nargs := 0
   787         nargs := 0
   787     ] ifFalse:[
   788     ] ifFalse:[
   788         nargs := argArray size
   789         nargs := argArray size
  1326 
  1327 
  1327     noSendDrop := aCompiler class newCodeSet == true.
  1328     noSendDrop := aCompiler class newCodeSet == true.
  1328 
  1329 
  1329     realReceiver := self realReceiver.
  1330     realReceiver := self realReceiver.
  1330     isSuper := realReceiver isSuper.
  1331     isSuper := realReceiver isSuper.
  1331     selector := selector asSymbol.
       
  1332 
  1332 
  1333     argArray isNil ifTrue:[
  1333     argArray isNil ifTrue:[
  1334         nargs := 0
  1334         nargs := 0
  1335     ] ifFalse:[
  1335     ] ifFalse:[
  1336         nargs := argArray size.
  1336         nargs := argArray size.
  1972      coded onto stack - needed for cascade"
  1972      coded onto stack - needed for cascade"
  1973 
  1973 
  1974     |nargs isBuiltIn code codeL litIndex cls clsLitIndex isSuper realReceiver noSendDrop|
  1974     |nargs isBuiltIn code codeL litIndex cls clsLitIndex isSuper realReceiver noSendDrop|
  1975 
  1975 
  1976     noSendDrop := aCompiler class newCodeSet == true.
  1976     noSendDrop := aCompiler class newCodeSet == true.
  1977     selector := selector asSymbol.
       
  1978 
  1977 
  1979     realReceiver := self realReceiver.
  1978     realReceiver := self realReceiver.
  1980     isSuper := realReceiver isSuper.
  1979     isSuper := realReceiver isSuper.
  1981 
  1980 
  1982     argArray isNil ifTrue:[
  1981     argArray isNil ifTrue:[
  2851     "Modified: 19.6.1997 / 17:08:28 / cg"
  2850     "Modified: 19.6.1997 / 17:08:28 / cg"
  2852 ! !
  2851 ! !
  2853 
  2852 
  2854 !MessageNode methodsFor:'evaluation'!
  2853 !MessageNode methodsFor:'evaluation'!
  2855 
  2854 
  2856 evaluate
  2855 evaluateForCascadeIn:anEnvironment
       
  2856     |r a1 a2 a3 nargs argValueArray class|
       
  2857 
       
  2858     receiver isSuper ifTrue:[
       
  2859         r := receiver value.
       
  2860         class := receiver definingClass.
       
  2861         receiver isHere ifFalse:[
       
  2862             class := class superclass.
       
  2863         ].
       
  2864         argArray notNil ifTrue:[
       
  2865             argValueArray := argArray collect:[:arg | arg evaluateIn:anEnvironment].
       
  2866         ] ifFalse:[
       
  2867             argValueArray := #()
       
  2868         ].
       
  2869         r perform:selector inClass:class withArguments:argValueArray.
       
  2870         ^ r
       
  2871     ].
       
  2872 
       
  2873     r := receiver evaluateIn:anEnvironment.
       
  2874     argArray isNil ifTrue:[
       
  2875         r perform:selector.
       
  2876         ^ r
       
  2877     ].
       
  2878     nargs := argArray size.
       
  2879     a1 := (argArray at:1) evaluateIn:anEnvironment.
       
  2880     (nargs == 1) ifTrue:[
       
  2881         r perform:selector with:a1.
       
  2882         ^ r
       
  2883     ].
       
  2884     a2 := (argArray at:2) evaluateIn:anEnvironment.
       
  2885     (nargs == 2) ifTrue:[
       
  2886         r perform:selector with:a1
       
  2887                            with:a2.
       
  2888         ^ r
       
  2889     ].
       
  2890     a3 := (argArray at:3) evaluateIn:anEnvironment.
       
  2891     (nargs == 3) ifTrue:[
       
  2892         r perform:selector with:a1
       
  2893                            with:a2
       
  2894                            with:a3.
       
  2895         ^ r
       
  2896     ].
       
  2897     argValueArray := Array new:nargs.
       
  2898     argValueArray at:1 put:a1.
       
  2899     argValueArray at:2 put:a2.
       
  2900     argValueArray at:3 put:a3.
       
  2901     3 to:nargs do:[:idx | 
       
  2902                     |argVal|
       
  2903 
       
  2904                     argVal := (argArray at:3) evaluateIn:anEnvironment.
       
  2905                     argValueArray at:idx put:argVal.
       
  2906                   ].
       
  2907     r perform:selector withArguments:argValueArray.
       
  2908     ^ r
       
  2909 !
       
  2910 
       
  2911 evaluateIn:anEnvironment
  2857     |r nargs argValueArray class|
  2912     |r nargs argValueArray class|
  2858 
       
  2859     selector := selector asSymbol.
       
  2860 
  2913 
  2861     receiver isSuper ifTrue:[
  2914     receiver isSuper ifTrue:[
  2862         r := receiver value.
  2915         r := receiver value.
  2863         receiver isHere ifTrue:[
  2916         receiver isHere ifTrue:[
  2864             class := receiver definingClass.
  2917             class := receiver definingClass.
  2865         ] ifFalse:[
  2918         ] ifFalse:[
  2866             class := receiver definingClass superclass.
  2919             class := receiver definingClass superclass.
  2867         ].
  2920         ].
  2868         argArray notNil ifTrue:[
  2921         argArray notNil ifTrue:[
  2869             argValueArray := argArray collect:[:arg | arg evaluate].
  2922             argValueArray := argArray collect:[:arg | arg evaluateIn:anEnvironment].
  2870         ] ifFalse:[
  2923         ] ifFalse:[
  2871             argValueArray := #()
  2924             argValueArray := #()
  2872         ].
  2925         ].
  2873         ^ r perform:selector inClass:class withArguments:argValueArray
  2926         ^ r perform:selector inClass:class withArguments:argValueArray
  2874     ].
  2927     ].
  2875 
  2928     r := receiver evaluateIn:anEnvironment.
  2876 
  2929 
  2877     argArray isNil ifTrue:[
  2930     argArray isNil ifTrue:[
  2878         ^ (receiver evaluate) perform:selector
  2931         ^ r perform:selector
  2879     ].
  2932     ].
  2880     nargs := argArray size.
  2933     nargs := argArray size.
  2881     (nargs == 0) ifTrue:[
  2934     (nargs == 0) ifTrue:[
  2882         ^ (receiver evaluate) perform:selector
  2935         ^ r perform:selector
  2883     ].
  2936     ].
  2884     (nargs == 1) ifTrue:[
  2937     (nargs == 1) ifTrue:[
  2885         ^ (receiver evaluate) perform:selector with:(argArray at:1) evaluate
  2938         ^ r perform:selector 
       
  2939             with:((argArray at:1) evaluateIn:anEnvironment)
  2886     ].
  2940     ].
  2887     (nargs == 2) ifTrue:[
  2941     (nargs == 2) ifTrue:[
  2888         ^ (receiver evaluate) perform:selector
  2942         ^ r perform:selector
  2889                                  with:(argArray at:1) evaluate
  2943             with:((argArray at:1) evaluateIn:anEnvironment)
  2890                                  with:(argArray at:2) evaluate
  2944             with:((argArray at:2) evaluateIn:anEnvironment)
  2891     ].
  2945     ].
  2892     (nargs == 3) ifTrue:[
  2946     (nargs == 3) ifTrue:[
  2893         ^ (receiver evaluate) perform:selector
  2947         ^ r perform:selector
  2894                                  with:(argArray at:1) evaluate
  2948             with:((argArray at:1) evaluateIn:anEnvironment)
  2895                                  with:(argArray at:2) evaluate
  2949             with:((argArray at:2) evaluateIn:anEnvironment)
  2896                                  with:(argArray at:3) evaluate
  2950             with:((argArray at:3) evaluateIn:anEnvironment)
  2897     ].
  2951     ].
  2898     r := receiver evaluate.
  2952     argValueArray := argArray collect:[:arg | arg evaluateIn:anEnvironment].
  2899     argValueArray := argArray collect:[:arg | arg evaluate].
       
  2900     ^ r perform:selector withArguments:argValueArray
  2953     ^ r perform:selector withArguments:argValueArray
  2901 !
       
  2902 
       
  2903 evaluateForCascade
       
  2904     |r nargs argValueArray class|
       
  2905 
       
  2906     selector := selector asSymbol.
       
  2907 
       
  2908     receiver isSuper ifTrue:[
       
  2909         r := receiver value.
       
  2910         class := receiver definingClass.
       
  2911         receiver isHere ifFalse:[
       
  2912             class := class superclass.
       
  2913         ].
       
  2914         argArray notNil ifTrue:[
       
  2915             argValueArray := argArray collect:[:arg | arg evaluate].
       
  2916         ] ifFalse:[
       
  2917             argValueArray := #()
       
  2918         ].
       
  2919         r perform:selector inClass:class withArguments:argValueArray.
       
  2920         ^ r
       
  2921     ].
       
  2922 
       
  2923     r := receiver evaluate.
       
  2924     argArray isNil ifTrue:[
       
  2925         r perform:selector.
       
  2926         ^ r
       
  2927     ].
       
  2928     nargs := argArray size.
       
  2929     (nargs == 1) ifTrue:[
       
  2930         r perform:selector with:(argArray at:1) evaluate.
       
  2931         ^ r
       
  2932     ].
       
  2933     (nargs == 2) ifTrue:[
       
  2934         r perform:selector with:(argArray at:1) evaluate
       
  2935                            with:(argArray at:2) evaluate.
       
  2936         ^ r
       
  2937     ].
       
  2938     (nargs == 3) ifTrue:[
       
  2939         r perform:selector with:(argArray at:1) evaluate
       
  2940                            with:(argArray at:2) evaluate
       
  2941                            with:(argArray at:3) evaluate.
       
  2942         ^ r
       
  2943     ].
       
  2944     argValueArray := argArray collect:[:arg | arg evaluate].
       
  2945     r perform:selector withArguments:argValueArray.
       
  2946     ^ r
       
  2947 ! !
  2954 ! !
  2948 
  2955 
  2949 !MessageNode methodsFor:'printing & storing'!
  2956 !MessageNode methodsFor:'printing & storing'!
  2950 
  2957 
  2951 printOn:aStream indent:i
  2958 printOn:aStream indent:i
  3057 
  3064 
  3058 isMessage
  3065 isMessage
  3059     ^ true
  3066     ^ true
  3060 !
  3067 !
  3061 
  3068 
       
  3069 numArgs
       
  3070     ^ argArray size
       
  3071 !
       
  3072 
  3062 realReceiver
  3073 realReceiver
  3063     receiver isCascade ifTrue:[
  3074     receiver isCascade ifTrue:[
  3064         ^ receiver realReceiver
  3075         ^ receiver realReceiver
  3065     ].
  3076     ].
  3066     self isCascade ifTrue:[
  3077     self isCascade ifTrue:[
  3073 ! !
  3084 ! !
  3074 
  3085 
  3075 !MessageNode class methodsFor:'documentation'!
  3086 !MessageNode class methodsFor:'documentation'!
  3076 
  3087 
  3077 version
  3088 version
  3078     ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.126 2003-03-27 22:31:40 cg Exp $'
  3089     ^ '$Header: /cvs/stx/stx/libcomp/MessageNode.st,v 1.127 2003-03-28 14:40:25 cg Exp $'
  3079 ! !
  3090 ! !