diff options
author | Marius Kintel <marius@kintel.net> | 2013-04-16 00:58:15 (GMT) |
---|---|---|
committer | Marius Kintel <marius@kintel.net> | 2013-04-16 00:58:15 (GMT) |
commit | 73c2a45af6afca253159d2cf9c1ecf5747f0217e (patch) | |
tree | 3467fbd22e2160bcb5791e6c118f3a46367c599c /src/modcontext.cc | |
parent | 49a288cd34f604ed13e1eff7b48bcfc6d6286169 (diff) |
Reinstate recursion guard to new context handling, fixes the last known subissue of #116 and #328
Diffstat (limited to 'src/modcontext.cc')
-rw-r--r-- | src/modcontext.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/modcontext.cc b/src/modcontext.cc index 7902608..3280108 100644 --- a/src/modcontext.cc +++ b/src/modcontext.cc @@ -49,8 +49,27 @@ void ModuleContext::registerBuiltin() this->set_constant("PI",Value(M_PI)); } +class RecursionGuard +{ +public: + RecursionGuard(const ModuleContext &c, const std::string &name) : c(c), name(name) { + c.recursioncount[name]++; + } + ~RecursionGuard() { if (--c.recursioncount[name] == 0) c.recursioncount.erase(name); } + bool recursion_detected() const { return (c.recursioncount[name] > 100); } +private: + const ModuleContext &c; + const std::string &name; +}; + Value ModuleContext::evaluate_function(const std::string &name, const EvalContext *evalctx) const { + RecursionGuard g(*this, name); + if (g.recursion_detected()) { + PRINTB("Recursion detected calling function '%s'", name); + return Value(); + } + if (this->functions_p && this->functions_p->find(name) != this->functions_p->end()) { return this->functions_p->find(name)->second->evaluate(this, evalctx); } |