cvs commit: ponie/src/pmc perl5cargo_cult.pmc perl5iv.pmc perl5null.pmc perl5nv.pmc perl5pv.pmc perl5pvav.pmc perl5pvbm.pmc perl5pvcv.pmc perl5pvfm.pmc perl5pvgv.pmc perl5pvhv.pmc perl5pvio.pmc perl5pviv.pmc perl5pvlv.pmc perl5pvmg.pmc perl5pvnv.pmc perl5rv.pmc

[email protected] (Nicholas Clark) 29 Apr 2005 23:47:21 -0000
Newsgroups perl.ponie.changes
Message-ID <[email protected]>
cvsuser     05/04/29 16:47:21

  Modified:    src/pmc  perl5cargo_cult.pmc perl5iv.pmc perl5null.pmc
                        perl5nv.pmc perl5pv.pmc perl5pvav.pmc perl5pvbm.pmc
                        perl5pvcv.pmc perl5pvfm.pmc perl5pvgv.pmc
                        perl5pvhv.pmc perl5pvio.pmc perl5pviv.pmc
                        perl5pvlv.pmc perl5pvmg.pmc perl5pvnv.pmc
                        perl5rv.pmc
  Log:
  Morphing part 2 - write the value into the new PMC with a vtable call
  
  Revision  Changes    Path
  1.51      +9 -300    ponie/src/pmc/perl5cargo_cult.pmc
  
  Index: perl5cargo_cult.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5cargo_cult.pmc,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- perl5cargo_cult.pmc	29 Apr 2005 22:11:31 -0000	1.50
  +++ perl5cargo_cult.pmc	29 Apr 2005 23:47:21 -0000	1.51
  @@ -33,304 +33,6 @@
         & (SVs_GMG|SVs_SMG|SVs_RMG);
   }
   
  -/* Refactor this when it gets chopped into morph code.  */
  -#define new_XPV()	(void*)new_xpv()
  -
  -#define new_XPVIV()	(void*)new_xpviv()
  -
  -#define new_XPVNV()	(void*)new_xpvnv()
  -
  -#define new_XPVCV()	(void*)new_xpvcv()
  -#define del_XPVCV(p)	del_xpvcv((XPVCV *)p)
  -
  -#define new_XPVAV()	(void*)new_xpvav()
  -#define del_XPVAV(p)	del_xpvav((XPVAV *)p)
  -
  -#define new_XPVHV()	(void*)new_xpvhv()
  -#define del_XPVHV(p)	del_xpvhv((XPVHV *)p)
  -
  -#define new_XPVMG()	(void*)new_xpvmg()
  -
  -#define new_XPVLV()	(void*)new_xpvlv()
  -#define del_XPVLV(p)	del_xpvlv((XPVLV *)p)
  -
  -#define new_XPVBM()	(void*)new_xpvbm()
  -#define del_XPVBM(p)	del_xpvbm((XPVBM *)p)
  -
  -#define new_XPVGV()	(void*)new_xpvgv()
  -#define del_XPVGV(p)	del_xpvgv((XPVGV *)p)
  -
  -#define new_XPVFM()	(void*)new_xpvfm()
  -#define del_XPVFM(p)	del_xpvfm((XPVFM *)p)
  -
  -#define new_XPVIO()	(void*)new_xpvio()
  -#define del_XPVIO(p)	del_xpvio((XPVIO *)p)
  -
  -static void do_upgrade(PMC *pmc, struct Ponie_upgrade_info *info) {
  -    char*	pv = info->value.pv;
  -    SV*		rv = info->value.rv;
  -    U32		cur = info->value.cur;
  -    U32		len = info->value.len;
  -    IV		iv = info->value.iv;
  -    NV		nv = info->value.nv;
  -    MAGIC*	magic = info->value.magic;
  -    HV*		stash = info->value.stash;
  -    int		sv_is_rv = info->value.sv_is_rv;
  -    U32		mt = info->p5_type;
  -
  -    SV *sv = MUMBLE(pmc);
  -
  -    /* This is SvTYPE_set(sv, mt): */
  -    ((struct STRUCT_SV *)PMC_struct_val(pmc))->sv_flags &= ~SVTYPEMASK;
  -    ((struct STRUCT_SV *)PMC_struct_val(pmc))->sv_flags |= mt;
  -
  -    switch (mt) {
  -    case SVt_NULL:
  -	Perl_croak(aTHX_ "Can't upgrade to undef");
  -    case SVt_IV:
  -	SvANY(sv) = 0;
  -	SvPMC_on(sv);
  -	SvIV_set(sv, iv);
  -	break;
  -    case SVt_NV:
  -	SvANY(sv) = 0;
  -	SvPMC_on(sv);
  -	SvNV_set(sv, nv);
  -	break;
  -    case SVt_RV:
  -	SvANY(sv) = 0;
  -	SvPMC_on(sv);
  -	SvRV_set(sv, rv);
  -	break;
  -    case SVt_PV:
  -	SvANY(sv) = new_XPV();
  -	SvPMC_on(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	break;
  -    case SVt_PVIV:
  -	SvANY(sv) = new_XPVIV();
  -	SvPMC_on(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	if (SvNIOK(sv))
  -	    (void)SvIOK_on(sv);
  -	SvNOK_off(sv);
  -	break;
  -    case SVt_PVNV:
  -	SvANY(sv) = new_XPVNV();
  -	SvPMC_on(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	SvNV_set(sv, nv);
  -	break;
  -    case SVt_PVMG:
  -	SvANY(sv) = new_XPVMG();
  -	SvPMC_on(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	SvNV_set(sv, nv);
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	break;
  -    case SVt_PVLV:
  -	SvANY(sv)       = new_XPVLV();
  -	SvPMC_on(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	SvNV_set(sv, nv);
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	LvTARGOFF(sv)	= 0;
  -	LvTARGLEN(sv)	= 0;
  -	LvTARG(sv)	= 0;
  -	LvTYPE(sv)	= 0;
  -	GvGP(sv)	= 0;
  -	GvNAME(sv)	= 0;
  -	GvNAMELEN(sv)	= 0;
  -	GvSTASH(sv)	= 0;
  -	GvFLAGS(sv)	= 0;
  -	break;
  -    case SVt_PVAV:
  -	SvANY(sv) = new_XPVAV();
  -	if (pv)
  -	    Safefree(pv);
  -	if (sv_is_rv) {
  -	    /* XXX need more paranoia here?  */
  -	    SvRV_set(sv, 0);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, (char*)0);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	AvMAX(sv)	= -1;
  -	AvFILLp(sv)	= -1;
  -	SvIV_set(sv, 0);
  -	SvNV_set(sv, 0.0);
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	AvALLOC(sv)	= 0;
  -	AvARYLEN(sv)	= 0;
  -	AvFLAGS(sv)	= AVf_REAL;
  -	break;
  -    case SVt_PVHV:
  -	SvANY(sv) = new_XPVHV();
  -	if (pv)
  -	    Safefree(pv);
  -	if (sv_is_rv) {
  -	    /* XXX need more paranoia here?  */
  -	    SvRV_set(sv, 0);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, (char*)0);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	HvFILL(sv)	= 0;
  -	HvMAX(sv)	= 0;
  -	HvTOTALKEYS(sv)	= 0;
  -	HvPLACEHOLDERS(sv) = 0;
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	HvRITER(sv)	= 0;
  -	HvEITER(sv)	= 0;
  -	HvPMROOT(sv)	= 0;
  -	HvNAME(sv)	= 0;
  -	break;
  -    case SVt_PVCV:
  -	SvANY(sv) = new_XPVCV();
  -	SvPMC_on(sv);
  -	zero_xpvcv(sv);
  -	assert (!sv_is_rv);
  -	SvPV_set(sv, pv);
  -	Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	SvNV_set(sv, nv);
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	break;
  -    case SVt_PVGV:
  -	SvANY(sv) = new_XPVGV();
  -	SvPMC_on(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	SvNV_set(sv, nv);
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	GvGP(sv)	= 0;
  -	GvNAME(sv)	= 0;
  -	GvNAMELEN(sv)	= 0;
  -	GvSTASH(sv)	= 0;
  -	GvFLAGS(sv)	= 0;
  -	break;
  -    case SVt_PVBM:
  -	SvANY(sv) = new_XPVBM();
  -	SvPMC_on(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	SvNV_set(sv, nv);
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	BmRARE(sv)	= 0;
  -	BmUSEFUL(sv)	= 0;
  -	BmPREVIOUS(sv)	= 0;
  -	break;
  -    case SVt_PVFM:
  -	SvANY(sv) = new_XPVFM();
  -	SvPMC_on(sv);
  -	zero_xpvfm(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	SvNV_set(sv, nv);
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	break;
  -    case SVt_PVIO:
  -	SvANY(sv) = new_XPVIO();
  -	SvPMC_on(sv);
  -	zero_xpvio(sv);
  -	if (sv_is_rv) {
  -	    SvRV_set(sv, rv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_PVX_0, 0);
  -	} else {
  -	    SvPV_set(sv, pv);
  -	    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv), Ponie_P_RVX_0, 0);
  -	}
  -	SvCUR_set(sv, cur);
  -	SvLEN_set(sv, len);
  -	SvIV_set(sv, iv);
  -	SvNV_set(sv, nv);
  -	SvMAGIC_set(sv, magic);
  -	SvSTASH_set(sv, stash);
  -	IoPAGE_LEN(sv)	= 60;
  -	break;
  -    }
  -}
  -
   pmclass Perl5cargo_cult dynpmc {
   
       void init () {	
  @@ -1019,9 +721,16 @@
                   struct Ponie_upgrade_info info;
   
                   info.p5_type = value;
  +                /* This may change the value of p5_type  */
                   DYNSELF.set_pointer_keyed_int(Ponie_P_GET_UPGRADE, &info);
                   DYNSELF.morph(PL_pmcname[info.p5_type]);
  -                do_upgrade(SELF, &info);
  +
  +                ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
  +                    &= ~SVTYPEMASK;
  +                ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
  +                    |= info.p5_type;
  +
  +                DYNSELF.set_pointer_keyed_int(Ponie_P_SET_UPGRADE, &info);
               }
               return;
   
  
  
  
  1.2       +13 -3     ponie/src/pmc/perl5iv.pmc
  
  Index: perl5iv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5iv.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5iv.pmc	29 Apr 2005 22:11:31 -0000	1.1
  +++ perl5iv.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -32,9 +32,19 @@
                   else if (mt < SVt_PVIV)
                       info->p5_type = SVt_PVIV;
                   break;
  -            default:
  -                SUPER(key, value);
               }
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = 0;
  +                SvIV_set(sv, val->iv);
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
           }
       }
   }
  
  
  
  1.2       +4 -1      ponie/src/pmc/perl5null.pmc
  
  Index: perl5null.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5null.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5null.pmc	29 Apr 2005 22:11:31 -0000	1.1
  +++ perl5null.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -21,6 +21,9 @@
               memset(&((struct Ponie_upgrade_info *)value)->value, 0,
                      sizeof(struct Ponie_upgrade_value));
               break;
  +        case Ponie_P_SET_UPGRADE:
  +            Perl_croak(aTHX_ "Can't upgrade to undef");
  +            break;
           default:
               SUPER(key, value);
           }
  
  
  
  1.2       +13 -3     ponie/src/pmc/perl5nv.pmc
  
  Index: perl5nv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5nv.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5nv.pmc	29 Apr 2005 22:11:31 -0000	1.1
  +++ perl5nv.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -30,9 +30,19 @@
                   if (mt < SVt_PVNV)
                       info->p5_type = SVt_PVNV;
                   break;
  -            default:
  -                SUPER(key, value);
               }
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +
  +                SvANY(sv) = 0;
  +                SvNV_set(sv, val->nv);
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
           }
       }
   }
  
  
  
  1.2       +24 -3     ponie/src/pmc/perl5pv.pmc
  
  Index: perl5pv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pv.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5pv.pmc	29 Apr 2005 22:11:31 -0000	1.1
  +++ perl5pv.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -12,6 +12,7 @@
   
   #include "ponie.h"
   
  +#define new_XPV()	(void*)new_xpv()
   #define del_XPV(p)	del_xpv((XPV *)p)
   
   pmclass Perl5PV extends Perl5base dynpmc group Perl5_group {
  @@ -43,9 +44,29 @@
                   else if (mt == SVt_NV)
                       info->p5_type = SVt_PVNV;
                   break;
  -            default:
  -                SUPER(key, value);
               }
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPV();
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
           }
       }
   }
  
  
  
  1.2       +47 -1     ponie/src/pmc/perl5pvav.pmc
  
  Index: perl5pvav.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvav.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5pvav.pmc	27 Apr 2005 14:32:22 -0000	1.1
  +++ perl5pvav.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -10,5 +10,51 @@
    *  References:
    */
   
  +#include "ponie.h"
  +
  +#define new_XPVAV()	(void*)new_xpvav()
  +#define del_XPVAV(p)	del_xpvav((XPVAV *)p)
  +
   pmclass Perl5PVAV extends Perl5PVMG dynpmc group Perl5_group {
  +    void set_pointer_keyed_int(INTVAL key, void *value) {
  +        switch (key) {
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +		SvANY(sv) = new_XPVAV();
  +		assert(!val->pv);
  +		assert(!val->rv);
  +
  +		SvRV_set(sv, 0);
  +		SvPV_set(sv, (char*)0);
  +
  +		AvMAX(sv)	= -1;
  +		AvFILLp(sv)	= -1;
  +		SvIV_set(sv, 0);
  +		SvNV_set(sv, 0.0);
  +		/* I think that these two can only be NULL.  */
  +		SvMAGIC_set(sv, val->magic);
  +		SvSTASH_set(sv, val->stash);
  +		AvALLOC(sv)	= 0;
  +		AvARYLEN(sv)	= 0;
  +		AvFLAGS(sv)	= AVf_REAL;
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
  +        }
  +    }
   }
  +
  +/*
  + * Local variables:
  + * c-indentation-style: bsd
  + * c-basic-offset: 4
  + * indent-tabs-mode: nil
  + * End:
  + *
  + * vim: expandtab shiftwidth=4:
  +*/
  
  
  
  1.2       +51 -1     ponie/src/pmc/perl5pvbm.pmc
  
  Index: perl5pvbm.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvbm.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5pvbm.pmc	27 Apr 2005 14:32:22 -0000	1.1
  +++ perl5pvbm.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -10,5 +10,55 @@
    *  References:
    */
   
  +#include "ponie.h"
  +
  +#define new_XPVBM()	(void*)new_xpvbm()
  +#define del_XPVBM(p)	del_xpvbm((XPVBM *)p)
  +
   pmclass Perl5PVBM extends Perl5PVMG dynpmc group Perl5_group {
  +
  +    void set_pointer_keyed_int(INTVAL key, void *value) {
  +        switch (key) {
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPVBM();
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                SvIV_set(sv, val->iv);
  +                SvNV_set(sv, val->nv);
  +                SvMAGIC_set(sv, val->magic);
  +                SvSTASH_set(sv, val->stash);
  +
  +		BmRARE(sv)	= 0;
  +		BmUSEFUL(sv)	= 0;
  +		BmPREVIOUS(sv)	= 0;
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
  +        }
  +    }
   }
  +
  +/*
  + * Local variables:
  + * c-indentation-style: bsd
  + * c-basic-offset: 4
  + * indent-tabs-mode: nil
  + * End:
  + *
  + * vim: expandtab shiftwidth=4:
  +*/
  
  
  
  1.2       +42 -1     ponie/src/pmc/perl5pvcv.pmc
  
  Index: perl5pvcv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvcv.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5pvcv.pmc	27 Apr 2005 14:32:22 -0000	1.1
  +++ perl5pvcv.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -10,5 +10,46 @@
    *  References:
    */
   
  +#include "ponie.h"
  +
  +#define new_XPVCV()	(void*)new_xpvcv()
  +#define del_XPVCV(p)	del_xpvcv((XPVCV *)p)
  +
   pmclass Perl5PVCV extends Perl5PVMG dynpmc group Perl5_group {
  +    void set_pointer_keyed_int(INTVAL key, void *value) {
  +        switch (key) {
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +
  +		SvANY(sv) = new_XPVCV();
  +		zero_xpvcv(sv);
  +		assert (!val->sv_is_rv);
  +		SvPV_set(sv, val->pv);
  +		Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +					      Ponie_P_RVX_0, 0);
  +		SvCUR_set(sv, val->cur);
  +		SvLEN_set(sv, val->len);
  +		SvIV_set(sv, val->iv);
  +		SvNV_set(sv, val->nv);
  +		SvMAGIC_set(sv, val->magic);
  +		SvSTASH_set(sv, val->stash);
  +		break;
  +            }
  +        default:
  +            SUPER(key, value);
  +        }
  +    }
   }
  +
  +/*
  + * Local variables:
  + * c-indentation-style: bsd
  + * c-basic-offset: 4
  + * indent-tabs-mode: nil
  + * End:
  + *
  + * vim: expandtab shiftwidth=4:
  +*/
  
  
  
  1.2       +48 -1     ponie/src/pmc/perl5pvfm.pmc
  
  Index: perl5pvfm.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvfm.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5pvfm.pmc	27 Apr 2005 14:32:22 -0000	1.1
  +++ perl5pvfm.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -10,5 +10,52 @@
    *  References:
    */
   
  +#include "ponie.h"
  +
  +#define new_XPVFM()	(void*)new_xpvfm()
  +#define del_XPVFM(p)	del_xpvfm((XPVFM *)p)
  +
   pmclass Perl5PVFM extends Perl5PVCV dynpmc group Perl5_group {
  +
  +    void set_pointer_keyed_int(INTVAL key, void *value) {
  +        switch (key) {
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPVFM();
  +		zero_xpvfm(sv);
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                SvIV_set(sv, val->iv);
  +                SvNV_set(sv, val->nv);
  +                SvMAGIC_set(sv, val->magic);
  +                SvSTASH_set(sv, val->stash);
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
  +        }
  +    }
   }
  +
  +/*
  + * Local variables:
  + * c-indentation-style: bsd
  + * c-basic-offset: 4
  + * indent-tabs-mode: nil
  + * End:
  + *
  + * vim: expandtab shiftwidth=4:
  +*/
  
  
  
  1.3       +34 -1     ponie/src/pmc/perl5pvgv.pmc
  
  Index: perl5pvgv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvgv.pmc,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- perl5pvgv.pmc	29 Apr 2005 22:11:31 -0000	1.2
  +++ perl5pvgv.pmc	29 Apr 2005 23:47:21 -0000	1.3
  @@ -12,10 +12,43 @@
   
   #include "ponie.h"
   
  +#define new_XPVGV()	(void*)new_xpvgv()
  +#define del_XPVGV(p)	del_xpvgv((XPVGV *)p)
  +
   pmclass Perl5PVGV extends Perl5PVMG dynpmc group Perl5_group {
   
       void set_pointer_keyed_int(INTVAL key, void *value) {
           switch (key) {
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPVGV();
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                SvIV_set(sv, val->iv);
  +                SvNV_set(sv, val->nv);
  +                SvMAGIC_set(sv, val->magic);
  +                SvSTASH_set(sv, val->stash);
  +
  +                GvGP(sv)	= 0;
  +                GvNAME(sv)	= 0;
  +                GvNAMELEN(sv)	= 0;
  +                GvSTASH(sv)	= 0;
  +                GvFLAGS(sv)	= 0;
  +                break;
  +            }
           case Ponie_P_UNGLOB:
               {
                   SELF->vtable = Parrot_base_vtables[PL_pmcname[SVt_PVMG]];
  
  
  
  1.2       +48 -1     ponie/src/pmc/perl5pvhv.pmc
  
  Index: perl5pvhv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvhv.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5pvhv.pmc	27 Apr 2005 14:32:22 -0000	1.1
  +++ perl5pvhv.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -10,5 +10,52 @@
    *  References:
    */
   
  +#include "ponie.h"
  +
  +#define new_XPVHV()	(void*)new_xpvhv()
  +#define del_XPVHV(p)	del_xpvhv((XPVHV *)p)
  +
   pmclass Perl5PVHV extends Perl5PVMG dynpmc group Perl5_group {
  +    void set_pointer_keyed_int(INTVAL key, void *value) {
  +        switch (key) {
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +
  +		SvANY(sv) = new_XPVHV();
  +		assert(!val->pv);
  +		assert(!val->rv);
  +
  +		SvRV_set(sv, 0);
  +		SvPV_set(sv, (char*)0);
  +
  +		HvFILL(sv)	= 0;
  +		HvMAX(sv)	= 0;
  +		HvTOTALKEYS(sv)	= 0;
  +		HvPLACEHOLDERS(sv) = 0;
  +		/* I think that these two can only be NULL.  */
  +		SvMAGIC_set(sv, val->magic);
  +		SvSTASH_set(sv, val->stash);
  +		HvRITER(sv)	= 0;
  +		HvEITER(sv)	= 0;
  +		HvPMROOT(sv)	= 0;
  +		HvNAME(sv)	= 0;
  +		break;
  +            }
  +        default:
  +            SUPER(key, value);
  +        }
  +    }
   }
  +
  +/*
  + * Local variables:
  + * c-indentation-style: bsd
  + * c-basic-offset: 4
  + * indent-tabs-mode: nil
  + * End:
  + *
  + * vim: expandtab shiftwidth=4:
  +*/
  
  
  
  1.2       +50 -1     ponie/src/pmc/perl5pvio.pmc
  
  Index: perl5pvio.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvio.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5pvio.pmc	27 Apr 2005 14:32:22 -0000	1.1
  +++ perl5pvio.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -10,5 +10,54 @@
    *  References:
    */
   
  +#include "ponie.h"
  +
  +#define new_XPVIO()	(void*)new_xpvio()
  +#define del_XPVIO(p)	del_xpvio((XPVIO *)p)
  +
   pmclass Perl5PVIO extends Perl5PVMG dynpmc group Perl5_group {
  +
  +    void set_pointer_keyed_int(INTVAL key, void *value) {
  +        switch (key) {
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPVIO();
  +		zero_xpvio(sv);
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                SvIV_set(sv, val->iv);
  +                SvNV_set(sv, val->nv);
  +                SvMAGIC_set(sv, val->magic);
  +                SvSTASH_set(sv, val->stash);
  +
  +		IoPAGE_LEN(sv)	= 60;
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
  +        }
  +    }
   }
  +
  +/*
  + * Local variables:
  + * c-indentation-style: bsd
  + * c-basic-offset: 4
  + * indent-tabs-mode: nil
  + * End:
  + *
  + * vim: expandtab shiftwidth=4:
  +*/
  
  
  
  1.3       +28 -3     ponie/src/pmc/perl5pviv.pmc
  
  Index: perl5pviv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pviv.pmc,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- perl5pviv.pmc	29 Apr 2005 22:11:31 -0000	1.2
  +++ perl5pviv.pmc	29 Apr 2005 23:47:21 -0000	1.3
  @@ -12,6 +12,7 @@
   
   #include "ponie.h"
   
  +#define new_XPVIV()	(void*)new_xpviv()
   #define del_XPVIV(p)	del_xpviv((XPVIV *)p)
   
   pmclass Perl5PVIV extends Perl5PV extends Perl5IV dynpmc group Perl5_group {
  @@ -38,9 +39,33 @@
   		del_XPVIV(SvANY(sv));
   
                   break;
  -            default:
  -                SUPER(key, value);
               }
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPVIV();
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                SvIV_set(sv, val->iv);
  +                if (SvNIOK(sv))
  +                    (void)SvIOK_on(sv);
  +                SvNOK_off(sv);
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
           }
       }
   }
  
  
  
  1.2       +57 -1     ponie/src/pmc/perl5pvlv.pmc
  
  Index: perl5pvlv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvlv.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5pvlv.pmc	27 Apr 2005 14:32:22 -0000	1.1
  +++ perl5pvlv.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -10,5 +10,61 @@
    *  References:
    */
   
  +#include "ponie.h"
  +
  +#define new_XPVLV()	(void*)new_xpvlv()
  +#define del_XPVLV(p)	del_xpvlv((XPVLV *)p)
  +
   pmclass Perl5PVLV extends Perl5PVGV dynpmc group Perl5_group {
  +
  +    void set_pointer_keyed_int(INTVAL key, void *value) {
  +        switch (key) {
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPVLV();
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                SvIV_set(sv, val->iv);
  +                SvNV_set(sv, val->nv);
  +                SvMAGIC_set(sv, val->magic);
  +                SvSTASH_set(sv, val->stash);
  +
  +		LvTARGOFF(sv)	= 0;
  +		LvTARGLEN(sv)	= 0;
  +		LvTARG(sv)	= 0;
  +		LvTYPE(sv)	= 0;
  +		GvGP(sv)	= 0;
  +		GvNAME(sv)	= 0;
  +		GvNAMELEN(sv)	= 0;
  +		GvSTASH(sv)	= 0;
  +		GvFLAGS(sv)	= 0;
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
  +        }
  +    }
   }
  +
  +/*
  + * Local variables:
  + * c-indentation-style: bsd
  + * c-basic-offset: 4
  + * indent-tabs-mode: nil
  + * End:
  + *
  + * vim: expandtab shiftwidth=4:
  +*/
  
  
  
  1.3       +28 -3     ponie/src/pmc/perl5pvmg.pmc
  
  Index: perl5pvmg.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvmg.pmc,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- perl5pvmg.pmc	29 Apr 2005 22:11:31 -0000	1.2
  +++ perl5pvmg.pmc	29 Apr 2005 23:47:21 -0000	1.3
  @@ -12,6 +12,7 @@
   
   #include "ponie.h"
   
  +#define new_XPVMG()	(void*)new_xpvmg()
   #define del_XPVMG(p)	del_xpvmg((XPVMG *)p)
   
   pmclass Perl5PVMG extends Perl5PVNV dynpmc group Perl5_group {
  @@ -42,9 +43,33 @@
   		del_XPVMG(SvANY(sv));
   
                   break;
  -            default:
  -                SUPER(key, value);
               }
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPVMG();
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                SvIV_set(sv, val->iv);
  +                SvNV_set(sv, val->nv);
  +                SvMAGIC_set(sv, val->magic);
  +                SvSTASH_set(sv, val->stash);
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
           }
       }
   }
  
  
  
  1.3       +26 -3     ponie/src/pmc/perl5pvnv.pmc
  
  Index: perl5pvnv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5pvnv.pmc,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- perl5pvnv.pmc	29 Apr 2005 22:11:31 -0000	1.2
  +++ perl5pvnv.pmc	29 Apr 2005 23:47:21 -0000	1.3
  @@ -12,6 +12,7 @@
   
   #include "ponie.h"
   
  +#define new_XPVNV()	(void*)new_xpvnv()
   #define del_XPVNV(p)	del_xpvnv((XPVNV *)p)
   
   pmclass Perl5PVNV extends Perl5PVIV extends Perl5NV dynpmc group Perl5_group {
  @@ -39,9 +40,31 @@
   		del_XPVNV(SvANY(sv));
   
                   break;
  -            default:
  -                SUPER(key, value);
               }
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +                
  +                SvANY(sv) = new_XPVNV();
  +                if (val->sv_is_rv) {
  +                    SvRV_set(sv, val->rv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_PVX_0, 0);
  +                } else {
  +                    SvPV_set(sv, val->pv);
  +                    Parrot_PMC_set_pointer_intkey(PL_Parrot,MUMBLE(sv),
  +                                                  Ponie_P_RVX_0, 0);
  +                }
  +                SvCUR_set(sv, val->cur);
  +                SvLEN_set(sv, val->len);
  +                SvIV_set(sv, val->iv);
  +                SvNV_set(sv, val->nv);
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
           }
       }
   }
  
  
  
  1.2       +13 -3     ponie/src/pmc/perl5rv.pmc
  
  Index: perl5rv.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5rv.pmc,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- perl5rv.pmc	29 Apr 2005 22:11:31 -0000	1.1
  +++ perl5rv.pmc	29 Apr 2005 23:47:21 -0000	1.2
  @@ -27,9 +27,19 @@
                   info->value.rv = SvRV(MUMBLE(SELF));
                   info->value.sv_is_rv = 1;
                   break;
  -            default:
  -                SUPER(key, value);
               }
  +        case Ponie_P_SET_UPGRADE:
  +            {
  +                const struct Ponie_upgrade_value *val
  +                    = &((struct Ponie_upgrade_info *)value)->value;
  +                SV *sv = MUMBLE(SELF);
  +
  +                SvANY(sv) = 0;
  +                SvRV_set(sv, val->rv);
  +                break;
  +            }
  +        default:
  +            SUPER(key, value);
           }
       }
   }