diff options
author | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-03-23 09:59:38 +0100 |
---|---|---|
committer | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-03-23 09:59:38 +0100 |
commit | cd46ac257c623b4966ebf9f86523feff65746c38 (patch) | |
tree | 310e985e47d2731558095a3c58e4a2eb8cb2ff28 /src/lauxlib.js | |
parent | 99564913987698cdfc2528a93b5157030e637ced (diff) | |
download | fengari-cd46ac257c623b4966ebf9f86523feff65746c38.tar.gz fengari-cd46ac257c623b4966ebf9f86523feff65746c38.tar.bz2 fengari-cd46ac257c623b4966ebf9f86523feff65746c38.zip |
Handle binary in luaL_loadfilex
Diffstat (limited to 'src/lauxlib.js')
-rw-r--r-- | src/lauxlib.js | 32 |
1 files changed, 25 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); |