Beispiel #1
0
 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]
Beispiel #2
0
 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]
Beispiel #3
0
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
Beispiel #4
0
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