From fa7ce109418aca2fd60fdb65b4b2451c4854dd09 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Thu, 2 Feb 2017 07:36:14 +0100 Subject: Following Lua's source code as closely as possible --- src/lundump.js | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/lundump.js (limited to 'src/lundump.js') diff --git a/src/lundump.js b/src/lundump.js new file mode 100644 index 0000000..69445d4 --- /dev/null +++ b/src/lundump.js @@ -0,0 +1,67 @@ +/*jshint esversion: 6 */ +"use strict"; + +const DataView = require('buffer-dataview'); +const fs = require('fs'); +const lua_State = require('./lstate.js').lua_State; +const LClosure = require('./lobject.js').LClosure; + +/** + * Parse Lua 5.3 bytecode + * @see {@link http://www.lua.org/source/5.3/lundump.c.html|lundump.c} + */ +class BytecodeParser { + + /** + * Initilialize bytecode parser + * @constructor + * @param {DataView} dataView Contains the binary data + */ + constructor(dataView) { + this.dataView = dataView; + this.offset = 0; + } + + peekByte() { + return this.dataView.getUint8(this.offset, true); + } + + readByte() { + let byte = this.peekByte(); + this.offset++; + return byte; + } + + peekWord() { + return this.dataView.getUint32(this.offset, true); + } + + readWord() { + let word = this.peekWord(); + this.offset += 4; + + return word; + } + + checkHeader() { + if (this.readByte() !== 0x1b + || this.readByte() !== 0x4c + || this.readByte() !== 0x75 + || this.readByte() !== 0x61) + throw new Error("Bad LUA_SIGNATURE, expected [1b 4c 75 61]"); + + if (this.readByte() !== 0x53) + throw new Error("Bad Lua version, expected 5.3"); + + if (this.readByte() !== 0) + throw new Error("Supports only official PUC-Rio implementation") + } + + luaU_undump() { + checkHeader(); + let cl = new LClosure(L, this.readByte()); + + return cl; + } + +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf