std::unique_ptr<UnitEmitter> single_unit(std::unique_ptr<UnitEmitter> input) { trace_time timer("single unit"); php::Program program; program.units.push_back(parse_unit(*input)); auto const u = borrow(program.units[0]); // Single-unit index. Index index{u}; // Visit each method in the unit, except the pseudomain, which isn't // supported for anything yet. for (auto& c : u->classes) { for (auto& m : c->methods) { analyze_and_optimize_func(index, Context { u, borrow(m), borrow(c) }); } assert(check(*c)); } for (auto& f : u->funcs) { analyze_and_optimize_func(index, Context { u, borrow(f) }); assert(check(*f)); } assert(check(*u)); return emit_unit(index, *u); }
std::vector<std::unique_ptr<UnitEmitter>> make_unit_emitters(const Index& index, const php::Program& program) { trace_time trace("make_unit_emitters"); return parallel_map( program.units, [&] (const std::unique_ptr<php::Unit>& unit) { return emit_unit(index, *unit); } ); }