From a65b94e483767a7e6425cb747d6ca1d89215f4ff Mon Sep 17 00:00:00 2001 From: Enrico Lumetti Date: Sun, 8 May 2022 00:10:26 +0200 Subject: [PATCH] Basic bytecode inspection for test1.lua --- inspectbc.lua | 14 ++++++++ opcodes.lua | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++ readbc.lua | 2 +- vm.lua | 72 -------------------------------------- 4 files changed, 110 insertions(+), 73 deletions(-) create mode 100644 inspectbc.lua create mode 100644 opcodes.lua diff --git a/inspectbc.lua b/inspectbc.lua new file mode 100644 index 0000000..8feb4f1 --- /dev/null +++ b/inspectbc.lua @@ -0,0 +1,14 @@ +local readbc = require('readbc') +local opcodes = require('opcodes') + +fp = io.open('tests/test1.luo') +header = readbc.read_header(fp) +proto = readbc.read_proto(fp) + +for i = 1, #proto.bcins do + local decoded = opcodes.decode(proto.bcins[i]) + local def = opcodes.defs[decoded.id] + print(def.name) + print(decoded.a) + print(decoded.d) +end diff --git a/opcodes.lua b/opcodes.lua new file mode 100644 index 0000000..c84d449 --- /dev/null +++ b/opcodes.lua @@ -0,0 +1,95 @@ +local bit = require('bit') + +local function opcode(id, name, a, b, c, metamethod) + return { + id=id, + name=name, + a=a, + b=b, + c=c, + methametod=metamethod, + } +end + +local function gen_opcodes(tbl) + res = {} + for i = 1, #tbl do + res[tbl[i].id] = { + name = tbl[i].name, + a = tbl[i].a, + b = tbl[i].b, + c = tbl[i].c, + metamethod = tbl[i].metamethod, + } + end + return res +end + +local Mode = { + none = 0, + dst = 1, + base = 2, + var = 3, + rbase = 4, + uv = 5, + lit = 6, + lits = 7, + pri = 8, + num = 9, + str = 10, + tab = 11, + func = 12, + jump = 13, + cdata = 14, + max = 15, + none = 15, -- same as max +} + +local Metamethod = { + index = 0, + newindex = 1, + gc = 2, + mode = 3, + eq = 4, + len = 5, + lt = 6, + le = 7, + concat = 8, + call = 9, + add = 10, + sub = 11, + mul = 12, + div = 13, + mod = 14, + pow = 15, + unm = 16, + metatable = 17, + tostring = 18, +} + +local Opcodes_defs = gen_opcodes { + opcode(37, 'POW', Mode.dst, Mode.none, Mode.lits, Metamethod.none), + opcode(41, 'KSHORT', Mode.dst, Mode.var, Mode.var, Metamethod.pow), + opcode(75, 'RET0', Mode.rbase, Mode.none, Mode.lit, Mode.none), +} + +local function decode(ins) + -- TODO: endianess + local id = bit.band(ins, 0xff) + local a = bit.band(ins, 0xff00) / 0x100 + local b = bit.band(ins, 0xff0000) / 0x10000 + local c = bit.band(ins, 0xff000000) / 0x1000000 + local d = bit.band(ins, 0xffff0000) / 0x10000 + return { + id = id, + a = a, + b = b, + c = c, + d = d, + } +end + +return { + defs = Opcodes_defs, + decode = decode, +} diff --git a/readbc.lua b/readbc.lua index af4fc05..98ce53e 100644 --- a/readbc.lua +++ b/readbc.lua @@ -125,7 +125,7 @@ local function read_proto(fp) return { flags = flags, numparams = numparams, - framsize = framesize, + framesize = framesize, numuv = numuv, numkgc = numkgc, numkn = numkn, diff --git a/vm.lua b/vm.lua index e994dbb..8b13789 100644 --- a/vm.lua +++ b/vm.lua @@ -1,73 +1 @@ -local funcbc = require('jit.util').funcbc -function opcode(id, name, a, b, c, metamethod) - return { - id=id, - name=name, - a=a, - b=b, - c=c, - methametod=metamethod, - } -end - -function gen_opcodes(tbl) - length = #tbl - res = {} - for i=1,length do - res[i] = i+1 - end - return res -end - -Mode = { - none = 0, - dst = 1, - base = 2, - var = 3,, - rbase = 4, - uv = 5, - lit = 6, - lits = 7, - pri = 8, - num = 9, - str = 10, - tab = 11, - func = 12, - jump = 13, - cdata = 14, - max = 15, - none = 15, -- same as max -} - -Metamethod = { - index = 0, - newindex = 1, - gc = 2, - mode = 3, - eq = 4, - len = 5, - lt = 6, - le = 7, - concat = 8, - call = 9, - add = 10, - sub = 11, - mul = 12, - div = 13, - mod = 14, - pow = 15, - unm = 16, - metatable = 17, - tostring = 18, -} - -Opcodes = gen_opcodes { - opcode(37, 'POW', Mode.dst, Mode.none, Mode.lits, Metamethod.none), - opcode(41, 'KSHORT', Mode.dst, Mode.var, Mode.var, Metamethod.pow), -} - -print(Opcodes[1]) -ins, m = funcbc(test1, 3) -- TODO: what is m? -print(ins) -print(m)