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: