cvs commit: ponie/src/pmc perl5cargo_cult.pmc

[email protected] (Nicholas Clark) 4 May 2005 15:08:57 -0000
Newsgroups perl.ponie.changes
Message-ID <[email protected]>
cvsuser     05/05/04 08:08:57

  Modified:    perl     sv.c
               src/pmc  perl5cargo_cult.pmc
  Log:
  Move the guts of newSVrv (bugs and all) into the PMC
  
  Revision  Changes    Path
  1.86      +3 -38     ponie/perl/sv.c
  
  Index: sv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/sv.c,v
  retrieving revision 1.85
  retrieving revision 1.86
  diff -u -r1.85 -r1.86
  --- sv.c	4 May 2005 14:09:48 -0000	1.85
  +++ sv.c	4 May 2005 15:08:56 -0000	1.86
  @@ -7289,44 +7289,9 @@
   SV*
   Perl_newSVrv(pTHX_ SV *rv, const char *classname)
   {
  -    SV *sv;
  -
  -    new_SV(sv);
  -
  -    SV_CHECK_THINKFIRST_COW_DROP(rv);
  -    SvAMAGIC_off(rv);
  -
  -    if (SvTYPE(rv) >= SVt_PVMG) {
  -	U32 refcnt = SvREFCNT(rv);
  -	SvREFCNT_set(rv, 0);
  -	/* FIXME. A downgrade upgrade.  */
  -	sv_clear(rv);
  -	SvANY_set(rv, 0);
  -	Parrot_PMC_set_pointer_intkey(PL_Parrot, MUMBLE(rv), Ponie_P_NEWSVRV,
  -				      classname);
  -	SvFLAGS(rv) = 0;
  -	SvREFCNT_set(rv, refcnt);
  -    }
  -
  -    if (SvTYPE(rv) < SVt_RV)
  -	sv_upgrade(rv, SVt_RV);
  -    else if (SvTYPE(rv) > SVt_RV) {
  -	SvOOK_off(rv);
  -	if (SvPVX(rv) && SvLEN(rv))
  -	    Safefree(SvPVX(rv));
  -	SvCUR_set(rv, 0);
  -	SvLEN_set(rv, 0);
  -    }
  -
  -    SvOK_off(rv);
  -    SvRV_set(rv, sv);
  -    SvROK_on(rv);
  -
  -    if (classname) {
  -	HV* stash = gv_stashpv(classname, TRUE);
  -	(void)sv_bless(rv, stash);
  -    }
  -    return sv;
  +    Parrot_PMC_set_pointer_intkey(PL_Parrot, MUMBLE(rv), Ponie_P_NEWSVRV,
  +				  (void *)classname);
  +    return SvRV(rv);
   }
   
   /*
  
  
  
  1.64      +42 -2     ponie/src/pmc/perl5cargo_cult.pmc
  
  Index: perl5cargo_cult.pmc
  ===================================================================
  RCS file: /cvs/public/ponie/src/pmc/perl5cargo_cult.pmc,v
  retrieving revision 1.63
  retrieving revision 1.64
  diff -u -r1.63 -r1.64
  --- perl5cargo_cult.pmc	4 May 2005 14:09:48 -0000	1.63
  +++ perl5cargo_cult.pmc	4 May 2005 15:08:56 -0000	1.64
  @@ -582,7 +582,47 @@
               }
               break;
           case Ponie_P_NEWSVRV:
  -            SELF->vtable = Parrot_base_vtables[PL_pmcname[SVt_NULL]];
  +            {
  +                /* value is the classname for gv_stashpv */
  +                SV *sv;
  +                SV *rv = MUMBLE(SELF);
  +
  +                SV_CHECK_THINKFIRST_COW_DROP(rv);
  +                SvAMAGIC_off(rv);
  +
  +                if (SvTYPE(rv) >= SVt_PVMG) {
  +                    U32 refcnt = SvREFCNT(rv);
  +                    SvREFCNT_set(rv, 0);
  +                    /* A downgrade upgrade.  */
  +                    sv_clear(rv);
  +                    SvANY_set(rv, 0);
  +                    SELF->vtable = Parrot_base_vtables[PL_pmcname[SVt_NULL]];
  +                    PERL5_FLAGS(SELF) = 0;
  +                    SvREFCNT_set(rv, refcnt);
  +                }
  +                
  +                if (SvTYPE(rv) < SVt_RV)
  +                    VTABLE_morph(interpreter, pmc, PL_pmcname[SVt_RV]);
  +                else if (SvTYPE(rv) > SVt_RV) {
  +                    /* Yes, this is buggy for all the reasons that core perl's
  +                       newSVrv is currently buggy.  */
  +                    SvOOK_off(rv);
  +                    if (SvPVX(rv) && SvLEN(rv))
  +                        Safefree(SvPVX(rv));
  +                    SvCUR_set(rv, 0);
  +                    SvLEN_set(rv, 0);
  +                }
  +
  +                SvOK_off(rv);
  +                SvRV_set(rv, MUMBLE(Parrot_PMC_new(PL_Parrot,
  +                                                   PL_pmcname[SVt_NULL])));
  +                SvROK_on(rv);
  +
  +                if (value) {
  +                    HV* stash = gv_stashpv(value, TRUE);
  +                    (void)sv_bless(rv, stash);
  +                }
  +            }
               break;
           case Ponie_P_REPLACE:
               {