]> www.ginac.de Git - ginac.git/blobdiff - ginac/function.pl
function(unsigned, const exprseq &) constructor clears status_flags::evaluated
[ginac.git] / ginac / function.pl
index 760252748775130c3db0331776c131e1a0cef96c..727eb52ff683cd386e5c1e0d221f54d302502487 100755 (executable)
@@ -604,6 +604,10 @@ $constructors_implementation
 function::function(unsigned ser, const exprseq & es) : exprseq(es), serial(ser)
 {
        tinfo_key = TINFO_function;
+
+       // Force re-evaluation even if the exprseq was already evaluated
+       // (the exprseq copy constructor copies the flags)
+       clearflag(status_flags::evaluated);
 }
 
 function::function(unsigned ser, const exvector & v, bool discardable) 
@@ -769,28 +773,31 @@ ex function::evalf(int level) const
 {
        GINAC_ASSERT(serial<registered_functions().size());
 
+       const function_options &opt = registered_functions()[serial];
+
        // Evaluate children first
        exvector eseq;
-       if (level == 1)
+       if (level == 1 || !(opt.evalf_params_first))
                eseq = seq;
        else if (level == -max_recursion_level)
                throw(std::runtime_error("max recursion level reached"));
-       else
+       else {
                eseq.reserve(seq.size());
-       --level;
-       exvector::const_iterator it = seq.begin(), itend = seq.end();
-       while (it != itend) {
-               eseq.push_back(it->evalf(level));
-               ++it;
+               --level;
+               exvector::const_iterator it = seq.begin(), itend = seq.end();
+               while (it != itend) {
+                       eseq.push_back(it->evalf(level));
+                       ++it;
+               }
        }
-       
-       if (registered_functions()[serial].evalf_f==0) {
+
+       if (opt.evalf_f==0) {
                return function(serial,eseq).hold();
        }
        current_serial = serial;
-       if (registered_functions()[serial].evalf_use_exvector_args)
-               return ((evalf_funcp_exvector)(registered_functions()[serial].evalf_f))(seq);
-       switch (registered_functions()[serial].nparams) {
+       if (opt.evalf_use_exvector_args)
+               return ((evalf_funcp_exvector)(opt.evalf_f))(seq);
+       switch (opt.nparams) {
                // the following lines have been generated for max. ${maxargs} parameters
 ${evalf_switch_statement}
                // end of generated lines