From 3c1040007a354ce55bd964beabac94b67c1f6fc7 Mon Sep 17 00:00:00 2001 From: Nicolas Noble Date: Mon, 5 Aug 2013 17:05:51 -0700 Subject: Adding the LuaLoad function. --- src/LuaLoad.cc | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/LuaLoad.cc (limited to 'src/LuaLoad.cc') 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 h; + enum { + OPENING, + CREATETASK, + WAITTASK, + } status; + if (L.isobject()) { + h = L.recast(); + if (h.isA()) { + L.load(h); + return 0; + } + status = CREATETASK; + } else { + h = new Input(L.tostring()); + status = OPENING; + } + LuaExecFile * execFile = NULL; + return L.yield(Future([L, status, h, execFile]() mutable { + switch (status) { + case OPENING: + h.asA()->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); +} -- cgit v1.2.3