diff options
author | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-03-02 15:47:19 +0100 |
---|---|---|
committer | Benoit Giannangeli <giann008@gmail.com> | 2017-03-02 20:45:06 +0100 |
commit | 319c40c4439a9eda7bd4a68769057cb12b04755a (patch) | |
tree | 76541920c3594e9a2e2f4c3a973f1815f9358ee1 /src | |
parent | 2e83b8d2e3ac6c30a53e7919a1808b732aeff5a4 (diff) | |
download | fengari-319c40c4439a9eda7bd4a68769057cb12b04755a.tar.gz fengari-319c40c4439a9eda7bd4a68769057cb12b04755a.tar.bz2 fengari-319c40c4439a9eda7bd4a68769057cb12b04755a.zip |
lua_load use reader function
Diffstat (limited to 'src')
-rw-r--r-- | src/lapi.js | 2 | ||||
-rw-r--r-- | src/ldo.js | 1 | ||||
-rw-r--r-- | src/llex.js | 35 |
3 files changed, 32 insertions, 6 deletions
diff --git a/src/lapi.js b/src/lapi.js index 36da7c6..72ff554 100644 --- a/src/lapi.js +++ b/src/lapi.js @@ -628,7 +628,7 @@ const lua_rawequal = function(L, index1, index2) { // TODO: reader is ignored because we don't implement ZIO const lua_load = function(L, reader, data, chunckname, mode) { - let z = new llex.MBuffer(data); + let z = new llex.MBuffer(L, data, reader); if (!chunckname) chunckname = "?"; let status = ldo.luaD_protectedparser(L, z, chunckname, mode); if (status === TS.LUA_OK) { /* no errors? */ @@ -547,6 +547,7 @@ const luaD_protectedparser = function(L, z, name, mode) { L.nny++; /* cannot yield during parsing */ p.z = z; + p.buff.L = L; p.name = name; p.mode = mode; p.dyd.actvar.arr = []; diff --git a/src/llex.js b/src/llex.js index dab384d..711f44b 100644 --- a/src/llex.js +++ b/src/llex.js @@ -73,17 +73,42 @@ const luaX_tokens = [ const NUM_RESERVED = Object.keys(RESERVED).length; class MBuffer { - constructor(data) { - this.buffer = typeof data === "string" ? data.split('') : (data ? data : []); - this.n = this.buffer instanceof DataView ? this.buffer.byteLength : this.buffer.length; + constructor(L, data, reader) { + this.L = L; + this.data = data; + this.n = 0; + this.buffer = null; this.off = 0; + this.reader = reader ? reader : null; + + if (!this.reader) { + this.buffer = typeof data === "string" ? data.split('') : (data ? data : []); + this.n = this.buffer instanceof DataView ? this.buffer.byteLength : this.buffer.length; + this.off = 0; + } } getc() { if (this.buffer instanceof DataView) - return this.n-- > 0 ? this.buffer.getUint8(this.off++, true) : -1; + return this.n-- > 0 ? this.buffer.getUint8(this.off++, true) : this.fill(); + + return this.n-- > 0 ? this.buffer[this.off++] : this.fill(); + } + + fill() { + if (this.reader) { + this.buffer = this.reader(this.L, this.data); + this.buffer = typeof this.buffer === "string" ? this.buffer.split('') : this.buffer; + if (this.buffer === null) + return -1; + this.n = this.buffer instanceof DataView ? this.buffer.byteLength - 1 : this.buffer.length - 1; + this.off = 0; + } else return -1; + + if (this.buffer instanceof DataView) + return this.buffer.getUint8(this.off++, true); - return this.n-- > 0 ? this.buffer[this.off++] : -1; + return this.buffer[this.off++]; } } |