local readbc = require('readbc') local opcodes = require('opcodes') local function inspect_proto(proto) print('\n-- proto --') -- print('Debug: ' .. proto.debug) print('Params: ' .. proto.numparams) print('Frame Size: ' .. proto.framesize) print('#Upvalues: ' .. proto.numuv) print('#kgc: ' .. proto.numkgc) print('#bcins: ' .. proto.numbc) print('-- bytecode --') for i = 1, #proto.bcins do local decoded = opcodes.decode(proto.bcins[i]) if opcodes.defs[decoded.id] ~= nil then local def = opcodes.defs[decoded.id] -- check for ABC or AD format if def.b == opcodes.Mode.none then print(string.format('%s\t A: %s\tB: %s\t C: %s', def.name, decoded.a, decoded.b, decoded.c)) else print(string.format('%s\t A: %s\tD: %s', def.name, decoded.a, decoded.d)) end else print('UNKNOWN OPCODE') end end end local function inspect(fp) local header = readbc.read_header(fp) print('-- header --') print('Name: ' .. header.name) print(string.format('Bytecode Version: %s', header.version)) print('Stripped: ' .. (header.stripped and 'yes' or 'no')) local proto = readbc.read_proto(fp) while proto ~= nil do inspect_proto(proto) proto = readbc.read_proto(fp) end end local arg = {...} if arg[1] == nil then print('Please pass a LuaJIT bytecode file as command line argument') return 1 end local fp = io.open(arg[1]) if fp == nil then print('Could not open path ' .. arg[1]) return 1 end inspect(fp) fp:close()