/* Deletes name from all the isarev entries listed in isa */ STATIC void S_mro_clean_isarev(pTHX_ HV * const isa, const char * const name, const STRLEN len, HV * const exceptions, U32 hash, U32 flags) { HE* iter; PERL_ARGS_ASSERT_MRO_CLEAN_ISAREV; /* Delete our name from our former parents' isarevs. */ if(HvARRAY(isa) && hv_iterinit(isa)) { SV **svp; while((iter = hv_iternext(isa))) { I32 klen; const char * const key = hv_iterkey(iter, &klen); if(exceptions && hv_exists(exceptions, key, HeKUTF8(iter) ? -klen : klen)) continue; svp = hv_fetch(PL_isarev, key, HeKUTF8(iter) ? -klen : klen, 0); if(svp) { HV * const isarev = (HV *)*svp; (void)hv_common(isarev, NULL, name, len, flags, G_DISCARD|HV_DELETE, NULL, hash); if(!HvARRAY(isarev) || !HvUSEDKEYS(isarev)) (void)hv_delete(PL_isarev, key, HeKUTF8(iter) ? -klen : klen, G_DISCARD); } } } }
bool LUCY_Doc_Equals_IMP(lucy_Doc *self, cfish_Obj *other) { if ((lucy_Doc*)other == self) { return true; } if (!cfish_Obj_is_a(other, LUCY_DOC)) { return false; } lucy_DocIVARS *const ivars = lucy_Doc_IVARS(self); lucy_DocIVARS *const ovars = lucy_Doc_IVARS((lucy_Doc*)other); if (!ivars->doc_id == ovars->doc_id) { return false; } if (!!ivars->fields ^ !!ovars->fields) { return false; } // Verify fields. Don't allow any deep data structures. dTHX; HV *my_fields = (HV*)ivars->fields; HV *other_fields = (HV*)ovars->fields; if (HvKEYS(my_fields) != HvKEYS(other_fields)) { return false; } I32 num_fields = hv_iterinit(my_fields); while (num_fields--) { HE *my_entry = hv_iternext(my_fields); SV *my_val_sv = HeVAL(my_entry); STRLEN key_len; char *key; if (HeKLEN(my_entry) == HEf_SVKEY) { SV *key_sv = HeKEY_sv(my_entry); key = SvPV(key_sv, key_len); if (SvUTF8(key_sv)) { key_len = -key_len; } } else { key_len = HeKLEN(my_entry); key = key_len ? HeKEY(my_entry) : Nullch; if (HeKUTF8(my_entry)) { key_len = -key_len; } } SV **const other_val = hv_fetch(other_fields, key, key_len, 0); if (!other_val) { return false; } if (!sv_eq(my_val_sv, *other_val)) { return false; } } return true; }