summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/context.cc5
-rw-r--r--src/module.cc10
-rw-r--r--src/module.h5
-rw-r--r--src/parser.y17
4 files changed, 14 insertions, 23 deletions
diff --git a/src/context.cc b/src/context.cc
index a2a8d13..97ea5b9 100644
--- a/src/context.cc
+++ b/src/context.cc
@@ -51,9 +51,8 @@ Context::Context(const Context *parent, const Module *library)
this->functions_p = &library->functions;
this->modules_p = &library->modules;
this->usedlibs_p = &library->usedlibs;
- for (size_t j = 0; j < library->assignments_var.size(); j++) {
- this->set_variable(library->assignments_var[j],
- library->assignments_expr[j]->evaluate(this));
+ BOOST_FOREACH(const std::string &var, library->assignments_var) {
+ this->set_variable(var, library->assignments.at(var)->evaluate(this));
}
}
else {
diff --git a/src/module.cc b/src/module.cc
index cfd73cc..e6dcb57 100644
--- a/src/module.cc
+++ b/src/module.cc
@@ -136,7 +136,7 @@ std::vector<AbstractNode*> IfElseModuleInstantiation::evaluateElseChildren(const
Module::~Module()
{
- BOOST_FOREACH (Expression *v, assignments_expr) delete v;
+ BOOST_FOREACH (const AssignmentContainer::value_type &v, assignments) delete v.second;
BOOST_FOREACH (FunctionContainer::value_type &f, functions) delete f.second;
BOOST_FOREACH (AbstractModuleContainer::value_type &m, modules) delete m.second;
BOOST_FOREACH (ModuleInstantiation *v, children) delete v;
@@ -158,8 +158,8 @@ AbstractNode *Module::evaluate(const Context *ctx, const ModuleInstantiation *in
else
c.usedlibs_p = NULL;
- for (size_t i = 0; i < assignments_var.size(); i++) {
- c.set_variable(assignments_var[i], assignments_expr[i]->evaluate(&c));
+ BOOST_FOREACH(const std::string &var, assignments_var) {
+ c.set_variable(var, assignments.at(var)->evaluate(&c));
}
AbstractNode *node = new AbstractNode(inst);
@@ -192,8 +192,8 @@ std::string Module::dump(const std::string &indent, const std::string &name) con
BOOST_FOREACH(const AbstractModuleContainer::value_type &m, modules) {
dump << m.second->dump(indent + tab, m.first);
}
- for (size_t i = 0; i < assignments_var.size(); i++) {
- dump << indent << tab << assignments_var[i] << " = " << *assignments_expr[i] << ";\n";
+ BOOST_FOREACH(const std::string &var, assignments_var) {
+ dump << indent << tab << var << " = " << *assignments.at(var) << ";\n";
}
for (size_t i = 0; i < children.size(); i++) {
dump << children[i]->dump(indent + tab);
diff --git a/src/module.h b/src/module.h
index 879d249..cc82f81 100644
--- a/src/module.h
+++ b/src/module.h
@@ -74,8 +74,9 @@ public:
bool is_handling_dependencies;
bool handleDependencies();
- std::vector<std::string> assignments_var;
- std::vector<Expression*> assignments_expr;
+ std::list<std::string> assignments_var;
+ typedef boost::unordered_map<std::string, Expression*> AssignmentContainer;
+ AssignmentContainer assignments;
typedef boost::unordered_map<std::string, class AbstractFunction*> FunctionContainer;
FunctionContainer functions;
diff --git a/src/parser.y b/src/parser.y
index 3e485ff..536f4ef 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -151,19 +151,10 @@ statement:
}
} |
TOK_ID '=' expr ';' {
- bool add_new_assignment = true;
- for (size_t i = 0; i < currmodule->assignments_var.size(); i++) {
- if (currmodule->assignments_var[i] != $1)
- continue;
- delete currmodule->assignments_expr[i];
- currmodule->assignments_expr[i] = $3;
- add_new_assignment = false;
- }
- if (add_new_assignment) {
- currmodule->assignments_var.push_back($1);
- currmodule->assignments_expr.push_back($3);
- free($1);
- }
+ std::list<std::string>::iterator found = std::find(currmodule->assignments_var.begin(), currmodule->assignments_var.end(),$1);
+ if (found != currmodule->assignments_var.end()) currmodule->assignments_var.erase(found);
+ currmodule->assignments_var.push_back($1);
+ currmodule->assignments[$1] = $3;
} |
TOK_MODULE TOK_ID '(' arguments_decl optional_commas ')' {
Module *p = currmodule;
contact: Jan Huwald // Impressum