luapy (7) lua function call

  1. load and call
from lua_stack import LuaStack
from lua_type import LuaType
from lua_value import LuaValue
from arith_op import ArithOp
from arithmetic import Arithmetic
from cmp_op import CmpOp
from compare import Compare
from lua_table import LuaTable
from binary_chunk import BinaryChunk
from closure import Closure
from opcode import Instruction
from opcode import OpCode
from thread_state import ThreadStatus


class LuaState:
    def __init__(self):
        self.stack = LuaStack()

    # ...

    # vm
    def get_pc(self):
        return self.stack.pc

    def add_pc(self, n):
        self.stack.pc += n

    def fetch(self):
        code = self.stack.closure.proto.get_code()[self.stack.pc]
        self.stack.pc += 1
        return code

    def get_const(self, idx):
        self.stack.push(self.stack.closure.proto.get_constants()[idx])

    def get_rk(self, rk):
        if rk > 0xff:   # constant
            self.get_const(rk & 0xff)
        else:           # register
            self.push_value(rk + 1)

    # ...

    def load(self, chunk):
        bc = BinaryChunk(chunk)
        proto = bc.undump()
        closure = Closure(proto)
        self.stack.push(closure)
        return ThreadStatus.OK

    def call(self, nargs, nresults):
        val = self.stack.get(-(nargs+1))
        if isinstance(val, Closure):
            print('call %s<%d,%d>' % (val.proto.get_source(), val.proto.get_line_defined(),
                                      val.proto.get_last_line_defined()))
            self.call_lua_closure(nargs, nresults, val)
        else:
            raise Exception('not function')

    def call_lua_closure(self, nargs, nresults, c):
        nregs = c.proto.get_max_stack_size()
        nparams = c.proto.get_num_params()
        is_vararg = c.proto.get_is_vararg()

        # create new lua stack
        new_stack = LuaStack()
        new_stack.closure = c

        # pass args, pop func
        func_and_args = self.stack.popn(nargs+1)
        new_stack.pushn(func_and_args[1:], nparams)
        if nargs > nparams and is_vararg:
            new_stack.varargs = func_and_args[nparams+1:]

        # run closure
        self.push_lua_stack(new_stack)
        self.set_top(nregs)
        self.run_lua_closure()
        self.pop_lua_stack()

        # return results
        if nresults != 0:
            results = new_stack.popn(new_stack.top() - nregs)
            self.stack.check(len(results))
            self.stack.pushn(results, nresults)

    def run_lua_closure(self):
        while True:
            pc = self.get_pc() + 1
            inst = Instruction(self.fetch())
            inst.execute(self)
            print('[%02d] %-12s ' % (pc, inst.op_name()), end='')
            self.print_stack()
            if inst.op_code() == OpCode.RETURN:
                break

    def push_lua_stack(self, s):
        s.caller = self.stack
        self.stack = s

    def pop_lua_stack(self):
        s = self.stack
        self.stack = s.caller
        s.caller = None

    def register_count(self):
        return self.stack.closure.proto.get_max_stack_size()

    def load_vararg(self, n):
        if n < 0:
            n = len(self.stack.varargs)

        self.stack.check(n)
        self.stack.pushn(self.stack.varargs, n)

    def load_proto(self, idx):
        proto = self.stack.closure.proto.get_protos()[idx]
        c = Closure(proto)
        self.stack.push(c)

  1. instructions
# R(A)[(C-1)*LFIELDS_PER_FLUSH+i] := R(A+i), 1 <= i <= B
def setlist(inst, vm):
    a, b, c = inst.a_b_c()
    a += 1
    c = c - 1 if c > 0 else inst.ax(vm.fetch())

    is_zero = b == 0
    if is_zero:
        b = vm.to_integer(-1) - a - 1
        vm.pop(1)

    vm.check_stack(1)
    idx = c * LFIELDS_PER_FLUSH
    for i in range(1, b+1):
        idx += 1
        vm.push_value(a+i)
        vm.set_i(a, idx)

    if is_zero:
        for i in range(vm.register_count() + 1, vm.get_top()+1):
            idx += 1
            vm.push_value(i)
            vm.set_i(a, idx)
        vm.set_top(vm.register_count())


