turbidity in av.[ch]
[p5sagit/p5-mst-13.2.git] / mg.c
diff --git a/mg.c b/mg.c
index 4b46ec4..42a0b10 100644 (file)
--- a/mg.c
+++ b/mg.c
 #include "EXTERN.h"
 #include "perl.h"
 
-/* Omit -- it causes too much grief on mixed systems.
+/* XXX If this causes problems, set i_unistd=undef in the hint file.  */
 #ifdef I_UNISTD
 # include <unistd.h>
 #endif
-*/
 
 /*
  * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
@@ -70,7 +69,7 @@ void* p;
            SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
     }
 
-    safefree((void *)mgs);
+    Safefree(mgs);
 }
 
 
@@ -99,6 +98,7 @@ SV* sv;
     MGS* mgs;
     MAGIC* mg;
     MAGIC** mgp;
+    int mgp_valid = 0;
 
     ENTER;
     mgs = save_magic(sv);
@@ -109,12 +109,16 @@ SV* sv;
        if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
            (*vtbl->svt_get)(sv, mg);
            /* Ignore this magic if it's been deleted */
-           if (*mgp == mg && (mg->mg_flags & MGf_GSKIP))
+           if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) && (mg->mg_flags & MGf_GSKIP))
                mgs->mgs_flags = 0;
        }
        /* Advance to next magic (complicated by possible deletion) */
-       if (*mgp == mg)
+       if (mg == (mgp_valid ? *mgp : SvMAGIC(sv))) {
            mgp = &mg->mg_moremagic;
+           mgp_valid = 1;
+       }
+       else
+           mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */
     }
 
     LEAVE;
@@ -659,12 +663,12 @@ MAGIC* mg;
 {
     I32 i;
     /* Are we fetching a signal entry? */
-    i = whichsig(mg->mg_ptr);
+    i = whichsig((mg->mg_len == HEf_SVKEY) ? SvPV((SV*)mg->mg_ptr, na) : mg->mg_ptr);
     if (i) {
        if(psig_ptr[i])
            sv_setsv(sv,psig_ptr[i]);
        else {
-           void (*origsig)(int);
+           void (*origsig) _((int));
            /* get signal state without losing signals */
            sig_trapped=0;
            origsig = rsignal(i,sig_trap);
@@ -689,7 +693,7 @@ MAGIC* mg;
 {
     I32 i;
     /* Are we clearing a signal entry? */
-    i = whichsig(mg->mg_ptr);
+    i = whichsig((mg->mg_len == HEf_SVKEY) ? SvPV((SV*)mg->mg_ptr, na) : mg->mg_ptr);
     if (i) {
        if(psig_ptr[i]) {
            SvREFCNT_dec(psig_ptr[i]);
@@ -740,7 +744,7 @@ MAGIC* mg;
        psig_ptr[i] = SvREFCNT_inc(sv);
        if(psig_name[i])
            SvREFCNT_dec(psig_name[i]);
-       psig_name[i] = newSVpv(mg->mg_ptr,strlen(mg->mg_ptr));
+       psig_name[i] = newSVpv(s,strlen(s));
        SvTEMP_off(sv); /* Make sure it doesn't go away on us */
        SvREADONLY_on(psig_name[i]);
     }
@@ -765,6 +769,8 @@ MAGIC* mg;
            *svp = 0;
     }
     else {
+       if(hints & HINT_STRICT_REFS)
+               die(no_symref,s,"a subroutine");
        if (!strchr(s,':') && !strchr(s,'\'')) {
            sprintf(tokenbuf, "main::%s",s);
            sv_setpv(sv,tokenbuf);
@@ -1024,7 +1030,13 @@ magic_getglob(sv,mg)
 SV* sv;
 MAGIC* mg;
 {
-    gv_efullname(sv,((GV*)sv));/* a gv value, be nice */
+    if (SvFAKE(sv)) {                  /* FAKE globs can get coerced */
+       SvFAKE_off(sv);
+       gv_efullname(sv,((GV*)sv), "*");
+       SvFAKE_on(sv);
+    }
+    else
+       gv_efullname(sv,((GV*)sv), "*");        /* a gv value, be nice */
     return 0;
 }
 
@@ -1454,6 +1466,10 @@ int sig;
     SV *sv;
     CV *cv;
     AV *oldstack;
+    
+    if(!psig_ptr[sig])
+       die("Signal SIG%s received, but no signal handler set.\n",
+       sig_name[sig]);
 
     cv = sv_2cv(psig_ptr[sig],&st,&gv,TRUE);
     if (!cv || !CvROOT(cv)) {