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 |