diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-06-29 20:30:43 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-06-29 20:30:43 (GMT) |
commit | ed687599bf1ca36869dc64dab2b9969f1d96b4c1 (patch) | |
tree | c0aa344d2dd28e03eddd8b5cfdb2f47cdea807d3 /module.cc | |
parent | 934e2cef98bc16d2552641314dae1f17a8841079 (diff) |
Clifford Wolf:
Restructured AST evaluation for control statements
git-svn-id: http://svn.clifford.at/openscad/trunk@37 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'module.cc')
-rw-r--r-- | module.cc | 43 |
1 files changed, 18 insertions, 25 deletions
@@ -26,14 +26,16 @@ AbstractModule::~AbstractModule() { } -AbstractNode *AbstractModule::evaluate(const Context*, const QVector<QString>&, const QVector<Value>&, const QVector<AbstractNode*> child_nodes) const +AbstractNode *AbstractModule::evaluate(const Context*, const QVector<QString>&, const QVector<Value>&, const QVector<ModuleInstanciation*> arg_children, const Context *arg_context) const { - if (child_nodes.size() == 1) - return child_nodes[0]; - AbstractNode *node = new AbstractNode(); - foreach (AbstractNode *v, child_nodes) - node->children.append(v); + + foreach (ModuleInstanciation *v, arg_children) { + AbstractNode *n = v->evaluate(arg_context); + if (n) + node->children.append(n); + } + return node; } @@ -84,13 +86,7 @@ AbstractNode *ModuleInstanciation::evaluate(const Context *ctx) const foreach (Expression *v, argexpr) { argvalues.append(v->evaluate(ctx)); } - QVector<AbstractNode*> child_nodes; - foreach (ModuleInstanciation *v, children) { - AbstractNode *n = v->evaluate(ctx); - if (n != NULL) - child_nodes.append(n); - } - return ctx->evaluate_module(modname, argnames, argvalues, child_nodes); + return ctx->evaluate_module(modname, argnames, argvalues, children); } Module::~Module() @@ -105,7 +101,7 @@ Module::~Module() delete v; } -AbstractNode *Module::evaluate(const Context *ctx, const QVector<QString> &call_argnames, const QVector<Value> &call_argvalues, const QVector<AbstractNode*> child_nodes) const +AbstractNode *Module::evaluate(const Context *ctx, const QVector<QString> &call_argnames, const QVector<Value> &call_argvalues, const QVector<ModuleInstanciation*> arg_children, const Context *arg_context) const { Context c(ctx); c.args(argnames, argexpr, call_argnames, call_argvalues); @@ -124,14 +120,10 @@ AbstractNode *Module::evaluate(const Context *ctx, const QVector<QString> &call_ node->children.append(n); } - foreach (AbstractNode *v, child_nodes) - node->children.append(v); - - if (node->children.size() == 1) { - AbstractNode *c = node->children[0]; - node->children.clear(); - delete node; - return c; + foreach(ModuleInstanciation *v, arg_children) { + AbstractNode *n = v->evaluate(arg_context); + if (n != NULL) + node->children.append(n); } return node; @@ -184,9 +176,10 @@ void initialize_builtin_modules() { builtin_modules["group"] = new AbstractModule(); - register_builtin_csg(); - register_builtin_trans(); - register_builtin_primitive(); + register_builtin_csgops(); + register_builtin_transform(); + register_builtin_primitives(); + register_builtin_control(); } void destroy_builtin_modules() |