Пример #1
0
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);
}
Пример #2
0
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);
    }
  );
}