cvs commit: ponie/src/pmc perl5cargo_cult.pmc

[email protected] (Nicholas Clark) 4 May 2005 14:09:49 -0000
Newsgroups perl.ponie.changes
Message-ID <[email protected]>
cvsuser     05/05/04 07:09:48

  Modified:    perl     sv.c
               src/pmc  perl5cargo_cult.pmc
  Log:
  Migrate all of sv_replace inside the PMC
  
  Revision  Changes    Path
  1.85      +0 -54     ponie/perl/sv.c
  
  Index: sv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/sv.c,v
  retrieving revision 1.84
  retrieving revision 1.85
  diff -u -r1.84 -r1.85
  --- sv.c	4 May 2005 11:06:43 -0000	1.84
  +++ sv.c	4 May 2005 14:09:48 -0000	1.85
  @@ -4785,61 +4785,7 @@
   void
   Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
   {
  -    U32 refcnt = SvREFCNT(sv);
  -    int type = SvTYPE(nsv);
  -
  -    SV_CHECK_THINKFIRST_COW_DROP(sv);
  -    if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
  -	Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
  -    if (SvMAGICAL(sv)) {
  -	if (SvMAGICAL(nsv))
  -	    mg_free(nsv);
  -	else
  -	    sv_upgrade(nsv, SVt_PVMG);
  -	SvMAGIC_set(nsv, SvMAGIC(sv));
  -	SvMAGICAL_set(nsv, SvMAGICAL(sv));
  -	SvMAGICAL_off(sv);
  -	SvMAGIC_set(sv, 0);
  -    }
  -    SvREFCNT_set(sv, 0);
  -    sv_clear(sv);
  -    assert(!SvREFCNT(sv));
  -    SvREFCNT_set(sv, SvREFCNT(nsv));
  -    SvFLAGS(sv) = SvFLAGS(nsv);
  -    SvANY_set(sv, SvANY(nsv));
  -    /* Because the SV data structure is rearranged */
  -    if (type == SVt_IV || type >= SVt_PVIV)
  -       SvIV_set(sv, SvIVX(nsv));
  -    if (type == SVt_NV || type >= SVt_PVNV)
  -       SvNV_set(sv, SvNVX(nsv));
       Parrot_PMC_set_pointer_intkey(PL_Parrot, MUMBLE(sv), Ponie_P_REPLACE, nsv);
  -
  -#ifdef PERL_COPY_ON_WRITE
  -    if (SvIsCOW_normal(nsv)) {
  -	/* We need to follow the pointers around the loop to make the
  -	   previous SV point to sv, rather than nsv.  */
  -	SV *next;
  -	SV *current = nsv;
  -	while ((next = SV_COW_NEXT_SV(current)) != nsv) {
  -	    assert(next);
  -	    current = next;
  -	    assert(SvPVX(current) == SvPVX(nsv));
  -	}
  -	/* Make the SV before us point to the SV after us.  */
  -	if (DEBUG_C_TEST) {
  -	    PerlIO_printf(Perl_debug_log, "previous is\n");
  -	    sv_dump(current);
  -	    PerlIO_printf(Perl_debug_log,
  -                          "move it from 0x%"UVxf" to 0x%"UVxf"\n",
  -			  (UV) SV_COW_NEXT_SV(current), (UV) sv);
  -	}
  -	SV_COW_NEXT_SV_SET(current, sv);
  -    }
  -#endif
  -    SvREFCNT_set(sv, refcnt);
  -    SvTYPE_set(nsv, SVTYPEMASK);		/* Mark as freed */
  -    SvREFCNT_set(nsv, 0);
  -    del_SV(nsv);
   }
   
   /*
  
  
  
  1.63      +39 -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.62
  retrieving revision 1.63
  diff -u -r1.62 -r1.63
  --- perl5cargo_cult.pmc	4 May 2005 11:06:44 -0000	1.62
  +++ perl5cargo_cult.pmc	4 May 2005 14:09:48 -0000	1.63
  @@ -586,8 +586,45 @@
               break;
           case Ponie_P_REPLACE:
               {
  -                /* FIXME. Loads more to migrate to here from sv_replace.  */
  +                SV *sv = MUMBLE(SELF);
  +                SV *nsv = value;
  +
  +                U32 refcnt = SvREFCNT(sv);
  +                int type = SvTYPE(nsv);
  +
  +                SV_CHECK_THINKFIRST_COW_DROP(sv);
  +                if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
  +                    Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
  +                if (SvMAGICAL(sv)) {
  +                    if (SvMAGICAL(nsv))
  +                        mg_free(nsv);
  +                    else
  +                        sv_upgrade(nsv, SVt_PVMG);
  +                    SvMAGIC_set(nsv, SvMAGIC(sv));
  +                    Parrot_PMC_set_intval_intkey(PL_Parrot,SELF,
  +                                                 Ponie_I_SV_MAGICAL_SET,
  +                                                 SvMAGICAL(sv));
  +                    SvMAGICAL_off(sv);
  +                    SvMAGIC_set(sv, 0);
  +                }
  +                SvREFCNT_set(sv, 0);
  +                sv_clear(sv);
  +                assert(!SvREFCNT(sv));
  +                SvREFCNT_set(sv, SvREFCNT(nsv));
  +                PERL5_FLAGS(SELF) = SvFLAGS(nsv);
  +                SvANY_set(sv, SvANY(nsv));
  +                /* Because the SV data structure is rearranged */
  +                if (type == SVt_IV || type >= SVt_PVIV)
  +                    SvIV_set(sv, SvIVX(nsv));
  +                if (type == SVt_NV || type >= SVt_PVNV)
  +                    SvNV_set(sv, SvNVX(nsv));
  +
                   SELF->vtable = ((PMC *)MUMBLE(value))->vtable;
  +
  +                PERL5_REFCNT(SELF) = refcnt;
  +                SvREFCNT_set(nsv, 0);
  +                Parrot_PMC_set_pointer_intkey(PL_Parrot, MUMBLE(nsv),
  +                                              Ponie_P_PINE_FOR_FJORDS, 0);
               }
               break;
           case Ponie_P_GET_UPGRADE: