[svn:ponie] r355 - in trunk: perl src/pmc
[email protected] 29 Aug 2005 17:59:46 -0000
| Newsgroups | perl.ponie.changes |
|---|---|
| Message-ID | <[email protected]> |
Author: nicholas
Date: Mon Aug 29 10:59:45 2005
New Revision: 355
Modified:
trunk/perl/sv.h
trunk/src/pmc/perl5cargo_cult.pmc
trunk/src/pmc/perl5cargo_cult_static_get.c
trunk/src/pmc/perl5cargo_cult_statics.c
trunk/src/pmc/perl5pining.pmc
trunk/src/pmc/perl5pvmg_mess.pmc
trunk/src/pmc/perl5sv_undef.pmc
trunk/src/pmc/perl5sv_yes.pmc
Log:
Remove the reference count from the SV head. It's now stored exclusively in
PL_Refcounts. This frees up 1 word, and significantly will allow a lot of
flexibility in restructuring the SV data layout for the simpler types such as
IVs and RVs
Modified: trunk/perl/sv.h
==============================================================================
--- trunk/perl/sv.h (original)
+++ trunk/perl/sv.h Mon Aug 29 10:59:45 2005
@@ -67,7 +67,6 @@ typedef enum {
struct STRUCT_SV { /* struct sv { */
void* sv_any; /* pointer to something */
- U32 sv_refcnt; /* how many references to us */
U32 sv_flags; /* what we are */
IV xiv_iv; /* integer value or pv offset */
NV xnv_nv; /* numeric value, if any */
Modified: trunk/src/pmc/perl5cargo_cult.pmc
==============================================================================
--- trunk/src/pmc/perl5cargo_cult.pmc (original)
+++ trunk/src/pmc/perl5cargo_cult.pmc Mon Aug 29 10:59:45 2005
@@ -16,7 +16,8 @@
#include "ponie.h"
#define PERL5_FLAGS(pmc) (((struct STRUCT_SV *)PMC_struct_val(pmc))->sv_flags)
-#define PERL5_REFCNT(pmc) (((struct STRUCT_SV *)PMC_struct_val(pmc))->sv_refcnt)
+#define PERL5_REFCNT(interp, pmc) (Parrot_PMC_get_intval_pmckey(interp, PL_Refcounts, pmc))
+
#include "perl5cargo_cult_statics.c"
@@ -81,7 +82,6 @@ pmclass Perl5cargo_cult dynpmc {
head->sv_any = 0;
head->sv_flags = 0;
- head->sv_refcnt = 1;
#ifdef DEBUG_LEAKING_SCALARS
/* FIXME */
@@ -743,7 +743,8 @@ pmclass Perl5cargo_cult dynpmc {
if (key != Ponie_P_JOIN_CHOIR_INVISIBLE) {
/* Immortals will always report a non-zero reference count.
*/
- assert(!PERL5_REFCNT(SELF));
+ INTVAL refcnt = PERL5_REFCNT(INTERP, SELF);
+ assert(refcnt == 0 || refcnt == -1);
}
free(PMC_struct_val(SELF));
Modified: trunk/src/pmc/perl5cargo_cult_static_get.c
==============================================================================
--- trunk/src/pmc/perl5cargo_cult_static_get.c (original)
+++ trunk/src/pmc/perl5cargo_cult_static_get.c Mon Aug 29 10:59:45 2005
@@ -25,7 +25,10 @@ S_get_integer_keyed_int(PMC *pmc, INTVAL
return PERL5_FLAGS(pmc);
case Ponie_I_SV_REFCNT_NO_ABORT:
case Ponie_I_SV_REFCNT:
- return PERL5_REFCNT(pmc);
+ {
+ INTVAL refcnt = PERL5_REFCNT(PL_Parrot, pmc);
+ return refcnt == -1 ? 0 : refcnt;
+ }
case Ponie_I_SV_TYPE:
return PERL5_FLAGS(pmc) & SVTYPEMASK;
case Ponie_I_SVp_OK:
Modified: trunk/src/pmc/perl5cargo_cult_statics.c
==============================================================================
--- trunk/src/pmc/perl5cargo_cult_statics.c (original)
+++ trunk/src/pmc/perl5cargo_cult_statics.c Mon Aug 29 10:59:45 2005
@@ -46,7 +46,18 @@ set_integer_keyed_int(Interp* interprete
((struct STRUCT_SV *)PMC_struct_val(pmc))->sv_any = (void *) 0xDEAD;
return;
case Ponie_I_SV_REFCNT_INC:
- PERL5_REFCNT(pmc) += value;
+ if (value > 0) {
+ do {
+ /* This is the moral equivalent of SvREFCNT_inc() */
+ Parrot_PMC_set_pmc_pmckey(interpreter, PL_Refcounts, pmc, 0);
+ } while (--value);
+ } else {
+ while (value) {
+ ++value;
+ /* This is the moral equivalent of SvREFCNT_dec() */
+ Parrot_PMC_delete_pmckey(interpreter, PL_Refcounts, pmc);
+ }
+ }
return;
case Ponie_I_SV_UPGRADE:
Modified: trunk/src/pmc/perl5pining.pmc
==============================================================================
--- trunk/src/pmc/perl5pining.pmc (original)
+++ trunk/src/pmc/perl5pining.pmc Mon Aug 29 10:59:45 2005
@@ -15,7 +15,7 @@
#include "ponie.h"
#define PERL5_FLAGS(pmc) PObj_buflen(pmc)
-#define PERL5_REFCNT(pmc) 0
+#define PERL5_REFCNT(interp, pmc) 0
#include "perl5cargo_cult_static_get.c"
Modified: trunk/src/pmc/perl5pvmg_mess.pmc
==============================================================================
--- trunk/src/pmc/perl5pvmg_mess.pmc (original)
+++ trunk/src/pmc/perl5pvmg_mess.pmc Mon Aug 29 10:59:45 2005
@@ -24,7 +24,6 @@ pmclass Perl5PVMG_mess extends Perl5PVMG
PMC_pmc_val(SELF) = NULL;
head->sv_flags = SVt_PVMG;
- head->sv_refcnt = 0;
Newz(905, any, 1, XPVMG);
Modified: trunk/src/pmc/perl5sv_undef.pmc
==============================================================================
--- trunk/src/pmc/perl5sv_undef.pmc (original)
+++ trunk/src/pmc/perl5sv_undef.pmc Mon Aug 29 10:59:45 2005
@@ -43,6 +43,15 @@ pmclass Perl5sv_undef extends Perl5base
return SUPER(key);
}
}
+
+ void set_integer_keyed_int(INTVAL key, INTVAL value) {
+ switch (key) {
+ case Ponie_I_SV_REFCNT_INC:
+ break;
+ default:
+ SUPER(key, value);
+ }
+ }
}
/*
Modified: trunk/src/pmc/perl5sv_yes.pmc
==============================================================================
--- trunk/src/pmc/perl5sv_yes.pmc (original)
+++ trunk/src/pmc/perl5sv_yes.pmc Mon Aug 29 10:59:45 2005
@@ -54,6 +54,16 @@ pmclass Perl5sv_yes extends Perl5PVNV dy
return SUPER(key);
}
}
+
+
+ void set_integer_keyed_int(INTVAL key, INTVAL value) {
+ switch (key) {
+ case Ponie_I_SV_REFCNT_INC:
+ break;
+ default:
+ SUPER(key, value);
+ }
+ }
}
/*