Beispiel #1
0
void cgKillClsRef(IRLS& env, const IRInstruction* inst) {
  if (!debug) return;

  auto& v = vmain(env);
  auto const fp = srcLoc(env, inst, 0).reg();
  auto const off = frame_clsref_offset(
    funcFromFp(inst->src(0)),
    inst->extra<ClsRefSlotData>()->slot
  );

  LowPtr<Class> trash;
  memset(&trash, kTrashClsRef, sizeof(trash));
  Immed64 immed(trash.get());

  if (sizeof(trash) == 4) {
    v << storeli{immed.l(), fp[off]};
  } else if (sizeof(trash) == 8) {
    if (immed.fits(sz::dword)) {
      v << storeqi{immed.l(), fp[off]};
    } else {
      v << store{v.cns(immed.q()), fp[off]};
    }
  } else {
    not_implemented();
  }
}
Beispiel #2
0
void NamedEntity::removeClass(Class* goner) {
  Class* head = m_clsList.load(std::memory_order_acquire);
  if (!head) return;
  if (head == goner) {
    return m_clsList.store(head->m_nextClass, std::memory_order_release);
  }
  LowPtr<Class>* cls = &head->m_nextClass;
  while (cls->get() != goner) {
    assert(*cls);
    cls = &(*cls)->m_nextClass;
  }
  *cls = goner->m_nextClass;
}
Beispiel #3
0
void NamedEntity::removeClass(Class* goner) {
  Class* head = m_clsList;
  if (!head) return;

  if (RuntimeOption::EvalEnableReverseDataMap) {
    // This deregisters Classes registered to data_map in Unit::defClass().
    data_map::deregister(goner);
  }

  if (head == goner) {
    m_clsList = head->m_nextClass;
    return;
  }
  LowPtr<Class>* cls = &head->m_nextClass;
  while (cls->get() != goner) {
    assertx(*cls);
    cls = &(*cls)->m_nextClass;
  }
  *cls = goner->m_nextClass;
}