Esempio n. 1
0
Slot lookupStaticSlotFromClosure(const Class* cls, const StringData* name) {
  auto str = String::attach(
    StringData::Make(s_staticPrefix.slice(), name->slice())
  );
  auto const slot = cls->lookupDeclProp(str.get());
  assertx(slot != kInvalidSlot);
  return slot;
}
// Defined here so it can be inlined below.
RefData* lookupStaticFromClosure(ObjectData* closure,
                                 StringData* name,
                                 bool& inited) {
  assert(closure->instanceof(c_Closure::classof()));
  String str(StringData::Make(s_staticPrefix->slice(), name->slice()));
  auto const cls = closure->getVMClass();
  auto const slot = cls->lookupDeclProp(str.get());
  assert(slot != kInvalidSlot);
  auto const val = static_cast<c_Closure*>(closure)->getStaticVar(slot);

  if (val->m_type == KindOfUninit) {
    inited = false;
    val->m_type = KindOfNull;
    tvBox(val);
    return val->m_data.pref;
  }
  inited = true;
  assert(val->m_type == KindOfRef);
  return val->m_data.pref;
}