Esempio n. 1
0
    def flatten (self, node):
        """Takes an AST as input, and then "flattens" the tree into a list of statements."""

        if isinstance(node, Function):
            # This is not a Function returned from the parse stage, but a top-level function
            # that is created in the closure-conversion pass.
            # We just need to flatten the "code" attribute, which is a Stmt.
            # Function(decorators, name, argnames, defaults, flags, doc, code, lineno=None)
            self.log.debug('in visit_Function, node.code = %s',node.code)
            code = self.flatten(node.code)
            for x in node.argnames:
                self.varalloc.add_var(x)
            return Function(node.decorators, node.name, node.argnames, node.defaults, node.flags, node.doc, code, node.lineno)
        elif isinstance(node, Return):
            x = self.flatten(node.value)
            retvar, retstmtlist = self.flatten(node.value)
            return retstmtlist + [Return(retvar)]
        elif isinstance(node, CallFuncIndirect):
            self.log.debug('CallFuncIndirect: args: %s', node.args)
            nodevar, nodestmtlist = self.flatten(node.node)
            tuplelist = [self.flatten(x) for x in node.args]
            varargs = [x[0] for x in tuplelist]
            varstmts = [x[1] for x in tuplelist]
            varname = self.varalloc.get_next_var()
            stmts = nodestmtlist + reduce(lambda x,y: x+y, varstmts, []) + [Assign([AssName(varname, 'OP_ASSIGN')], CallFuncIndirect(nodevar, varargs))]
            return (Name(varname), stmts)
        else:
            return P1Flattener.flatten(self, node)
Esempio n. 2
0
    def flatten(self, node):
        """Takes an AST as input, and then "flattens" the tree into a list of statements."""

        if isinstance(node, Function):
            # This is not a Function returned from the parse stage, but a top-level function
            # that is created in the closure-conversion pass.
            # We just need to flatten the "code" attribute, which is a Stmt.
            # Function(decorators, name, argnames, defaults, flags, doc, code, lineno=None)
            self.log.debug('in visit_Function, node.code = %s', node.code)
            code = self.flatten(node.code)
            for x in node.argnames:
                self.varalloc.add_var(x)
            return Function(node.decorators, node.name, node.argnames,
                            node.defaults, node.flags, node.doc, code,
                            node.lineno)
        elif isinstance(node, Return):
            x = self.flatten(node.value)
            retvar, retstmtlist = self.flatten(node.value)
            return retstmtlist + [Return(retvar)]
        elif isinstance(node, CallFuncIndirect):
            self.log.debug('CallFuncIndirect: args: %s', node.args)
            nodevar, nodestmtlist = self.flatten(node.node)
            tuplelist = [self.flatten(x) for x in node.args]
            varargs = [x[0] for x in tuplelist]
            varstmts = [x[1] for x in tuplelist]
            varname = self.varalloc.get_next_var()
            stmts = nodestmtlist + reduce(lambda x, y: x + y, varstmts, []) + [
                Assign([AssName(varname, 'OP_ASSIGN')],
                       CallFuncIndirect(nodevar, varargs))
            ]
            return (Name(varname), stmts)
        else:
            return P1Flattener.flatten(self, node)