예제 #1
0
파일: flatten.py 프로젝트: pshc/archipelago
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)
예제 #2
0
파일: scan.py 프로젝트: pshc/archipelago
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)"))
예제 #3
0
파일: expand.py 프로젝트: pshc/archipelago
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
예제 #4
0
파일: prop.py 프로젝트: pshc/archipelago
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))
예제 #5
0
파일: flatten.py 프로젝트: pshc/archipelago
 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"