예제 #1
0
  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
예제 #2
0
 def disable(obj):
     if hasattr(obj, 'im_func'):
         obj = obj.im_func
     pypyjit.dont_trace_here(0, False, obj.__code__)
예제 #3
0
 def disable(obj):
     if hasattr(obj, 'im_func'):
         obj = obj.im_func
     pypyjit.dont_trace_here(0, False, obj.__code__)
예제 #4
0
 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)