lparser.py: don't read RK values here, use lundump.py to read them

This commit is contained in:
CPunch 2022-08-11 16:45:05 -05:00
parent eb1d3ffe87
commit 055af56e27
2 changed files with 19 additions and 19 deletions

View File

@ -26,18 +26,18 @@ example.luac
==== [[example.lua's dissassembly]] ==== ==== [[example.lua's dissassembly]] ====
[ 0] LOADK : R[0] K[1] [ 0] LOADK : R[0] K[1] ; load "pri" into R[0]
[ 1] LOADK : R[1] K[2] [ 1] LOADK : R[1] K[2] ; load "nt" into R[1]
[ 2] CONCAT : R[0] R[0] R[1] [ 2] CONCAT : R[0] R[0] R[1] ; concat 2 values from R[0] to R[1]
[ 3] SETGLOBAL : R[0] R[0] [ 3] SETGLOBAL : R[0] R[0] ;
[ 4] EQ : R[0] K[3] K[3] [ 4] EQ : R[0] K[3] K[3] ;
[ 5] JMP : R[0] R[5] [ 5] JMP : R[0] R[5] ;
[ 6] GETGLOBAL : R[0] K[4] [ 6] GETGLOBAL : R[0] K[4] ;
[ 7] GETGLOBAL : R[1] K[0] [ 7] GETGLOBAL : R[1] K[0] ;
[ 8] GETTABLE : R[0] R[0] R[1] [ 8] GETTABLE : R[0] R[0] R[1] ;
[ 9] LOADK : R[1] K[5] [ 9] LOADK : R[1] K[5] ; load "Hello world" into R[1]
[ 10] CALL : R[0] R[2] R[1] [ 10] CALL : R[0] R[2] R[1] ;
[ 11] RETURN : R[0] R[1] R[0] [ 11] RETURN : R[0] R[1] R[0] ;
==== [[example.lua's decompiled source]] ==== ==== [[example.lua's decompiled source]] ====

View File

@ -1,14 +1,14 @@
''' '''
lparser.py lparser.py
Depends on ldump.py for lua dump deserialization. Depends on lundump.py for lua dump deserialization.
An experimental bytecode decompiler. An experimental bytecode decompiler.
''' '''
from operator import concat from operator import concat
from subprocess import call from subprocess import call
from lundump import Chunk, LuaUndump, Constant, Instruction, InstructionType, Opcodes from lundump import Chunk, Constant, Instruction, Opcodes, whichRK, readRKasK
class _Scope: class _Scope:
def __init__(self, startPC: int, endPC: int): def __init__(self, startPC: int, endPC: int):
@ -104,8 +104,8 @@ class LuaDecomp:
# 'RK's are special in because can be a register or a konstant. a bitflag is read to determine which # 'RK's are special in because can be a register or a konstant. a bitflag is read to determine which
def __readRK(self, rk: int) -> str: def __readRK(self, rk: int) -> str:
if (rk & (1 << 8)) > 0: if (whichRK(rk)) > 0:
return self.chunk.constants[(rk & ~(1 << 8))].toCode() return self.chunk.getConstant(readRKasK(rk)).toCode()
else: else:
return self.__getReg(rk) return self.__getReg(rk)
@ -117,19 +117,19 @@ class LuaDecomp:
# move registers # move registers
self.__setReg(instr.A, self.__getReg(instr.B)) self.__setReg(instr.A, self.__getReg(instr.B))
elif instr.opcode == Opcodes.LOADK: elif instr.opcode == Opcodes.LOADK:
self.__setReg(instr.A, self.chunk.constants[instr.B].toCode()) self.__setReg(instr.A, self.chunk.getConstant(instr.B).toCode())
elif instr.opcode == Opcodes.LOADBOOL: elif instr.opcode == Opcodes.LOADBOOL:
if instr.B == 0: if instr.B == 0:
self.__setReg(instr.A, "false") self.__setReg(instr.A, "false")
else: else:
self.__setReg(instr.A, "true") self.__setReg(instr.A, "true")
elif instr.opcode == Opcodes.GETGLOBAL: elif instr.opcode == Opcodes.GETGLOBAL:
self.__setReg(instr.A, self.chunk.constants[instr.B].data) self.__setReg(instr.A, self.chunk.getConstant(instr.B).data)
elif instr.opcode == Opcodes.GETTABLE: elif instr.opcode == Opcodes.GETTABLE:
self.__setReg(instr.A, self.__getReg(instr.B) + "[" + self.__readRK(instr.C) + "]") self.__setReg(instr.A, self.__getReg(instr.B) + "[" + self.__readRK(instr.C) + "]")
elif instr.opcode == Opcodes.SETGLOBAL: elif instr.opcode == Opcodes.SETGLOBAL:
self.__startStatement() self.__startStatement()
self.__addExpr(self.chunk.constants[instr.B].data + " = " + self.__getReg(instr.A)) self.__addExpr(self.chunk.getConstant(instr.B).data + " = " + self.__getReg(instr.A))
elif instr.opcode == Opcodes.SETTABLE: elif instr.opcode == Opcodes.SETTABLE:
self.__startStatement() self.__startStatement()
self.__addExpr(self.__getReg(instr.A) + "[" + self.__readRK(instr.B) + "] = " + self.__readRK(instr.C)) self.__addExpr(self.__getReg(instr.A) + "[" + self.__readRK(instr.B) + "] = " + self.__readRK(instr.C))