def visit_Constant(self,const): if const.type == 'int': #XXX t = types.Int() reg = ir.I32() const = ir.ConstantI32(const.value) op = ir.LoadConstant(reg,const) v = ValTracker(False,t,reg) self.curBasicBlock.append(op) return v elif const.type == 'string': t = types.Char() reg = ir.Pointer() v = ValTracker(False,types.Pointer(t),reg) rawdata = cstrings.parseCString(const.value) label = self.module.addReadOnlyData(rawdata) op = ir.LoadGlobalAddr(reg,GlobalSym(label,v.type.clone())) self.curBasicBlock.append(op) return v elif const.type == 'char': t = types.Char() v = ValTracker(False,t,None) v.createVirtualReg() const = ir.ConstantI8(cstrings.parseCChar(const.value)) op = ir.LoadConstant(v.reg,const) self.curBasicBlock.append(op) return v else: raise Exception('unimplemented constant load : %s' % const.coord)
def test_charparse(): tests = [(r"'a'", ord("a")), (r"'\n'", ord("\n")), (r"'\x00'", 0), (r"'\xff'", 255)] for s, parsed in tests: assert cstrings.parseCChar(s) == parsed