diff --git a/Makefile b/Makefile index e2fdf34..83f395e 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ include $(RACK_DIR)/arch.mk DUKTAPE ?= 0 QUICKJS ?= 1 LUAJIT ?= 1 -PYTHON ?= 1 +PYTHON ?= 0 # Entropia File System Watcher efsw := dep/lib/libefsw-static-release.a diff --git a/src/DuktapeEngine.cpp b/src/DuktapeEngine.cpp index 47eaab8..d9db2b9 100644 --- a/src/DuktapeEngine.cpp +++ b/src/DuktapeEngine.cpp @@ -217,6 +217,7 @@ struct DuktapeEngine : ScriptEngine { }; -ScriptEngine* createDuktapeEngine() { - return new DuktapeEngine; -} \ No newline at end of file +__attribute__((constructor(1000))) +static void constructor() { + addScriptEngine("js"); +} diff --git a/src/LuaJITEngine.cpp b/src/LuaJITEngine.cpp index 4217ef9..14a0d98 100644 --- a/src/LuaJITEngine.cpp +++ b/src/LuaJITEngine.cpp @@ -317,6 +317,7 @@ struct LuaJITEngine : ScriptEngine { }; -ScriptEngine* createLuaJITEngine() { - return new LuaJITEngine; -} \ No newline at end of file +__attribute__((constructor(1000))) +static void constructor() { + addScriptEngine("lua"); +} diff --git a/src/Prototype.cpp b/src/Prototype.cpp index c496437..949e2d2 100644 --- a/src/Prototype.cpp +++ b/src/Prototype.cpp @@ -13,6 +13,18 @@ using namespace rack; Plugin* pluginInstance; +// Don't bother deleting this with a destructor. +__attribute((init_priority(999))) +std::map scriptEngineFactories; + +ScriptEngine* createScriptEngine(std::string extension) { + auto it = scriptEngineFactories.find(extension); + if (it == scriptEngineFactories.end()) + return NULL; + return it->second->createScriptEngine(); +} + + // Global warning message for script security bool securityRequested = false; bool securityAccepted = false; @@ -253,10 +265,10 @@ struct Prototype : Module { this->script = script; // Create script engine from path extension - std::string ext = string::filenameExtension(string::filename(path)); - scriptEngine = createScriptEngine(ext); + std::string extension = string::filenameExtension(string::filename(path)); + scriptEngine = createScriptEngine(extension); if (!scriptEngine) { - message = string::f("No engine for .%s extension", ext.c_str()); + message = string::f("No engine for .%s extension", extension.c_str()); return; } scriptEngine->module = this; diff --git a/src/PythonEngine.cpp b/src/PythonEngine.cpp index 4b9f93c..12f3a7c 100644 --- a/src/PythonEngine.cpp +++ b/src/PythonEngine.cpp @@ -247,6 +247,7 @@ struct PythonEngine : ScriptEngine { }; -ScriptEngine* createPythonEngine() { - return new PythonEngine; -} \ No newline at end of file +__attribute__((constructor(1000))) +static void constructor() { + addScriptEngine("py"); +} diff --git a/src/QuickJSEngine.cpp b/src/QuickJSEngine.cpp index 1e0d3d2..d137d9b 100644 --- a/src/QuickJSEngine.cpp +++ b/src/QuickJSEngine.cpp @@ -327,6 +327,7 @@ struct QuickJSEngine : ScriptEngine { }; -ScriptEngine* createQuickJSEngine() { - return new QuickJSEngine(); +__attribute__((constructor(1000))) +static void constructor() { + addScriptEngine("js"); } diff --git a/src/ScriptEngine.hpp b/src/ScriptEngine.hpp index a2c67a9..4dcaf7b 100644 --- a/src/ScriptEngine.hpp +++ b/src/ScriptEngine.hpp @@ -48,22 +48,20 @@ struct ScriptEngine { }; -// List of ScriptEngines - -// Add your createMyEngine() function here. -ScriptEngine* createDuktapeEngine(); -ScriptEngine* createQuickJSEngine(); -ScriptEngine* createPythonEngine(); -ScriptEngine* createLuaJITEngine(); +struct ScriptEngineFactory { + virtual ScriptEngine* createScriptEngine() = 0; +}; +extern std::map scriptEngineFactories; -inline ScriptEngine* createScriptEngine(std::string ext) { - ext = rack::string::lowercase(ext); - if (ext == "js") - return createQuickJSEngine(); - else if (ext == "lua") - return createLuaJITEngine(); - else if (ext == "py") - return createPythonEngine(); - // Add your file extension check here. - return NULL; +/** Called from functions with +__attribute__((constructor(1000))) +*/ +template +void addScriptEngine(std::string extension) { + struct TScriptEngineFactory : ScriptEngineFactory { + ScriptEngine* createScriptEngine() { + return new TScriptEngine; + } + }; + scriptEngineFactories[extension] = new TScriptEngineFactory; }