#1549 Refactored duplicated code into EvalContext::assignTo()
This commit is contained in:
parent
4c77052002
commit
d37c20f568
4 changed files with 19 additions and 22 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
16
src/expr.cc
16
src/expr.cc
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue