示例#1
0
文件: typing.py 项目: mac0ne/pythran
    def visit_FunctionDef(self, node):
        self.curr_locals_declaration = self.passmanager.gather(
            LocalDeclarations,
            node)
        self.current = node
        self.typedefs = list()
        self.name_to_nodes = {arg.id: {arg} for arg in node.args.args}
        self.yield_points = self.passmanager.gather(YieldPoints, node)

        # two stages, one for inter procedural propagation
        self.stage = 0
        self.generic_visit(node)

        # and one for backward propagation
        # but this step is generally costly
        if cfg.getboolean('typing', 'enable_two_steps_typing'):
            self.stage = 1
            self.generic_visit(node)

        # propagate type information through all aliases
        for name, nodes in self.name_to_nodes.iteritems():
            final_node = ast.Name("__fake__" + name, ast.Load())
            for n in nodes:
                self.combine(final_node, n)
            for n in nodes:
                self.result[n] = self.result[final_node]
        self.current_global_declarations[node.name] = node
        # return type may be unset if the function always raises
        return_type = self.result.get(node, NamedType("void"))
        self.result[node] = (Assignable(return_type), self.typedefs)
        for k in self.passmanager.gather(LocalDeclarations, node):
            self.result[k] = self.get_qualifier(k)(self.result[k])
示例#2
0
文件: typing.py 项目: Nagadum/pythran
    def visit_FunctionDef(self, node):
        self.current = node
        self.typedefs = list()
        self.name_to_nodes = {arg.id: {arg} for arg in node.args.args}
        self.yield_points = self.passmanager.gather(YieldPoints, node)

        # two stages, one for inter procedural propagation
        self.stage = 0
        self.generic_visit(node)

        # and one for backward propagation
        # but this step is generally costly
        if cfg.getboolean('typing', 'enable_two_steps_typing'):
            self.stage = 1
            self.generic_visit(node)

        # propagate type information through all aliases
        for name, nodes in self.name_to_nodes.iteritems():
            final_node = ast.Name("__fake__" + name, ast.Load())
            for n in nodes:
                self.combine(final_node, n)
            for n in nodes:
                self.result[n] = self.result[final_node]
        self.current_global_declarations[node.name] = node
        # return type may be unset if the function always raises
        return_type = self.result.get(node, NamedType("void"))
        self.result[node] = (Assignable(return_type), self.typedefs)
        for k in self.passmanager.gather(LocalDeclarations, node):
            lazy_res = self.lazyness_analysis[k.id]
            if lazy_res <= self.max_recompute:
                self.result[k] = Lazy(self.result[k])
            else:
                self.result[k] = Assignable(self.result[k])
    def dispose(self, minfo, cachefp, starttime):
        """ Dispose the log in one or more format below
            mlog - for debugging, save if the mlog config is set
            qlog - queuing for indexing, save if minfo.discard is not set
        """

        mlogFlag = cfg.getboolean('messagelog', 'mlog', False)
        if not minfo.discard or mlogFlag:
            minfo.id = self.getId()

        if not minfo.discard:
            cachefp.write_qlog(minfo.id)

        if mlogFlag:
            cachefp.write_mlog(minfo.id)

        elapsed = datetime.datetime.now() - starttime
        log.debug('%3d.%02ds %s' % (elapsed.seconds, elapsed.microseconds/10000, minfo.logmsg()))