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++];      }  } | 
