def visit_FunctionDef(self, node): if node.closure_scope is None: # Process inner functions and determine cellvars and freevars # codes = [c for c in self.constants # if isinstance(c, types.CodeType)] process_closures( self.env, node, self.symtab, func_globals=self.func_globals, closures=self.closures, warn=self.warn ) # cellvars are the variables we own cellvars = dict((name, var) for name, var in self.symtab.iteritems() if var.is_cellvar) node.cellvars = cellvars logger.debug("Cellvars in function %s: %s", node.name, cellvars) outer_scope = self.outer_scope if outer_scope: outer_scope_type = outer_scope.type else: outer_scope_type = None if not cellvars: # No cellvars, so use parent closure scope if this is a closure if outer_scope: self.update_closures(node, outer_scope_type, None) return self.visit_func_children(node) # Create closure scope extension type cellvar_fields = [(name, var.type) for name, var in cellvars.iteritems()] fields = numba.struct(cellvar_fields).fields if outer_scope: fields.insert(0, ("__numba_base_scope", outer_scope_type)) class py_class(object): pass func_name = self.func_name py_class.__name__ = "%s_scope" % func_name scope_type = typesystem.ClosureScopeType(py_class, outer_scope_type) scope_type.unmangled_symtab = dict(fields) AttrTable = attributetable.AttributeTable scope_type.attribute_table = AttrTable.from_list(py_class=None, attributes=fields) ext_type = extension_types.create_new_extension_type(type, func_name, (object,), {}, scope_type, None) # Instantiate closure scope logger.debug("Generate closure %s %s %s", node.name, scope_type, outer_scope) cellvar_scope = nodes.InstantiateClosureScope(node, ext_type, scope_type, outer_scope) node.body.insert(0, cellvar_scope) self.update_closures(node, scope_type, ext_type) return self.visit_func_children(node)
def build_extension_type(self, vtable): """ Build extension type from llvm methods and pointers and a populated virtual method table. """ vtable_wrapper = self.vtabbuilder.wrap_vtable(vtable) extension_type = extension_types.create_new_extension_type( self.get_metacls(), self.py_class.__name__, self.get_bases(), self.class_dict, self.ext_type, vtable_wrapper) return extension_type
def build_extension_type(self, vtable): """ Build extension type from llvm methods and pointers and a populated virtual method table. """ vtable_wrapper = self.vtabbuilder.wrap_vtable(vtable) extension_type = extension_types.create_new_extension_type( self.get_metacls(), self.py_class.__name__, self.get_bases(), self.class_dict, self.ext_type, vtable_wrapper) return extension_type
def visit_FunctionDef(self, node): if node.closure_scope is None: # Process inner functions and determine cellvars and freevars # codes = [c for c in self.constants # if isinstance(c, types.CodeType)] process_closures(self.env, node, self.symtab, func_globals=self.func_globals, closures=self.closures, warn=self.warn) # cellvars are the variables we own cellvars = dict((name, var) for name, var in self.symtab.iteritems() if var.is_cellvar) node.cellvars = cellvars logger.debug("Cellvars in function %s: %s", node.name, cellvars) outer_scope = self.outer_scope if outer_scope: outer_scope_type = outer_scope.type else: outer_scope_type = None if not cellvars: # No cellvars, so use parent closure scope if this is a closure if outer_scope: self.update_closures(node, outer_scope_type, None) return self.visit_func_children(node) # Create closure scope extension type cellvar_fields = [(name, var.type) for name, var in cellvars.iteritems()] fields = numba.struct(cellvar_fields).fields if outer_scope: fields.insert(0, ('__numba_base_scope', outer_scope_type)) class py_class(object): pass func_name = self.func_name py_class.__name__ = '%s_scope' % func_name scope_type = typesystem.ClosureScopeType(py_class, outer_scope_type) scope_type.unmangled_symtab = dict(fields) AttrTable = attributetable.AttributeTable scope_type.attribute_table = AttrTable.from_list(py_class=None, attributes=fields) ext_type = extension_types.create_new_extension_type( type, func_name, (object, ), {}, scope_type, None) # Instantiate closure scope logger.debug("Generate closure %s %s %s", node.name, scope_type, outer_scope) cellvar_scope = nodes.InstantiateClosureScope(node, ext_type, scope_type, outer_scope) node.body.insert(0, cellvar_scope) self.update_closures(node, scope_type, ext_type) return self.visit_func_children(node)