Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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();
}