Slight refactoring of builtin function and module handling

stl_dim
Marius Kintel 2011-11-06 18:37:12 +01:00
parent 970c6c1c6e
commit 45161d4356
28 changed files with 220 additions and 201 deletions

View File

@ -218,6 +218,7 @@ SOURCES += src/openscad.cc \
src/func.cc \
src/module.cc \
src/node.cc \
src/builtin.cc \
src/context.cc \
src/csgterm.cc \
src/polyset.cc \

86
src/builtin.cc Normal file
View File

@ -0,0 +1,86 @@
#include "builtin.h"
#include "function.h"
#include "module.h"
#include <boost/foreach.hpp>
Builtins *Builtins::instance(bool erase)
{
static Builtins *s_builtins = new Builtins;
if (erase) {
delete s_builtins;
s_builtins = NULL;
}
return s_builtins;
}
void Builtins::init(const char *name, class AbstractModule *module)
{
Builtins::instance()->builtinmodules[name] = module;
}
void Builtins::init(const char *name, class AbstractFunction *function)
{
Builtins::instance()->builtinfunctions[name] = function;
}
extern void register_builtin_functions();
extern void register_builtin_csgops();
extern void register_builtin_transform();
extern void register_builtin_color();
extern void register_builtin_primitives();
extern void register_builtin_surface();
extern void register_builtin_control();
extern void register_builtin_render();
extern void register_builtin_import();
extern void register_builtin_projection();
extern void register_builtin_cgaladv();
extern void register_builtin_dxf_linear_extrude();
extern void register_builtin_dxf_rotate_extrude();
extern void initialize_builtin_dxf_dim();
/*!
Registers all builtin functions.
Call once for the whole app.
*/
void Builtins::initialize()
{
register_builtin_functions();
initialize_builtin_dxf_dim();
init("group", new AbstractModule());
register_builtin_csgops();
register_builtin_transform();
register_builtin_color();
register_builtin_primitives();
register_builtin_surface();
register_builtin_control();
register_builtin_render();
register_builtin_import();
register_builtin_projection();
register_builtin_cgaladv();
register_builtin_dxf_linear_extrude();
register_builtin_dxf_rotate_extrude();
this->deprecations["dxf_linear_extrude"] = "linear_extrude";
this->deprecations["dxf_rotate_extrude"] = "rotate_extrude";
this->deprecations["import_stl"] = "import";
this->deprecations["import_dxf"] = "import";
this->deprecations["import_off"] = "import";
}
std::string Builtins::isDeprecated(const std::string &name)
{
if (this->deprecations.find(name) != this->deprecations.end()) {
return this->deprecations[name];
}
return std::string();
}
Builtins::~Builtins()
{
BOOST_FOREACH(FunctionContainer::value_type &f, this->builtinfunctions) delete f.second;
this->builtinfunctions.clear();
BOOST_FOREACH(ModuleContainer::value_type &m, this->builtinmodules) delete m.second;
this->builtinmodules.clear();
}

View File

@ -4,27 +4,30 @@
#include <string>
#include <boost/unordered_map.hpp>
extern boost::unordered_map<std::string, class AbstractFunction*> builtin_functions;
extern void initialize_builtin_functions();
extern void destroy_builtin_functions();
class Builtins
{
public:
typedef boost::unordered_map<std::string, class AbstractFunction*> FunctionContainer;
typedef boost::unordered_map<std::string, class AbstractModule*> ModuleContainer;
extern boost::unordered_map<std::string, class AbstractModule*> builtin_modules;
extern void initialize_builtin_modules();
extern void destroy_builtin_modules();
static Builtins *instance(bool erase = false);
static void init(const char *name, class AbstractModule *module);
static void init(const char *name, class AbstractFunction *function);
void initialize();
std::string isDeprecated(const std::string &name);
extern void register_builtin_csgops();
extern void register_builtin_transform();
extern void register_builtin_color();
extern void register_builtin_primitives();
extern void register_builtin_surface();
extern void register_builtin_control();
extern void register_builtin_render();
extern void register_builtin_import();
extern void register_builtin_projection();
extern void register_builtin_cgaladv();
extern void register_builtin_dxf_linear_extrude();
extern void register_builtin_dxf_rotate_extrude();
extern void initialize_builtin_dxf_dim();
const FunctionContainer &functions() { return this->builtinfunctions; }
const ModuleContainer &modules() { return this->builtinmodules; }
private:
Builtins() { }
~Builtins();
FunctionContainer builtinfunctions;
ModuleContainer builtinmodules;
boost::unordered_map<std::string, std::string> deprecations;
};
extern void register_builtin(class Context &ctx);

