+#include <exception>
#include <msp/core/algorithm.h>
#include <msp/core/raii.h>
#include <msp/fs/utils.h>
context = FS::basename(p.get_source());
+ Activator activate(*this);
while(p)
{
if(p.peek(0))
load_statement(st);
}
}
- finish();
- for(Loader *l: aux_loaders)
- l->finish();
}
void Loader::load(const Statement &st)
if(!actions)
throw logic_error("no actions");
+ Activator activate(*this);
for(const Statement &s: st.sub)
load_statement(s);
- finish();
- for(Loader *l: aux_loaders)
- l->finish();
}
void Loader::load_direct(Parser &p, unsigned l)
{
if(direct)
{
+ Activator activate(ldr);
ldr.load_direct(*cur_parser, cur_level+1);
- ldr.finish();
- for(Loader *l: ldr.aux_loaders)
- l->finish();
}
else if(cur_st)
{
return cur_st->keyword;
}
+
+Loader::Activator::Activator(Loader &l):
+ ldr(l),
+ exc_count(uncaught_exceptions())
+{
+ ldr.prepare();
+ for(Loader *a: ldr.aux_loaders)
+ a->prepare();
+}
+
+Loader::Activator::~Activator()
+{
+ bool success = (uncaught_exceptions()==exc_count);
+ ldr.finish(success);
+ for(Loader *a: ldr.aux_loaders)
+ a->finish(success);
+}
+
} // namespace DataFile
} // namespace Msp
};
private:
+ struct Activator
+ {
+ Loader &ldr;
+ int exc_count = 0;
+
+ Activator(Loader &);
+ ~Activator();
+ };
+
ActionMap local_actions;
ActionMap *actions = nullptr;
std::string context;
implement dynamic keywords. */
const std::string &get_keyword() const;
+ virtual void prepare() { }
virtual void finish() { }
+ virtual void finish(bool s) { if(s) finish(); }
};