summaryrefslogtreecommitdiff
path: root/src/context.cc
diff options
context:
space:
mode:
authorclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2010-02-28 13:48:04 (GMT)
committerclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2010-02-28 13:48:04 (GMT)
commitd3329838b4d948455277caa3c24df4b7b50fabb2 (patch)
treec132e689fbf28bc5d607461c83afdeb79b0adfa2 /src/context.cc
parentb12deeff5be0ce76af25d557480f29b0ed849dd6 (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.cc35
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);
contact: Jan Huwald // Impressum