def __init__(self, type: RType, src: Value, line: int = -1) -> None: super().__init__(line) self.type = type # TODO: for now we enforce that the src memory address should be Py_ssize_t # later we should also support same width unsigned int assert is_pointer_rprimitive(src.type) self.src = src
def reg(self, reg: Value) -> str: if reg.name in self.const_int_regs: val = self.const_int_regs[reg.name] if val == 0 and is_pointer_rprimitive(reg.type): return "NULL" return str(val) else: return self.emitter.reg(reg)
def reg(self, reg: Value) -> str: if isinstance(reg, Integer): val = reg.value if val == 0 and is_pointer_rprimitive(reg.type): return "NULL" return str(val) else: return self.emitter.reg(reg)
def reg(self, reg: Value) -> str: if isinstance(reg, LoadInt) and reg in self.const_int_regs: val = self.const_int_regs[reg] if val == 0 and is_pointer_rprimitive(reg.type): return "NULL" return str(val) else: return self.emitter.reg(reg)
def reg(self, reg: Value) -> str: if isinstance(reg, Integer): val = reg.value if val == 0 and is_pointer_rprimitive(reg.type): return "NULL" s = str(val) if val >= (1 << 31): # Avoid overflowing signed 32-bit int s += 'U' return s else: return self.emitter.reg(reg)
def reg(self, reg: Value) -> str: if isinstance(reg, Integer): val = reg.value if val == 0 and is_pointer_rprimitive(reg.type): return "NULL" s = str(val) if val >= (1 << 31): # Avoid overflowing signed 32-bit int s += 'ULL' elif val == -(1 << 63): # Avoid overflowing C integer literal s = '(-9223372036854775807LL - 1)' elif val <= -(1 << 31): s += 'LL' return s else: return self.emitter.reg(reg)