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(); } }
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; }
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; }