Updates to perlfunc.pod
[p5sagit/p5-mst-13.2.git] / hv.c
diff --git a/hv.c b/hv.c
index ecbd548..1ae7ad9 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -135,7 +135,7 @@ I32 lval;
     if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) {
       char *gotenv;
 
-      gotenv = my_getenv(key);
+      gotenv = ENV_getenv(key);
       if (gotenv != NULL) {
         sv = newSVpv(gotenv,strlen(gotenv));
         return hv_store(hv,key,klen,sv,hash);
@@ -215,7 +215,7 @@ register U32 hash;
     if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) {
       char *gotenv;
 
-      gotenv = my_getenv(key);
+      gotenv = ENV_getenv(key);
       if (gotenv != NULL) {
         sv = newSVpv(gotenv,strlen(gotenv));
         return hv_store_ent(hv,keysv,sv,hash);
@@ -423,7 +423,7 @@ I32 flags;
        if (entry == xhv->xhv_eiter)
            HvLAZYDEL_on(hv);
        else
-           he_free(entry, HvSHAREKEYS(hv));
+           he_free(hv, entry);
        --xhv->xhv_keys;
        return sv;
     }
@@ -485,7 +485,7 @@ U32 hash;
        if (entry == xhv->xhv_eiter)
            HvLAZYDEL_on(hv);
        else
-           he_free(entry, HvSHAREKEYS(hv));
+           he_free(hv, entry);
        --xhv->xhv_keys;
        return sv;
     }
@@ -746,17 +746,20 @@ newHV()
 }
 
 void
-he_free(hent, shared)
+he_free(hv, hent)
+HV *hv;
 register HE *hent;
-I32 shared;
 {
     if (!hent)
        return;
+    if (isGV(HeVAL(hent)) && GvCVu(HeVAL(hent)) && HvNAME(hv))
+       sub_generation++;       /* may be deletion of method from stash */
     SvREFCNT_dec(HeVAL(hent));
     if (HeKLEN(hent) == HEf_SVKEY) {
        SvREFCNT_dec(HeKEY_sv(hent));
         Safefree(HeKEY_hek(hent));
-    } else if (shared)
+    }
+    else if (HvSHAREKEYS(hv))
        unshare_hek(HeKEY_hek(hent));
     else
        Safefree(HeKEY_hek(hent));
@@ -764,17 +767,20 @@ I32 shared;
 }
 
 void
-he_delayfree(hent, shared)
+he_delayfree(hv, hent)
+HV *hv;
 register HE *hent;
-I32 shared;
 {
     if (!hent)
        return;
+    if (isGV(HeVAL(hent)) && GvCVu(HeVAL(hent)) && HvNAME(hv))
+       sub_generation++;       /* may be deletion of method from stash */
     sv_2mortal(HeVAL(hent));   /* free between statements */
     if (HeKLEN(hent) == HEf_SVKEY) {
        sv_2mortal(HeKEY_sv(hent));
        Safefree(HeKEY_hek(hent));
-    } else if (shared)
+    }
+    else if (HvSHAREKEYS(hv))
        unshare_hek(HeKEY_hek(hent));
     else
        Safefree(HeKEY_hek(hent));
@@ -808,7 +814,6 @@ HV *hv;
     register HE *ohent = Null(HE*);
     I32 riter;
     I32 max;
-    I32 shared;
 
     if (!hv)
        return;
@@ -819,12 +824,11 @@ HV *hv;
     max = HvMAX(hv);
     array = HvARRAY(hv);
     hent = array[0];
-    shared = HvSHAREKEYS(hv);
     for (;;) {
        if (hent) {
            ohent = hent;
            hent = HeNEXT(hent);
-           he_free(ohent, shared);
+           he_free(hv, ohent);
        }
        if (!hent) {
            if (++riter > max)
@@ -850,7 +854,7 @@ HV *hv;
        HvNAME(hv) = 0;
     }
     xhv->xhv_array = 0;
-    xhv->xhv_max = 7;          /* it's a normal associative array */
+    xhv->xhv_max = 7;          /* it's a normal hash */
     xhv->xhv_fill = 0;
     xhv->xhv_keys = 0;
 
@@ -862,14 +866,20 @@ I32
 hv_iterinit(hv)
 HV *hv;
 {
-    register XPVHV* xhv = (XPVHV*)SvANY(hv);
-    HE *entry = xhv->xhv_eiter;
+    register XPVHV* xhv;
+    HE *entry;
+
+    if (!hv)
+       croak("Bad hash");
+    xhv = (XPVHV*)SvANY(hv);
+    entry = xhv->xhv_eiter;
 #ifdef DYNAMIC_ENV_FETCH  /* set up %ENV for iteration */
-    if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) prime_env_iter();
+    if (HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME))
+       prime_env_iter();
 #endif
     if (entry && HvLAZYDEL(hv)) {      /* was deleted earlier? */
        HvLAZYDEL_off(hv);
-       he_free(entry, HvSHAREKEYS(hv));
+       he_free(hv, entry);
     }
     xhv->xhv_riter = -1;
     xhv->xhv_eiter = Null(HE*);
@@ -886,7 +896,7 @@ HV *hv;
     MAGIC* mg;
 
     if (!hv)
-       croak("Bad associative array");
+       croak("Bad hash");
     xhv = (XPVHV*)SvANY(hv);
     oldentry = entry = xhv->xhv_eiter;
 
@@ -936,7 +946,7 @@ HV *hv;
 
     if (oldentry && HvLAZYDEL(hv)) {           /* was deleted earlier? */
        HvLAZYDEL_off(hv);
-       he_free(oldentry, HvSHAREKEYS(hv));
+       he_free(hv, oldentry);
     }
 
     xhv->xhv_eiter = entry;