summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ldo.js2
-rw-r--r--src/ldump.js8
-rw-r--r--src/lundump.js25
3 files changed, 27 insertions, 8 deletions
diff --git a/src/ldo.js b/src/ldo.js
index 3bdd5b5..4105722 100644
--- a/src/ldo.js
+++ b/src/ldo.js
@@ -565,7 +565,7 @@ const f_parser = function(L, p) {
let c = p.z.getc(); /* read first character */
if (c === lua.LUA_SIGNATURE.charCodeAt(0)) {
checkmode(L, p.mode, lua.to_luastring("binary", true));
- cl = new BytecodeParser(L, p.z.buffer).luaU_undump();
+ cl = new BytecodeParser(L, p.z.buffer, p.name).luaU_undump();
} else {
checkmode(L, p.mode, lua.to_luastring("text", true));
cl = lparser.luaY_parser(L, p.z, p.buff, p.dyd, p.name, c);
diff --git a/src/ldump.js b/src/ldump.js
index 98c48ef..e35d3be 100644
--- a/src/ldump.js
+++ b/src/ldump.js
@@ -48,10 +48,10 @@ const DumpInt = function(x, D) {
};
const DumpInteger = function(x, D) {
- let dv = new DataView(new ArrayBuffer(8));
+ let dv = new DataView(new ArrayBuffer(4));
dv.setInt32(0, x, true);
let t = [];
- for (let i = 0; i < 8; i++)
+ for (let i = 0; i < 4; i++)
t.push(dv.getUint8(i, true));
DumpBlock(t, 8, D);
};
@@ -176,7 +176,7 @@ const DumpHeader = function(D) {
DumpByte(4, D); // intSize
DumpByte(8, D); // size_tSize
DumpByte(4, D); // instructionSize
- DumpByte(8, D); // integerSize
+ DumpByte(4, D); // integerSize
DumpByte(8, D); // numberSize
DumpInteger(LUAC_INT, D);
DumpNumber(LUAC_NUM, D);
@@ -198,4 +198,4 @@ const luaU_dump = function(L, f, w, data, strip) {
return D.status;
};
-module.exports.luaU_dump = luaU_dump; \ No newline at end of file
+module.exports.luaU_dump = luaU_dump;
diff --git a/src/lundump.js b/src/lundump.js
index 36fd674..b229926 100644
--- a/src/lundump.js
+++ b/src/lundump.js
@@ -13,16 +13,17 @@ const LUAI_MAXSHORTLEN = 40;
class BytecodeParser {
- constructor(L, dataView) {
+ constructor(L, dataView, name) {
this.L = L;
this.intSize = 4;
this.size_tSize = 8;
this.instructionSize = 4;
- this.integerSize = 8;
+ this.integerSize = 4;
this.numberSize = 8;
this.dataView = dataView;
this.offset = 0;
+ this.name = name;
}
peekByte() {
@@ -36,7 +37,7 @@ class BytecodeParser {
}
peekInteger() {
- return this.dataView.getInt32(this.offset, true); // TODO: 64b ?
+ return this.dataView.getInt32(this.offset, true);
}
readInteger() {
@@ -251,6 +252,12 @@ class BytecodeParser {
this.integerSize = this.readByte();
this.numberSize = this.readByte();
+ this.checksize(this.intSize, 4, "int");
+ this.checksize(this.size_tSize, 8, "size_t");
+ this.checksize(this.instructionSize, 4, "instruction");
+ this.checksize(this.integerSize, 4, "integer");
+ this.checksize(this.numberSize, 8, "number");
+
if (this.readInteger() !== 0x5678)
throw new Error("endianness mismatch");
@@ -259,6 +266,18 @@ class BytecodeParser {
}
+ error(why) {
+ const lapi = require('./lapi.js');
+ const ldo = require('./ldo.js');
+ lapi.lua_pushstring(this.L, lua.to_luastring(`${this.name}: ${why} precompiled chunk`, true));
+ ldo.luaD_throw(this.L, lua.thread_status.LUA_ERRSYNTAX);
+ }
+
+ checksize(byte, size, tname) {
+ if (byte !== size)
+ this.error(`${tname} size mismatch in`);
+ }
+
luaU_undump() {
this.checkHeader();