def build_control_flow(unit): funcs = [] t = t_DT(ExpandedUnit) in_env(NEWFUNCS, funcs, lambda: vat.visit(ControlFlowBuilder, unit, t)) if env(GENOPTS).dumpBlocks: for func in funcs: print 'FUNC', extrinsic(Name, func.var) for block in func.blocks: if block.entryBlocks: print fmtcol('{0}: ^LG; entry from {1}^N', block.label, ', '.join(b.label for b in block.entryBlocks)) for stmt in block.stmts: print ' ', stmt print ' ', match(block.terminator, ('TermJump(Just(d))', lambda d: 'j %s' % (d.label,)), ('TermJumpCond(c, Just(t), Just(f))', lambda c, t, f: 'j %r, %s, %s' % (c, t.label, f.label)), ('TermReturnNothing()', lambda: 'ret void'), ('TermReturn(e)', lambda e: 'ret %r' % (e,)), ('TermUnreachable()', lambda: 'unreachable')) print map_(check_cfg_func, funcs) return BlockUnit(funcs)
def scan_func(f, typeDest): if not has_extrinsic(AstType, f): vat.visit(Scanner, f.body, "Body(Expr)") return tvars = {} ftstr = extrinsic(AstType, f) ft = parse_new_type(ftstr, tvars) tps = ft.paramTypes ps = f.params assert len(tps) == len(ps), "Mismatched param count: %s\n%s" % (tps,ps) set_type(typeDest, ft) closed = env(INWARD).closedVars closed.update(tvars) in_env(INWARD, Inward(closed), lambda: vat.visit(Scanner, f.body, "Body(Expr)"))
def expand_unit(old_decl_mod, unit): checkpoint() t = t_DT(ExpandedUnit) expand_closures(unit) checkpoint('expanded closures') vat.mutate(FuncValGenerator, unit, t) vat.mutate(LitExpander, unit, t) vat.mutate(AssertionExpander, unit, t) checkpoint('expanded compound exprs') gen_gc_layouts(old_decl_mod.root) checkpoint('generated gc layouts') # Prepend generated TopFuncs now unit.funcs = env(EXGLOBAL).newDefns + unit.funcs flat = flatten.flatten_unit(unit) t = t_DT(BlockUnit) checkpoint('flattened') drum.walk(flat) checkpoint('did drum analysis') _prepare_decls(env(EXGLOBAL).newDecls) vat.mutate(TypeConverter, flat, t) checkpoint('convert to itypes') vat.mutate(MaybeConverter, flat, t) checkpoint('expanded maybes') vat.mutate(EnvExtrConverter, flat, t) checkpoint('expanded envs and extrs') replace_ctors(old_decl_mod.root, flat) _finish_decls(env(EXGLOBAL).newDecls) checkpoint('expanded ctors and types') vat.visit(ImportMarker, flat, t) checkpoint('marked imports') vat.visit(LocalVarUniquer, flat, t) checkpoint('uniqued vars') return flat
def prop_compilation_unit(unit): for f in unit.funcs: in_env(STMTCTXT, f, lambda: prop_top_func(f, f.var, f.func)) vat.visit(EnvInference, unit, t_DT(CompilationUnit))
def go(): for stmt in body.stmts: vat.visit(ControlFlowBuilder, stmt, 'Stmt(LExpr)') callInside() assert isNothing(env(CFG).block), "Block still active after scope end"