diff options
author | Torsten Paul <Torsten.Paul@gmx.de> | 2014-01-02 21:50:04 (GMT) |
---|---|---|
committer | Torsten Paul <Torsten.Paul@gmx.de> | 2014-01-02 22:28:02 (GMT) |
commit | 09f8e80a7d49188ff18195e40e3c02a2d8768257 (patch) | |
tree | 88f711ffae5863c8673f7bdd3c34b5f7faf74cb2 | |
parent | 7f3659907358f57e912f76291f8c9500b3032fbd (diff) |
Integrate feature registry with functions.
In case a function is attached to a disabled feature, the function lookup
will give a warning message and ignore that (builtin) function.
-rw-r--r-- | src/function.h | 9 | ||||
-rw-r--r-- | src/modcontext.cc | 7 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/function.h b/src/function.h index a1fde3c..2491809 100644 --- a/src/function.h +++ b/src/function.h @@ -3,13 +3,21 @@ #include "value.h" #include "typedefs.h" +#include "feature.h" + #include <string> #include <vector> + class AbstractFunction { +private: + const Feature *feature; public: + AbstractFunction() : feature(NULL) {} + AbstractFunction(const Feature& feature) : feature(&feature) {} virtual ~AbstractFunction(); + virtual bool is_enabled() const { return (feature == NULL) || feature->is_enabled(); }; virtual Value evaluate(const class Context *ctx, const class EvalContext *evalctx) const; virtual std::string dump(const std::string &indent, const std::string &name) const; }; @@ -21,6 +29,7 @@ public: eval_func_t eval_func; BuiltinFunction(eval_func_t f) : eval_func(f) { } + BuiltinFunction(eval_func_t f, const Feature& feature) : AbstractFunction(feature), eval_func(f) { } virtual ~BuiltinFunction(); virtual Value evaluate(const Context *ctx, const EvalContext *evalctx) const; diff --git a/src/modcontext.cc b/src/modcontext.cc index 7b8cb07..21b04fd 100644 --- a/src/modcontext.cc +++ b/src/modcontext.cc @@ -95,7 +95,12 @@ void ModuleContext::registerBuiltin() const AbstractFunction *ModuleContext::findLocalFunction(const std::string &name) const { if (this->functions_p && this->functions_p->find(name) != this->functions_p->end()) { - return this->functions_p->find(name)->second; + AbstractFunction *f = this->functions_p->find(name)->second; + if (!f->is_enabled()) { + PRINTB("WARNING: Experimental builtin function '%s' is not enabled.", name); + return NULL; + } + return f; } return NULL; } |