summaryrefslogtreecommitdiff
path: root/i/marvin/src/interpreter
diff options
context:
space:
mode:
Diffstat (limited to 'i/marvin/src/interpreter')
-rw-r--r--i/marvin/src/interpreter/interpreter.cc9
-rw-r--r--i/marvin/src/interpreter/interpreter.hh2
-rw-r--r--i/marvin/src/interpreter/interpreter_parser.cc3
3 files changed, 13 insertions, 1 deletions
diff --git a/i/marvin/src/interpreter/interpreter.cc b/i/marvin/src/interpreter/interpreter.cc
index a160002..bbf4767 100644
--- a/i/marvin/src/interpreter/interpreter.cc
+++ b/i/marvin/src/interpreter/interpreter.cc
@@ -54,6 +54,15 @@ Interpreter::add (const std::string &s, Func *f)
add (s, f, "");
}
+/// Test if a function is defined.
+bool
+Interpreter::exists (const std::string &s) const
+{
+ Funcs::const_iterator i;
+ i = funcs_.find (s);
+ return i != funcs_.end ();
+}
+
/// Call a function by name.
void
Interpreter::call (const std::string &s, const Args &a,
diff --git a/i/marvin/src/interpreter/interpreter.hh b/i/marvin/src/interpreter/interpreter.hh
index 1f6e688..3341ea1 100644
--- a/i/marvin/src/interpreter/interpreter.hh
+++ b/i/marvin/src/interpreter/interpreter.hh
@@ -69,6 +69,8 @@ class Interpreter
void add (const std::string &s, Func *f, const std::string &desc);
/// Add a function without description, Interpreter owns f.
void add (const std::string &s, Func *f);
+ /// Test if a function is defined.
+ bool exists (const std::string &s) const;
/// Call a function by name.
void call (const std::string &s, const Args &a,
bool dryrun = false) const;
diff --git a/i/marvin/src/interpreter/interpreter_parser.cc b/i/marvin/src/interpreter/interpreter_parser.cc
index 2a3f54b..f10e8ec 100644
--- a/i/marvin/src/interpreter/interpreter_parser.cc
+++ b/i/marvin/src/interpreter/interpreter_parser.cc
@@ -37,6 +37,7 @@ void
InterpreterParser::call (const std::string &id, AnyList &args)
{
interpreter_.call (id, args, dryrun_);
- interpreter_.call ("_postcall", AnyList (), dryrun_);
+ if (interpreter_.exists ("_postcall"))
+ interpreter_.call ("_postcall", AnyList (), dryrun_);
}