def _get_function_globals_for_reduction(func): """ Analyse *func* and return a dictionary of global values suitable for reduction. """ from numba.core import bytecode # needed here to avoid cyclic import func_id = bytecode.FunctionIdentity.from_function(func) bc = bytecode.ByteCode(func_id) globs = bc.get_used_globals() # Remember the module name so that the function gets a proper __module__ # when rebuilding. This is used to recreate the environment. globs['__name__'] = func.__module__ return globs
def _get_function_globals_for_reduction(func): """ Analyse *func* and return a dictionary of global values suitable for reduction. """ func_id = bytecode.FunctionIdentity.from_function(func) bc = bytecode.ByteCode(func_id) globs = bc.get_used_globals() for k, v in globs.items(): # Make modules picklable by name if isinstance(v, ModuleType): globs[k] = _ModuleRef(v.__name__) # Remember the module name so that the function gets a proper __module__ # when rebuilding. This is used to recreate the environment. globs['__name__'] = func.__module__ return globs
def run_frontend(func, inline_closures=False): """ Run the compiler frontend over the given Python function, and return the function's canonical Numba IR. If inline_closures is Truthy then closure inlining will be run """ # XXX make this a dedicated Pipeline? func_id = bytecode.FunctionIdentity.from_function(func) interp = interpreter.Interpreter(func_id) bc = bytecode.ByteCode(func_id=func_id) func_ir = interp.interpret(bc) if inline_closures: inline_pass = InlineClosureCallPass(func_ir, cpu.ParallelOptions(False), {}, False) inline_pass.run() post_proc = postproc.PostProcessor(func_ir) post_proc.run() return func_ir