def record(self, opnum, argboxes, value, descr=None): op = ResOperation(opnum, argboxes, descr) if value is None: assert op.type == 'v' elif isinstance(value, bool): assert op.type == 'i' op.setint(int(value)) elif lltype.typeOf(value) == lltype.Signed: assert op.type == 'i' op.setint(value) elif lltype.typeOf(value) is longlong.FLOATSTORAGE: assert op.type == 'f' op.setfloatstorage(value) else: assert lltype.typeOf(value) == llmemory.GCREF assert op.type == 'r' op.setref_base(value) self.operations.append(op) return op
def remove_tested_failarg(self, op): opnum = op.getopnum() if not (opnum == rop.GUARD_TRUE or opnum == rop.GUARD_FALSE): return if op.getarg(0).is_vector(): return try: i = op.getfailargs().index(op.getarg(0)) except ValueError: return # The checked value is also in the failargs. The front-end # tries not to produce it, but doesn't always succeed (and # it's hard to test all cases). Rewrite it away. value = int(opnum == rop.GUARD_FALSE) op1 = ResOperation(rop.SAME_AS_I, [ConstInt(value)]) op1.setint(value) self.emit_op(op1) lst = op.getfailargs()[:] lst[i] = op1 newop = op.copy_and_change(opnum) newop.setfailargs(lst) self._changed_op = op self._changed_op_to = newop