# R(A+1) := R(B); R(A) := R(B)[RK(C)]
def luaself(inst, vm):
    a, b, c = inst.a_b_c()
    a += 1
    b += 1
    vm.copy(b, a+1)
    vm.get_rk(c)
    vm.get_table(b)
    vm.replace(a)


# R(A) := closure(KPROTO[Bx])
def closure(inst, vm):
    a, bx = inst.a_bx()
    a += 1
    vm.load_proto(bx)
    vm.replace(a)


def vararg(inst, vm):
    a, b, _ = inst.a_b_c()
    a += 1
    if b != 1:
        vm.load_vararg(b-1)
        pop_results(a, b, vm)


def tailcall(inst, vm):
    a, b, _ = inst.a_b_c()
    a += 1
    c = 0
    nargs = push_func_and_args(a, b, vm)
    vm.call(nargs, c-1)
    pop_results(a, c, vm)


def call(inst, vm):
    a, b, c = inst.a_b_c()
    a += 1
    nargs = push_func_and_args(a, b, vm)
    vm.call(nargs, c-1)
    pop_results(a, c, vm)


def luaret(inst, vm):
    a, b, _ = inst.a_b_c()
    a += 1
    if b == 1:
        pass
    elif b > 1:
        vm.check_stack(b-1)
        for i in range(a, a+b-1):
            vm.push_value(i)
    else:
        fix_stack(a, vm)


def push_func_and_args(a, b, vm):
    if b >= 1:
        vm.check_stack(b)
        for i in range(a, a+b):
            vm.push_value(i)
        return b-1
    else:
        fix_stack(a, vm)
        return vm.get_top() - vm.register_count() - 1


def fix_stack(a, vm):
    x = vm.to_integer(-1)
    vm.pop(1)

    vm.check_stack(x-a)
    for i in range(a, x):
        vm.push_value(i)
    vm.rotate(vm.register_count()+1, x-a)


def pop_results(a, c, vm):
    if c == 1:
        pass
    elif c > 1:
        for i in range(a+c-2, a-1, -1):
            vm.replace(i)
    else:
        vm.check_stack(1)
        vm.push_integer(a)


