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)
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)