summaryrefslogtreecommitdiff
path: root/src/LuaLoad.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/LuaLoad.cc')
-rw-r--r--src/LuaLoad.cc64
1 files changed, 64 insertions, 0 deletions
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);
+}