summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Giannangeli <benoit.giannangeli@boursorama.fr>2017-03-23 09:59:38 +0100
committerBenoit Giannangeli <benoit.giannangeli@boursorama.fr>2017-03-23 09:59:38 +0100
commitcd46ac257c623b4966ebf9f86523feff65746c38 (patch)
tree310e985e47d2731558095a3c58e4a2eb8cb2ff28
parent99564913987698cdfc2528a93b5157030e637ced (diff)
downloadfengari-cd46ac257c623b4966ebf9f86523feff65746c38.tar.gz
fengari-cd46ac257c623b4966ebf9f86523feff65746c38.tar.bz2
fengari-cd46ac257c623b4966ebf9f86523feff65746c38.zip
Handle binary in luaL_loadfilex
-rw-r--r--src/lauxlib.js32
-rw-r--r--tests/load.js33
-rw-r--r--tests/loadfile-test.bcbin0 -> 142 bytes
3 files changed, 58 insertions, 7 deletions
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
--- /dev/null
+++ b/tests/loadfile-test.bc
Binary files differ