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
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())
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())
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
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 = {}
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
def __getitem__(self, item): if item.typeOf() is LUATYPE.LUA_TSTRING.value: item = item.value return self.map.get(item,LuaNil())
def popN(self, n: int) -> List[LuaValue]: tmplist = [LuaNil()] * n for i in range(n - 1, -1, -1): tmplist[i] = self.pop() return tmplist
def check(self, n): free = len(self.slots) - self.top # if free < n: for i in range(free, n): self.slots.append(LuaNil())
def PushNil(self): self.stack.push(LuaNil())