op_codes = [
    #      T  A  B       C       mode   name        action
    OpCode(0, 1, OpArgR, OpArgN, IABC,  "MOVE    ", move),      # R(A) := R(B)
    OpCode(0, 1, OpArgK, OpArgN, IABx,  "LOADK   ", loadk),     # R(A) := Kst(Bx)
    OpCode(0, 1, OpArgN, OpArgN, IABx,  "LOADKX  ", loadkx),    # R(A) := Kst(extra arg)
    OpCode(0, 1, OpArgU, OpArgU, IABC,  "LOADBOOL", loadbool),  # R(A) := (bool)B; if (C) pc++
    OpCode(0, 1, OpArgU, OpArgN, IABC,  "LOADNIL ", loadnil),   # R(A), R(A+1), ..., R(A+B) := nil
    OpCode(0, 1, OpArgU, OpArgN, IABC,  "GETUPVAL", None),      # R(A) := UpValue[B]
    OpCode(0, 1, OpArgU, OpArgK, IABC,  "GETTABUP", None),      # R(A) := UpValue[B][RK(C)]
    OpCode(0, 1, OpArgR, OpArgK, IABC,  "GETTABLE", gettable),  # R(A) := R(B)[RK(C)]
    OpCode(0, 0, OpArgK, OpArgK, IABC,  "SETTABUP", None),      # UpValue[A][RK(B)] := RK(C)
    OpCode(0, 0, OpArgU, OpArgN, IABC,  "SETUPVAL", None),      # UpValue[B] := R(A)
    OpCode(0, 0, OpArgK, OpArgK, IABC,  "SETTABLE", settable),  # R(A)[RK(B)] := RK(C)
    OpCode(0, 1, OpArgU, OpArgU, IABC,  "NEWTABLE", newtable),  # R(A) := {} (size = B,C)
    OpCode(0, 1, OpArgR, OpArgK, IABC,  "SELF    ", luaself),   # R(A+1) := R(B); R(A) := R(B)[RK(C)]
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "ADD     ", add),       # R(A) := RK(B) + RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "SUB     ", sub),       # R(A) := RK(B) - RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "MUL     ", mul),       # R(A) := RK(B) * RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "MOD     ", mod),       # R(A) := RK(B) % RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "POW     ", luapow),    # R(A) := RK(B) ^ RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "DIV     ", div),       # R(A) := RK(B) / RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "IDIV    ", idiv),      # R(A) := RK(B) // RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "BAND    ", band),      # R(A) := RK(B) & RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "BOR     ", bor),       # R(A) := RK(B) | RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "BXOR    ", bxor),      # R(A) := RK(B) ~ RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "SHL     ", shl),       # R(A) := RK(B) << RK(C)
    OpCode(0, 1, OpArgK, OpArgK, IABC,  "SHR     ", shr),       # R(A) := RK(B) >> RK(C)
    OpCode(0, 1, OpArgR, OpArgN, IABC,  "UNM     ", unm),       # R(A) := -R(B)
    OpCode(0, 1, OpArgR, OpArgN, IABC,  "BNOT    ", bnot),      # R(A) := ~R(B)
    OpCode(0, 1, OpArgR, OpArgN, IABC,  "NOT     ", luanot),    # R(A) := not R(B)
    OpCode(0, 1, OpArgR, OpArgN, IABC,  "LEN     ", length),    # R(A) := length of R(B)
    OpCode(0, 1, OpArgR, OpArgR, IABC,  "CONCAT  ", concat),    # R(A) := R(B).. ... ..R(C)
    OpCode(0, 0, OpArgR, OpArgN, IAsBx, "JMP     ", jmp),       # pc+=sBx; if (A) close all upvalues >= R(A - 1)
    OpCode(1, 0, OpArgK, OpArgK, IABC,  "EQ      ", eq),        # if ((RK(B) == RK(C)) ~= A) then pc++
    OpCode(1, 0, OpArgK, OpArgK, IABC,  "LT      ", lt),        # if ((RK(B) <  RK(C)) ~= A) then pc++
    OpCode(1, 0, OpArgK, OpArgK, IABC,  "LE      ", le),        # if ((RK(B) <= RK(C)) ~= A) then pc++
    OpCode(1, 0, OpArgN, OpArgU, IABC,  "TEST    ", test),      # if not (R(A) <=> C) then pc++
    OpCode(1, 1, OpArgR, OpArgU, IABC,  "TESTSET ", testset),   # if (R(B) <=> C) then R(A) := R(B) else pc++
    OpCode(0, 1, OpArgU, OpArgU, IABC,  "CALL    ", call),      # R(A), ...,R(A+C-2) := R(A)(R(A+1), ...,R(A+B-1))
    OpCode(0, 1, OpArgU, OpArgU, IABC,  "TAILCALL", tailcall),  # return R(A)(R(A+1), ... ,R(A+B-1))
    OpCode(0, 0, OpArgU, OpArgN, IABC,  "RETURN  ", luaret),    # return R(A), ... ,R(A+B-2)
    OpCode(0, 1, OpArgR, OpArgN, IAsBx, "FORLOOP ", forloop),   # R(A)+=R(A+2); if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }
    OpCode(0, 1, OpArgR, OpArgN, IAsBx, "FORPREP ", forprep),   # R(A)-=R(A+2); pc+=sBx
    OpCode(0, 0, OpArgN, OpArgU, IABC,  "TFORCALL", None),      # R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2));
    OpCode(0, 1, OpArgR, OpArgN, IAsBx, "TFORLOOP", None),      # if R(A+1) ~= nil then { R(A)=R(A+1); pc += sBx }
    OpCode(0, 0, OpArgU, OpArgU, IABC,  "SETLIST ", setlist),   # R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B
    OpCode(0, 1, OpArgU, OpArgN, IABx,  "CLOSURE ", closure),   # R(A) := closure(KPROTO[Bx])
    OpCode(0, 1, OpArgU, OpArgN, IABC,  "VARARG  ", vararg),    # R(A), R(A+1), ..., R(A+B-2) = vararg
    OpCode(0, 0, OpArgU, OpArgU, IAx,   "EXTRAARG", None),      # extra (larger) argument for previous opcode
]

  1. test
local function max(...)
    local args = {...}
    local val, idx
    for i = 1, #args do
        if val == nil or args[i] > val then
            val, idx = args[i], i
        end
    end
    return val, idx
