turbidity in av.[ch]
[p5sagit/p5-mst-13.2.git] / mg.c
diff --git a/mg.c b/mg.c
index 31c542e..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);
 }
 
 
@@ -664,7 +663,7 @@ 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]);
@@ -694,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]);
@@ -745,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]);
     }
@@ -1031,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;
 }