void ActRecState::pushFunc(const NormalizedInstruction& inst) { assertx(isFPush(inst.op())); const Unit& unit = *inst.unit(); const Func* func = nullptr; if (inst.op() == OpFPushFuncD || inst.op() == OpFPushFuncU) { Id funcId = inst.imm[1].u_SA; auto const& nep = unit.lookupNamedEntityPairId(funcId); func = Unit::lookupFunc(nep.second); } else if (inst.op() == OpFPushCtorD) { Id clsId = inst.imm[1].u_SA; auto const ctxFunc = inst.func(); if (ctxFunc) { auto const str = unit.lookupLitstrId(clsId); auto const ctx = ctxFunc->cls(); auto const cls = Unit::lookupUniqueClassInContext(str, ctx); func = lookupImmutableCtor(cls, ctx); } } if (func) func->validate(); if (func && func->isNameBindingImmutable(&unit)) { pushFuncD(func); return; } pushDynFunc(); }
void ActRecState::pushFunc(const NormalizedInstruction& inst) { assertx(isFPush(inst.op())); if (inst.op() == OpFPushFuncD || inst.op() == OpFPushFuncU) { const Unit& unit = *inst.unit(); Id funcId = inst.imm[1].u_SA; auto const& nep = unit.lookupNamedEntityPairId(funcId); auto const func = Unit::lookupFunc(nep.second); if (func) func->validate(); if (func && func->isNameBindingImmutable(&unit)) { pushFuncD(func); return; } } pushDynFunc(); }