def get(f, argtypes): f = jit(f) env = environment.fresh_env(f, argtypes, "cpu") func, env = phase.typing(f, env) context = env['flypy.typing.context'] signature = env['flypy.typing.signature'] return func, context, signature
def test_cache_code(self): def py_func(x, y): return x + y nb_func = jit(py_func) argtypes = (float64, float64) e = environment.fresh_env(nb_func, argtypes) lfunc, env = phase.llvm(nb_func, e) self.db.insert(py_func, argtypes, 'llvm', lfunc, env, now) cached_module, cached_lfunc, cached_env = self.db.lookup( py_func, argtypes, 'llvm') self.assertEqual(str(lfunc), str(cached_lfunc))
def op_call(run_phase, typeof_func, interp, func, args): """ Called by the interpreter to interpret IR function calls. """ if isinstance(func, Method): func, self = func args = [self] + list(args) if isinstance(func, functionwrapper.FunctionWrapper): wrapper = func op = interp.op try: # Flatten args (consider default values) args = simple_flatargs(func.py_func, tuple(args), {}) except TypeError: pass # Determine argument types argtypes = [ typeof_func(arg, val) for arg, val in zip(op.args[1], args) ] # Use regular typeof() for remaining arguments (default values) remaining_args = args[len(argtypes):] for arg in remaining_args: argtypes.append(typeof(arg)) # Compile function env = environment.fresh_env(func, argtypes, "cpu") if wrapper.opaque and run_phase == phase.frontend: func = implement(wrapper, wrapper.py_func, tuple(argtypes), env) else: func, env = run_phase(func, env) elif is_flypy_type(func): obj = func(*args) return obj #layout = type(obj).layout #return { 'value': dict((name, getattr(obj, name)) for name in layout) } return interp.call(func, args)
def op_call(run_phase, typeof_func, interp, func, args): """ Called by the interpreter to interpret IR function calls. """ if isinstance(func, Method): func, self = func args = [self] + list(args) if isinstance(func, functionwrapper.FunctionWrapper): wrapper = func op = interp.op try: # Flatten args (consider default values) args = simple_flatargs(func.py_func, tuple(args), {}) except TypeError: pass # Determine argument types argtypes = [typeof_func(arg, val) for arg, val in zip(op.args[1], args)] # Use regular typeof() for remaining arguments (default values) remaining_args = args[len(argtypes):] for arg in remaining_args: argtypes.append(typeof(arg)) # Compile function env = environment.fresh_env(func, argtypes, "cpu") if wrapper.opaque and run_phase == phase.frontend: func = implement(wrapper, wrapper.py_func, tuple(argtypes), env) else: func, env = run_phase(func, env) elif is_flypy_type(func): obj = func(*args) return obj #layout = type(obj).layout #return { 'value': dict((name, getattr(obj, name)) for name in layout) } return interp.call(func, args)
def interpret(nb_func, run_phase, args, debug=False, tracer=None): """Interpret and return result""" # Translate flypy function argtypes = [typeof(arg) for arg in args] env = environment.fresh_env(nb_func, argtypes, target="cpu") f, env = run_phase(nb_func, env) if debug: header(f) if tracer is None: # Set up tracer to trace interpretation if debug: tracer = tracing.Tracer() else: tracer = tracing.DummyTracer() newargs = [conversion.fromobject(arg, typeof(arg)) for arg in args] # Interpret function env.setdefault('interp.handlers', handlers(run_phase, env)) return interp.run(f, env, args=newargs, tracer=tracer)