diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lbaselib.js | 2 | ||||
-rw-r--r-- | src/ldo.js | 4 | ||||
-rw-r--r-- | src/lfunc.js | 17 | ||||
-rw-r--r-- | src/lstate.js | 1 | ||||
-rw-r--r-- | src/lundump.js | 4 | ||||
-rw-r--r-- | src/lvm.js | 1 |
6 files changed, 16 insertions, 13 deletions
diff --git a/src/lbaselib.js b/src/lbaselib.js index 5e3fff6..d1d930a 100644 --- a/src/lbaselib.js +++ b/src/lbaselib.js @@ -297,7 +297,7 @@ const luaB_load = function(L) { let status; if (s !== null) { /* loading a string? */ let chunkname = lauxlib.luaL_optstring(L, 2, s); - status = lauxlib.luaL_loadbufferx(L, s, chunkname, mode); + status = lauxlib.luaL_loadbufferx(L, s, s.length, chunkname, mode); } else { /* loading from a reader function */ let chunkname = lauxlib.luaL_optstring(L, 2, lua.to_luastring("=(load)", true)); lauxlib.luaL_checktype(L, 1, lua.LUA_TFUNCTION); @@ -574,7 +574,9 @@ const f_parser = function(L, p) { let c = p.z.getc(); /* read first character */ if (c === defs.LUA_SIGNATURE.charCodeAt(0)) { checkmode(L, p.mode, defs.to_luastring("binary", true)); - cl = new BytecodeParser(L, p.z.buffer, p.name).luaU_undump(); + let buff = p.z.buffer; + if (Array.isArray(buff)) buff = new DataView(new Uint8Array(p.z.buffer).buffer); /* Lua string holding binary (string.dump) */ + cl = new BytecodeParser(L, buff, p.name).luaU_undump(); } else { checkmode(L, p.mode, defs.to_luastring("text", true)); cl = lparser.luaY_parser(L, p.z, p.buff, p.dyd, p.name, c); diff --git a/src/lfunc.js b/src/lfunc.js index cf2cfe0..7b2c557 100644 --- a/src/lfunc.js +++ b/src/lfunc.js @@ -8,7 +8,7 @@ const CT = defs.constant_types; class Proto { - constructor(L) { + constructor() { this.k = []; // constants used by the function this.p = []; // functions defined inside the function this.code = []; // opcodes @@ -54,10 +54,10 @@ const luaF_newLclosure = function(L, n) { const findupval = function(L, level) { let pp = L.openupval; - - while(pp !== null && pp.v >= level) { - let p = pp; - + let p = pp; + while (pp !== null && pp.v >= level) { + p = pp; + assert(p.isopen()); if (p.v === level) return p; @@ -66,11 +66,14 @@ const findupval = function(L, level) { let uv = new UpVal(); - uv.open_next = pp; + if (p) { /* The openupval list is not empty */ + uv.open_next = p; /* link it to list of open upvalues */ + } + L.openupval = uv; uv.L = L; - uv.v = level; + uv.v = level; /* current value lives in the stack */ return uv; }; diff --git a/src/lstate.js b/src/lstate.js index 4fd2951..fee308c 100644 --- a/src/lstate.js +++ b/src/lstate.js @@ -168,7 +168,6 @@ const lua_newstate = function() { }; const close_state = function(L) { - let g = L.l_G; lfunc.luaF_close(L, L.stack); /* close all upvalues for this thread */ }; diff --git a/src/lundump.js b/src/lundump.js index 541adbb..1c0d4c7 100644 --- a/src/lundump.js +++ b/src/lundump.js @@ -8,11 +8,11 @@ const lfunc = require('./lfunc.js'); const lobject = require('./lobject.js'); const lopcodes = require('./lopcodes.js'); -const LUAI_MAXSHORTLEN = 40; - class BytecodeParser { constructor(L, dataView, name) { + assert(dataView instanceof DataView, "BytecodeParser only operates on a dataView") + this.L = L; this.intSize = 4; this.size_tSize = 8; @@ -516,7 +516,6 @@ const luaV_execute = function(L) { let oci = nci.previous; let nfunc = nci.func; let nfuncOff = nci.funcOff; - let ofunc = oci.func; let ofuncOff = oci.funcOff; let lim = nci.l_base + nfunc.value.p.numparams; if (cl.p.p.length > 0) lfunc.luaF_close(L, oci.l_base); |