def test_cut_trace_from(self): i0, i1, i2 = IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0) t = Trace([i0, i1, i2], metainterp_sd) add1 = FakeOp(t.record_op(rop.INT_ADD, [i0, i1])) cut_point = t.cut_point() add2 = FakeOp(t.record_op(rop.INT_ADD, [add1, i1])) t.record_op(rop.GUARD_TRUE, [add2]) resume.capture_resumedata([FakeFrame(3, JitCode(4), [add2, add1, i1])], None, [], t) t.record_op(rop.INT_SUB, [add2, add1]) t2 = t.cut_trace_from(cut_point, [add1, i1]) (i0, i1), l, iter = self.unpack(t2) assert len(l) == 3 assert l[0].getarglist() == [i0, i1]
def test_cut_trace_from(self): i0, i1, i2 = IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0) t = Trace([i0, i1, i2], metainterp_sd) add1 = FakeOp(t.record_op(rop.INT_ADD, [i0, i1])) cut_point = t.cut_point() add2 = FakeOp(t.record_op(rop.INT_ADD, [add1, i1])) t.record_op(rop.GUARD_TRUE, [add2]) resume.capture_resumedata([FakeFrame(3, JitCode(4), [add2, add1, i1])], None, [], t) t.record_op(rop.INT_SUB, [add2, add1]) t2 = t.cut_trace_from(cut_point, [add1, i1]) (i0, i1), l, iter = self.unpack(t2) assert len(l) == 3 assert l[0].getarglist() == [i0, i1]
class History(object): ends_with_jump = False trace = None def __init__(self): self.descr_cache = {} self.descrs = {} self.consts = [] self._cache = [] def set_inputargs(self, inpargs, metainterp_sd): from rpython.jit.metainterp.opencoder import Trace self.trace = Trace(inpargs, metainterp_sd) self.inputargs = inpargs if self._cache is not None: # hack to record the ops *after* we know our inputargs for (opnum, argboxes, op, descr) in self._cache: pos = self.trace.record_op(opnum, argboxes, descr) op.set_position(pos) self._cache = None def length(self): return self.trace._count - len(self.trace.inputargs) def trace_tag_overflow(self): return self.trace.tag_overflow def get_trace_position(self): return self.trace.cut_point() def cut(self, cut_at): self.trace.cut_at(cut_at) def any_operation(self): return self.trace._count > self.trace._start @specialize.argtype(2) def set_op_value(self, op, value): if value is None: return elif isinstance(value, bool): op.setint(int(value)) elif lltype.typeOf(value) == lltype.Signed: op.setint(value) elif lltype.typeOf(value) is longlong.FLOATSTORAGE: op.setfloatstorage(value) else: assert lltype.typeOf(value) == llmemory.GCREF op.setref_base(value) def _record_op(self, opnum, argboxes, descr=None): return self.trace.record_op(opnum, argboxes, descr) @specialize.argtype(3) def record(self, opnum, argboxes, value, descr=None): if self.trace is None: pos = 2**14 - 1 else: pos = self._record_op(opnum, argboxes, descr) if value is None: op = FrontendOp(pos) elif isinstance(value, bool): op = IntFrontendOp(pos) elif lltype.typeOf(value) == lltype.Signed: op = IntFrontendOp(pos) elif lltype.typeOf(value) is longlong.FLOATSTORAGE: op = FloatFrontendOp(pos) else: op = RefFrontendOp(pos) if self.trace is None: self._cache.append((opnum, argboxes, op, descr)) self.set_op_value(op, value) return op def record_nospec(self, opnum, argboxes, descr=None): tp = opclasses[opnum].type pos = self._record_op(opnum, argboxes, descr) if tp == 'v': return FrontendOp(pos) elif tp == 'i': return IntFrontendOp(pos) elif tp == 'f': return FloatFrontendOp(pos) assert tp == 'r' return RefFrontendOp(pos) def record_default_val(self, opnum, argboxes, descr=None): assert rop.is_same_as(opnum) op = self.record_nospec(opnum, argboxes, descr) op.copy_value_from(argboxes[0]) return op
class History(object): ends_with_jump = False trace = None def __init__(self): self.descr_cache = {} self.descrs = {} self.consts = [] self._cache = [] def set_inputargs(self, inpargs, metainterp_sd): from rpython.jit.metainterp.opencoder import Trace self.trace = Trace(inpargs, metainterp_sd) self.inputargs = inpargs if self._cache is not None: # hack to record the ops *after* we know our inputargs for (opnum, argboxes, op, descr) in self._cache: pos = self.trace.record_op(opnum, argboxes, descr) op.set_position(pos) self._cache = None def length(self): return self.trace._count - len(self.trace.inputargs) def get_trace_position(self): return self.trace.cut_point() def cut(self, cut_at): self.trace.cut_at(cut_at) def any_operation(self): return self.trace._count > self.trace._start @specialize.argtype(2) def set_op_value(self, op, value): if value is None: return elif isinstance(value, bool): op.setint(int(value)) elif lltype.typeOf(value) == lltype.Signed: op.setint(value) elif lltype.typeOf(value) is longlong.FLOATSTORAGE: op.setfloatstorage(value) else: assert lltype.typeOf(value) == llmemory.GCREF op.setref_base(value) def _record_op(self, opnum, argboxes, descr=None): from rpython.jit.metainterp.opencoder import FrontendTagOverflow try: return self.trace.record_op(opnum, argboxes, descr) except FrontendTagOverflow: # note that with the default settings this one should not # happen - however if we hit that case, we don't get # anything disabled raise SwitchToBlackhole(Counters.ABORT_TOO_LONG) @specialize.argtype(3) def record(self, opnum, argboxes, value, descr=None): if self.trace is None: pos = 2**14 - 1 else: pos = self._record_op(opnum, argboxes, descr) if value is None: op = FrontendOp(pos) elif isinstance(value, bool): op = IntFrontendOp(pos) elif lltype.typeOf(value) == lltype.Signed: op = IntFrontendOp(pos) elif lltype.typeOf(value) is longlong.FLOATSTORAGE: op = FloatFrontendOp(pos) else: op = RefFrontendOp(pos) if self.trace is None: self._cache.append((opnum, argboxes, op, descr)) self.set_op_value(op, value) return op def record_nospec(self, opnum, argboxes, descr=None): tp = opclasses[opnum].type pos = self._record_op(opnum, argboxes, descr) if tp == 'v': return FrontendOp(pos) elif tp == 'i': return IntFrontendOp(pos) elif tp == 'f': return FloatFrontendOp(pos) assert tp == 'r' return RefFrontendOp(pos) def record_default_val(self, opnum, argboxes, descr=None): assert rop.is_same_as(opnum) op = self.record_nospec(opnum, argboxes, descr) op.copy_value_from(argboxes[0]) return op