Ejemplo n.º 1
0
 def pop(self) -> LuaValue:
     if self.top < 1:
         raise RuntimeError('stack underflow')
     self.top -= 1
     # replace pop slots with set the slot to lua nil
     item = self.slots[self.top]
     self.slots[self.top] = LuaNil()
     return item
Ejemplo n.º 2
0
 def pushN(self, values: List[LuaValue], n: int):
     # if values is  None:
     #     return
     valuesNum = len(values)
     if n < 0:
         n = valuesNum
     for i in range(n):
         if i < valuesNum:
             self.push(values[i])
         else:
             self.push(LuaNil())
Ejemplo n.º 3
0
 def SetTop(self, index):
     newTop = self.stack.absIndex(index)
     if newTop < 0:
         raise RuntimeError('stack underflow')
     n = self.stack.top - newTop
     if n > 0:
         for i in range(n):
             self.stack.pop()
     elif n < 0:
         for i in range(abs(n)):
             self.stack.push(LuaNil())
Ejemplo n.º 4
0
    def readProtos(self, prototype):
        # proto first byte
        self.readByte()
        source = self.sourcename = self.readString(
        ) if prototype is 0 else self.sourcename

        line_def, last_line_def = unpack('=2I', self.f.read(8))

        numParms = self.readByte()

        isVararg = self.readBoolean()

        maxStackSize = self.readByte()

        codenum = self.readCint()
        code = unpack('=%dI' % codenum, self.f.read(codenum * 4))

        constantsnum = self.readCint()

        constants = []
        for i in range(constantsnum):
            type = self.readByte()
            if type == LUA_NIL:
                constants.append(LuaNil())
            elif type == LUA_BOOLEAN:
                constants.append(LuaBoolean(self.readBoolean()))
            elif type == LUA_NUMBER:
                constants.append(LuaNumber(self.readNumber()))
            elif type == LUA_INTEGER:
                constants.append(LuaNumber(self.readInt()))
            elif type == LUA_SHORT_STR or type == LUA_LONG_STR:
                constants.append(LuaString(self.readString()))
            else:
                raise TypeError('type not support')

        upValues = self.readUpvalues()

        protosize = self.readCint()

        nestproto = None
        protos = []
        if protosize > 0:
            for i in range(protosize):
                nestproto = self.readProtos(1)
                protos.append(nestproto)
        lineinfo = self.readLineInfo()
        locVars = self.readlocVars()

        upvalueNames = self.readUpValueNames()
        proto = Proto(source, line_def, last_line_def, numParms, isVararg,
                      maxStackSize, code, constants, upValues, protos,
                      lineinfo, locVars, upvalueNames)
        return proto
Ejemplo n.º 5
0
 def __init__(self, size: int, ls):
     self.slots = LuaArray()
     self.size = size
     self.top = 0
     for i in range(size):
         self.slots.append(LuaNil())
     self.prev = None
     self.closure = None
     self.varargs = None
     self.pc = 0
     self.ls = ls
     self.openuvs = {}
Ejemplo n.º 6
0
 def get(self, index):
     if index < LuaState.LUA_REGISTRYINDEX:
         uvindex = LuaState.LUA_REGISTRYINDEX - index - 1
         c = self.closure
         if (c is None) or (uvindex >= len(c.upvalues)):
             return LuaNil()
         return c.upvalues[uvindex]
     if index is LuaState.LUA_REGISTRYINDEX:
         return self.ls.registry
     absIndex = self.absIndex(index)
     if 0 < absIndex <= self.top:
         item = self.slots[absIndex - 1]
         return item
     return None
Ejemplo n.º 7
0
 def __getitem__(self, item):
     if item.typeOf() is LUATYPE.LUA_TSTRING.value:
         item = item.value
     return self.map.get(item,LuaNil())
Ejemplo n.º 8
0
 def popN(self, n: int) -> List[LuaValue]:
     tmplist = [LuaNil()] * n
     for i in range(n - 1, -1, -1):
         tmplist[i] = self.pop()
     return tmplist
Ejemplo n.º 9
0
 def check(self, n):
     free = len(self.slots) - self.top
     # if free < n:
     for i in range(free, n):
         self.slots.append(LuaNil())
Ejemplo n.º 10
0
 def PushNil(self):
     self.stack.push(LuaNil())