diff options
-rw-r--r-- | includes/LuaLoad.h | 5 | ||||
-rw-r--r-- | src/LuaLoad.cc | 64 |
2 files changed, 69 insertions, 0 deletions
diff --git a/includes/LuaLoad.h b/includes/LuaLoad.h new file mode 100644 index 0000000..8a3012b --- /dev/null +++ b/includes/LuaLoad.h @@ -0,0 +1,5 @@ +#pragma once + +#include <BLua.h> + +void registerLuaLoad(Balau::Lua &); diff --git a/src/LuaLoad.cc b/src/LuaLoad.cc new file mode 100644 index 0000000..de7501f --- /dev/null +++ b/src/LuaLoad.cc @@ -0,0 +1,64 @@ +#include "LuaLoad.h" +#include "LuaTask.h" +#include "Buffer.h" +#include "Input.h" + +using namespace Balau; + +namespace { + +class LuaLoad { }; + +enum LuaLoad_functions_t { + LUALOAD +}; + +struct lua_functypes_t LuaLoad_functions[] = { + { LUALOAD, "load", 1, 1, { BLUA_OBJECT | BLUA_STRING } }, + { -1, 0, 0, 0, 0 } +}; + +struct sLua_LuaLoad { + static int LuaLoad_proceed_static(Lua & L, int n, int caller) { + IO<Handle> h; + enum { + OPENING, + CREATETASK, + WAITTASK, + } status; + if (L.isobject()) { + h = L.recast<Handle>(); + if (h.isA<Buffer>()) { + L.load(h); + return 0; + } + status = CREATETASK; + } else { + h = new Input(L.tostring()); + status = OPENING; + } + LuaExecFile * execFile = NULL; + return L.yield(Future<int>([L, status, h, execFile]() mutable { + switch (status) { + case OPENING: + h.asA<Input>()->open(); + status = CREATETASK; + case CREATETASK: + execFile = new LuaExecFile(h); + status = WAITTASK; + execFile->exec(L); + case WAITTASK: + execFile->throwError(); // will induce a memory leak in case of an actual error. + delete execFile; + } + return 0; + })); + } +}; + +}; + +void registerLuaLoad(Lua & L) { + CHECK_FUNCTIONS(LuaLoad); + PUSH_FUNCTION(LuaLoad, LUALOAD); +} |