def valid_locals(self, func): if self.ast is None or self.env is None: return True return (func is not None and query(self.env, self.ast, "__numba_valid_code_object", default=True))
def invalidate_locals(self, ast=None): ast = ast or self.ast if query(self.env, ast, "variable_status_tuple"): # Delete variable status of the function (local/free/cell status) annotate(self.env, ast, variable_status_tuple=None) if self.func and ast is self.ast: # Invalidate validity of code object annotate(self.env, ast, __numba_valid_code_object=False)
def determine_variable_status(env, ast, locals_dict): """ Determine what category referenced and assignment variables fall in: - local variables - free variables - cell variables """ variable_status = query(env, ast, 'variable_status_tuple') if variable_status: return variable_status v = VariableFindingVisitor() v.visit(ast) locals = set(v.assigned) locals.update(locals_dict) if PY3: locals.update(arg.arg for arg in ast.args.args) else: locals.update(arg.id for arg in ast.args.args) locals.update(func_def.name for func_def in v.func_defs) freevars = set(v.referenced) - locals cellvars = set() # Compute cell variables for func_def in v.func_defs: func_env = env.translation.make_partial_env(func_def, locals={}) inner_locals_dict = func_env.locals inner_locals, inner_cellvars, inner_freevars = \ determine_variable_status(env, func_def, inner_locals_dict) cellvars.update(locals.intersection(inner_freevars)) # print ast.name, "locals", pformat(locals), \ # "cellvars", pformat(cellvars), \ # "freevars", pformat(freevars), \ # "locals_dict", pformat(locals_dict) # print ast.name, "locals", pformat(locals) # Cache state annotate(env, ast, variable_status_tuple=(locals, cellvars, freevars)) return locals, cellvars, freevars
def determine_variable_status(env, ast, locals_dict): """ Determine what category referenced and assignment variables fall in: - local variables - free variables - cell variables """ variable_status = query(env, ast, 'variable_status_tuple') if variable_status: return variable_status v = VariableFindingVisitor() v.visit(ast) locals = set(v.assigned) locals.update(locals_dict) locals.update([name.id for name in ast.args.args]) locals.update(func_def.name for func_def in v.func_defs) freevars = set(v.referenced) - locals cellvars = set() # Compute cell variables for func_def in v.func_defs: func_env = env.translation.make_partial_env(func_def, locals={}) inner_locals_dict = func_env.locals inner_locals, inner_cellvars, inner_freevars = \ determine_variable_status(env, func_def, inner_locals_dict) cellvars.update(locals.intersection(inner_freevars)) # print ast.name, "locals", pformat(locals), \ # "cellvars", pformat(cellvars), \ # "freevars", pformat(freevars), \ # "locals_dict", pformat(locals_dict) # print ast.name, "locals", pformat(locals) # Cache state annotate(env, ast, variable_status_tuple=(locals, cellvars, freevars)) return locals, cellvars, freevars
def determine_variable_status(env, ast, locals_dict): """ Determine what category referenced and assignment variables fall in: - local variables - free variables - cell variables """ variable_status = query(env, ast, 'variable_status_tuple') if variable_status: return variable_status v = VariableFindingVisitor() v.visit(ast) if not v.params.isdisjoint(v.globals): raise error.NumbaError( node, "Parameters cannot be declared global") locals = v.params.union(v.assigned, locals_dict) - v.globals freevars = v.referenced - locals cellvars = set() # Compute cell variables for func_def in v.func_defs: func_env = env.translation.make_partial_env(func_def, locals={}) inner_locals_dict = func_env.locals inner_locals, inner_cellvars, inner_freevars = \ determine_variable_status(env, func_def, inner_locals_dict) cellvars.update(locals.intersection(inner_freevars)) # from pprint import pformat # print(ast.name, "locals", pformat(locals), # "cellvars", pformat(cellvars), # "freevars", pformat(freevars), # "locals_dict", pformat(locals_dict)) # print(ast.name, "locals", pformat(locals)) # Cache state annotate(env, ast, variable_status_tuple=(locals, cellvars, freevars)) return locals, cellvars, freevars
def determine_variable_status(env, ast, locals_dict): """ Determine what category referenced and assignment variables fall in: - local variables - free variables - cell variables """ variable_status = query(env, ast, 'variable_status_tuple') if variable_status: return variable_status v = VariableFindingVisitor() v.visit(ast) if not v.params.isdisjoint(v.globals): raise error.NumbaError(node, "Parameters cannot be declared global") locals = v.params.union(v.assigned, locals_dict) - v.globals freevars = v.referenced - locals cellvars = set() # Compute cell variables for func_def in v.func_defs: func_env = env.translation.make_partial_env(func_def, locals={}) inner_locals_dict = func_env.locals inner_locals, inner_cellvars, inner_freevars = \ determine_variable_status(env, func_def, inner_locals_dict) cellvars.update(locals.intersection(inner_freevars)) # from pprint import pformat # print(ast.name, "locals", pformat(locals), # "cellvars", pformat(cellvars), # "freevars", pformat(freevars), # "locals_dict", pformat(locals_dict)) # print(ast.name, "locals", pformat(locals)) # Cache state annotate(env, ast, variable_status_tuple=(locals, cellvars, freevars)) return locals, cellvars, freevars
def query(self, node, key): return query(self.env, node, key)