Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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)