+HV*
+Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 flags)
+{
+ HV* stash;
+ const HE* const he = (const HE *)hv_common(
+ PL_stashcache, NULL, name, namelen,
+ (flags & SVf_UTF8) ? HVhek_UTF8 : 0, 0, NULL, 0
+ );
+ if (he) return INT2PTR(HV*,SvIVX(HeVAL(he)));
+ else if (flags & GV_CACHE_ONLY) return NULL;
+
+ stash = S_stashpvn(aTHX_ name, namelen, flags);
+ if (stash && namelen) {
+ SV* const ref = newSViv(PTR2IV(stash));
+ hv_store(PL_stashcache, name,
+ (flags & SVf_UTF8) ? -(I32)namelen : (I32)namelen, ref, 0);
+ }
+ return stash;
+}
+