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