cvs commit: ponie/perl av.c gv.c hv.c sv.c sv.h

[email protected] (Nicholas Clark) 7 Apr 2004 13:52:00 -0000
Newsgroups perl.ponie.changes
Message-ID <[email protected]>
cvsuser     04/04/07 06:51:59

  Modified:    perl     av.c gv.c hv.c sv.c sv.h
  Log:
  Invert the bits on any sv_any pointer used to point to a PMC.
  Instant flaming SEGV death for any part of perl that assumes that it
  points straight to a perl struct, and accidentally tries to access it.
  Catches writes that would corrupt parrot's state before the corruption.
  
  Revision  Changes    Path
  1.5       +6 -6      ponie/perl/av.c
  
  Index: av.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/av.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -w -r1.4 -r1.5
  --- av.c	2 Mar 2004 12:03:02 -0000	1.4
  +++ av.c	7 Apr 2004 13:51:58 -0000	1.5
  @@ -23,32 +23,32 @@
   #include "parrot/extend.h"
   
   SV*** Perl_macro_AvARRAY (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
  +  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
     return (SV***)&(data->xav_array);
   }
   
   U8* Perl_macro_AvFLAGS (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
  +  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
     return &(data->xav_flags);
   }
   
   SSize_t* Perl_macro_AvMAX (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
  +  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
     return &(data->xav_max);
   }
   
   SV*** Perl_macro_AvALLOC (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
  +  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
     return &(data->xav_alloc);
   }
   
   SV** Perl_macro_AvARYLEN (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
  +  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
     return &(data->xav_arylen);
   }
   
   SSize_t* Perl_macro_AvFILLp (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(av));
  +  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
     return &(data->xav_fill);
   }
   
  
  
  
  1.5       +5 -5      ponie/perl/gv.c
  
  Index: gv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/gv.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -w -r1.4 -r1.5
  --- gv.c	7 Apr 2004 10:37:27 -0000	1.4
  +++ gv.c	7 Apr 2004 13:51:58 -0000	1.5
  @@ -28,7 +28,7 @@
   
   GP** Perl_macro_GvGP (pTHX_ GV *sv) {
     if(SvPMC(sv)) {
  -    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xgv_gp);
     }
     return &((XPVGV*)SvANY(sv))->xgv_gp;
  @@ -36,7 +36,7 @@
   
   char** Perl_macro_GvNAME (pTHX_ GV *sv) {
     if(SvPMC(sv)) {
  -    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xgv_name);
     }
     return &((XPVGV*)SvANY(sv))->xgv_name;
  @@ -44,7 +44,7 @@
   
   STRLEN* Perl_macro_GvNAMELEN (pTHX_ GV *sv) {
     if(SvPMC(sv)) {
  -    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xgv_namelen);
     }
     return &((XPVGV*)SvANY(sv))->xgv_namelen;
  @@ -52,7 +52,7 @@
   
   HV** Perl_macro_GvSTASH (pTHX_ GV *sv) {
     if(SvPMC(sv)) {
  -    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xgv_stash);
     }
     return &((XPVGV*)SvANY(sv))->xgv_stash;
  @@ -60,7 +60,7 @@
   
   U8* Perl_macro_GvFLAGS (pTHX_ GV *sv) {
     if(SvPMC(sv)) {
  -    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xgv_flags);
     }
     return &((XPVGV*)SvANY(sv))->xgv_flags;
  
  
  
  1.8       +10 -10    ponie/perl/hv.c
  
  Index: hv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/hv.c,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -w -r1.7 -r1.8
  --- hv.c	7 Apr 2004 10:37:27 -0000	1.7
  +++ hv.c	7 Apr 2004 13:51:58 -0000	1.8
  @@ -25,52 +25,52 @@
   #define HV_MAX_LENGTH_BEFORE_SPLIT 14
   
   HE*** Perl_macro_HvARRAY (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return (HE***)&data->xhv_array;
   }
   
   
   XPVHV* Perl_macro_HvDATA (pTHX_ HV *hv) {
  -  return (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  return (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
   }
   
   STRLEN* Perl_macro_HvFILL (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return &(data->xhv_fill);
   }
   
   STRLEN* Perl_macro_HvMAX (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return &(data->xhv_max);
   }
   
   I32* Perl_macro_HvRITER (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return &(data->xhv_riter);
   }
   
   HE** Perl_macro_HvEITER (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return &(data->xhv_eiter);
   }
   
   PMOP** Perl_macro_HvPMROOT (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return &(data->xhv_pmroot);
   }
   
   char** Perl_macro_HvNAME (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return &(data->xhv_name);
   }
   
   IV* Perl_macro_XHvTOTALKEYS (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return &(data->xhv_keys);
   }
   
   NV* Perl_macro_XHvPLACEHOLDERS (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(hv));
  +  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
     return &(data->xhv_placeholders);
   }
   
  
  
  
  1.20      +37 -37    ponie/perl/sv.c
  
  Index: sv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/sv.c,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -w -r1.19 -r1.20
  --- sv.c	7 Apr 2004 10:37:28 -0000	1.19
  +++ sv.c	7 Apr 2004 13:51:58 -0000	1.20
  @@ -1004,7 +1004,7 @@
     
     hv = Parrot_PMC_new(PL_Parrot, type);
     Parrot_register_pmc(PL_Parrot, hv);
  -  return hv;
  +  return MUMBLE(hv);
   }
   
   /* return a struct xpvhv to the free list */
  @@ -1095,7 +1095,7 @@
       
       av = Parrot_PMC_new(PL_Parrot, type);
       Parrot_register_pmc(PL_Parrot, av);
  -    return av;
  +    return MUMBLE(av);
   }
   
   
  @@ -1118,7 +1118,7 @@
       */
   
       Parrot_register_pmc(PL_Parrot, lval);
  -    return lval;
  +    return MUMBLE(lval);
   }
   
   /* return a struct xpvlv to the free list */
  @@ -1287,7 +1287,7 @@
   
   MAGIC** Perl_macro_SvMAGIC (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xmg_magic);
     }
     return &((XPVMG*)SvANY(sv))->xmg_magic;
  @@ -1295,7 +1295,7 @@
   
   HV** Perl_macro_SvSTASH (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xmg_stash);
     }
     return &((XPVMG*)SvANY(sv))->xmg_stash;
  @@ -1304,7 +1304,7 @@
   
   SV** Perl_macro_SvRV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XRV* data = (XRV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XRV* data = (XRV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xrv_rv);
     }
     return &((XRV*)SvANY(sv))->xrv_rv;
  @@ -1314,7 +1314,7 @@
   
   UV* Perl_macro_SvUVX (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVUV* data = (XPVUV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVUV* data = (XPVUV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xuv_uv);
     }
     return &((XPVUV*)SvANY(sv))->xuv_uv;
  @@ -1323,7 +1323,7 @@
   
   NV* Perl_macro_SvNVX (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVNV* data = (XPVNV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVNV* data = (XPVNV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xnv_nv);
     }
     return &((XPVNV*)SvANY(sv))->xnv_nv;
  @@ -1332,7 +1332,7 @@
   
   IV* Perl_macro_SvIVX (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIV* data = (XPVIV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIV* data = (XPVIV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xiv_iv);
     }
     return &((XPVIV*)SvANY(sv))->xiv_iv;
  @@ -1341,7 +1341,7 @@
   
   char** Perl_macro_SvPVX (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xpv_pv);
     }
     return &((XPV*)SvANY(sv))->xpv_pv;
  @@ -1350,7 +1350,7 @@
   
   STRLEN* Perl_macro_SvLEN (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xpv_len);
     }
     return &((XPV*)SvANY(sv))->xpv_len;
  @@ -1359,7 +1359,7 @@
   
   STRLEN* Perl_macro_SvCUR (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xpv_cur);
     }
     return &((XPV*)SvANY(sv))->xpv_cur;
  @@ -1368,7 +1368,7 @@
   
   U8* Perl_macro_BmRARE (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xbm_rare);
     }
     return &((XPVBM*)SvANY(sv))->xbm_rare;
  @@ -1376,7 +1376,7 @@
   
   I32* Perl_macro_BmUSEFUL (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xbm_useful);
     }
     return &((XPVBM*)SvANY(sv))->xbm_useful;
  @@ -1384,7 +1384,7 @@
   
   U16* Perl_macro_BmPREVIOUS (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xbm_previous);
     }
     return &((XPVBM*)SvANY(sv))->xbm_previous;
  @@ -1392,7 +1392,7 @@
   
   IV* Perl_macro_FmLINES (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVFM* data = (XPVFM*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVFM* data = (XPVFM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xfm_lines);
     }
     return &((XPVFM*)SvANY(sv))->xfm_lines;
  @@ -1402,7 +1402,7 @@
     XPVLV* data;
     if(!SvPMC(sv))
       abort();
  -  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));  
  +  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));  
     return &(data->xlv_type);
   }
   
  @@ -1410,7 +1410,7 @@
     XPVLV* data;
     if(!SvPMC(sv))
       abort();
  -  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));  
  +  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));  
     return &(data->xlv_targ);
   }
   
  @@ -1418,7 +1418,7 @@
     XPVLV* data;
     if(!SvPMC(sv))
       abort();  
  -  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));  
  +  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));  
     return &(data->xlv_targoff);
   }
   
  @@ -1426,13 +1426,13 @@
     XPVLV* data;
     if(!SvPMC(sv))
       abort();
  -  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));  
  +  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));  
     return &(data->xlv_targlen);  
   }
   
   PerlIO** Perl_macro_IoIFP (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_ifp);
     }
     return &((XPVIO*)SvANY(sv))->xio_ifp;
  @@ -1440,7 +1440,7 @@
   
   PerlIO** Perl_macro_IoOFP (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_ofp);
     }
     return &((XPVIO*)SvANY(sv))->xio_ofp;
  @@ -1448,7 +1448,7 @@
   
   DIR** Perl_macro_IoDIRP (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_dirp);
     }
     return &((XPVIO*)SvANY(sv))->xio_dirp;
  @@ -1456,7 +1456,7 @@
   
   void** Perl_macro_IoANY (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_any);
     }
     return &((XPVIO*)SvANY(sv))->xio_any;
  @@ -1464,7 +1464,7 @@
   
   IV* Perl_macro_IoLINES (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_lines);
     }
     return &((XPVIO*)SvANY(sv))->xio_lines;
  @@ -1472,7 +1472,7 @@
   
   IV* Perl_macro_IoPAGE (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_page);
     }
     return &((XPVIO*)SvANY(sv))->xio_page;
  @@ -1480,7 +1480,7 @@
   
   IV* Perl_macro_IoPAGE_LEN (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_page_len);
     }
     return &((XPVIO*)SvANY(sv))->xio_page_len;
  @@ -1488,7 +1488,7 @@
   
   IV* Perl_macro_IoLINES_LEFT (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_lines_left);
     }
     return &((XPVIO*)SvANY(sv))->xio_lines_left;
  @@ -1496,7 +1496,7 @@
   
   char** Perl_macro_IoTOP_NAME (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_top_name);
     }
     return &((XPVIO*)SvANY(sv))->xio_top_name;
  @@ -1504,7 +1504,7 @@
   
   GV** Perl_macro_IoTOP_GV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_top_gv);
     }
     return &((XPVIO*)SvANY(sv))->xio_top_gv;
  @@ -1512,7 +1512,7 @@
   
   char** Perl_macro_IoFMT_NAME (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_fmt_name);
     }
     return &((XPVIO*)SvANY(sv))->xio_fmt_name;
  @@ -1520,7 +1520,7 @@
   
   GV** Perl_macro_IoFMT_GV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_fmt_gv);
     }
     return &((XPVIO*)SvANY(sv))->xio_fmt_gv;
  @@ -1528,7 +1528,7 @@
   
   char** Perl_macro_IoBOTTOM_NAME (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_bottom_name);
     }
     return &((XPVIO*)SvANY(sv))->xio_bottom_name;
  @@ -1536,7 +1536,7 @@
   
   GV** Perl_macro_IoBOTTOM_GV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_bottom_gv);
     }
     return &((XPVIO*)SvANY(sv))->xio_bottom_gv;
  @@ -1544,7 +1544,7 @@
   
   short* Perl_macro_IoSUBPROCESS (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_subprocess);
     }
     return &((XPVIO*)SvANY(sv))->xio_subprocess;
  @@ -1552,7 +1552,7 @@
   
   char* Perl_macro_IoTYPE (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_type);
     }
     return &((XPVIO*)SvANY(sv))->xio_type;
  @@ -1560,7 +1560,7 @@
   
   char* Perl_macro_IoFLAGS (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, SvANY(sv));
  +    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
       return &(data->xio_flags);
     }
     return &((XPVIO*)SvANY(sv))->xio_flags;
  
  
  
  1.15      +11 -0     ponie/perl/sv.h
  
  Index: sv.h
  ===================================================================
  RCS file: /cvs/public/ponie/perl/sv.h,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -w -r1.14 -r1.15
  --- sv.h	7 Apr 2004 10:37:28 -0000	1.14
  +++ sv.h	7 Apr 2004 13:51:58 -0000	1.15
  @@ -1292,3 +1292,14 @@
     UV  flags;
     PerlInterpreter *proto_perl;
   };
  +
  +#if 1
  +/* Invert the bits on any sv_any pointer used to point to a PMC.
  +   Instant flaming SEGV death for any part of perl that assumes that it
  +   points straight to a perl struct, and accidentally tries to access it.
  +   Catches writes that would corrupt parrot's state before the corruption.
  +*/
  +#define MUMBLE(p) ((void *)((p)?~(UV)(p):0))
  +#else
  +#define MUMBLE(p) p
  +#endif