This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge gv_AVadd(), gv_HVadd() and gv_SVadd() into gv_add_by_type().
[perl5.git] / mro.c
diff --git a/mro.c b/mro.c
index c29d38e..23f8c07 100644 (file)
--- a/mro.c
+++ b/mro.c
@@ -37,9 +37,9 @@ Perl_mro_get_private_data(pTHX_ struct mro_meta *const smeta,
     SV **data;
     PERL_ARGS_ASSERT_MRO_GET_PRIVATE_DATA;
 
-    data = Perl_hv_common(aTHX_ smeta->mro_linear_all, NULL,
-                         which->name, which->length, which->kflags,
-                         HV_FETCH_JUST_SV, NULL, which->hash);
+    data = (SV **)Perl_hv_common(aTHX_ smeta->mro_linear_all, NULL,
+                                which->name, which->length, which->kflags,
+                                HV_FETCH_JUST_SV, NULL, which->hash);
     if (!data)
        return NULL;
 
@@ -105,8 +105,8 @@ Perl_mro_get_from_name(pTHX_ SV *name) {
 
     PERL_ARGS_ASSERT_MRO_GET_FROM_NAME;
 
-    data = Perl_hv_common(aTHX_ PL_registered_mros, name, NULL, 0, 0,
-                         HV_FETCH_JUST_SV, NULL, 0);
+    data = (SV **)Perl_hv_common(aTHX_ PL_registered_mros, name, NULL, 0, 0,
+                                HV_FETCH_JUST_SV, NULL, 0);
     if (!data)
        return NULL;
     assert(SvTYPE(*data) == SVt_IV);
@@ -185,41 +185,6 @@ Perl_mro_meta_dup(pTHX_ struct mro_meta* smeta, CLONE_PARAMS* param)
 
 #endif /* USE_ITHREADS */
 
-HV *
-Perl_get_isa_hash(pTHX_ HV *const stash)
-{
-    dVAR;
-    struct mro_meta *const meta = HvMROMETA(stash);
-
-    PERL_ARGS_ASSERT_GET_ISA_HASH;
-
-    if (!meta->isa) {
-       AV *const isa = mro_get_linear_isa(stash);
-       if (!meta->isa) {
-           HV *const isa_hash = newHV();
-           /* Linearisation didn't build it for us, so do it here.  */
-           SV *const *svp = AvARRAY(isa);
-           SV *const *const svp_end = svp + AvFILLp(isa) + 1;
-           const HEK *const canon_name = HvNAME_HEK(stash);
-
-           while (svp < svp_end) {
-               (void) hv_store_ent(isa_hash, *svp++, &PL_sv_undef, 0);
-           }
-
-           (void) hv_common(isa_hash, NULL, HEK_KEY(canon_name),
-                            HEK_LEN(canon_name), HEK_FLAGS(canon_name),
-                            HV_FETCH_ISSTORE, &PL_sv_undef,
-                            HEK_HASH(canon_name));
-           (void) hv_store(isa_hash, "UNIVERSAL", 9, &PL_sv_undef, 0);
-
-           SvREADONLY_on(isa_hash);
-
-           meta->isa = isa_hash;
-       }
-    }
-    return meta->isa;
-}
-
 /*
 =for apidoc mro_get_linear_isa_dfs
 
@@ -473,7 +438,7 @@ Perl_mro_isa_changed_in(pTHX_ HV* stash)
     if(meta->mro_nextmethod) hv_clear(meta->mro_nextmethod);
 
     /* Iterate the isarev (classes that are our children),
-       wiping out their linearization and method caches */
+       wiping out their linearization, method and isa caches */
     if(isarev) {
         hv_iterinit(isarev);
         while((iter = hv_iternext(isarev))) {
@@ -498,6 +463,10 @@ Perl_mro_isa_changed_in(pTHX_ HV* stash)
                 revmeta->cache_gen++;
             if(revmeta->mro_nextmethod)
                 hv_clear(revmeta->mro_nextmethod);
+           if (revmeta->isa) {
+               SvREFCNT_dec(revmeta->isa);
+               revmeta->isa = NULL;
+           }
         }
     }