diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2010-02-28 13:48:04 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2010-02-28 13:48:04 (GMT) |
commit | d3329838b4d948455277caa3c24df4b7b50fabb2 (patch) | |
tree | c132e689fbf28bc5d607461c83afdeb79b0adfa2 /src/context.cc | |
parent | b12deeff5be0ce76af25d557480f29b0ed849dd6 (diff) |
Clifford Wolf:
Implemented 'use' statement
git-svn-id: http://svn.clifford.at/openscad/trunk@459 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'src/context.cc')
-rw-r--r-- | src/context.cc | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/context.cc b/src/context.cc index a9ccc98..5aec712b 100644 --- a/src/context.cc +++ b/src/context.cc @@ -36,6 +36,7 @@ Context::Context(const Context *parent) this->parent = parent; functions_p = NULL; modules_p = NULL; + usedlibs_p = NULL; inst_p = NULL; if (parent) document_path = parent->document_path; ctx_stack.append(this); @@ -96,6 +97,23 @@ Value Context::evaluate_function(QString name, const QVector<QString> &argnames, { if (functions_p && functions_p->contains(name)) return functions_p->value(name)->evaluate(this, argnames, argvalues); + if (usedlibs_p) { + QHashIterator<QString, Module*> i(*usedlibs_p); + while (i.hasNext()) { + i.next(); + if (i.value()->functions.contains(name)) { + Module *lib = i.value(); + Context ctx(parent); + ctx.functions_p = &lib->functions; + ctx.modules_p = &lib->modules; + ctx.usedlibs_p = &lib->usedlibs; + for (int j = 0; j < lib->assignments_var.size(); j++) { + ctx.set_variable(lib->assignments_var[j], lib->assignments_expr[j]->evaluate(&ctx)); + } + return i.value()->functions.value(name)->evaluate(&ctx, argnames, argvalues); + } + } + } if (parent) return parent->evaluate_function(name, argnames, argvalues); PRINTA("WARNING: Ignoring unkown function '%1'.", name); @@ -106,6 +124,23 @@ AbstractNode *Context::evaluate_module(const ModuleInstantiation *inst) const { if (modules_p && modules_p->contains(inst->modname)) return modules_p->value(inst->modname)->evaluate(this, inst); + if (usedlibs_p) { + QHashIterator<QString, Module*> i(*usedlibs_p); + while (i.hasNext()) { + i.next(); + if (i.value()->modules.contains(inst->modname)) { + Module *lib = i.value(); + Context ctx(parent); + ctx.functions_p = &lib->functions; + ctx.modules_p = &lib->modules; + ctx.usedlibs_p = &lib->usedlibs; + for (int j = 0; j < lib->assignments_var.size(); j++) { + ctx.set_variable(lib->assignments_var[j], lib->assignments_expr[j]->evaluate(&ctx)); + } + return i.value()->modules.value(inst->modname)->evaluate(&ctx, inst); + } + } + } if (parent) return parent->evaluate_module(inst); PRINTA("WARNING: Ignoring unkown module '%1'.", inst->modname); |