View File

@ -97,14 +97,6 @@ PolySet *CgaladvNode::evaluate_polyset(PolySetEvaluator *ps) const
return ps->evaluatePolySet(*this);
}
void register_builtin_cgaladv()
{
builtin_modules["minkowski"] = new CgaladvModule(MINKOWSKI);
builtin_modules["glide"] = new CgaladvModule(GLIDE);
builtin_modules["subdiv"] = new CgaladvModule(SUBDIV);
builtin_modules["hull"] = new CgaladvModule(HULL);
}
std::string CgaladvNode::name() const
{
switch (this->type) {
@ -149,3 +141,11 @@ std::string CgaladvNode::toString() const
return stream.str();
}
void register_builtin_cgaladv()
{
Builtins::init("minkowski", new CgaladvModule(MINKOWSKI));
Builtins::init("glide", new CgaladvModule(GLIDE));
Builtins::init("subdiv", new CgaladvModule(SUBDIV));
Builtins::init("hull", new CgaladvModule(HULL));
}

View File

@ -101,5 +101,5 @@ std::string ColorNode::name() const
void register_builtin_color()
{
builtin_modules["color"] = new ColorModule();
Builtins::init("color", new ColorModule());
}

View File

@ -150,20 +150,9 @@ AbstractNode *Context::evaluate_module(const ModuleInstantiation &inst) const
{
if (this->modules_p && this->modules_p->find(inst.modname) != this->modules_p->end()) {
AbstractModule *m = this->modules_p->find(inst.modname)->second;
if (m == builtin_modules["dxf_linear_extrude"]) {
PRINTF("DEPRECATED: The dxf_linear_extrude() module will be removed in future releases. Use a linear_extrude() instead.");
}
else if (m == builtin_modules["dxf_rotate_extrude"]) {
PRINTF("DEPRECATED: The dxf_rotate_extrude() module will be removed in future releases. Use a rotate_extrude() instead.");
}
else if (m == builtin_modules["import_stl"]) {
PRINTF("DEPRECATED: The import_stl() module will be removed in future releases. Use import() instead.");
}
else if (m == builtin_modules["import_dxf"]) {
PRINTF("DEPRECATED: The import_dxf() module will be removed in future releases. Use import() instead.");
}
else if (m == builtin_modules["import_off"]) {
PRINTF("DEPRECATED: The import_off() module will be removed in future releases. Use import() instead.");
std::string replacement = Builtins::instance()->isDeprecated(inst.modname);
if (!replacement.empty()) {
PRINTF("DEPRECATED: The %s() module will be removed in future releases. Use %s() instead.", inst.modname.c_str(), replacement.c_str());
}
return m->evaluate(this, &inst);
}
@ -196,8 +185,8 @@ std::string Context::getAbsolutePath(const std::string &filename) const
void register_builtin(Context &ctx)
{
ctx.functions_p = &builtin_functions;
ctx.modules_p = &builtin_modules;
ctx.functions_p = &Builtins::instance()->functions();
ctx.modules_p = &Builtins::instance()->modules();
ctx.set_variable("$fn", Value(0.0));
ctx.set_variable("$fs", Value(1.0));
ctx.set_variable("$fa", Value(12.0));

View File

@ -169,11 +169,10 @@ AbstractNode *ControlModule::evaluate(const Context*, const ModuleInstantiation
void register_builtin_control()
{
builtin_modules["child"] = new ControlModule(CHILD);
builtin_modules["echo"] = new ControlModule(ECHO);
builtin_modules["assign"] = new ControlModule(ASSIGN);
builtin_modules["for"] = new ControlModule(FOR);
builtin_modules["intersection_for"] = new ControlModule(INT_FOR);
builtin_modules["if"] = new ControlModule(IF);
Builtins::init("child", new ControlModule(CHILD));
Builtins::init("echo", new ControlModule(ECHO));
Builtins::init("assign", new ControlModule(ASSIGN));
Builtins::init("for", new ControlModule(FOR));
Builtins::init("intersection_for", new ControlModule(INT_FOR));
Builtins::init("if", new ControlModule(IF));
}

View File

@ -72,8 +72,8 @@ std::string CsgNode::name() const
void register_builtin_csgops()
{
builtin_modules["union"] = new CsgModule(CSG_TYPE_UNION);
builtin_modules["difference"] = new CsgModule(CSG_TYPE_DIFFERENCE);
builtin_modules["intersection"] = new CsgModule(CSG_TYPE_INTERSECTION);
Builtins::init("union", new CsgModule(CSG_TYPE_UNION));
Builtins::init("difference", new CsgModule(CSG_TYPE_DIFFERENCE));
Builtins::init("intersection", new CsgModule(CSG_TYPE_INTERSECTION));
}

View File

@ -194,7 +194,6 @@ Value builtin_dxf_cross(const Context *ctx, const std::vector<std::string> &argn
void initialize_builtin_dxf_dim()
{
builtin_functions["dxf_dim"] = new BuiltinFunction(&builtin_dxf_dim);
builtin_functions["dxf_cross"] = new BuiltinFunction(&builtin_dxf_cross);
Builtins::init("dxf_dim", new BuiltinFunction(&builtin_dxf_dim));
Builtins::init("dxf_cross", new BuiltinFunction(&builtin_dxf_cross));
}

View File

@ -33,7 +33,6 @@
#include "mathc99.h"
#include <algorithm>
#include "stl-utils.h"
#include <boost/foreach.hpp>
AbstractFunction::~AbstractFunction()
{
@ -81,9 +80,6 @@ std::string Function::dump(const std::string &indent, const std::string &name) c
return dump.str();
}
typedef boost::unordered_map<std::string, AbstractFunction*> BuiltinContainer;
BuiltinContainer builtin_functions;
BuiltinFunction::~BuiltinFunction()
{
}
@ -375,38 +371,30 @@ Value builtin_version_num(const Context *ctx, const std::vector<std::string>& ca
return Value(y * 10000 + m * 100 + d);
}
void initialize_builtin_functions()
void register_builtin_functions()
{
builtin_functions["abs"] = new BuiltinFunction(&builtin_abs);
builtin_functions["sign"] = new BuiltinFunction(&builtin_sign);
builtin_functions["rands"] = new BuiltinFunction(&builtin_rands);
builtin_functions["min"] = new BuiltinFunction(&builtin_min);
builtin_functions["max"] = new BuiltinFunction(&builtin_max);
builtin_functions["sin"] = new BuiltinFunction(&builtin_sin);
builtin_functions["cos"] = new BuiltinFunction(&builtin_cos);
builtin_functions["asin"] = new BuiltinFunction(&builtin_asin);
builtin_functions["acos"] = new BuiltinFunction(&builtin_acos);
builtin_functions["tan"] = new BuiltinFunction(&builtin_tan);
builtin_functions["atan"] = new BuiltinFunction(&builtin_atan);
builtin_functions["atan2"] = new BuiltinFunction(&builtin_atan2);
builtin_functions["round"] = new BuiltinFunction(&builtin_round);
builtin_functions["ceil"] = new BuiltinFunction(&builtin_ceil);
builtin_functions["floor"] = new BuiltinFunction(&builtin_floor);
builtin_functions["pow"] = new BuiltinFunction(&builtin_pow);
builtin_functions["sqrt"] = new BuiltinFunction(&builtin_sqrt);
builtin_functions["exp"] = new BuiltinFunction(&builtin_exp);
builtin_functions["log"] = new BuiltinFunction(&builtin_log);
builtin_functions["ln"] = new BuiltinFunction(&builtin_ln);
builtin_functions["str"] = new BuiltinFunction(&builtin_str);
builtin_functions["lookup"] = new BuiltinFunction(&builtin_lookup);
builtin_functions["version"] = new BuiltinFunction(&builtin_version);
builtin_functions["version_num"] = new BuiltinFunction(&builtin_version_num);
initialize_builtin_dxf_dim();
}
void destroy_builtin_functions()
{
BOOST_FOREACH(BuiltinContainer::value_type &f, builtin_functions) delete f.second;
//std::for_each(builtin_functions.begin(), builtin_functions.end(), del_fun<AbstractFunction>());
builtin_functions.clear();
Builtins::init("abs", new BuiltinFunction(&builtin_abs));
Builtins::init("sign", new BuiltinFunction(&builtin_sign));
Builtins::init("rands", new BuiltinFunction(&builtin_rands));
Builtins::init("min", new BuiltinFunction(&builtin_min));
Builtins::init("max", new BuiltinFunction(&builtin_max));
Builtins::init("sin", new BuiltinFunction(&builtin_sin));
Builtins::init("cos", new BuiltinFunction(&builtin_cos));
Builtins::init("asin", new BuiltinFunction(&builtin_asin));
Builtins::init("acos", new BuiltinFunction(&builtin_acos));
Builtins::init("tan", new BuiltinFunction(&builtin_tan));
Builtins::init("atan", new BuiltinFunction(&builtin_atan));
Builtins::init("atan2", new BuiltinFunction(&builtin_atan2));
Builtins::init("round", new BuiltinFunction(&builtin_round));
Builtins::init("ceil", new BuiltinFunction(&builtin_ceil));
Builtins::init("floor", new BuiltinFunction(&builtin_floor));
Builtins::init("pow", new BuiltinFunction(&builtin_pow));
Builtins::init("sqrt", new BuiltinFunction(&builtin_sqrt));
Builtins::init("exp", new BuiltinFunction(&builtin_exp));
Builtins::init("log", new BuiltinFunction(&builtin_log));
Builtins::init("ln", new BuiltinFunction(&builtin_ln));
Builtins::init("str", new BuiltinFunction(&builtin_str));
Builtins::init("lookup", new BuiltinFunction(&builtin_lookup));
Builtins::init("version", new BuiltinFunction(&builtin_version));
Builtins::init("version_num", new BuiltinFunction(&builtin_version_num));
}

View File

@ -251,9 +251,8 @@ std::string ImportNode::name() const
void register_builtin_import()
{
builtin_modules["import_stl"] = new ImportModule(TYPE_STL);
builtin_modules["import_off"] = new ImportModule(TYPE_OFF);
builtin_modules["import_dxf"] = new ImportModule(TYPE_DXF);
builtin_modules["import"] = new ImportModule();
Builtins::init("import_stl", new ImportModule(TYPE_STL));
Builtins::init("import_off", new ImportModule(TYPE_OFF));
Builtins::init("import_dxf", new ImportModule(TYPE_DXF));
Builtins::init("import", new ImportModule());
}

View File

@ -114,12 +114,6 @@ AbstractNode *LinearExtrudeModule::evaluate(const Context *ctx, const ModuleInst
return node;
}
void register_builtin_dxf_linear_extrude()
{
builtin_modules["dxf_linear_extrude"] = new LinearExtrudeModule();
builtin_modules["linear_extrude"] = new LinearExtrudeModule();
}
class PolySet *LinearExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const
{
if (!evaluator) {
@ -161,3 +155,9 @@ std::string LinearExtrudeNode::toString() const
return stream.str();
}
void register_builtin_dxf_linear_extrude()
{
Builtins::init("dxf_linear_extrude", new LinearExtrudeModule());
Builtins::init("linear_extrude", new LinearExtrudeModule());
}

View File

@ -29,7 +29,6 @@
#include "context.h"
#include "expression.h"
#include "function.h"
#include "builtin.h"
#include "printutils.h"
#include <boost/foreach.hpp>
#include <sstream>
@ -201,31 +200,3 @@ std::string Module::dump(const std::string &indent, const std::string &name) con
}
return dump.str();
}
Module::AbstractModuleContainer builtin_modules;
void initialize_builtin_modules()
{
builtin_modules["group"] = new AbstractModule();
register_builtin_csgops();
register_builtin_transform();
register_builtin_color();
register_builtin_primitives();
register_builtin_surface();
register_builtin_control();
register_builtin_render();
register_builtin_import();
register_builtin_projection();
register_builtin_cgaladv();
register_builtin_dxf_linear_extrude();
register_builtin_dxf_rotate_extrude();
}
void destroy_builtin_modules()
{
BOOST_FOREACH(Module::AbstractModuleContainer::value_type &m, builtin_modules) {
delete m.second;
}
builtin_modules.clear();
}

View File

@ -101,8 +101,7 @@ int main(int argc, char **argv)
// (which we don't catch). This gives us stack traces without rerunning in gdb.
CGAL::set_error_behaviour(CGAL::ABORT);
#endif
initialize_builtin_functions();
initialize_builtin_modules();
Builtins::instance()->initialize();
#ifdef Q_WS_X11
// see <http://qt.nokia.com/doc/4.5/qapplication.html#QApplication-2>:
@ -409,8 +408,7 @@ int main(int argc, char **argv)
exit(1);
}
destroy_builtin_functions();
destroy_builtin_modules();
Builtins::instance(true);
return rc;
}

View File

@ -236,17 +236,6 @@ AbstractNode *PrimitiveModule::evaluate(const Context *ctx, const ModuleInstanti
return node;
}
void register_builtin_primitives()
{
builtin_modules["cube"] = new PrimitiveModule(CUBE);
builtin_modules["sphere"] = new PrimitiveModule(SPHERE);
builtin_modules["cylinder"] = new PrimitiveModule(CYLINDER);
builtin_modules["polyhedron"] = new PrimitiveModule(POLYHEDRON);
builtin_modules["square"] = new PrimitiveModule(SQUARE);
builtin_modules["circle"] = new PrimitiveModule(CIRCLE);
builtin_modules["polygon"] = new PrimitiveModule(POLYGON);
}
/*!
Returns the number of subdivision of a whole circle, given radius and
the three special variables $fn, $fs and $fa
@ -606,3 +595,14 @@ std::string PrimitiveNode::toString() const
return stream.str();
}
void register_builtin_primitives()
{
Builtins::init("cube", new PrimitiveModule(CUBE));
Builtins::init("sphere", new PrimitiveModule(SPHERE));
Builtins::init("cylinder", new PrimitiveModule(CYLINDER));
Builtins::init("polyhedron", new PrimitiveModule(POLYHEDRON));
Builtins::init("square", new PrimitiveModule(SQUARE));
Builtins::init("circle", new PrimitiveModule(CIRCLE));
Builtins::init("polygon", new PrimitiveModule(POLYGON));
}

View File

@ -97,5 +97,5 @@ std::string ProjectionNode::toString() const
void register_builtin_projection()
{
builtin_modules["projection"] = new ProjectionModule();
Builtins::init("projection", new ProjectionModule());
}

View File

@ -67,11 +67,6 @@ class PolySet *RenderNode::evaluate_polyset(PolySetEvaluator *ps) const
return ps->evaluatePolySet(*this);
}
void register_builtin_render()
{
builtin_modules["render"] = new RenderModule();
}
std::string RenderNode::toString() const
{
std::stringstream stream;
@ -80,3 +75,8 @@ std::string RenderNode::toString() const
return stream.str();
}
void register_builtin_render()
{
Builtins::init("render", new RenderModule());
}

View File

@ -92,12 +92,6 @@ AbstractNode *RotateExtrudeModule::evaluate(const Context *ctx, const ModuleInst
return node;
}
void register_builtin_dxf_rotate_extrude()
{
builtin_modules["dxf_rotate_extrude"] = new RotateExtrudeModule();
builtin_modules["rotate_extrude"] = new RotateExtrudeModule();
}
PolySet *RotateExtrudeNode::evaluate_polyset(PolySetEvaluator *evaluator) const
{
if (!evaluator) {
@ -133,3 +127,9 @@ std::string RotateExtrudeNode::toString() const
return stream.str();
}
void register_builtin_dxf_rotate_extrude()
{
Builtins::init("dxf_rotate_extrude", new RotateExtrudeModule());
Builtins::init("rotate_extrude", new RotateExtrudeModule());
}

View File

@ -92,11 +92,6 @@ AbstractNode *SurfaceModule::evaluate(const Context *ctx, const ModuleInstantiat
return node;
}
void register_builtin_surface()
{
builtin_modules["surface"] = new SurfaceModule();
}
PolySet *SurfaceNode::evaluate_polyset(class PolySetEvaluator *) const
{
handle_dep(filename);
@ -219,3 +214,8 @@ std::string SurfaceNode::toString() const
return stream.str();
}
void register_builtin_surface()
{
Builtins::init("surface", new SurfaceModule());
}

View File

@ -206,9 +206,9 @@ std::string TransformNode::name() const
void register_builtin_transform()
{
builtin_modules["scale"] = new TransformModule(SCALE);
builtin_modules["rotate"] = new TransformModule(ROTATE);
builtin_modules["mirror"] = new TransformModule(MIRROR);
builtin_modules["translate"] = new TransformModule(TRANSLATE);
builtin_modules["multmatrix"] = new TransformModule(MULTMATRIX);
Builtins::init("scale", new TransformModule(SCALE));
Builtins::init("rotate", new TransformModule(ROTATE));
Builtins::init("mirror", new TransformModule(MIRROR));
Builtins::init("translate", new TransformModule(TRANSLATE));
Builtins::init("multmatrix", new TransformModule(MULTMATRIX));
}

View File

@ -167,6 +167,7 @@ set(CORE_SOURCES
../src/func.cc
../src/module.cc
../src/node.cc
../src/builtin.cc
../src/context.cc
../src/csgterm.cc
../src/polyset.cc

View File

@ -100,8 +100,7 @@ int main(int argc, char **argv)
const char *filename = argv[1];
const char *outfile = argv[2];
initialize_builtin_functions();
initialize_builtin_modules();
Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@ -212,8 +211,7 @@ int main(int argc, char **argv)
csgInfo.glview->paintGL();
csgInfo.glview->save(outfile);
destroy_builtin_functions();
destroy_builtin_modules();
Builtins::instance(true);
return 0;
}

View File

@ -84,8 +84,7 @@ int main(int argc, char **argv)
const char *filename = argv[1];
initialize_builtin_functions();
initialize_builtin_modules();
Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@ -142,8 +141,8 @@ int main(int argc, char **argv)
if (!N.empty()) {
export_stl(&N, std::cout, NULL);
}
destroy_builtin_functions();
destroy_builtin_modules();
Builtins::instance(true);
return 0;
}

View File

@ -69,8 +69,7 @@ int main(int argc, char **argv)
int rc = 0;
initialize_builtin_functions();
initialize_builtin_modules();
Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@ -145,8 +144,7 @@ int main(int argc, char **argv)
}
outfile.close();
destroy_builtin_functions();
destroy_builtin_modules();
Builtins::instance(true);
return rc;
}

View File

@ -77,8 +77,7 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
const char *filename = argv[1];
const char *outfilename = argv[2];
initialize_builtin_functions();
initialize_builtin_modules();
Builtins::instance()->initialize();
QApplication app(argc, argv, false);
@ -217,8 +216,7 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type)
csgInfo.glview->save(outfilename);
destroy_builtin_functions();
destroy_builtin_modules();
Builtins::instance(true);
return 0;
}

View File

@ -72,8 +72,7 @@ int main(int argc, char **argv)
int rc = 0;
initialize_builtin_functions();
initialize_builtin_modules();
Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@ -130,8 +129,7 @@ int main(int argc, char **argv)
outfile << csgcache[*root_node] << "\n";
outfile.close();
destroy_builtin_functions();
destroy_builtin_modules();
Builtins::instance(true);
return rc;
}

View File

@ -75,8 +75,7 @@ int main(int argc, char **argv)
int rc = 0;
initialize_builtin_functions();
initialize_builtin_modules();
Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@ -159,9 +158,7 @@ int main(int argc, char **argv)
exit(1);
}
destroy_builtin_functions();
destroy_builtin_modules();
Builtins::instance(true);
return rc;
}

View File

@ -76,8 +76,7 @@ int main(int argc, char **argv)
}
set_output_handler(&outfile_handler, &ofile);
initialize_builtin_functions();
initialize_builtin_modules();
Builtins::instance()->initialize();
QApplication app(argc, argv, false);
QDir original_path = QDir::current();
@ -121,9 +120,7 @@ int main(int argc, char **argv)
AbstractNode::resetIndexCounter();
root_node = root_module->evaluate(&root_ctx, &root_inst);
destroy_builtin_functions();
destroy_builtin_modules();
Builtins::instance(true);
ofile.close();
return rc;
}