[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);
+        }
+    }
 }
 
 /*