From 30153bd2d5be8850a491380e0cb47c72a21e8c02 Mon Sep 17 00:00:00 2001 From: Jim Cromie Date: Thu, 25 Aug 2005 15:42:44 -0600 Subject: [PATCH] sv-head refactor Message-ID: p4raw-id: //depot/perl@25337 --- sv.h | 98 ++++++++++++++++++++++---------------------------------------------- 1 file changed, 32 insertions(+), 66 deletions(-) diff --git a/sv.h b/sv.h index 003e041..c53de53 100644 --- a/sv.h +++ b/sv.h @@ -69,18 +69,26 @@ typedef struct hek HEK; /* Using C's structural equivalence to help emulate C++ inheritance here... */ +/* start with 2 sv-head building blocks */ +#define _SV_HEAD(ptrtype) \ + ptrtype sv_any; /* pointer to body */ \ + U32 sv_refcnt; /* how many references to us */ \ + U32 sv_flags /* what we are */ + +#define _SV_HEAD_UNION \ + union { \ + IV svu_iv; \ + UV svu_uv; \ + SV* svu_rv; /* pointer to another SV */ \ + char* svu_pv; /* pointer to malloced string */ \ + SV** svu_array; \ + HE** svu_hash; \ + } sv_u + + 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 */ - union { - IV svu_iv; - UV svu_uv; - SV* svu_rv; /* pointer to another SV */ - char* svu_pv; /* pointer to malloced string */ - SV** svu_array; - HE** svu_hash; - } sv_u; + _SV_HEAD(void*); + _SV_HEAD_UNION; #ifdef DEBUG_LEAKING_SCALARS unsigned sv_debug_optype:9; /* the type of OP that allocated us */ unsigned sv_debug_inpad:1; /* was allocated in a pad for an OP */ @@ -91,75 +99,33 @@ struct STRUCT_SV { /* struct sv { */ }; struct gv { - XPVGV* sv_any; /* pointer to something */ - U32 sv_refcnt; /* how many references to us */ - U32 sv_flags; /* what we are */ - union { - IV svu_iv; - UV svu_uv; - SV* svu_rv; - char* svu_pv; - SV** svu_array; - HE** svu_hash; - } sv_u; + _SV_HEAD(XPVGV*); /* pointer to xpvgv body */ + _SV_HEAD_UNION; }; struct cv { - XPVCV* sv_any; /* pointer to something */ - U32 sv_refcnt; /* how many references to us */ - U32 sv_flags; /* what we are */ - union { - IV svu_iv; - UV svu_uv; - SV* svu_rv; - char* svu_pv; - SV** svu_array; - HE** svu_hash; - } sv_u; + _SV_HEAD(XPVCV*); /* pointer to xpvcv body */ + _SV_HEAD_UNION; }; struct av { - XPVAV* sv_any; /* pointer to something */ - U32 sv_refcnt; /* how many references to us */ - U32 sv_flags; /* what we are */ - union { - IV svu_iv; - UV svu_uv; - SV* svu_rv; - char* svu_pv; /* pointer to first array element */ - SV** svu_array; - HE** svu_hash; - } sv_u; + _SV_HEAD(XPVAV*); /* pointer to xpvcv body */ + _SV_HEAD_UNION; }; struct hv { - XPVHV* sv_any; /* pointer to something */ - U32 sv_refcnt; /* how many references to us */ - U32 sv_flags; /* what we are */ - union { - IV svu_iv; - UV svu_uv; - SV* svu_rv; - char* svu_pv; - SV** svu_array; - HE** svu_hash; - } sv_u; + _SV_HEAD(XPVHV*); /* pointer to xpvhv body */ + _SV_HEAD_UNION; }; struct io { - XPVIO* sv_any; /* pointer to something */ - U32 sv_refcnt; /* how many references to us */ - U32 sv_flags; /* what we are */ - union { - IV svu_iv; - UV svu_uv; - SV* svu_rv; - char* svu_pv; - SV** svu_array; - HE** svu_hash; - } sv_u; + _SV_HEAD(XPVIO*); /* pointer to xpvio body */ + _SV_HEAD_UNION; }; +#undef _SV_HEAD +#undef _SV_HEAD_UNION /* insure no pollution */ + /* =head1 SV Manipulation Functions -- 1.8.3.1