Add to MANIFEST: README.threads, lib/ISA.pm, lib/Class/Fields.pm
[p5sagit/p5-mst-13.2.git] / av.c
diff --git a/av.c b/av.c
index e3d341c..b9382a8 100644 (file)
--- a/av.c
+++ b/av.c
@@ -30,8 +30,10 @@ AV* av;
     while (key) {
        sv = AvARRAY(av)[--key];
        assert(sv);
-       if (sv != &sv_undef)
+       if (sv != &sv_undef) {
+           dTHR;
            (void)SvREFCNT_inc(sv);
+       }
     }
     key = AvARRAY(av) - AvALLOC(av);
     while (key)
@@ -44,6 +46,7 @@ av_extend(av,key)
 AV *av;
 I32 key;
 {
+    dTHR;                      /* only necessary if we have to extend stack */
     if (key > AvMAX(av)) {
        SV** ary;
        I32 tmp;
@@ -134,6 +137,7 @@ I32 lval;
 
     if (SvRMAGICAL(av)) {
        if (mg_find((SV*)av,'P')) {
+           dTHR;
            sv = sv_newmortal();
            mg_copy((SV*)av, sv, 0, key);
            Sv = sv;
@@ -207,6 +211,7 @@ SV *val;
     ary = AvARRAY(av);
     if (AvFILL(av) < key) {
        if (!AvREAL(av)) {
+           dTHR;
            if (av == curstack && key > stack_sp - stack_base)
                stack_sp = stack_base + key;    /* XPUSH in disguise */
            do
@@ -561,6 +566,32 @@ U32 hash;
     return av_store(av, ind, val);
 }
 
+SV**
+avhv_store_ent(av, keysv, val, hash)
+AV *av;
+SV *keysv;
+SV *val;
+U32 hash;
+{
+    SV **keys;
+    HE *he;
+    I32 ind;
+    
+    keys = av_fetch(av, 0, FALSE);
+    if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
+       croak("Can't coerce array into hash");
+    he = hv_fetch_ent((HV*)SvRV(*keys), keysv, FALSE, hash);
+    if (he) {
+       ind = SvIV(HeVAL(he));
+       if (ind < 1)
+           croak("Bad index while coercing array into hash");
+    } else {
+       ind = AvFILL(av) + 1;
+       hv_store_ent((HV*)SvRV(*keys), keysv, newSViv(ind), hash);
+    }
+    return av_store(av, ind, val);
+}
+
 bool
 avhv_exists_ent(av, keysv, hash)
 AV *av;