void mop_prehash_keys () { int i; for (i = 0; i < key_last; i++) { const char *value = prehashed_keys[i].value; prehashed_keys[i].key = newSVpv(value, strlen(value)); PERL_HASH(prehashed_keys[i].hash, value, strlen(value)); } }
/* allocate and populate the anon handler sub-struct */ MP_INLINE modperl_mgv_t *modperl_handler_anon_next(pTHX_ apr_pool_t *p) { /* re-use modperl_mgv_t entry which is otherwise is not used * by anon handlers */ modperl_mgv_t *anon = (modperl_mgv_t *)apr_pcalloc(p, sizeof(*anon)); anon->name = apr_psprintf(p, "anon%d", modperl_global_anon_cnt_next()); anon->len = strlen(anon->name); PERL_HASH(anon->hash, anon->name, anon->len); MP_TRACE_h(MP_FUNC, "[%s] new anon handler: '%s'", modperl_pid_tid(p), anon->name); return anon; }
/* * similar to hv_fetch_ent, but takes string key and key len rather than SV * also skips magic and utf8 fu, since we are only dealing with internal tables */ HE *modperl_perl_hv_fetch_he(pTHX_ HV *hv, register char *key, register I32 klen, register U32 hash) { register XPVHV *xhv; register HE *entry; xhv = (XPVHV *)SvANY(hv); if (!HvARRAY(hv)) { return 0; } #ifdef HvREHASH if (HvREHASH(hv)) { PERL_HASH_INTERNAL(hash, key, klen); } else #endif if (!hash) { PERL_HASH(hash, key, klen); } entry = ((HE**)HvARRAY(hv))[hash & (I32)xhv->xhv_max]; for (; entry; entry = HeNEXT(entry)) { if (HeHASH(entry) != hash) { continue; } if (HeKLEN(entry) != klen) { continue; } if (HeKEY(entry) != key && memNE(HeKEY(entry), key, klen)) { continue; } return entry; } return 0; }