From cd46ac257c623b4966ebf9f86523feff65746c38 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Thu, 23 Mar 2017 09:59:38 +0100 Subject: Handle binary in luaL_loadfilex --- src/lauxlib.js | 32 +++++++++++++++++++++++++------- tests/load.js | 33 +++++++++++++++++++++++++++++++++ tests/loadfile-test.bc | Bin 0 -> 142 bytes 3 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 tests/loadfile-test.bc diff --git a/src/lauxlib.js b/src/lauxlib.js index dbdb251..689abbb 100644 --- a/src/lauxlib.js +++ b/src/lauxlib.js @@ -410,9 +410,18 @@ if (typeof window === "undefined") { this.f = null; /* file being read */ this.buff = new Buffer(1024); /* area for reading file */ this.pos = 0; /* current position in file */ + this.binary = false; } } + const toDataView = function(buffer) { + let ab = new ArrayBuffer(buffer.length); + let au = new Uint8Array(ab); + for (let i = 0; i < buffer.length; i++) + au[i] = buffer[i]; + return new DataView(ab); + }; + const getF = function(L, ud) { let lf = ud; let bytes = 0; @@ -423,7 +432,9 @@ if (typeof window === "undefined") { bytes = fs.readSync(lf.f, lf.buff, 0, lf.buff.length, lf.pos); /* read block */ lf.pos += bytes; } - return bytes > 0 ? new lobject.TValue(0, lf.buff).jsstring() : null; // TODO: Here reading utf8 only + if (bytes > 0) + return lf.binary ? toDataView(lf.buff) : new lobject.TValue(0, lf.buff).jsstring(); // TODO: Here reading utf8 only + else return null; }; const errfile = function(L, what, fnameindex, error) { @@ -468,10 +479,17 @@ if (typeof window === "undefined") { do { /* skip first line */ c = getc(lf); } while (c && c !== '\n'.charCodeAt(0)); - return getc(lf); /* skip end-of-line, if present */ + + return { + skipped: true, + c: getc(lf) /* skip end-of-line, if present */ + }; } else { lf.pos--; - return false; + return { + skipped: false, + c: c + }; } }; @@ -491,12 +509,12 @@ if (typeof window === "undefined") { } try { - let c; - if ((c = skipcomment(lf))) /* read initial portion */ + let com; + if ((com = skipcomment(lf)).skipped) /* read initial portion */ lf.buff[lf.n++] = '\n'.charCodeAt(0); /* add line to correct line numbers */ - if (c === lua.LUA_SIGNATURE.charCodeAt(0) && filename) { /* binary file? */ - // ... + if (com.c === lua.LUA_SIGNATURE.charCodeAt(0) && filename) { /* binary file? */ + lf.binary = true; } let status = lapi.lua_load(L, getF, lf, lapi.lua_tostring(L, -1), mode); diff --git a/tests/load.js b/tests/load.js index ef37309..143549a 100644 --- a/tests/load.js +++ b/tests/load.js @@ -150,6 +150,39 @@ test('loadfile', function (t) { }); +test('loadfile (binary)', function (t) { + let luaCode = ` + local f = loadfile("tests/loadfile-test.bc") + return f() + `, L; + + t.plan(3); + + t.doesNotThrow(function () { + + L = lauxlib.luaL_newstate(); + + linit.luaL_openlibs(L); + + lauxlib.luaL_loadstring(L, luaCode); + + }, "Lua program loaded without error"); + + t.doesNotThrow(function () { + + lapi.lua_call(L, 0, -1); + + }, "Lua program ran without error"); + + t.strictEqual( + lapi.lua_tostring(L, -1), + "hello world", + "Correct element(s) on the stack" + ); + +}); + + test('dofile', function (t) { let luaCode = ` return dofile("tests/loadfile-test.lua") diff --git a/tests/loadfile-test.bc b/tests/loadfile-test.bc new file mode 100644 index 0000000..502b0ce Binary files /dev/null and b/tests/loadfile-test.bc differ -- cgit v1.2.3-54-g00ecf