diff options
Diffstat (limited to 'src/lundump.js')
-rw-r--r-- | src/lundump.js | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/lundump.js b/src/lundump.js index aa66584..d215c60 100644 --- a/src/lundump.js +++ b/src/lundump.js @@ -15,7 +15,8 @@ const LUAI_MAXSHORTLEN = 40; class BytecodeParser { - constructor(dataView) { + constructor(L, dataView) { + this.L = L; this.intSize = 4; this.size_tSize = 8; this.instructionSize = 4; @@ -69,7 +70,7 @@ class BytecodeParser { return number; } - readString(n) { + read8bitString(n) { let size = typeof n !== 'undefined' ? n : this.readByte() - 1; if (size === 0xFF) // TODO: test @@ -79,7 +80,7 @@ class BytecodeParser { return null; } - let string = new Uint8Array(); + let string = [];//new Uint8Array(); for (let i = 0; i < size; i++) string.push(this.readByte()); @@ -87,6 +88,24 @@ class BytecodeParser { return string; } + readString(n) { + let size = typeof n !== 'undefined' ? n : this.readByte() - 1; + + if (size === 0xFF) // TODO: test + this.offset += this.size_tSize; + + if (size === 0) { + return null; + } + + let string = ""; + + for (let i = 0; i < size; i++) + string += String.fromCharCode(this.readByte()); + + return string; + } + /* creates a mask with 'n' 1 bits at position 'p' */ static MASK1(n, p) { return ((~((~0)<<(n)))<<(p)); @@ -158,7 +177,7 @@ class BytecodeParser { break; case constant_types.LUA_TSHRSTR: case constant_types.LUA_TLNGSTR: - f.k.push(new TValue(constant_types.LUA_TLNGSTR, this.readString())); + f.k.push(this.L.l_G.intern(this.read8bitString())); break; default: throw new Error(`unrecognized constant '${t}'`); @@ -238,13 +257,13 @@ class BytecodeParser { } - luaU_undump(L) { + luaU_undump() { this.checkHeader(); - let cl = new LClosure(L, this.readByte()); + let cl = new LClosure(this.L, this.readByte()); - L.stack[L.top] = cl; - L.top++; + this.L.stack[this.L.top] = cl; + this.L.top++; cl.p = new Proto(); |