Exemple #1
0
def test_switch_on_symbolic():
    symb1 = CDefinedIntSymbolic("1", 1)
    symb2 = CDefinedIntSymbolic("2", 2)
    symb3 = CDefinedIntSymbolic("3", 3)

    def fn(x):
        res = 0
        if x == symb1:
            res += x + 1
        elif x == symb2:
            res += x + 2
        elif x == symb3:
            res += x + 3
        res += 1
        return res

    t = TranslationContext()
    a = t.buildannotator()
    a.build_types(fn, [int])
    rtyper = t.buildrtyper()
    rtyper.specialize()
    graph = t.graphs[0]
    remove_same_as(graph)
    res = merge_if_blocks_once(graph)
    assert not res
    checkgraph(graph)
    def __init__(self, FIELDTYPE, fieldname, loop_invariant=False):
        "must be prebuilt"
        try:
            from thread import _local
        except ImportError:

            class _local(object):
                pass

        self.FIELDTYPE = FIELDTYPE
        self.fieldname = fieldname
        self.local = _local()  # <- not rpython
        zero = rffi.cast(FIELDTYPE, 0)
        offset = CDefinedIntSymbolic('RPY_TLOFS_%s' % self.fieldname,
                                     default='?')
        offset.loop_invariant = loop_invariant
        self._offset = offset

        def getraw():
            if we_are_translated():
                _threadlocalref_seeme(self)
                return llop.threadlocalref_get(FIELDTYPE, offset)
            else:
                return getattr(self.local, 'rawvalue', zero)

        @jit.dont_look_inside
        def get_or_make_raw():
            if we_are_translated():
                _threadlocalref_seeme(self)
                addr = llop.threadlocalref_addr(llmemory.Address)
                return llop.raw_load(FIELDTYPE, addr, offset)
            else:
                return getattr(self.local, 'rawvalue', zero)

        @jit.dont_look_inside
        def setraw(value):
            if we_are_translated():
                _threadlocalref_seeme(self)
                addr = llop.threadlocalref_addr(llmemory.Address)
                llop.raw_store(lltype.Void, addr, offset, value)
            else:
                self.local.rawvalue = value

        def getoffset():
            _threadlocalref_seeme(self)
            return offset

        self.getraw = getraw
        self.get_or_make_raw = get_or_make_raw
        self.setraw = setraw
        self.getoffset = getoffset
    def __init__(self, FIELDTYPE, fieldname, loop_invariant=False):
        "NOT_RPYTHON: must be prebuilt"
        try:
            from thread import _local
        except ImportError:
            class _local(object):
                pass
        self.FIELDTYPE = FIELDTYPE
        self.fieldname = fieldname
        self.local = _local()      # <- NOT_RPYTHON
        zero = rffi.cast(FIELDTYPE, 0)
        offset = CDefinedIntSymbolic('RPY_TLOFS_%s' % self.fieldname,
                                     default='?')
        offset.loop_invariant = loop_invariant
        self.offset = offset

        def getraw():
            if we_are_translated():
                _threadlocalref_seeme(self)
                return llop.threadlocalref_get(FIELDTYPE, offset)
            else:
                return getattr(self.local, 'rawvalue', zero)

        @jit.dont_look_inside
        def get_or_make_raw():
            if we_are_translated():
                _threadlocalref_seeme(self)
                addr = llop.threadlocalref_addr(llmemory.Address)
                return llop.raw_load(FIELDTYPE, addr, offset)
            else:
                return getattr(self.local, 'rawvalue', zero)

        @jit.dont_look_inside
        def setraw(value):
            if we_are_translated():
                _threadlocalref_seeme(self)
                addr = llop.threadlocalref_addr(llmemory.Address)
                llop.raw_store(lltype.Void, addr, offset, value)
            else:
                self.local.rawvalue = value

        def getoffset():
            _threadlocalref_seeme(self)
            return offset

        self.getraw = getraw
        self.get_or_make_raw = get_or_make_raw
        self.setraw = setraw
        self.getoffset = getoffset
Exemple #4
0
 def compute_result_annotation(self, s_fq):
     assert s_fq.is_constant()
     fq = s_fq.const
     s_func = self.bookkeeper.immutablevalue(fq.finalizer_trigger)
     self.bookkeeper.emulate_pbc_call(self.bookkeeper.position_key, s_func,
                                      [])
     if not hasattr(fq, '_fq_tag'):
         fq._fq_tag = CDefinedIntSymbolic(
             '0 /*FinalizerQueue TAG for %s*/' % fq.__class__.__name__,
             default=fq)
     return self.bookkeeper.immutablevalue(fq._fq_tag)
Exemple #5
0
                raise TyperError("hint %r is not constant" % (key, ))
            assert key.startswith('i_')
            hints[key[2:]] = s_value.const
        v = hop.inputarg(hop.args_r[0], arg=0)
        c_hint = hop.inputconst(lltype.Void, hints)
        hop.exception_cannot_occur()
        return hop.genop('hint', [v, c_hint], resulttype=v.concretetype)


def we_are_jitted():
    """ Considered as true during tracing and blackholing,
    so its consquences are reflected into jitted code """
    return False


_we_are_jitted = CDefinedIntSymbolic('0 /* we are not jitted here */',
                                     default=0)


class Entry(ExtRegistryEntry):
    _about_ = we_are_jitted

    def compute_result_annotation(self):
        from rpython.annotator import model as annmodel
        return annmodel.SomeInteger(nonneg=True)

    def specialize_call(self, hop):
        from rpython.rtyper.lltypesystem import lltype
        hop.exception_cannot_occur()
        return hop.inputconst(lltype.Signed, _we_are_jitted)