end

local function assert(v)
    if not v then fail() end
end

local v1 = max(3, 9, 7, 128, 35)
assert(v1 == 128)
local v2, i2 = max(3, 9, 7, 128, 35)
assert(v2 == 128 and i2 == 4)
local v3, i3 = max(max(3, 9, 7, 128, 35))
assert(v3 == 128 and i3 == 1)
local t = {max(3, 9, 7, 128, 35)}
assert(t[1] == 128 and t[2] == 4)
from lua_state import LuaState


def main():
    with open('./test/function_call.luac', 'rb') as f:
        data = f.read()
        ls = LuaState()
        ls.load(data)
        ls.call(0, 0)


if __name__ == '__main__':
    main()

  1. result
call @function_call.lua<0,0>
[01] CLOSURE      [function][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil]
[02] CLOSURE      [function][function][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil]
[03] MOVE         [function][function][function][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil]
[04] LOADK        [function][function][function][3][nil][nil][nil][nil][nil][nil][nil][nil][nil][nil]
[05] LOADK        [function][function][function][3][9][nil][nil][nil][nil][nil][nil][nil][nil][nil]
[06] LOADK        [function][function][function][3][9][7][nil][nil][nil][nil][nil][nil][nil][nil]
[07] LOADK        [function][function][function][3][9][7][128][nil][nil][nil][nil][nil][nil][nil]
[08] LOADK        [function][function][function][3][9][7][128][35][nil][nil][nil][nil][nil][nil]
call @function_call.lua<1,10>
[01] NEWTABLE     [table][nil][nil][nil][nil][nil][nil][nil]
[02] VARARG       [table][nil][nil][nil][nil][nil][nil][nil][3][9][7][128][35][2]
[03] SETLIST      [table][nil][nil][nil][nil][nil][nil][nil]
[04] LOADNIL      [table][nil][nil][nil][nil][nil][nil][nil]
[05] LOADK        [table][nil][nil][1][nil][nil][nil][nil]
[06] LEN          [table][nil][nil][1][5][nil][nil][nil]
[07] LOADK        [table][nil][nil][1][5][1][nil][nil]
[08] FORPREP      [table][nil][nil][0][5][1][nil][nil]
[17] FORLOOP      [table][nil][nil][1][5][1][1][nil]
[09] EQ           [table][nil][nil][1][5][1][1][nil]
[10] JMP          [table][nil][nil][1][5][1][1][nil]
[14] GETTABLE     [table][nil][nil][1][5][1][1][3]
[15] MOVE         [table][nil][1][1][5][1][1][3]
[16] MOVE         [table][3][1][1][5][1][1][3]
[17] FORLOOP      [table][3][1][2][5][1][2][3]
[09] EQ           [table][3][1][2][5][1][2][3]
[11] GETTABLE     [table][3][1][2][5][1][2][9]
[12] LT           [table][3][1][2][5][1][2][9]
[14] GETTABLE     [table][3][1][2][5][1][2][9]
[15] MOVE         [table][3][2][2][5][1][2][9]
[16] MOVE         [table][9][2][2][5][1][2][9]
[17] FORLOOP      [table][9][2][3][5][1][3][9]
[09] EQ           [table][9][2][3][5][1][3][9]
[11] GETTABLE     [table][9][2][3][5][1][3][7]
[12] LT           [table][9][2][3][5][1][3][7]
[13] JMP          [table][9][2][3][5][1][3][7]
[17] FORLOOP      [table][9][2][4][5][1][4][7]
[09] EQ           [table][9][2][4][5][1][4][7]
[11] GETTABLE     [table][9][2][4][5][1][4][128]
[12] LT           [table][9][2][4][5][1][4][128]
[14] GETTABLE     [table][9][2][4][5][1][4][128]
[15] MOVE         [table][9][4][4][5][1][4][128]
[16] MOVE         [table][128][4][4][5][1][4][128]
[17] FORLOOP      [table][128][4][5][5][1][5][128]
[09] EQ           [table][128][4][5][5][1][5][128]
[11] GETTABLE     [table][128][4][5][5][1][5][35]
[12] LT           [table][128][4][5][5][1][5][35]
[13] JMP          [table][128][4][5][5][1][5][35]
[17] FORLOOP      [table][128][4][6][5][1][5][35]
[18] MOVE         [table][128][4][128][5][1][5][35]
[19] MOVE         [table][128][4][128][4][1][5][35]
[20] RETURN       [table][128][4][128][4][1][5][35][128][4]
[09] CALL         [function][function][128][3][9][7][128][35][nil][nil][nil][nil][nil][nil]
[10] MOVE         [function][function][128][function][9][7][128][35][nil][nil][nil][nil][nil][nil]
[11] EQ           [function][function][128][function][9][7][128][35][nil][nil][nil][nil][nil][nil]
[12] JMP          [function][function][128][function][9][7][128][35][nil][nil][nil][nil][nil][nil]
[14] LOADBOOL     [function][function][128][function][true][7][128][35][nil][nil][nil][nil][nil][nil]
call @function_call.lua<12,14>
[01] TEST         [true][nil]
[02] JMP          [true][nil]
[05] RETURN       [true][nil]
[15] CALL         [function][function][128][function][true][7][128][35][nil][nil][nil][nil][nil][nil]
[16] MOVE         [function][function][128][function][true][7][128][35][nil][nil][nil][nil][nil][nil]
[17] LOADK        [function][function][128][function][3][7][128][35][nil][nil][nil][nil][nil][nil]
[18] LOADK        [function][function][128][function][3][9][128][35][nil][nil][nil][nil][nil][nil]
[19] LOADK        [function][function][128][function][3][9][7][35][nil][nil][nil][nil][nil][nil]
[20] LOADK        [function][function][128][function][3][9][7][128][nil][nil][nil][nil][nil][nil]
[21] LOADK        [function][function][128][function][3][9][7][128][35][nil][nil][nil][nil][nil]
call @function_call.lua<1,10>
[01] NEWTABLE     [table][nil][nil][nil][nil][nil][nil][nil]
[02] VARARG       [table][nil][nil][nil][nil][nil][nil][nil][3][9][7][128][35][2]
[03] SETLIST      [table][nil][nil][nil][nil][nil][nil][nil]
[04] LOADNIL      [table][nil][nil][nil][nil][nil][nil][nil]
[05] LOADK        [table][nil][nil][1][nil][nil][nil][nil]
[06] LEN          [table][nil][nil][1][5][nil][nil][nil]
[07] LOADK        [table][nil][nil][1][5][1][nil][nil]
[08] FORPREP      [table][nil][nil][0][5][1][nil][nil]
[17] FORLOOP      [table][nil][nil][1][5][1][1][nil]
[09] EQ           [table][nil][nil][1][5][1][1][nil]
[10] JMP          [table][nil][nil][1][5][1][1][nil]
[14] GETTABLE     [table][nil][nil][1][5][1][1][3]
[15] MOVE         [table][nil][1][1][5][1][1][3]
[16] MOVE         [table][3][1][1][5][1][1][3]
[17] FORLOOP      [table][3][1][2][5][1][2][3]
[09] EQ           [table][3][1][2][5][1][2][3]
[11] GETTABLE     [table][3][1][2][5][1][2][9]
[12] LT           [table][3][1][2][5][1][2][9]
[14] GETTABLE     [table][3][1][2][5][1][2][9]
[15] MOVE         [table][3][2][2][5][1][2][9]
[16] MOVE         [table][9][2][2][5][1][2][9]
[17] FORLOOP      [table][9][2][3][5][1][3][9]
[09] EQ           [table][9][2][3][5][1][3][9]
[11] GETTABLE     [table][9][2][3][5][1][3][7]
[12] LT           [table][9][2][3][5][1][3][7]
[13] JMP          [table][9][2][3][5][1][3][7]
[17] FORLOOP      [table][9][2][4][5][1][4][7]
[09] EQ           [table][9][2][4][5][1][4][7]
[11] GETTABLE     [table][9][2][4][5][1][4][128]
[12] LT           [table][9][2][4][5][1][4][128]
[14] GETTABLE     [table][9][2][4][5][1][4][128]
[15] MOVE         [table][9][4][4][5][1][4][128]
[16] MOVE         [table][128][4][4][5][1][4][128]
[17] FORLOOP      [table][128][4][5][5][1][5][128]
[09] EQ           [table][128][4][5][5][1][5][128]
[11] GETTABLE     [table][128][4][5][5][1][5][35]
[12] LT           [table][128][4][5][5][1][5][35]
[13] JMP          [table][128][4][5][5][1][5][35]
[17] FORLOOP      [table][128][4][6][5][1][5][35]
[18] MOVE         [table][128][4][128][5][1][5][35]
[19] MOVE         [table][128][4][128][4][1][5][35]
[20] RETURN       [table][128][4][128][4][1][5][35][128][4]
[22] CALL         [function][function][128][128][4][9][7][128][35][nil][nil][nil][nil][nil]
[23] MOVE         [function][function][128][128][4][function][7][128][35][nil][nil][nil][nil][nil]
[24] EQ           [function][function][128][128][4][function][7][128][35][nil][nil][nil][nil][nil]
[26] EQ           [function][function][128][128][4][function][7][128][35][nil][nil][nil][nil][nil]
[27] JMP          [function][function][128][128][4][function][7][128][35][nil][nil][nil][nil][nil]
[29] LOADBOOL     [function][function][128][128][4][function][true][128][35][nil][nil][nil][nil][nil]
call @function_call.lua<12,14>
[01] TEST         [true][nil]
[02] JMP          [true][nil]
[05] RETURN       [true][nil]
[30] CALL         [function][function][128][128][4][function][true][128][35][nil][nil][nil][nil][nil]
[31] MOVE         [function][function][128][128][4][function][true][128][35][nil][nil][nil][nil][nil]
[32] MOVE         [function][function][128][128][4][function][function][128][35][nil][nil][nil][nil][nil]
[33] LOADK        [function][function][128][128][4][function][function][3][35][nil][nil][nil][nil][nil]
[34] LOADK        [function][function][128][128][4][function][function][3][9][nil][nil][nil][nil][nil]
[35] LOADK        [function][function][128][128][4][function][function][3][9][7][nil][nil][nil][nil]
[36] LOADK        [function][function][128][128][4][function][function][3][9][7][128][nil][nil][nil]
[37] LOADK        [function][function][128][128][4][function][function][3][9][7][128][35][nil][nil]
call @function_call.lua<1,10>
[01] NEWTABLE     [table][nil][nil][nil][nil][nil][nil][nil]
[02] VARARG       [table][nil][nil][nil][nil][nil][nil][nil][3][9][7][128][35][2]
[03] SETLIST      [table][nil][nil][nil][nil][nil][nil][nil]
[04] LOADNIL      [table][nil][nil][nil][nil][nil][nil][nil]
[05] LOADK        [table][nil][nil][1][nil][nil][nil][nil]
[06] LEN          [table][nil][nil][1][5][nil][nil][nil]
[07] LOADK        [table][nil][nil][1][5][1][nil][nil]
[08] FORPREP      [table][nil][nil][0][5][1][nil][nil]
[17] FORLOOP      [table][nil][nil][1][5][1][1][nil]
[09] EQ           [table][nil][nil][1][5][1][1][nil]
[10] JMP          [table][nil][nil][1][5][1][1][nil]
[14] GETTABLE     [table][nil][nil][1][5][1][1][3]
[15] MOVE         [table][nil][1][1][5][1][1][3]
[16] MOVE         [table][3][1][1][5][1][1][3]
[17] FORLOOP      [table][3][1][2][5][1][2][3]
[09] EQ           [table][3][1][2][5][1][2][3]
[11] GETTABLE     [table][3][1][2][5][1][2][9]
[12] LT           [table][3][1][2][5][1][2][9]
[14] GETTABLE     [table][3][1][2][5][1][2][9]
[15] MOVE         [table][3][2][2][5][1][2][9]
[16] MOVE         [table][9][2][2][5][1][2][9]
[17] FORLOOP      [table][9][2][3][5][1][3][9]
[09] EQ           [table][9][2][3][5][1][3][9]
[11] GETTABLE     [table][9][2][3][5][1][3][7]
[12] LT           [table][9][2][3][5][1][3][7]
[13] JMP          [table][9][2][3][5][1][3][7]
[17] FORLOOP      [table][9][2][4][5][1][4][7]
[09] EQ           [table][9][2][4][5][1][4][7]
[11] GETTABLE     [table][9][2][4][5][1][4][128]
[12] LT           [table][9][2][4][5][1][4][128]
[14] GETTABLE     [table][9][2][4][5][1][4][128]
[15] MOVE         [table][9][4][4][5][1][4][128]
[16] MOVE         [table][128][4][4][5][1][4][128]
[17] FORLOOP      [table][128][4][5][5][1][5][128]
[09] EQ           [table][128][4][5][5][1][5][128]
[11] GETTABLE     [table][128][4][5][5][1][5][35]
[12] LT           [table][128][4][5][5][1][5][35]
[13] JMP          [table][128][4][5][5][1][5][35]
[17] FORLOOP      [table][128][4][6][5][1][5][35]
[18] MOVE         [table][128][4][128][5][1][5][35]
[19] MOVE         [table][128][4][128][4][1][5][35]
[20] RETURN       [table][128][4][128][4][1][5][35][128][4]
[38] CALL         [function][function][128][128][4][function][function][3][9][7][128][35][nil][nil][128][4][7]
call @function_call.lua<1,10>
[01] NEWTABLE     [table][nil][nil][nil][nil][nil][nil][nil]
[02] VARARG       [table][nil][nil][nil][nil][nil][nil][nil][128][4][2]
[03] SETLIST      [table][nil][nil][nil][nil][nil][nil][nil]
[04] LOADNIL      [table][nil][nil][nil][nil][nil][nil][nil]
[05] LOADK        [table][nil][nil][1][nil][nil][nil][nil]
[06] LEN          [table][nil][nil][1][2][nil][nil][nil]
[07] LOADK        [table][nil][nil][1][2][1][nil][nil]
[08] FORPREP      [table][nil][nil][0][2][1][nil][nil]
[17] FORLOOP      [table][nil][nil][1][2][1][1][nil]
[09] EQ           [table][nil][nil][1][2][1][1][nil]
[10] JMP          [table][nil][nil][1][2][1][1][nil]
[14] GETTABLE     [table][nil][nil][1][2][1][1][128]
[15] MOVE         [table][nil][1][1][2][1][1][128]
[16] MOVE         [table][128][1][1][2][1][1][128]
[17] FORLOOP      [table][128][1][2][2][1][2][128]
[09] EQ           [table][128][1][2][2][1][2][128]
[11] GETTABLE     [table][128][1][2][2][1][2][4]
[12] LT           [table][128][1][2][2][1][2][4]
[13] JMP          [table][128][1][2][2][1][2][4]
[17] FORLOOP      [table][128][1][3][2][1][2][4]
[18] MOVE         [table][128][1][128][2][1][2][4]
[19] MOVE         [table][128][1][128][1][1][2][4]
[20] RETURN       [table][128][1][128][1][1][2][4][128][1]
[39] CALL         [function][function][128][128][4][128][1][3][9][7][128][35][nil][nil]
[40] MOVE         [function][function][128][128][4][128][1][function][9][7][128][35][nil][nil]
[41] EQ           [function][function][128][128][4][128][1][function][9][7][128][35][nil][nil]
[43] EQ           [function][function][128][128][4][128][1][function][9][7][128][35][nil][nil]
[44] JMP          [function][function][128][128][4][128][1][function][9][7][128][35][nil][nil]
[46] LOADBOOL     [function][function][128][128][4][128][1][function][true][7][128][35][nil][nil]
call @function_call.lua<12,14>
[01] TEST         [true][nil]
[02] JMP          [true][nil]
[05] RETURN       [true][nil]
[47] CALL         [function][function][128][128][4][128][1][function][true][7][128][35][nil][nil]
[48] NEWTABLE     [function][function][128][128][4][128][1][table][true][7][128][35][nil][nil]
[49] MOVE         [function][function][128][128][4][128][1][table][function][7][128][35][nil][nil]
[50] LOADK        [function][function][128][128][4][128][1][table][function][3][128][35][nil][nil]
[51] LOADK        [function][function][128][128][4][128][1][table][function][3][9][35][nil][nil]
[52] LOADK        [function][function][128][128][4][128][1][table][function][3][9][7][nil][nil]
[53] LOADK        [function][function][128][128][4][128][1][table][function][3][9][7][128][nil]
[54] LOADK        [function][function][128][128][4][128][1][table][function][3][9][7][128][35]
call @function_call.lua<1,10>
[01] NEWTABLE     [table][nil][nil][nil][nil][nil][nil][nil]
[02] VARARG       [table][nil][nil][nil][nil][nil][nil][nil][3][9][7][128][35][2]
[03] SETLIST      [table][nil][nil][nil][nil][nil][nil][nil]
[04] LOADNIL      [table][nil][nil][nil][nil][nil][nil][nil]
[05] LOADK        [table][nil][nil][1][nil][nil][nil][nil]
[06] LEN          [table][nil][nil][1][5][nil][nil][nil]
[07] LOADK        [table][nil][nil][1][5][1][nil][nil]
[08] FORPREP      [table][nil][nil][0][5][1][nil][nil]
[17] FORLOOP      [table][nil][nil][1][5][1][1][nil]
[09] EQ           [table][nil][nil][1][5][1][1][nil]
[10] JMP          [table][nil][nil][1][5][1][1][nil]
[14] GETTABLE     [table][nil][nil][1][5][1][1][3]
[15] MOVE         [table][nil][1][1][5][1][1][3]
[16] MOVE         [table][3][1][1][5][1][1][3]
[17] FORLOOP      [table][3][1][2][5][1][2][3]
[09] EQ           [table][3][1][2][5][1][2][3]
[11] GETTABLE     [table][3][1][2][5][1][2][9]
[12] LT           [table][3][1][2][5][1][2][9]
[14] GETTABLE     [table][3][1][2][5][1][2][9]
[15] MOVE         [table][3][2][2][5][1][2][9]
[16] MOVE         [table][9][2][2][5][1][2][9]
[17] FORLOOP      [table][9][2][3][5][1][3][9]
[09] EQ           [table][9][2][3][5][1][3][9]
[11] GETTABLE     [table][9][2][3][5][1][3][7]
[12] LT           [table][9][2][3][5][1][3][7]
[13] JMP          [table][9][2][3][5][1][3][7]
[17] FORLOOP      [table][9][2][4][5][1][4][7]
[09] EQ           [table][9][2][4][5][1][4][7]
[11] GETTABLE     [table][9][2][4][5][1][4][128]
[12] LT           [table][9][2][4][5][1][4][128]
[14] GETTABLE     [table][9][2][4][5][1][4][128]
[15] MOVE         [table][9][4][4][5][1][4][128]
[16] MOVE         [table][128][4][4][5][1][4][128]
[17] FORLOOP      [table][128][4][5][5][1][5][128]
[09] EQ           [table][128][4][5][5][1][5][128]
[11] GETTABLE     [table][128][4][5][5][1][5][35]
[12] LT           [table][128][4][5][5][1][5][35]
[13] JMP          [table][128][4][5][5][1][5][35]
[17] FORLOOP      [table][128][4][6][5][1][5][35]
[18] MOVE         [table][128][4][128][5][1][5][35]
[19] MOVE         [table][128][4][128][4][1][5][35]
[20] RETURN       [table][128][4][128][4][1][5][35][128][4]
[55] CALL         [function][function][128][128][4][128][1][table][function][3][9][7][128][35][128][4][9]
[56] SETLIST      [function][function][128][128][4][128][1][table][function][3][9][7][128][35]
[57] MOVE         [function][function][128][128][4][128][1][table][function][3][9][7][128][35]
[58] GETTABLE     [function][function][128][128][4][128][1][table][function][128][9][7][128][35]
[59] EQ           [function][function][128][128][4][128][1][table][function][128][9][7][128][35]
[61] GETTABLE     [function][function][128][128][4][128][1][table][function][4][9][7][128][35]
[62] EQ           [function][function][128][128][4][128][1][table][function][4][9][7][128][35]
[63] JMP          [function][function][128][128][4][128][1][table][function][4][9][7][128][35]
[65] LOADBOOL     [function][function][128][128][4][128][1][table][function][true][9][7][128][35]
call @function_call.lua<12,14>
[01] TEST         [true][nil]
[02] JMP          [true][nil]
[05] RETURN       [true][nil]
[66] CALL         [function][function][128][128][4][128][1][table][function][true][9][7][128][35]
[67] RETURN       [function][function][128][128][4][128][1][table][function][true][9][7][128][35]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值