UnaryNode.st
changeset 15 992c3d87edbf
parent 13 30e69e21d1d1
child 17 f06d70d785dc
--- a/UnaryNode.st	Mon Jan 17 10:14:07 1994 +0100
+++ b/UnaryNode.st	Fri Feb 25 13:52:15 1994 +0100
@@ -22,7 +22,7 @@
 COPYRIGHT (c) 1989 by Claus Gittinger
               All Rights Reserved
 
-$Header: /cvs/stx/stx/libcomp/UnaryNode.st,v 1.5 1994-01-16 03:51:45 claus Exp $
+$Header: /cvs/stx/stx/libcomp/UnaryNode.st,v 1.6 1994-02-25 12:49:52 claus Exp $
 '!
 
 !UnaryNode class methodsFor:'instance creation'!
@@ -34,11 +34,11 @@
     ^ self receiver:r selector:s fold:true
 !
 
-receiver:r selector:s fold:folding
-    "return a new UnaryNode for sending selector s to receiver r.
+receiver:r selector:selectorString fold:folding
+    "return a new UnaryNode for sending selector selectorString to receiver r.
      If folding is true, fold constant expressions."
 
-    |result recVal sym|
+    |result recVal selector|
 
 "
     The constant folding code can usually not optimize things - this may change
@@ -49,44 +49,52 @@
         r isConstant ifTrue:[
             "check if we can do it ..."
             recVal := r evaluate.
-            s knownAsSymbol ifTrue:[
-                (recVal respondsTo:sym) ifTrue:[
+            selectorString knownAsSymbol ifTrue:[
+                selector := selectorString asSymbol.
+                (recVal respondsTo:selector) ifTrue:[
                     "
                      we could do much more here - but then, we need a dependency from
                      the folded selectors method to the method we generate code for ...
                      limit optimizations to those that will never change 
                      (or, if you change them, it will crash badly anyway ...)
                     "
-                    Number domainErrorSignal handle:[:ex |
+                    SignalSet anySignal "Number domainErrorSignal" handle:[:ex |
+                        "in case of an error, abort fold and return original"
                         ex return
                     ] do:[
-                        sym := s asSymbol.
                         recVal respondsToArithmetic ifTrue:[
                             (#( negated abs asPoint degreesToRadians radiansToDegrees
                                 exp ln log sqrt reciprocal 
-                                arcCos arcSin arcTan sin cos tan) includes:sym)
+                                arcCos arcSin arcTan sin cos tan) includes:selector)
                             ifTrue:[
-                                result := recVal perform:sym.
+                                result := recVal perform:selector.
                                 ^ ConstantNode type:(ConstantNode typeOfConstant:result)
                                               value:result
                             ]
                         ].
                         (recVal isMemberOf:Character) ifTrue:[
-                            (#( asciiValue asInteger digitValue) includes:sym) 
+                            (#( asciiValue asInteger digitValue) includes:selector) 
                             ifTrue:[
-                                result := recVal perform:sym.
+                                result := recVal perform:selector.
                                 ^ ConstantNode type:(ConstantNode typeOfConstant:result)
                                               value:result
                             ]
                         ].
                         (recVal isMemberOf:String) ifTrue:[
-                            (sym == #withCRs) ifTrue:[
-                                result := recVal perform:sym.
+                            (selector == #withCRs) ifTrue:[
+                                result := recVal perform:selector.
                                 ^ ConstantNode type:(ConstantNode typeOfConstant:result)
                                               value:result
                             ]
                         ].
-                        ^ (self basicNew) receiver:r selector:s args:nil lineno:0
+                        (recVal isMemberOf:Array) ifTrue:[
+                            (#(asFloatArray asDoubleArray) includes:selector) ifTrue:[
+                                result := recVal perform:selector.
+                                ^ ConstantNode type:(ConstantNode typeOfConstant:result)
+                                              value:result
+                            ]
+                        ].
+                        ^ (self basicNew) receiver:r selector:selector args:nil lineno:0
                     ].
                     "when we reach here, something went wrong (something like 0.0 log)"
                     ^ 'error occured when evaluating constant expression'
@@ -94,7 +102,7 @@
             ]
         ]
     ].
-    ^ (self basicNew) receiver:r selector:s args:nil lineno:0
+    ^ (self basicNew) receiver:r selector:selectorString args:nil lineno:0
 ! !
 
 !UnaryNode methodsFor:'queries'!