cvs commit: ponie/perl av.c embed.fnc gv.c hv.c proto.h sv.c util.c

[email protected] (Nicholas Clark) 16 Jun 2004 10:22:22 -0000
Newsgroups perl.ponie.changes
Message-ID <[email protected]>
cvsuser     04/06/16 03:22:22

  Modified:    perl     av.c embed.fnc gv.c hv.c proto.h sv.c util.c
  Log:
  Seemingly a great step backwards. Remove all the PMCs. ie step 2 in
  
  1:			2:			3:
  
  Head			Head			PMC
   |			 |			 |
   +-> PMC		 .			 +-> Head
        |			 .			      |
        +-> Body		 + - - -> Body		      +-> Body
  
  Revision  Changes    Path
  1.6       +6 -6      ponie/perl/av.c
  
  Index: av.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/av.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -w -r1.5 -r1.6
  --- av.c	7 Apr 2004 13:51:58 -0000	1.5
  +++ av.c	16 Jun 2004 10:22:19 -0000	1.6
  @@ -23,32 +23,32 @@
   #include "parrot/extend.h"
   
   SV*** Perl_macro_AvARRAY (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
  +  XPVAV* data = (XPVAV*) /**/ SvANY(av);
     return (SV***)&(data->xav_array);
   }
   
   U8* Perl_macro_AvFLAGS (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
  +  XPVAV* data = (XPVAV*) /**/ SvANY(av);
     return &(data->xav_flags);
   }
   
   SSize_t* Perl_macro_AvMAX (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
  +  XPVAV* data = (XPVAV*) /**/ SvANY(av);
     return &(data->xav_max);
   }
   
   SV*** Perl_macro_AvALLOC (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
  +  XPVAV* data = (XPVAV*) /**/ SvANY(av);
     return &(data->xav_alloc);
   }
   
   SV** Perl_macro_AvARYLEN (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
  +  XPVAV* data = (XPVAV*) /**/ SvANY(av);
     return &(data->xav_arylen);
   }
   
   SSize_t* Perl_macro_AvFILLp (pTHX_ AV *av) {
  -  XPVAV* data = (XPVAV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(av)));
  +  XPVAV* data = (XPVAV*) /**/ SvANY(av);
     return &(data->xav_fill);
   }
   
  
  
  
  1.26      +29 -29    ponie/perl/embed.fnc
  
  Index: embed.fnc
  ===================================================================
  RCS file: /cvs/public/ponie/perl/embed.fnc,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -w -r1.25 -r1.26
  --- embed.fnc	13 Jun 2004 20:38:53 -0000	1.25
  +++ embed.fnc	16 Jun 2004 10:22:19 -0000	1.26
  @@ -1268,35 +1268,35 @@
   s	|void	|more_xpvlv
   s	|void	|more_xpvbm
   s	|void	|more_xrv
  -s	|Parrot_PMC	|new_xiv
  -s	|Parrot_PMC	|new_xnv
  -s	|Parrot_PMC	|new_xpv
  -s	|Parrot_PMC	|new_xpviv
  -s	|Parrot_PMC	|new_xpvnv
  -s	|Parrot_PMC	|new_xpvcv
  -s	|Parrot_PMC	|new_xpvav
  -s	|Parrot_PMC	|new_xpvhv
  -s	|Parrot_PMC	|new_xpvio
  -s	|Parrot_PMC	|new_xpvfm
  -s	|Parrot_PMC	|new_xpvmg
  -s	|Parrot_PMC	|new_xpvlv
  -s	|Parrot_PMC	|new_xpvbm
  -s	|Parrot_PMC	|new_xpvgv
  -s	|Parrot_PMC	|new_xrv
  -s	|void	|del_xiv	|Parrot_PMC p
  -s	|void	|del_xnv	|Parrot_PMC p
  -s	|void	|del_xpv	|Parrot_PMC p
  -s	|void	|del_xpviv	|Parrot_PMC p
  -s	|void	|del_xpvnv	|Parrot_PMC p
  -s	|void	|del_xpvcv	|Parrot_PMC p
  -s	|void	|del_xpvav	|Parrot_PMC p
  -s	|void	|del_xpvhv	|Parrot_PMC p
  -s	|void	|del_xpvio	|Parrot_PMC p
  -s	|void	|del_xpvfm	|Parrot_PMC p
  -s	|void	|del_xpvmg	|Parrot_PMC p
  -s	|void	|del_xpvlv	|Parrot_PMC p
  -s	|void	|del_xpvbm	|Parrot_PMC p
  -s	|void	|del_xpvgv	|Parrot_PMC p
  +s	|XPVIV*	|new_xiv
  +s	|XPVNV*	|new_xnv
  +s	|XPV*	|new_xpv
  +s	|XPVIV*	|new_xpviv
  +s	|XPVNV*	|new_xpvnv
  +s	|XPVCV*	|new_xpvcv
  +s	|XPVAV*	|new_xpvav
  +s	|XPVHV*	|new_xpvhv
  +s	|XPVIO*	|new_xpvio
  +s	|XPVFM*	|new_xpvfm
  +s	|XPVMG*	|new_xpvmg
  +s	|XPVLV*	|new_xpvlv
  +s	|XPVBM*	|new_xpvbm
  +s	|XPVGV*	|new_xpvgv
  +s	|XRV*	|new_xrv
  +s	|void	|del_xiv	|XPVIV* p
  +s	|void	|del_xnv	|XPVNV* p
  +s	|void	|del_xpv	|XPV* p
  +s	|void	|del_xpviv	|XPVIV* p
  +s	|void	|del_xpvnv	|XPVNV* p
  +s	|void	|del_xpvcv	|XPVCV* p
  +s	|void	|del_xpvav	|XPVAV* p
  +s	|void	|del_xpvhv	|XPVHV* p
  +s	|void	|del_xpvio	|XPVIO* p
  +s	|void	|del_xpvfm	|XPVFM* p
  +s	|void	|del_xpvmg	|XPVMG* p
  +s	|void	|del_xpvlv	|XPVLV* p
  +s	|void	|del_xpvbm	|XPVBM* p
  +s	|void	|del_xpvgv	|XPVGV* p
   s	|void	|del_xrv	|XRV* p
   s	|void	|zero_xpvfm	|SV *fm
   s	|void	|zero_xpvcv	|SV *cv
  
  
  
  1.6       +5 -5      ponie/perl/gv.c
  
  Index: gv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/gv.c,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -w -r1.5 -r1.6
  --- gv.c	7 Apr 2004 13:51:58 -0000	1.5
  +++ gv.c	16 Jun 2004 10:22:19 -0000	1.6
  @@ -28,7 +28,7 @@
   
   GP** Perl_macro_GvGP (pTHX_ GV *sv) {
     if(SvPMC(sv)) {
  -    XPVGV* data = (XPVGV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVGV* data = (XPVGV*) /**/ 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, MUMBLE(SvANY(sv)));
  +    XPVGV* data = (XPVGV*) /**/ 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, MUMBLE(SvANY(sv)));
  +    XPVGV* data = (XPVGV*) /**/ 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, MUMBLE(SvANY(sv)));
  +    XPVGV* data = (XPVGV*) /**/ 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, MUMBLE(SvANY(sv)));
  +    XPVGV* data = (XPVGV*) /**/ SvANY(sv);
       return &(data->xgv_flags);
     }
     return &((XPVGV*)SvANY(sv))->xgv_flags;
  
  
  
  1.9       +10 -10    ponie/perl/hv.c
  
  Index: hv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/hv.c,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -w -r1.8 -r1.9
  --- hv.c	7 Apr 2004 13:51:58 -0000	1.8
  +++ hv.c	16 Jun 2004 10:22:19 -0000	1.9
  @@ -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, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return (HE***)&data->xhv_array;
   }
   
   
   XPVHV* Perl_macro_HvDATA (pTHX_ HV *hv) {
  -  return (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  return (XPVHV*) /**/ SvANY(hv);
   }
   
   STRLEN* Perl_macro_HvFILL (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return &(data->xhv_fill);
   }
   
   STRLEN* Perl_macro_HvMAX (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return &(data->xhv_max);
   }
   
   I32* Perl_macro_HvRITER (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return &(data->xhv_riter);
   }
   
   HE** Perl_macro_HvEITER (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return &(data->xhv_eiter);
   }
   
   PMOP** Perl_macro_HvPMROOT (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return &(data->xhv_pmroot);
   }
   
   char** Perl_macro_HvNAME (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return &(data->xhv_name);
   }
   
   IV* Perl_macro_XHvTOTALKEYS (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return &(data->xhv_keys);
   }
   
   NV* Perl_macro_XHvPLACEHOLDERS (pTHX_ HV *hv) {
  -  XPVHV* data = (XPVHV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(hv)));
  +  XPVHV* data = (XPVHV*) /**/ SvANY(hv);
     return &(data->xhv_placeholders);
   }
   
  
  
  
  1.26      +29 -29    ponie/perl/proto.h
  
  Index: proto.h
  ===================================================================
  RCS file: /cvs/public/ponie/perl/proto.h,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -w -r1.25 -r1.26
  --- proto.h	13 Jun 2004 20:38:53 -0000	1.25
  +++ proto.h	16 Jun 2004 10:22:20 -0000	1.26
  @@ -1220,35 +1220,35 @@
   STATIC void	S_more_xpvlv(pTHX);
   STATIC void	S_more_xpvbm(pTHX);
   STATIC void	S_more_xrv(pTHX);
  -STATIC Parrot_PMC	S_new_xiv(pTHX);
  -STATIC Parrot_PMC	S_new_xnv(pTHX);
  -STATIC Parrot_PMC	S_new_xpv(pTHX);
  -STATIC Parrot_PMC	S_new_xpviv(pTHX);
  -STATIC Parrot_PMC	S_new_xpvnv(pTHX);
  -STATIC Parrot_PMC	S_new_xpvcv(pTHX);
  -STATIC Parrot_PMC	S_new_xpvav(pTHX);
  -STATIC Parrot_PMC	S_new_xpvhv(pTHX);
  -STATIC Parrot_PMC	S_new_xpvio(pTHX);
  -STATIC Parrot_PMC	S_new_xpvfm(pTHX);
  -STATIC Parrot_PMC	S_new_xpvmg(pTHX);
  -STATIC Parrot_PMC	S_new_xpvlv(pTHX);
  -STATIC Parrot_PMC	S_new_xpvbm(pTHX);
  -STATIC Parrot_PMC	S_new_xpvgv(pTHX);
  -STATIC Parrot_PMC	S_new_xrv(pTHX);
  -STATIC void	S_del_xiv(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xnv(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpv(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpviv(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvnv(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvcv(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvav(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvhv(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvio(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvfm(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvmg(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvlv(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvbm(pTHX_ Parrot_PMC p);
  -STATIC void	S_del_xpvgv(pTHX_ Parrot_PMC p);
  +STATIC XPVIV*	S_new_xiv(pTHX);
  +STATIC XPVNV*	S_new_xnv(pTHX);
  +STATIC XPV*	S_new_xpv(pTHX);
  +STATIC XPVIV*	S_new_xpviv(pTHX);
  +STATIC XPVNV*	S_new_xpvnv(pTHX);
  +STATIC XPVCV*	S_new_xpvcv(pTHX);
  +STATIC XPVAV*	S_new_xpvav(pTHX);
  +STATIC XPVHV*	S_new_xpvhv(pTHX);
  +STATIC XPVIO*	S_new_xpvio(pTHX);
  +STATIC XPVFM*	S_new_xpvfm(pTHX);
  +STATIC XPVMG*	S_new_xpvmg(pTHX);
  +STATIC XPVLV*	S_new_xpvlv(pTHX);
  +STATIC XPVBM*	S_new_xpvbm(pTHX);
  +STATIC XPVGV*	S_new_xpvgv(pTHX);
  +STATIC XRV*	S_new_xrv(pTHX);
  +STATIC void	S_del_xiv(pTHX_ XPVIV* p);
  +STATIC void	S_del_xnv(pTHX_ XPVNV* p);
  +STATIC void	S_del_xpv(pTHX_ XPV* p);
  +STATIC void	S_del_xpviv(pTHX_ XPVIV* p);
  +STATIC void	S_del_xpvnv(pTHX_ XPVNV* p);
  +STATIC void	S_del_xpvcv(pTHX_ XPVCV* p);
  +STATIC void	S_del_xpvav(pTHX_ XPVAV* p);
  +STATIC void	S_del_xpvhv(pTHX_ XPVHV* p);
  +STATIC void	S_del_xpvio(pTHX_ XPVIO* p);
  +STATIC void	S_del_xpvfm(pTHX_ XPVFM* p);
  +STATIC void	S_del_xpvmg(pTHX_ XPVMG* p);
  +STATIC void	S_del_xpvlv(pTHX_ XPVLV* p);
  +STATIC void	S_del_xpvbm(pTHX_ XPVBM* p);
  +STATIC void	S_del_xpvgv(pTHX_ XPVGV* p);
   STATIC void	S_del_xrv(pTHX_ XRV* p);
   STATIC void	S_zero_xpvfm(pTHX_ SV *fm);
   STATIC void	S_zero_xpvcv(pTHX_ SV *cv);
  
  
  
  1.34      +244 -214  ponie/perl/sv.c
  
  Index: sv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/sv.c,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -w -r1.33 -r1.34
  --- sv.c	13 Jun 2004 20:38:53 -0000	1.33
  +++ sv.c	16 Jun 2004 10:22:20 -0000	1.34
  @@ -615,21 +615,32 @@
   
   /* grab a new IV body from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPVIV*
   S_new_xiv(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5IV");
  -  Parrot_PMC  pviv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, pviv);
  -  return MUMBLE(pviv);
  +    IV* xiv;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xiv_root)
  +	more_xiv();
  +    xiv = PL_xiv_root;
  +    /*
  +     * See comment in more_xiv() -- RAM.
  +     */
  +    PL_xiv_root = *(IV**)xiv;
  +    UNLOCK_SV_MUTEX;
  +    return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
   }
   
   /* return an IV body to the free list */
   
   STATIC void
  -S_del_xiv(pTHX_ Parrot_PMC p)
  +S_del_xiv(pTHX_ XPVIV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
  +    LOCK_SV_MUTEX;
  +    *(IV**)xiv = PL_xiv_root;
  +    PL_xiv_root = xiv;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of IV bodies */
  @@ -657,24 +668,31 @@
   
   /* grab a new NV body from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPVNV*
   S_new_xnv(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5NV");
  -  Parrot_PMC  pvnv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, pvnv);
  -  return MUMBLE(pvnv);
  +    NV* xnv;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xnv_root)
  +	more_xnv();
  +    xnv = PL_xnv_root;
  +    PL_xnv_root = *(NV**)xnv;
  +    UNLOCK_SV_MUTEX;
  +    return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
   }
   
   /* return an NV body to the free list */
   
   STATIC void
  -S_del_xnv(pTHX_ Parrot_PMC p)
  +S_del_xnv(pTHX_ XPVNV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
  +    LOCK_SV_MUTEX;
  +    *(NV**)xnv = PL_xnv_root;
  +    PL_xnv_root = xnv;
  +    UNLOCK_SV_MUTEX;
   }
   
  -
   /* allocate another arena's worth of NV bodies */
   
   STATIC void
  @@ -700,18 +718,17 @@
   
   /* grab a new struct xrv from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XRV*
   S_new_xrv(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5RV");
  -  Parrot_PMC  rv;
  -  /*
  -    Instead of giving back a real XRV we give back a PMC
  -  */
  -
  -  rv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, rv);
  -  return MUMBLE(rv);
  +    XRV* xrv;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xrv_root)
  +	more_xrv();
  +    xrv = PL_xrv_root;
  +    PL_xrv_root = (XRV*)xrv->xrv_rv;
  +    UNLOCK_SV_MUTEX;
  +    return xrv;
   }
   
   /* return a struct xrv to the free list */
  @@ -719,7 +736,10 @@
   STATIC void
   S_del_xrv(pTHX_ XRV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    LOCK_SV_MUTEX;
  +    p->xrv_rv = (SV*)PL_xrv_root;
  +    PL_xrv_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xrv */
  @@ -747,26 +767,28 @@
   
   /* grab a new struct xpv from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPV*
   S_new_xpv(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PV");
  -  Parrot_PMC  pv;
  -  /*
  -    Instead of giving back a real XPV we give back a PMC
  -  */
  -
  -  pv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, pv);
  -  return MUMBLE(pv);
  +    XPV* xpv;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xpv_root)
  +	more_xpv();
  +    xpv = PL_xpv_root;
  +    PL_xpv_root = (XPV*)xpv->xpv_pv;
  +    UNLOCK_SV_MUTEX;
  +    return xpv;
   }
   
   /* return a struct xpv to the free list */
   
   STATIC void
  -S_del_xpv(pTHX_ Parrot_PMC p)
  +S_del_xpv(pTHX_ XPV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    LOCK_SV_MUTEX;
  +    p->xpv_pv = (char*)PL_xpv_root;
  +    PL_xpv_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpv */
  @@ -791,21 +813,28 @@
   
   /* grab a new struct xpviv from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPVIV*
   S_new_xpviv(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVIV");
  -  Parrot_PMC  pviv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, pviv);
  -  return MUMBLE(pviv);
  +    XPVIV* xpviv;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xpviv_root)
  +	more_xpviv();
  +    xpviv = PL_xpviv_root;
  +    PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
  +    UNLOCK_SV_MUTEX;
  +    return xpviv;
   }
   
   /* return a struct xpviv to the free list */
   
   STATIC void
  -S_del_xpviv(pTHX_ Parrot_PMC p)
  +S_del_xpviv(pTHX_ XPVIV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    LOCK_SV_MUTEX;
  +    p->xpv_pv = (char*)PL_xpviv_root;
  +    PL_xpviv_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpviv */
  @@ -830,21 +859,28 @@
   
   /* grab a new struct xpvnv from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPVNV*
   S_new_xpvnv(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVNV");
  -  Parrot_PMC  pvnv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, pvnv);
  -  return MUMBLE(pvnv);
  +    XPVNV* xpvnv;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xpvnv_root)
  +	more_xpvnv();
  +    xpvnv = PL_xpvnv_root;
  +    PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
  +    UNLOCK_SV_MUTEX;
  +    return xpvnv;
   }
   
   /* return a struct xpvnv to the free list */
   
   STATIC void
  -S_del_xpvnv(pTHX_ Parrot_PMC p)
  +S_del_xpvnv(pTHX_ XPVNV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    LOCK_SV_MUTEX;
  +    p->xpv_pv = (char*)PL_xpvnv_root;
  +    PL_xpvnv_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpvnv */
  @@ -869,28 +905,28 @@
   
   /* grab a new struct xpvcv from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPVCV*
   S_new_xpvcv(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVCV");
  -  Parrot_PMC  cv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, cv);
  -  return MUMBLE(cv);
  +    XPVCV* xpvcv;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xpvcv_root)
  +	more_xpvcv();
  +    xpvcv = PL_xpvcv_root;
  +    PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
  +    UNLOCK_SV_MUTEX;
  +    return xpvcv;
   }
   
   /* return a struct xpvcv to the free list */
   
   STATIC void
  -S_del_xpvcv(pTHX_ Parrot_PMC cv)
  -{
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(cv));
  -}
  -
  -void
  -S_zero_xpvcv(pTHX_ SV *fm)
  +S_del_xpvcv(pTHX_ XPVCV *p)
   {
  -  assert(SvPMC(fm));
  -  Zero(Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(fm))), 1, XPVCV);
  +    LOCK_SV_MUTEX;
  +    p->xpv_pv = (char*)PL_xpvcv_root;
  +    PL_xpvcv_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpvcv */
  @@ -915,13 +951,28 @@
   
   /* grab a new struct xpvav from the free list, allocating more if necessary */
   
  +STATIC XPVAV*
  +S_new_xpvav(pTHX)
  +{
  +    XPVAV* xpvav;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xpvav_root)
  +	more_xpvav();
  +    xpvav = PL_xpvav_root;
  +    PL_xpvav_root = (XPVAV*)xpvav->xav_array;
  +    UNLOCK_SV_MUTEX;
  +    return xpvav;
  +}
   
   /* return a struct xpvav to the free list */
   
   STATIC void
  -S_del_xpvav(pTHX_ Parrot_PMC av)
  +S_del_xpvav(pTHX_ XPVAV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(av));
  +    LOCK_SV_MUTEX;
  +    p->xav_array = (char*)PL_xpvav_root;
  +    PL_xpvav_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpvav */
  @@ -946,10 +997,10 @@
   
   /* grab a new struct xpvhv from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPVHV*
   S_new_xpvhv(pTHX)
   {
  -  /*    XPVHV* xpvhv;
  +    XPVHV* xpvhv;
       LOCK_SV_MUTEX;
       if (!PL_xpvhv_root)
   	more_xpvhv();
  @@ -957,26 +1008,17 @@
       PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
       UNLOCK_SV_MUTEX;
       return xpvhv;
  -  */
  - 
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVHV");
  -  Parrot_PMC  hv;
  -  /*
  -    Instead of giving back a real XPVLV we give back a PMC
  -  */
  -        
  -  
  -  hv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, hv);
  -  return MUMBLE(hv);
   }
   
   /* return a struct xpvhv to the free list */
   
   STATIC void
  -S_del_xpvhv(pTHX_ Parrot_PMC p)
  +S_del_xpvhv(pTHX_ XPVHV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    LOCK_SV_MUTEX;
  +    p->xhv_array = (char*)PL_xpvhv_root;
  +    PL_xpvhv_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpvhv */
  @@ -1001,21 +1043,28 @@
   
   /* grab a new struct xpvmg from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPVMG*
   S_new_xpvmg(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVMG");
  -  Parrot_PMC  pvpvmg = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, pvpvmg);
  -  return MUMBLE(pvpvmg);
  +    XPVMG* xpvmg;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xpvmg_root)
  +	more_xpvmg();
  +    xpvmg = PL_xpvmg_root;
  +    PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
  +    UNLOCK_SV_MUTEX;
  +    return xpvmg;
   }
   
  -/* return an PVMG body to the free list */
  +/* return a struct xpvmg to the free list */
   
   STATIC void
  -S_del_xpvmg(pTHX_ Parrot_PMC p)
  +S_del_xpvmg(pTHX_ XPVMG *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    LOCK_SV_MUTEX;
  +    p->xpv_pv = (char*)PL_xpvmg_root;
  +    PL_xpvmg_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpvmg */
  @@ -1040,49 +1089,28 @@
   
   /* grab a new struct xpvlv from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  -S_new_xpvav(pTHX)
  -{
  -    Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVAV");
  -    Parrot_PMC  av;
  -    /*
  -      Instead of giving back a real XPVLV we give back a PMC
  -    */
  -        
  -    
  -    av = Parrot_PMC_new(PL_Parrot, type);
  -    Parrot_register_pmc(PL_Parrot, av);
  -    return MUMBLE(av);
  -}
  -
  -
  -STATIC Parrot_PMC
  +STATIC XPVLV*
   S_new_xpvlv(pTHX)
   {
  -    Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVLV");
  -    Parrot_PMC  lval;
  -    /*
  -      Instead of giving back a real XPVLV we give back a PMC
  -      
  -    */
  -    
  -    
  -    
  -    lval = Parrot_PMC_new(PL_Parrot, type);
  -    /*    PerlIO_printf(Perl_debug_log,
  -		  "Create a new PMC %p\n",lval);
  -    */
  -
  -    Parrot_register_pmc(PL_Parrot, lval);
  -    return MUMBLE(lval);
  +    XPVLV* xpvlv;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xpvlv_root)
  +	more_xpvlv();
  +    xpvlv = PL_xpvlv_root;
  +    PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
  +    UNLOCK_SV_MUTEX;
  +    return xpvlv;
   }
   
   /* return a struct xpvlv to the free list */
   
   STATIC void
  -S_del_xpvlv(pTHX_ Parrot_PMC lval)
  +S_del_xpvlv(pTHX_ XPVLV *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(lval));
  +    LOCK_SV_MUTEX;
  +    p->xpv_pv = (char*)PL_xpvlv_root;
  +    PL_xpvlv_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpvlv */
  @@ -1107,21 +1135,28 @@
   
   /* grab a new struct xpvbm from the free list, allocating more if necessary */
   
  -STATIC Parrot_PMC
  +STATIC XPVBM*
   S_new_xpvbm(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVBM");
  -  Parrot_PMC  pvbm = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, pvbm);
  -  return MUMBLE(pvbm);
  +    XPVBM* xpvbm;
  +    LOCK_SV_MUTEX;
  +    if (!PL_xpvbm_root)
  +	more_xpvbm();
  +    xpvbm = PL_xpvbm_root;
  +    PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
  +    UNLOCK_SV_MUTEX;
  +    return xpvbm;
   }
   
   /* return a struct xpvbm to the free list */
   
   STATIC void
  -S_del_xpvbm(pTHX_ Parrot_PMC p)
  +S_del_xpvbm(pTHX_ XPVBM *p)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  +    LOCK_SV_MUTEX;
  +    p->xpv_pv = (char*)PL_xpvbm_root;
  +    PL_xpvbm_root = p;
  +    UNLOCK_SV_MUTEX;
   }
   
   /* allocate another arena's worth of struct xpvbm */
  @@ -1144,23 +1179,6 @@
       xpvbm->xpv_pv = 0;
   }
   
  -STATIC Parrot_PMC
  -S_new_xpvgv(pTHX)
  -{
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVGV");
  -  Parrot_PMC  pvgv = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, pvgv);
  -  return MUMBLE(pvgv);
  -}
  -
  -/* return a struct xpvgv to the free list */
  -
  -STATIC void
  -S_del_xpvgv(pTHX_ Parrot_PMC p)
  -{
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(p));
  -}
  -
   #define my_safemalloc(s)	(void*)safemalloc(s)
   #define my_safefree(p)	safefree((char*)p)
   
  @@ -1243,7 +1261,7 @@
   #endif /* PURIFY */
   
   #define new_XPVGV()	(void*)new_xpvgv()
  -#define del_XPVGV(p)	del_xpvfm((XPVGV *)p)
  +#define del_XPVGV(p)	del_xpvgv((XPVGV *)p)
   
   #define new_XPVFM()	(void*)new_xpvfm()
   #define del_XPVFM(p)	del_xpvfm((XPVFM *)p)
  @@ -1251,32 +1269,37 @@
   #define new_XPVIO()	(void*)new_xpvio()
   #define del_XPVIO(p)	del_xpvio((XPVIO *)p)
   
  -STATIC Parrot_PMC
  +STATIC XPVGV *
  +S_new_xpvgv(pTHX)
  +{
  +  return my_safemalloc(sizeof(XPVGV));
  +}
  +STATIC void
  +S_del_xpvgv(pTHX_ XPVGV *fm)
  +{
  +  my_safefree(fm);
  +}
  +
  +STATIC XPVFM *
   S_new_xpvfm(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVFM");
  -  Parrot_PMC  fm = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, fm);
  -  return MUMBLE(fm);
  +  return my_safemalloc(sizeof(XPVFM));
   }
   STATIC void
  -S_del_xpvfm(pTHX_ Parrot_PMC fm)
  +S_del_xpvfm(pTHX_ XPVFM *fm)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(fm));
  +  my_safefree(fm);
   }
   
  -STATIC Parrot_PMC
  +STATIC XPVIO *
   S_new_xpvio(pTHX)
   {
  -  Parrot_Int  type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVIO");
  -  Parrot_PMC  io = Parrot_PMC_new(PL_Parrot, type);
  -  Parrot_register_pmc(PL_Parrot, io);
  -  return MUMBLE(io);
  +  return my_safemalloc(sizeof(XPVIO));
   }
   STATIC void
  -S_del_xpvio(pTHX_ Parrot_PMC io)
  +S_del_xpvio(pTHX_ XPVIO*io)
   {
  -  Parrot_unregister_pmc(PL_Parrot, MUMBLE(io));
  +  my_safefree(io);
   }
   
   void**
  @@ -1295,7 +1318,7 @@
   
   MAGIC** Perl_macro_SvMAGIC (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVMG* data = (XPVMG*) /**/ SvANY(sv);
       return &(data->xmg_magic);
     }
     return &((XPVMG*)SvANY(sv))->xmg_magic;
  @@ -1303,7 +1326,7 @@
   
   HV** Perl_macro_SvSTASH (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVMG* data = (XPVMG*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVMG* data = (XPVMG*) /**/ SvANY(sv);
       return &(data->xmg_stash);
     }
     return &((XPVMG*)SvANY(sv))->xmg_stash;
  @@ -1312,7 +1335,7 @@
   
   SV** Perl_macro_SvRV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XRV* data = (XRV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XRV* data = (XRV*) /**/ SvANY(sv);
       return &(data->xrv_rv);
     }
     return &((XRV*)SvANY(sv))->xrv_rv;
  @@ -1322,7 +1345,7 @@
   
   UV* Perl_macro_SvUVX (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVUV* data = (XPVUV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVUV* data = (XPVUV*) /**/ SvANY(sv);
       return &(data->xuv_uv);
     }
     return &((XPVUV*)SvANY(sv))->xuv_uv;
  @@ -1331,7 +1354,7 @@
   
   NV* Perl_macro_SvNVX (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVNV* data = (XPVNV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVNV* data = (XPVNV*) /**/ SvANY(sv);
       return &(data->xnv_nv);
     }
     return &((XPVNV*)SvANY(sv))->xnv_nv;
  @@ -1340,7 +1363,7 @@
   
   IV* Perl_macro_SvIVX (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIV* data = (XPVIV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIV* data = (XPVIV*) /**/ SvANY(sv);
       return &(data->xiv_iv);
     }
     return &((XPVIV*)SvANY(sv))->xiv_iv;
  @@ -1349,7 +1372,7 @@
   
   char** Perl_macro_SvPVX (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPV* data = (XPV*) /**/ SvANY(sv);
       return &(data->xpv_pv);
     }
     return &((XPV*)SvANY(sv))->xpv_pv;
  @@ -1358,7 +1381,7 @@
   
   STRLEN* Perl_macro_SvLEN (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPV* data = (XPV*) /**/ SvANY(sv);
       return &(data->xpv_len);
     }
     return &((XPV*)SvANY(sv))->xpv_len;
  @@ -1367,7 +1390,7 @@
   
   STRLEN* Perl_macro_SvCUR (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPV* data = (XPV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPV* data = (XPV*) /**/ SvANY(sv);
       return &(data->xpv_cur);
     }
     return &((XPV*)SvANY(sv))->xpv_cur;
  @@ -1376,7 +1399,7 @@
   
   U8* Perl_macro_BmRARE (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVBM* data = (XPVBM*) /**/ SvANY(sv);
       return &(data->xbm_rare);
     }
     return &((XPVBM*)SvANY(sv))->xbm_rare;
  @@ -1384,7 +1407,7 @@
   
   I32* Perl_macro_BmUSEFUL (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVBM* data = (XPVBM*) /**/ SvANY(sv);
       return &(data->xbm_useful);
     }
     return &((XPVBM*)SvANY(sv))->xbm_useful;
  @@ -1392,7 +1415,7 @@
   
   U16* Perl_macro_BmPREVIOUS (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVBM* data = (XPVBM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVBM* data = (XPVBM*) /**/ SvANY(sv);
       return &(data->xbm_previous);
     }
     return &((XPVBM*)SvANY(sv))->xbm_previous;
  @@ -1400,7 +1423,7 @@
   
   IV* Perl_macro_FmLINES (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVFM* data = (XPVFM*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVFM* data = (XPVFM*) /**/ SvANY(sv);
       return &(data->xfm_lines);
     }
     return &((XPVFM*)SvANY(sv))->xfm_lines;
  @@ -1410,7 +1433,7 @@
     XPVLV* data;
     if(!SvPMC(sv))
       abort();
  -  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));  
  +  data = (XPVLV*) /**/ SvANY(sv);  
     return &(data->xlv_type);
   }
   
  @@ -1418,7 +1441,7 @@
     XPVLV* data;
     if(!SvPMC(sv))
       abort();
  -  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));  
  +  data = (XPVLV*) /**/ SvANY(sv);  
     return &(data->xlv_targ);
   }
   
  @@ -1426,7 +1449,7 @@
     XPVLV* data;
     if(!SvPMC(sv))
       abort();  
  -  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));  
  +  data = (XPVLV*) /**/ SvANY(sv);  
     return &(data->xlv_targoff);
   }
   
  @@ -1434,13 +1457,13 @@
     XPVLV* data;
     if(!SvPMC(sv))
       abort();
  -  data = (XPVLV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));  
  +  data = (XPVLV*) /**/ 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, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_ifp);
     }
     return &((XPVIO*)SvANY(sv))->xio_ifp;
  @@ -1448,7 +1471,7 @@
   
   PerlIO** Perl_macro_IoOFP (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_ofp);
     }
     return &((XPVIO*)SvANY(sv))->xio_ofp;
  @@ -1456,7 +1479,7 @@
   
   DIR** Perl_macro_IoDIRP (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_dirp);
     }
     return &((XPVIO*)SvANY(sv))->xio_dirp;
  @@ -1464,7 +1487,7 @@
   
   void** Perl_macro_IoANY (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_any);
     }
     return &((XPVIO*)SvANY(sv))->xio_any;
  @@ -1472,7 +1495,7 @@
   
   IV* Perl_macro_IoLINES (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_lines);
     }
     return &((XPVIO*)SvANY(sv))->xio_lines;
  @@ -1480,7 +1503,7 @@
   
   IV* Perl_macro_IoPAGE (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_page);
     }
     return &((XPVIO*)SvANY(sv))->xio_page;
  @@ -1488,7 +1511,7 @@
   
   IV* Perl_macro_IoPAGE_LEN (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_page_len);
     }
     return &((XPVIO*)SvANY(sv))->xio_page_len;
  @@ -1496,7 +1519,7 @@
   
   IV* Perl_macro_IoLINES_LEFT (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_lines_left);
     }
     return &((XPVIO*)SvANY(sv))->xio_lines_left;
  @@ -1504,7 +1527,7 @@
   
   char** Perl_macro_IoTOP_NAME (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_top_name);
     }
     return &((XPVIO*)SvANY(sv))->xio_top_name;
  @@ -1512,7 +1535,7 @@
   
   GV** Perl_macro_IoTOP_GV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_top_gv);
     }
     return &((XPVIO*)SvANY(sv))->xio_top_gv;
  @@ -1520,7 +1543,7 @@
   
   char** Perl_macro_IoFMT_NAME (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_fmt_name);
     }
     return &((XPVIO*)SvANY(sv))->xio_fmt_name;
  @@ -1528,7 +1551,7 @@
   
   GV** Perl_macro_IoFMT_GV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_fmt_gv);
     }
     return &((XPVIO*)SvANY(sv))->xio_fmt_gv;
  @@ -1536,7 +1559,7 @@
   
   char** Perl_macro_IoBOTTOM_NAME (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_bottom_name);
     }
     return &((XPVIO*)SvANY(sv))->xio_bottom_name;
  @@ -1544,7 +1567,7 @@
   
   GV** Perl_macro_IoBOTTOM_GV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_bottom_gv);
     }
     return &((XPVIO*)SvANY(sv))->xio_bottom_gv;
  @@ -1552,7 +1575,7 @@
   
   short* Perl_macro_IoSUBPROCESS (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_subprocess);
     }
     return &((XPVIO*)SvANY(sv))->xio_subprocess;
  @@ -1560,7 +1583,7 @@
   
   char* Perl_macro_IoTYPE (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_type);
     }
     return &((XPVIO*)SvANY(sv))->xio_type;
  @@ -1568,7 +1591,7 @@
   
   char* Perl_macro_IoFLAGS (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVIO* data = (XPVIO*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVIO* data = (XPVIO*) /**/ SvANY(sv);
       return &(data->xio_flags);
     }
     return &((XPVIO*)SvANY(sv))->xio_flags;
  @@ -1576,7 +1599,7 @@
   
   HV** Perl_macro_CvSTASH (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_stash);
     }
     return &((XPVCV*)SvANY(sv))->xcv_stash;
  @@ -1584,7 +1607,7 @@
   
   OP** Perl_macro_CvSTART (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_start);
     }
     return &((XPVCV*)SvANY(sv))->xcv_start;
  @@ -1592,7 +1615,7 @@
   
   OP** Perl_macro_CvROOT (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_root);
     }
     return &((XPVCV*)SvANY(sv))->xcv_root;
  @@ -1600,7 +1623,7 @@
   
   xpvcv_xcv_xsub_t * Perl_macro_CvXSUB (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_xsub);
     }
     return &((XPVCV*)SvANY(sv))->xcv_xsub;
  @@ -1608,7 +1631,7 @@
   
   ANY* Perl_macro_CvXSUBANY (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_xsubany);
     }
     return &((XPVCV*)SvANY(sv))->xcv_xsubany;
  @@ -1616,7 +1639,7 @@
   
   GV** Perl_macro_CvGV (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_gv);
     }
     return &((XPVCV*)SvANY(sv))->xcv_gv;
  @@ -1624,7 +1647,7 @@
   
   char** Perl_macro_CvFILE (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_file);
     }
     return &((XPVCV*)SvANY(sv))->xcv_file;
  @@ -1632,7 +1655,7 @@
   
   long* Perl_macro_CvDEPTH (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_depth);
     }
     return &((XPVCV*)SvANY(sv))->xcv_depth;
  @@ -1640,7 +1663,7 @@
   
   PADLIST** Perl_macro_CvPADLIST (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_padlist);
     }
     return &((XPVCV*)SvANY(sv))->xcv_padlist;
  @@ -1648,7 +1671,7 @@
   
   CV** Perl_macro_CvOUTSIDE (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_outside);
     }
     return &((XPVCV*)SvANY(sv))->xcv_outside;
  @@ -1656,7 +1679,7 @@
   
   cv_flags_t* Perl_macro_CvFLAGS (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_flags);
     }
     return &((XPVCV*)SvANY(sv))->xcv_flags;
  @@ -1664,7 +1687,7 @@
   
   U32* Perl_macro_CvOUTSIDE_SEQ (pTHX_ SV *sv) {
     if(SvPMC(sv)) {
  -    XPVCV* data = (XPVCV*) Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(sv)));
  +    XPVCV* data = (XPVCV*) /**/ SvANY(sv);
       return &(data->xcv_outside_seq);
     }
     return &((XPVCV*)SvANY(sv))->xcv_outside_seq;
  @@ -1675,14 +1698,21 @@
   S_zero_xpvfm(pTHX_ SV *fm)
   {
     assert(SvPMC(fm));
  -  Zero(Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(fm))), 1, XPVFM);
  +  Zero(/**/ SvANY(fm), 1, XPVFM);
   }
   
   void
   S_zero_xpvio(pTHX_ SV *io)
   {
     assert(SvPMC(io));
  -  Zero(Parrot_PMC_get_pointer(PL_Parrot, MUMBLE(SvANY(io))), 1, XPVIO);
  +  Zero(/**/ SvANY(io), 1, XPVIO);
  +}
  +
  +void
  +S_zero_xpvcv(pTHX_ SV *fm)
  +{
  +  assert(SvPMC(fm));
  +  Zero(/**/ SvANY(fm), 1, XPVCV);
   }
   
   
  
  
  
  1.5       +9 -7      ponie/perl/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/util.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -w -r1.4 -r1.5
  --- util.c	13 Jun 2004 16:40:05 -0000	1.4
  +++ util.c	16 Jun 2004 10:22:20 -0000	1.5
  @@ -817,8 +817,9 @@
   S_mess_alloc(pTHX)
   {
       SV *sv;
  -    Parrot_Int  type;
  -    Parrot_PMC  pvpvmg;
  +    /*Parrot_Int  type;
  +      Parrot_PMC  pvpvmg;*/
  +    XPVMG *any;
   
       if (!PL_dirty)
   	return sv_2mortal(newSVpvn("",0));
  @@ -828,14 +829,15 @@
   
       /* Create as PVMG now, to avoid any upgrading later */
   
  -    type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVMG");
  -    pvpvmg = Parrot_PMC_new(PL_Parrot, type);
  -    Parrot_register_pmc(PL_Parrot, pvpvmg);
  -    Zero(Parrot_PMC_get_pointer(PL_Parrot, pvpvmg), 1, XPVMG);
  +    /*type = Parrot_PMC_typenum(PL_Parrot, "Perl5PVMG");*/
  +    /*pvpvmg = Parrot_PMC_new(PL_Parrot, type);*/
  +    /*Parrot_register_pmc(PL_Parrot, pvpvmg);*/
  +    /*Zero(Parrot_PMC_get_pointer(PL_Parrot, pvpvmg), 1, XPVMG);*/
   
       New(905, sv, 1, SV);
  +    Newz(905, any, 1, XPVMG);
       SvFLAGS(sv) = SVt_PVMG;
  -    SvANY(sv) = (void*)MUMBLE(pvpvmg);
  +    SvANY(sv) = /*(void*)MUMBLE(pvpvmg);*/ any;
       SvREFCNT(sv) = 1 << 30; /* practically infinite */
       SvPMC_on(sv);
       PL_mess_sv = sv;