def put(self, key, val): assert (key is not None) assert (key is not float('NAN')) key = LuaValue.float2integer(key) if isinstance(key, int) and key >= 1: if not self.arr: self.arr = [] arr_len = len(self.arr) if key <= arr_len: self.arr[key - 1] = val if key == arr_len and val is None: self.arr.pop(key) return if key == arr_len + 1: if self.map: self.map.pop(key) if val is not None: self.arr.append(val) self.map_to_arr() return if val is not None: if not self.map: self.map = {key: val} else: self.map.pop(key)
def cast_to_int(exp): if isinstance(exp, lua_exp.IntegerExp): return exp.val, True if isinstance(exp, lua_exp.FloatExp): i = LuaValue.float2integer(exp.val) return i, i is not None return 0, False
def get(self, key): key = LuaValue.float2integer(key) if self.arr and isinstance(key, int): if 1 <= key <= len(self.arr): return self.arr[key - 1] return self.map[key] if key in self.map else None
def optimize_bnot(exp): if isinstance(exp.exp, lua_exp.IntegerExp): exp.exp.val = ~exp.exp.val return exp.exp.val if isinstance(exp.exp, lua_exp.FloatExp): i = LuaValue.float2integer(exp.exp.val) if i is not None: return lua_exp.IntegerExp(exp.exp.line, ~i) return exp