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
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)
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)