Browse Source

Add constructor initializers for ScriptEngines to remove derived classes from ScriptEngine.hpp.

tags/v1.3.0
Andrew Belt 5 years ago
parent
commit
bf4bf96b4c
7 changed files with 46 additions and 32 deletions
  1. +1
    -1
      Makefile
  2. +4
    -3
      src/DuktapeEngine.cpp
  3. +4
    -3
      src/LuaJITEngine.cpp
  4. +15
    -3
      src/Prototype.cpp
  5. +4
    -3
      src/PythonEngine.cpp
  6. +3
    -2
      src/QuickJSEngine.cpp
  7. +15
    -17
      src/ScriptEngine.hpp

+ 1
- 1
Makefile View File

@@ -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


+ 4
- 3
src/DuktapeEngine.cpp View File

@@ -217,6 +217,7 @@ struct DuktapeEngine : ScriptEngine {
};


ScriptEngine* createDuktapeEngine() {
return new DuktapeEngine;
}
__attribute__((constructor(1000)))
static void constructor() {
addScriptEngine<DuktapeEngine>("js");
}

+ 4
- 3
src/LuaJITEngine.cpp View File

@@ -317,6 +317,7 @@ struct LuaJITEngine : ScriptEngine {
};


ScriptEngine* createLuaJITEngine() {
return new LuaJITEngine;
}
__attribute__((constructor(1000)))
static void constructor() {
addScriptEngine<LuaJITEngine>("lua");
}

+ 15
- 3
src/Prototype.cpp View File

@@ -13,6 +13,18 @@ using namespace rack;
Plugin* pluginInstance;


// Don't bother deleting this with a destructor.
__attribute((init_priority(999)))
std::map<std::string, ScriptEngineFactory*> 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;


+ 4
- 3
src/PythonEngine.cpp View File

@@ -247,6 +247,7 @@ struct PythonEngine : ScriptEngine {
};


ScriptEngine* createPythonEngine() {
return new PythonEngine;
}
__attribute__((constructor(1000)))
static void constructor() {
addScriptEngine<PythonEngine>("py");
}

+ 3
- 2
src/QuickJSEngine.cpp View File

@@ -327,6 +327,7 @@ struct QuickJSEngine : ScriptEngine {
};


ScriptEngine* createQuickJSEngine() {
return new QuickJSEngine();
__attribute__((constructor(1000)))
static void constructor() {
addScriptEngine<QuickJSEngine>("js");
}

+ 15
- 17
src/ScriptEngine.hpp View File

@@ -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<std::string, ScriptEngineFactory*> 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<typename TScriptEngine>
void addScriptEngine(std::string extension) {
struct TScriptEngineFactory : ScriptEngineFactory {
ScriptEngine* createScriptEngine() {
return new TScriptEngine;
}
};
scriptEngineFactories[extension] = new TScriptEngineFactory;
}

Loading…
Cancel
Save