def compile_meta_block( self, blocks ): meta_id = self.meta_block_id self.meta_block_id += 1 # Create custom global dict for all blocks inside the meta block _globals = { f"blk{i}": b for i, b in enumerate( blocks ) } blk_srcs = [] for i, b in enumerate(blocks): # This is a normal update block if b in self.branchiness: blk_srcs.append( f"blk{i}() # [br {self.branchiness[b]}, loop {int(self.only_loop_at_top[b])}] {b.__name__}" ) # This is an SCC block which has zero BR and is a loop else: blk_srcs.append( f"blk{i}() # {b.__name__}" ) gen_src = f"def meta_block{meta_id}():\n " gen_src += "\n ".join( blk_srcs ) # use custom_exec to compile the meta block _locals = {} custom_exec( py.code.Source( gen_src ).compile(), _globals, _locals ) ret = _locals[ f'meta_block{meta_id}' ] if _DEBUG: print(gen_src) # We will use pypyjit.dont_trace_here to compile standalone traces for # each meta block try: from pypyjit import dont_trace_here dont_trace_here( 0, False, ret.__code__ ) except: pass return ret
def disable(obj): if hasattr(obj, 'im_func'): obj = obj.im_func pypyjit.dont_trace_here(0, False, obj.__code__)
def code_callback(self, code): if hash(code) in self._trace_too_long_set: pypyjit.dont_trace_here(0, False, code) if hash(code) in self._trace_immediately: for v in self._trace_immediately[hash(code)]: pypyjit.trace_next_iteration(v, False, code)