]> www.ginac.de Git - ginac.git/blobdiff - ginac/basic.cpp
[bugfix] Fix crash in basic::subs().
[ginac.git] / ginac / basic.cpp
index a2be1ca51ce4c0922ef3a361bd5fdab0dcbbb360..59e7dbd97be7447cf2a3c4b1c020adc3fb4de6b5 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of GiNaC's ABC. */
 
 /*
- *  GiNaC Copyright (C) 1999-2015 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2016 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -373,7 +373,7 @@ ex basic::collect(const ex & s, bool distributed) const
                                        pre_coeff = pre_coeff.coeff(li, cexp);
                                        key *= pow(li, cexp);
                                }
-                               exmap::iterator ci = cmap.find(key);
+                               auto ci = cmap.find(key);
                                if (ci != cmap.end())
                                        ci->second += pre_coeff;
                                else
@@ -418,25 +418,17 @@ ex basic::eval() const
 
 /** Function object to be applied by basic::evalf(). */
 struct evalf_map_function : public map_function {
-       int level;
-       evalf_map_function(int l) : level(l) {}
-       ex operator()(const ex & e) override { return evalf(e, level); }
+       ex operator()(const ex & e) override { return evalf(e); }
 };
 
 /** Evaluate object numerically. */
-ex basic::evalf(int level) const
+ex basic::evalf() const
 {
        if (nops() == 0)
                return *this;
        else {
-               if (level == 1)
-                       return *this;
-               else if (level == -max_recursion_level)
-                       throw(std::runtime_error("max recursion level reached"));
-               else {
-                       evalf_map_function map_evalf(level - 1);
-                       return map(map_evalf);
-               }
+               evalf_map_function map_evalf;
+               return map(map_evalf);
        }
 }
 
@@ -593,10 +585,11 @@ bool basic::match(const ex & pattern, exmap& repl_lst) const
 ex basic::subs_one_level(const exmap & m, unsigned options) const
 {
        if (options & subs_options::no_pattern) {
-               auto it = m.find(*this);
+               ex thisex = *this;  // NB: *this may be deleted here.
+               auto it = m.find(thisex);
                if (it != m.end())
                        return it->second;
-               return *this;
+               return thisex;
        } else {
                for (auto & it : m) {
                        exmap repl_lst;
@@ -909,9 +902,6 @@ void basic::ensure_if_modifiable() const
 // global variables
 //////////
 
-int max_recursion_level = 1024;
-
-
 #ifdef GINAC_COMPARE_STATISTICS
 compare_statistics_t::~compare_statistics_t()
 {