Add support for compiled ".mrb" scripts

A compiled ".mrb" script can be specified in the Binding config
subgroup with key 'mrbFile='.
If a 'customScript' is specified it still takes priority however.
This commit is contained in:
Jonas Kulla 2013-09-03 11:11:12 +02:00
parent 57c806e9b5
commit 2ddb31016d
1 changed files with 38 additions and 1 deletions

View File

@ -28,6 +28,7 @@
#include "mruby/irep.h" #include "mruby/irep.h"
#include "mruby/compile.h" #include "mruby/compile.h"
#include "mruby/proc.h" #include "mruby/proc.h"
#include "mruby/dump.h"
#include "binding-util.h" #include "binding-util.h"
@ -208,6 +209,37 @@ runCustomScript(mrb_state *mrb, mrbc_context *ctx, const char *filename)
fclose(f); fclose(f);
} }
static void
runMrbFile(mrb_state *mrb, const char *filename)
{
/* Execute compiled script */
FILE *f = fopen(filename, "r");
if (!f)
{
static char buffer[256];
snprintf(buffer, sizeof(buffer), "Unable to open compiled script '%s'", filename);
showError(buffer);
return;
}
int n = mrb_read_irep_file(mrb, f);
if (n < 0)
{
static char buffer[256];
snprintf(buffer, sizeof(buffer), "Unable to read compiled script '%s'", filename);
showError(buffer);
return;
}
mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
fclose(f);
}
static void static void
runRMXPScripts(mrb_state *mrb, mrbc_context *ctx) runRMXPScripts(mrb_state *mrb, mrbc_context *ctx)
{ {
@ -323,9 +355,14 @@ void mrbBindingExecute()
mrbc_context *ctx = mrbc_context_new(mrb); mrbc_context *ctx = mrbc_context_new(mrb);
ctx->capture_errors = 1; ctx->capture_errors = 1;
QByteArray &customScript = gState->rtData().config.customScript; Config &conf = gState->rtData().config;
QByteArray &customScript = conf.customScript;
QByteArray mrbFile = conf.bindingConf.value("mrbFile").toByteArray();
if (!customScript.isEmpty()) if (!customScript.isEmpty())
runCustomScript(mrb, ctx, customScript.constData()); runCustomScript(mrb, ctx, customScript.constData());
else if (!mrbFile.isEmpty())
runMrbFile(mrb, mrbFile.constData());
else else
runRMXPScripts(mrb, ctx); runRMXPScripts(mrb, ctx);