# LuaDecompy An experimental Lua 5.1 dump decompiler (typically dumped using `luac -o `). You will quickly find that only **extremely** simple scripts are decompiled successfully right now. This is an experimental project and not all opcodes are properly handled for now. If you need a real decompiler I would recommend any of the handful of ones that exist already. ## Why? Lua has a relatively small instruction set (only 38 different opcodes!). This makes it pretty feasible for a weekend decompiler project. (real) Decompilers are extremely complex pieces of software, so being able to write a simpler one helps show the theory without *much* of the headache. ## Example usage ```sh > cat example.lua && luac5.1 -o example.luac example.lua i = 0 while i < 10 do print(i) i = i + 1 end > python main.py example.luac example.luac ==== [[example.lua's constants]] ==== 0: [STRING] i 1: [NUMBER] 0.0 2: [NUMBER] 10.0 3: [STRING] print 4: [NUMBER] 1.0 ==== [[example.lua's dissassembly]] ==== [ 0] LOADK : R[0] K[1] ; load 0.0 into R[0] [ 1] SETGLOBAL : R[0] K[0] ; [ 2] GETGLOBAL : R[0] K[0] ; [ 3] LT : R[0] R[0] K[2] ; [ 4] JMP : R[0] 7 ; [ 5] GETGLOBAL : R[0] K[3] ; [ 6] GETGLOBAL : R[1] K[0] ; [ 7] CALL : R[0] 2 1 ; [ 8] GETGLOBAL : R[0] K[0] ; [ 9] ADD : R[0] R[0] K[4] ; [ 10] SETGLOBAL : R[0] K[0] ; [ 11] JMP : R[0] -10 ; [ 12] RETURN : R[0] 1 0 ; ==== [[example.lua's decompiled source]] ==== i = 0.0 while i < 10.0 do print(i) i = (i + 1.0) end ```