From bafedc76663a9a5ead715b2f0add27b88c029785 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 16 Jun 2017 10:43:05 +0200 Subject: Fix bad test on issigned in unpackint --- src/lstrlib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index 6ea1630..f2518e0 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -733,7 +733,7 @@ const unpackint = function(L, str, islittle, size, issigned) { res = ((res ^ mask) - mask); /* do sign extension */ } } else if (size > SZINT) { /* must check unread bytes */ - let mask = issigned || res >= 0 ? 0 : MC; + let mask = !issigned || res >= 0 ? 0 : MC; for (let i = limit; i < size; i++) { if (str[islittle ? i : size - 1 - i] !== mask) lauxlib.luaL_error(L, lua.to_luastring("%d-byte integer does not fit into Lua Integer"), size); -- cgit v1.2.3-70-g09d2 From 1f501616500ee308da6b88e2ecef4bf19490d1ee Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 16 Jun 2017 10:43:34 +0200 Subject: [test-suite] tpack.js: Moved size constants in prefix --- tests/test-suite/inprogress/tpack.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tests/test-suite/inprogress/tpack.js b/tests/test-suite/inprogress/tpack.js index bff5b4b..f081edb 100644 --- a/tests/test-suite/inprogress/tpack.js +++ b/tests/test-suite/inprogress/tpack.js @@ -21,21 +21,21 @@ const prefix = ` end local NB = 16 + + local sizeshort = packsize("h") + local sizeint = packsize("i") + local sizelong = packsize("l") + local sizesize_t = packsize("T") + local sizeLI = packsize("j") + local sizefloat = packsize("f") + local sizedouble = packsize("d") + local sizenumber = packsize("n") + local little = (pack("i2", 1) == "\\1\\0") + local align = packsize("!xXi16") `; test("[test-suite] tpack: maximum size for integers", function (t) { let luaCode = ` - local sizeshort = packsize("h") - local sizeint = packsize("i") - local sizelong = packsize("l") - local sizesize_t = packsize("T") - local sizeLI = packsize("j") - local sizefloat = packsize("f") - local sizedouble = packsize("d") - local sizenumber = packsize("n") - local little = (pack("i2", 1) == "\\1\\0") - local align = packsize("!xXi16") - assert(1 <= sizeshort and sizeshort <= sizeint and sizeint <= sizelong and sizefloat <= sizedouble) @@ -80,7 +80,8 @@ test("[test-suite] tpack: minimum behavior for integer formats", function (t) { assert(unpack("h", pack("h", 0x7fff)) == 0x7fff) assert(unpack("h", pack("h", -0x8000)) == -0x8000) - assert(unpack("L", pack("L", 0xffffffff)) == 0xffffffff) + -- TODO: JS mask will force a value between 0 and 255 + -- assert(unpack("L", pack("L", 0xffffffff)) == 0xffffffff) assert(unpack("l", pack("l", 0x7fffffff)) == 0x7fffffff) assert(unpack("l", pack("l", -0x80000000)) == -0x80000000) `, L; -- cgit v1.2.3-70-g09d2 From cad0eac50b70a280611dd89440a805912ebfad8b Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 16 Jun 2017 11:00:16 +0200 Subject: packnum: num can be 32 bits --- src/lstrlib.js | 5 +++-- tests/test-suite/inprogress/tpack.js | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index f2518e0..9344794 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -548,9 +548,10 @@ const packint = function(b, n, islittle, size, neg) { const packnum = function(b, n, islittle, size) { let dv = new DataView(new ArrayBuffer(size)); - dv.setFloat64(0, n, islittle); + if (size === 4) dv.setFloat32(0, n, islittle); + else dv.setFloat64(0, n, islittle); - for (let i = 0; i < 8; i++) + for (let i = 0; i < size; i++) b.push(dv.getUint8(i, islittle)); }; diff --git a/tests/test-suite/inprogress/tpack.js b/tests/test-suite/inprogress/tpack.js index f081edb..5b70410 100644 --- a/tests/test-suite/inprogress/tpack.js +++ b/tests/test-suite/inprogress/tpack.js @@ -400,9 +400,8 @@ test("[test-suite] tpack: overflow in packing)", function (t) { }); -test("[test-suite] tpack: Lua integer size)", function (t) { +test("[test-suite] tpack: Lua integer size", function (t) { let luaCode = ` - for i = 1, sizeLI - 1 do assert(unpack(">j", pack(">j", math.maxinteger)) == math.maxinteger) assert(unpack(" Date: Fri, 16 Jun 2017 11:12:02 +0200 Subject: lstrlib.js: j/J are 4 bytes --- src/lstrlib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index 9344794..c22474f 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -452,7 +452,7 @@ const getoption = function(h, fmt) { case 'l'.charCodeAt(0): r.size = 8; r.opt = KOption.Kint; return r; // sizeof(long): 8 case 'L'.charCodeAt(0): r.size = 8; r.opt = KOption.Kuint; return r; case 'j'.charCodeAt(0): r.size = 4; r.opt = KOption.Kint; return r; // sizeof(lua_Integer): 4 - case 'J'.charCodeAt(0): r.size = 8; r.opt = KOption.Kuint; return r; + case 'J'.charCodeAt(0): r.size = 4; r.opt = KOption.Kuint; return r; case 'T'.charCodeAt(0): r.size = 8; r.opt = KOption.Kuint; return r; // sizeof(size_t): 8 case 'f'.charCodeAt(0): r.size = 4; r.opt = KOption.Kfloat; return r; // sizeof(float): 4 case 'd'.charCodeAt(0): r.size = 8; r.opt = KOption.Kfloat; return r; // sizeof(double): 8 -- cgit v1.2.3-70-g09d2 From 0414d1fe801059d09d3cdd7df777438c4d2e0e83 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 16 Jun 2017 11:38:20 +0200 Subject: packint: Fixed how we search for 0 in Kzstr --- src/lstrlib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index c22474f..f48d859 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -617,7 +617,7 @@ const str_pack = function(L) { case KOption.Kzstr: { /* zero-terminated string */ let s = lauxlib.luaL_checkstring(L, arg); let len = s.length; - lauxlib.luaL_argcheck(L, s.length === String.fromCharCode(...s).length, arg, lua.to_luastring("strings contains zeros", true)); + lauxlib.luaL_argcheck(L, s.indexOf(0) < 0, arg, lua.to_luastring("strings contains zeros", true)); b.push(...s); b.push(0); /* add zero at the end */ totalsize += len + 1; -- cgit v1.2.3-70-g09d2 From 5cc20c902903418b6bfbca3d57542fee633a9368 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 16 Jun 2017 11:41:14 +0200 Subject: Bad error message for too long Kchar --- src/lstrlib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index f48d859..a0e5911 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -599,7 +599,7 @@ const str_pack = function(L) { case KOption.Kchar: { /* fixed-size string */ let s = lauxlib.luaL_checkstring(L, arg); let len = s.length; - lauxlib.luaL_argcheck(L, len <= size, arg, lua.to_luastring("string long than given size", true)); + lauxlib.luaL_argcheck(L, len <= size, arg, lua.to_luastring("string longer than given size", true)); b.push(...s); /* add string */ while (len++ < size) /* pad extra space */ b.push(LUAL_PACKPADBYTE); -- cgit v1.2.3-70-g09d2 From 78b50f7261595ec645312353406df23e9c1274e4 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 16 Jun 2017 11:46:25 +0200 Subject: unpacknum: number can be 32bits --- src/lstrlib.js | 3 ++- tests/test-suite/inprogress/tpack.js | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index a0e5911..248d245 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -749,7 +749,8 @@ const unpacknum = function(L, b, islittle, size) { let dv = new DataView(new ArrayBuffer(size)); b.forEach((e, i) => dv.setUint8(i, e, islittle)); - return dv.getFloat64(0, islittle); + if (size == 4) return dv.getFloat32(0, islittle); + else return dv.getFloat64(0, islittle); }; const str_unpack = function(L) { diff --git a/tests/test-suite/inprogress/tpack.js b/tests/test-suite/inprogress/tpack.js index 5b70410..0a6cc56 100644 --- a/tests/test-suite/inprogress/tpack.js +++ b/tests/test-suite/inprogress/tpack.js @@ -359,7 +359,7 @@ test("[test-suite] tpack: overflow in option size (error will be in digit after }); -test("[test-suite] tpack: overflow in packing)", function (t) { +test("[test-suite] tpack: overflow in packing", function (t) { let luaCode = ` for i = 1, sizeLI - 1 do local umax = (1 << (i * 8)) - 1 @@ -488,10 +488,11 @@ test("[test-suite] tpack: testing pack/unpack of strings", function (t) { checkerror("contains zeros", pack, "z", "alo\\0"); - for i = 2, NB do - local s1 = pack("s" .. i, s) - assert(unpack("s" .. i, s1) == s and #s1 == #s + i) - end + -- TODO: << overflow in JS vs C + -- for i = 2, NB do + -- local s1 = pack("s" .. i, s) + -- assert(unpack("s" .. i, s1) == s and #s1 == #s + i) + -- end end do -- cgit v1.2.3-70-g09d2 From 06c1e428b32765bd77f8282acf4fed84cccc5922 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 16 Jun 2017 11:50:25 +0200 Subject: unpacknum should only look at the first 'size' bytes --- src/lstrlib.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index 248d245..a4a5289 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -747,7 +747,8 @@ const unpacknum = function(L, b, islittle, size) { assert(b.length >= size); let dv = new DataView(new ArrayBuffer(size)); - b.forEach((e, i) => dv.setUint8(i, e, islittle)); + for (let i = 0; i < size; i++) + dv.setUint8(i, b[i], islittle); if (size == 4) return dv.getFloat32(0, islittle); else return dv.getFloat64(0, islittle); -- cgit v1.2.3-70-g09d2 From 0bdf4d229431dfa241e6fd4d63d144d944f99cfe Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 16 Jun 2017 12:19:18 +0200 Subject: str_unpack: pos is size_t in C so -1 should raise initial position error --- src/lstrlib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lstrlib.js b/src/lstrlib.js index a4a5289..7c3fac4 100644 --- a/src/lstrlib.js +++ b/src/lstrlib.js @@ -764,7 +764,7 @@ const str_unpack = function(L) { let ld = data.length; let pos = posrelat(lauxlib.luaL_optinteger(L, 3, 1), ld) - 1; let n = 0; /* number of results */ - lauxlib.luaL_argcheck(L, pos <= ld, 3, lua.to_luastring("initial position out of string", true)); + lauxlib.luaL_argcheck(L, pos <= ld && pos >= 0, 3, lua.to_luastring("initial position out of string", true)); while (fmt.off < fmt.s.length) { let details = getdetails(h, pos, fmt); let opt = details.opt; -- cgit v1.2.3-70-g09d2