void link_entry_points(php::Func& func, const FuncEmitter& fe, FindBlk findBlock) { func.dvEntries.resize(fe.params().size()); for (size_t i = 0, sz = fe.params().size(); i < sz; ++i) { if (fe.params()[i].hasDefaultValue()) { auto const dv = findBlock(fe.params()[i].funcletOff()); func.params[i].dvEntryPoint = dv; func.dvEntries[i] = dv; } } func.mainEntry = findBlock(fe.base()); }
void add_frame_variables(php::Func& func, const FuncEmitter& fe) { for (auto& param : fe.params()) { func.params.push_back( php::Param { param.defaultValue(), nullptr, param.typeConstraint(), param.userType(), param.phpCode(), param.userAttributes(), param.builtinType(), param.ref(), param.isVariadic() } ); } func.locals.resize(fe.numLocals()); for (size_t id = 0; id < func.locals.size(); ++id) { auto& loc = func.locals[id]; loc = folly::make_unique<php::Local>(); loc->id = id; loc->name = nullptr; } for (auto& kv : fe.localNameMap()) { func.locals[kv.second]->name = kv.first; } func.iters.resize(fe.numIterators()); for (uint32_t i = 0; i < func.iters.size(); ++i) { func.iters[i] = folly::make_unique<php::Iter>(); func.iters[i]->id = i; } func.staticLocals.reserve(fe.svInfo().size()); for (auto& sv : fe.svInfo()) { func.staticLocals.push_back( php::StaticLocalInfo { sv.name, sv.phpCode } ); } }