def run(self, state): """ Run the defined pipelines on the state. """ from numba.core.compiler import _EarlyPipelineCompletion if not self.finalized: raise RuntimeError("Cannot run non-finalised pipeline") # walk the passes and run them for idx, (pss, pass_desc) in enumerate(self.passes): try: event("-- %s" % pass_desc) pass_inst = _pass_registry.get(pss).pass_inst if isinstance(pass_inst, CompilerPass): self._runPass(idx, pass_inst, state) else: raise BaseException("Legacy pass in use") except _EarlyPipelineCompletion as e: raise e except Exception as e: if (utils.use_new_style_errors() and not isinstance(e, errors.NumbaError)): raise e msg = "Failed in %s mode pipeline (step: %s)" % \ (self.pipeline_name, pass_desc) patched_exception = self._patch_error(msg, e) raise patched_exception
def _compile_core(self): """ Populate and run compiler pipeline """ with ConfigStack().enter(self.state.flags.copy()): pms = self.define_pipelines() for pm in pms: pipeline_name = pm.pipeline_name func_name = "%s.%s" % (self.state.func_id.modname, self.state.func_id.func_qualname) event("Pipeline: %s for %s" % (pipeline_name, func_name)) self.state.metadata['pipeline_times'] = { pipeline_name: pm.exec_times } is_final_pipeline = pm == pms[-1] res = None try: pm.run(self.state) if self.state.cr is not None: break except _EarlyPipelineCompletion as e: res = e.result break except Exception as e: if (utils.use_new_style_errors() and not isinstance(e, errors.NumbaError)): raise e self.state.status.fail_reason = e if is_final_pipeline: raise e else: raise CompilerError("All available pipelines exhausted") # Pipeline is done, remove self reference to release refs to user # code self.state.pipeline = None # organise a return if res is not None: # Early pipeline completion return res else: assert self.state.cr is not None return self.state.cr