[PATCH] Refactor cargo-cult PMC

[email protected] (Mattia Barbon) Sat, 14 Aug 2004 00:22:27 +0200 (ora legale Europa occidentale)
Newsgroups perl.ponie.dev
Message-ID <[email protected]>
  Hello,
this patch moves most of the code in perl5cargo_cult.pm to a
new Perl5Base PMC. It also adds some initialization code to
set struct PERL5_SV fields to 0/NULL and to initialize the
SvTYPE field.

Regards
Mattia

P.S.: the src/pmc/perl5base.pmc needs to be added to CVS
pmc-refact.diff (application/octet-stream, 7.1 KB)
Index: src/pmc/perl5cargo_cult.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5cargo_cult.pmc,v
retrieving revision 1.12
diff -u -2 -r1.12 perl5cargo_cult.pmc
--- src/pmc/perl5cargo_cult.pmc	24 Jun 2004 14:33:05 -0000	1.12
+++ src/pmc/perl5cargo_cult.pmc	13 Aug 2004 22:13:25 -0000
@@ -18,99 +18,13 @@
 #include "perl.h"
 
-pmclass Perl5QQQ {
+#define PMC_sv(pmc) ((struct STRUCT_SV *)PMC_struct_val((pmc)))
 
-    void init () {	
-        PObj_active_destroy_SET(SELF);
-	PMC_struct_val(SELF) = malloc(sizeof(struct STRUCT_SV));
-	PMC_pmc_val(SELF) = NULL;
-    }
-
-    void destroy () {
-        free(PMC_struct_val(SELF));
-    }
-
-    void init_pmc (PMC* initializer) {
-	abort();
-    }
+pmclass Perl5QQQ extends Perl5Base {
 
-    void* get_pointer() {
-        return PMC_struct_val(SELF);
+    void init() {
+        SUPER();
+        PMC_sv(SELF)->sv_flags = SVt_QQQ;
     }
 
-    void* get_pointer_keyed_int(INTVAL key) {
-	switch (key) {
-	case Ponie_P_ANY:
-	    return PMC_struct_val(SELF);
-	case Ponie_P_RV:
-	    return &(PMC_pmc_val(SELF));
-	    /*return &(((struct xrv*)((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_any)->xrv_rv);*/
-	case Ponie_P_IVX:
-	case Ponie_P_UVX:
-	case Ponie_P_AVOFF:
-	case Ponie_P_HVKEYS:
-	    return &(((struct STRUCT_SV *)PMC_struct_val(SELF))->xiv_iv);
-	case Ponie_P_NVX:
-	case Ponie_P_HVPLACEHOLDERS:
-	    return &(((struct STRUCT_SV *)PMC_struct_val(SELF))->xnv_nv);
-	    default:
-	      /*  Can't easily croak.  */
-	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
-	    fprintf (stderr, "Out of range P key %d (max is %d)\n", (int)key,
-		     (int)Ponie_P_MAX - 1);
-	}
-	return 0;
-    }
-
-    INTVAL get_integer_keyed_int(INTVAL key) {
-	switch (key) {
-	case Ponie_I_SVp_NOK:
-	    return ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
-			 & SVp_NOK;
-	case Ponie_I_SVf_NOK:
-	    return ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
-			 & SVf_NOK;
-	case Ponie_I_SVpf_NOK:
-	    return ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
-			 & (SVf_NOK|SVf_NOK);
-	default:
-	    /*  Can't easily croak.  */
-	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
-	    fprintf (stderr, "Out of range get I key %d (max is %d)\n",
-		     (int)key, (int)Ponie_I_MAX - 1);
-	    abort();
-	}
-	return 0;
-    }
-
-    void set_integer_keyed_int(INTVAL key, INTVAL value) {
-	switch (key) {
-	case Ponie_I_SVp_NOK:
-	    (((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags) &= ~SVp_NOK;
-	    if (value)
-		(((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags)
-		    |= SVp_NOK;
-	    return;
-	case Ponie_I_SVf_NOK:
-	    (((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags) &= ~SVf_NOK;
-	    if (value)
-		(((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags)
-		    |= SVf_NOK;
-	    return;
-	case Ponie_I_SVpf_NOK:
-	    (((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags)
-		&= ~(SVp_NOK|SVf_NOK);
-	    if (value)
-		(((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags)
-		    |= (SVp_NOK|SVf_NOK);
-	    return;
-	default:
-	    /*  Can't easily croak.  */
-	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
-	    fprintf (stderr, "Out of range set I key %d (max is %d)\n",
-		     (int)key, (int)Ponie_I_MAX - 1);
-	    abort();
-	}
-	return;
-    }
 }
 
Index: src/pmc/perl5base.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5cargo_cult.pmc,v
retrieving revision 1.12
diff -u -2 -r1.12 perl5cargo_cult.pmc
--- /dev/null	Fri Jun 14 16:35:21 2002
+++ src/pmc/perl5base.pmc	Fri Aug 13 23:58:06 2004
@@ -0,0 +1,123 @@
+/* Perl5Base.pmc -*- c -*-
+ *  Copyright: 2001-2004 The Perl Foundation.  All Rights Reserved.
+ *  CVS Info
+ *     $Id: perl5cargo_cult.pmc,v 1.12 2004/06/24 14:33:05 nicholas Exp $
+ *  Overview:
+ *     These are the vtable functions for the Perl5Base base class
+ *  Data Structure and Algorithms:
+ *  History:
+ *  Notes:
+ *  References:
+ */
+
+#include "parrot/parrot.h"
+
+#include "EXTERN.h"
+#include "config.h"
+#undef HAS_OFF64_T
+#include "perl.h"
+
+#define PMC_sv(pmc) ((struct STRUCT_SV *)PMC_struct_val((pmc)))
+/* FIXME need to use PerlIO/ParrotIO */
+#undef fprintf
+#undef stderr
+
+pmclass Perl5Base {
+
+    void init () {	
+        PObj_active_destroy_SET(SELF);
+	PMC_struct_val(SELF) = malloc(sizeof(struct STRUCT_SV));
+	PMC_pmc_val(SELF) = NULL;
+        PMC_sv(SELF)->sv_any = 0;
+        PMC_sv(SELF)->sv_refcnt = 1;
+        PMC_sv(SELF)->sv_flags = 0;
+    }
+
+    void destroy () {
+        free(PMC_struct_val(SELF));
+    }
+
+    void init_pmc (PMC* initializer) {
+	abort();
+    }
+
+    void* get_pointer() {
+        return PMC_struct_val(SELF);
+    }
+
+    void* get_pointer_keyed_int(INTVAL key) {
+	switch (key) {
+	case Ponie_P_ANY:
+	    return PMC_struct_val(SELF);
+	case Ponie_P_RV:
+	    return &(PMC_pmc_val(SELF));
+	    /*return &(((struct xrv*)((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_any)->xrv_rv);*/
+	case Ponie_P_IVX:
+	case Ponie_P_UVX:
+	case Ponie_P_AVOFF:
+	case Ponie_P_HVKEYS:
+	    return &(((struct STRUCT_SV *)PMC_struct_val(SELF))->xiv_iv);
+	case Ponie_P_NVX:
+	case Ponie_P_HVPLACEHOLDERS:
+	    return &(((struct STRUCT_SV *)PMC_struct_val(SELF))->xnv_nv);
+	    default:
+	      /*  Can't easily croak.  */
+	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
+	    fprintf (stderr, "Out of range P key %d (max is %d)\n", (int)key,
+		     (int)Ponie_P_MAX - 1);
+	}
+	return 0;
+    }
+
+    INTVAL get_integer_keyed_int(INTVAL key) {
+	switch (key) {
+	case Ponie_I_SVp_NOK:
+	    return ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
+			 & SVp_NOK;
+	case Ponie_I_SVf_NOK:
+	    return ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
+			 & SVf_NOK;
+	case Ponie_I_SVpf_NOK:
+	    return ((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags
+			 & (SVf_NOK|SVf_NOK);
+	default:
+	    /*  Can't easily croak.  */
+	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
+	    fprintf (stderr, "Out of range get I key %d (max is %d)\n",
+		     (int)key, (int)Ponie_I_MAX - 1);
+	    abort();
+	}
+	return 0;
+    }
+
+    void set_integer_keyed_int(INTVAL key, INTVAL value) {
+	switch (key) {
+	case Ponie_I_SVp_NOK:
+	    (((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags) &= ~SVp_NOK;
+	    if (value)
+		(((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags)
+		    |= SVp_NOK;
+	    return;
+	case Ponie_I_SVf_NOK:
+	    (((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags) &= ~SVf_NOK;
+	    if (value)
+		(((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags)
+		    |= SVf_NOK;
+	    return;
+	case Ponie_I_SVpf_NOK:
+	    (((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags)
+		&= ~(SVp_NOK|SVf_NOK);
+	    if (value)
+		(((struct STRUCT_SV *)PMC_struct_val(SELF))->sv_flags)
+		    |= (SVp_NOK|SVf_NOK);
+	    return;
+	default:
+	    /*  Can't easily croak.  */
+	    /*croak ("Out of range key %d (max is %d)", key, Ponie_P_MAX - 1);*/
+	    fprintf (stderr, "Out of range set I key %d (max is %d)\n",
+		     (int)key, (int)Ponie_I_MAX - 1);
+	    abort();
+	}
+	return;
+    }
+}