#1549 Refactored duplicated code into EvalContext::assignTo()

This commit is contained in:
Marius Kintel 2016-01-19 13:48:31 -05:00
parent 4c77052002
commit d37c20f568
4 changed files with 19 additions and 22 deletions

View file

@ -284,15 +284,7 @@ AbstractNode *ControlModule::instantiate(const Context* /*ctx*/, const ModuleIns
node = new GroupNode(inst);
Context c(evalctx);
// TODO: unify with evaluate_sequential_assignment() from expr.cc
for (unsigned int i = 0; i < evalctx->numArgs(); i++) {
if (c.has_local_variable(evalctx->getArgName(i))) {
PRINTB("WARNING: Ignoring duplicate variable assignment %s = %s", evalctx->getArgName(i) % evalctx->getArgValue(i, &c)->toString());
} else {
// NOTE: iteratively evaluated list of arguments
c.set_variable(evalctx->getArgName(i), evalctx->getArgValue(i, &c));
}
}
evalctx->assignTo(c);
inst->scope.apply(c);
std::vector<AbstractNode *> instantiatednodes = inst->instantiateChildren(&c);

View file

@ -42,6 +42,19 @@ ModuleInstantiation *EvalContext::getChild(size_t i) const
return this->scope ? this->scope->children[i] : NULL;
}
void EvalContext::assignTo(Context &target) const
{
BOOST_FOREACH(const Assignment &assignment, this->eval_arguments) {
ValuePtr v;
if (assignment.second) v = assignment.second->evaluate(&target);
if (target.has_local_variable(assignment.first)) {
PRINTB("WARNING: Ignoring duplicate variable assignment %s = %s", assignment.first % v->toString());
} else {
target.set_variable(assignment.first, v);
}
}
}
#ifdef DEBUG
std::string EvalContext::dump(const AbstractModule *mod, const ModuleInstantiation *inst)
{

View file

@ -22,6 +22,8 @@ public:
size_t numChildren() const;
ModuleInstantiation *getChild(size_t i) const;
void assignTo(Context &target) const;
#ifdef DEBUG
virtual std::string dump(const class AbstractModule *mod, const ModuleInstantiation *inst);
#endif

View file

@ -51,19 +51,9 @@ namespace {
return ret;
}
void evaluate_sequential_assignment(const AssignmentList & assignment_list, Context *context) {
EvalContext let_context(context, assignment_list);
const bool allow_reassignment = false;
for (unsigned int i = 0; i < let_context.numArgs(); i++) {
if (!allow_reassignment && context->has_local_variable(let_context.getArgName(i))) {
PRINTB("WARNING: Ignoring duplicate variable assignment %s = %s", let_context.getArgName(i) % let_context.getArgValue(i, context)->toString());
} else {
// NOTE: iteratively evaluated list of arguments
context->set_variable(let_context.getArgName(i), let_context.getArgValue(i, context));
}
}
void evaluate_sequential_assignment(const AssignmentList &assignment_list, Context *context) {
EvalContext ctx(context, assignment_list);
ctx.assignTo(*context);
}
}