cvs commit: ponie/perl/ext/B B.xs

[email protected] (Nicholas Clark) 24 Jun 2004 10:04:17 -0000
Newsgroups perl.ponie.changes
Message-ID <[email protected]>
cvsuser     04/06/24 03:04:17

  Modified:    perl     av.c av.h cv.h embed.fnc embed.h global.sym hv.c
                        hv.h proto.h
               perl/ext/B B.xs
  Log:
  All accesses to the xiv and xnv should go through the macro functions.
  
  Revision  Changes    Path
  1.7       +6 -0      ponie/perl/av.c
  
  Index: av.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/av.c,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -w -r1.6 -r1.7
  --- av.c	16 Jun 2004 10:22:19 -0000	1.6
  +++ av.c	24 Jun 2004 10:04:16 -0000	1.7
  @@ -52,6 +52,12 @@
     return &(data->xav_fill);
   }
   
  +IV* Perl_macro_AvOFF (pTHX_ AV *av) {
  +  XPVAV* data = (XPVAV*) /**/ SvANY(av);
  +  return &(data->wibble);
  +}
  +
  +
   
   void
   Perl_av_reify(pTHX_ AV *av)
  
  
  
  1.5       +4 -2      ponie/perl/av.h
  
  Index: av.h
  ===================================================================
  RCS file: /cvs/public/ponie/perl/av.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -w -r1.4 -r1.5
  --- av.h	2 Mar 2004 12:03:02 -0000	1.4
  +++ av.h	24 Jun 2004 10:04:16 -0000	1.5
  @@ -12,8 +12,8 @@
       char*	xav_array;      /* pointer to first array element */
       SSize_t	xav_fill;       /* Index of last element present */
       SSize_t	xav_max;        /* max index for which array has space */
  -    IV		xof_off;	/* ptr is incremented by offset */
  -    NV		xnv_nv;		/* numeric value, if any */
  +    IV		wibble;	/* ptr is incremented by offset */
  +    NV		wobble;		/* numeric value, if any */
       MAGIC*	xmg_magic;	/* magic for scalar array */
       HV*		xmg_stash;	/* class package */
   
  @@ -67,6 +67,8 @@
   #define AvFILLp(av)     ( * Perl_macro_AvFILLp(aTHX_  (AV*)(av)) )
   #define AvARYLEN(av)    ( * Perl_macro_AvARYLEN(aTHX_ (AV*)(av)) )
   #define AvFLAGS(av)	( * Perl_macro_AvFLAGS(aTHX_  (AV*)(av)) )
  +#define AvOFF(av)	( * Perl_macro_AvOFF(aTHX_  (AV*)(av)) )
  +
   
   
   #define AvREAL(av)	(AvFLAGS(av) & AVf_REAL)
  
  
  
  1.3       +2 -2      ponie/perl/cv.h
  
  Index: cv.h
  ===================================================================
  RCS file: /cvs/public/ponie/perl/cv.h,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -w -r1.2 -r1.3
  --- cv.h	4 May 2004 16:36:52 -0000	1.2
  +++ cv.h	24 Jun 2004 10:04:16 -0000	1.3
  @@ -17,8 +17,8 @@
       char *	xpv_pv;		/* pointer to malloced string (for prototype) */
       STRLEN	xpv_cur;	/* length of xp_pv as a C string */
       STRLEN	xpv_len;	/* allocated size */
  -    IV		xof_off;	/* integer value */
  -    NV		xnv_nv;		/* numeric value, if any */
  +    IV		wibble;	/* integer value */
  +    NV		wobble;		/* numeric value, if any */
       MAGIC*	xmg_magic;	/* magic for scalar array */
       HV*		xmg_stash;	/* class package */
   
  
  
  
  1.29      +4 -2      ponie/perl/embed.fnc
  
  Index: embed.fnc
  ===================================================================
  RCS file: /cvs/public/ponie/perl/embed.fnc,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -w -r1.28 -r1.29
  --- embed.fnc	23 Jun 2004 10:54:24 -0000	1.28
  +++ embed.fnc	24 Jun 2004 10:04:16 -0000	1.29
  @@ -975,8 +975,9 @@
   Ap	|HE**	|macro_HvEITER	|HV *
   Ap	|PMOP**	|macro_HvPMROOT	|HV *
   Ap	|char**	|macro_HvNAME	|HV *
  -Ap	|IV*	|macro_XHvTOTALKEYS	|HV *
  -Ap	|NV*	|macro_XHvPLACEHOLDERS	|HV *
  +Ap	|IV*	|macro_HvTOTALKEYS	|HV *
  +Ap	|NV*	|macro_HvPLACEHOLDERS	|HV *
  +Ap	|IV	|macro_HvUSEDKEYS	|HV *
   Ap	|XPVHV*	|macro_HvDATA	|HV *
   
   Ap	|SV***	|macro_AvARRAY	|AV *
  @@ -985,6 +986,7 @@
   Ap      |SV**|macro_AvARYLEN  |AV *
   Ap      |SSize_t*|macro_AvFILLp  |AV *
   Ap      |SSize_t*|macro_AvMAX  |AV *
  +Ap      |IV*|macro_AvOFF  |AV *
   
   Ap	|void**	|macro_SvANY	|SV *
   Ap	|U32*	|macro_SvFLAGS	|SV *
  
  
  
  1.19      +8 -4      ponie/perl/embed.h
  
  Index: embed.h
  ===================================================================
  RCS file: /cvs/public/ponie/perl/embed.h,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -w -r1.18 -r1.19
  --- embed.h	23 Jun 2004 10:54:24 -0000	1.18
  +++ embed.h	24 Jun 2004 10:04:16 -0000	1.19
  @@ -1258,8 +1258,9 @@
   #define macro_HvEITER		Perl_macro_HvEITER
   #define macro_HvPMROOT		Perl_macro_HvPMROOT
   #define macro_HvNAME		Perl_macro_HvNAME
  -#define macro_XHvTOTALKEYS	Perl_macro_XHvTOTALKEYS
  -#define macro_XHvPLACEHOLDERS	Perl_macro_XHvPLACEHOLDERS
  +#define macro_HvTOTALKEYS	Perl_macro_HvTOTALKEYS
  +#define macro_HvPLACEHOLDERS	Perl_macro_HvPLACEHOLDERS
  +#define macro_HvUSEDKEYS	Perl_macro_HvUSEDKEYS
   #define macro_HvDATA		Perl_macro_HvDATA
   #define macro_AvARRAY		Perl_macro_AvARRAY
   #define macro_AvFLAGS		Perl_macro_AvFLAGS
  @@ -1267,6 +1268,7 @@
   #define macro_AvARYLEN		Perl_macro_AvARYLEN
   #define macro_AvFILLp		Perl_macro_AvFILLp
   #define macro_AvMAX		Perl_macro_AvMAX
  +#define macro_AvOFF		Perl_macro_AvOFF
   #define macro_SvANY		Perl_macro_SvANY
   #define macro_SvFLAGS		Perl_macro_SvFLAGS
   #define macro_SvREFCNT		Perl_macro_SvREFCNT
  @@ -3830,8 +3832,9 @@
   #define macro_HvEITER(a)	Perl_macro_HvEITER(aTHX_ a)
   #define macro_HvPMROOT(a)	Perl_macro_HvPMROOT(aTHX_ a)
   #define macro_HvNAME(a)		Perl_macro_HvNAME(aTHX_ a)
  -#define macro_XHvTOTALKEYS(a)	Perl_macro_XHvTOTALKEYS(aTHX_ a)
  -#define macro_XHvPLACEHOLDERS(a)	Perl_macro_XHvPLACEHOLDERS(aTHX_ a)
  +#define macro_HvTOTALKEYS(a)	Perl_macro_HvTOTALKEYS(aTHX_ a)
  +#define macro_HvPLACEHOLDERS(a)	Perl_macro_HvPLACEHOLDERS(aTHX_ a)
  +#define macro_HvUSEDKEYS(a)	Perl_macro_HvUSEDKEYS(aTHX_ a)
   #define macro_HvDATA(a)		Perl_macro_HvDATA(aTHX_ a)
   #define macro_AvARRAY(a)	Perl_macro_AvARRAY(aTHX_ a)
   #define macro_AvFLAGS(a)	Perl_macro_AvFLAGS(aTHX_ a)
  @@ -3839,6 +3842,7 @@
   #define macro_AvARYLEN(a)	Perl_macro_AvARYLEN(aTHX_ a)
   #define macro_AvFILLp(a)	Perl_macro_AvFILLp(aTHX_ a)
   #define macro_AvMAX(a)		Perl_macro_AvMAX(aTHX_ a)
  +#define macro_AvOFF(a)		Perl_macro_AvOFF(aTHX_ a)
   #define macro_SvANY(a)		Perl_macro_SvANY(aTHX_ a)
   #define macro_SvFLAGS(a)	Perl_macro_SvFLAGS(aTHX_ a)
   #define macro_SvREFCNT(a)	Perl_macro_SvREFCNT(aTHX_ a)
  
  
  
  1.15      +4 -2      ponie/perl/global.sym
  
  Index: global.sym
  ===================================================================
  RCS file: /cvs/public/ponie/perl/global.sym,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -w -r1.14 -r1.15
  --- global.sym	13 Jun 2004 20:38:53 -0000	1.14
  +++ global.sym	24 Jun 2004 10:04:16 -0000	1.15
  @@ -638,8 +638,9 @@
   Perl_macro_HvEITER
   Perl_macro_HvPMROOT
   Perl_macro_HvNAME
  -Perl_macro_XHvTOTALKEYS
  -Perl_macro_XHvPLACEHOLDERS
  +Perl_macro_HvTOTALKEYS
  +Perl_macro_HvPLACEHOLDERS
  +Perl_macro_HvUSEDKEYS
   Perl_macro_HvDATA
   Perl_macro_AvARRAY
   Perl_macro_AvFLAGS
  @@ -647,6 +648,7 @@
   Perl_macro_AvARYLEN
   Perl_macro_AvFILLp
   Perl_macro_AvMAX
  +Perl_macro_AvOFF
   Perl_macro_SvANY
   Perl_macro_SvFLAGS
   Perl_macro_SvREFCNT
  
  
  
  1.11      +94 -117   ponie/perl/hv.c
  
  Index: hv.c
  ===================================================================
  RCS file: /cvs/public/ponie/perl/hv.c,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -w -r1.10 -r1.11
  --- hv.c	21 Jun 2004 16:34:16 -0000	1.10
  +++ hv.c	24 Jun 2004 10:04:16 -0000	1.11
  @@ -64,14 +64,18 @@
     return &(data->xhv_name);
   }
   
  -IV* Perl_macro_XHvTOTALKEYS (pTHX_ HV *hv) {
  +IV* Perl_macro_HvTOTALKEYS (pTHX_ HV *hv) {
     XPVHV* data = (XPVHV*) /**/ SvANY(hv);
  -  return &(data->xhv_keys);
  +  return &(data->wibble);
   }
   
  -NV* Perl_macro_XHvPLACEHOLDERS (pTHX_ HV *hv) {
  +NV* Perl_macro_HvPLACEHOLDERS (pTHX_ HV *hv) {
     XPVHV* data = (XPVHV*) /**/ SvANY(hv);
  -  return &(data->xhv_placeholders);
  +  return &(data->wobble);
  +}
  +
  +IV Perl_macro_HvUSEDKEYS (pTHX_ HV *hv) {
  +  return HvTOTALKEYS(hv) - (IV)HvPLACEHOLDERS(hv);
   }
   
   STATIC HE*
  @@ -424,7 +428,6 @@
   S_hv_fetch_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
   		  int flags, int action, SV *val, register U32 hash)
   {
  -    XPVHV* xhv;
       U32 n_links;
       HE *entry;
       HE **oentry;
  @@ -445,7 +448,6 @@
   	is_utf8 = ((flags & HVhek_UTF8) ? TRUE : FALSE);
       }
   
  -    xhv = (XPVHV*)HvDATA(hv);
       if (SvMAGICAL(hv)) {
   	if (SvRMAGICAL(hv) && !(action & (HV_FETCH_ISSTORE|HV_FETCH_ISEXISTS)))
   	  {
  @@ -584,7 +586,7 @@
   		}
   
   		TAINT_IF(save_taint);
  -		if (!xhv->xhv_array /* !HvARRAY(hv) */ && !needs_store) {
  +		if (!HvARRAY(hv) && !needs_store) {
   		    if (flags & HVhek_FREEKEY)
   			Safefree(key);
   		    return Nullhe;
  @@ -609,14 +611,14 @@
   	} /* ISSTORE */
       } /* SvMAGICAL */
   
  -    if (!xhv->xhv_array /* !HvARRAY(hv) */) {
  +    if (!HvARRAY(hv)) {
   	if ((action & (HV_FETCH_LVALUE | HV_FETCH_ISSTORE))
   #ifdef DYNAMIC_ENV_FETCH  /* if it's an %ENV lookup, we may get it on the fly */
   		 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
   #endif
   								  )
  -	    Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
  -		 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
  +	    Newz(503, *(char **)&(HvARRAY(hv)),
  +		 PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv)+1),
   		 char);
   #ifdef DYNAMIC_ENV_FETCH
   	else if (action & HV_FETCH_ISEXISTS) {
  @@ -667,12 +669,11 @@
       n_links = 0;
   
   #ifdef DYNAMIC_ENV_FETCH
  -    if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
  +    if (!HvARRAY(hv)) entry = Null(HE*);
       else
   #endif
       {
  -	/* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
  -	entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
  +	entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)];
       }
       for (; entry; ++n_links, entry = HeNEXT(entry)) {
   	if (HeHASH(entry) != hash)		/* strings can't be equal */
  @@ -721,11 +722,11 @@
   		    }
   		    /* LVAL fetch which actaully needs a store.  */
   		    val = NEWSV(61,0);
  -		    xhv->xhv_placeholders--;
  +		    HvPLACEHOLDERS(hv)--;
   		} else {
   		    /* store */
   		    if (val != &PL_sv_placeholder)
  -			xhv->xhv_placeholders--;
  +			HvPLACEHOLDERS(hv)--;
   		}
   		HeVAL(entry) = val;
   	    } else if (action & HV_FETCH_ISSTORE) {
  @@ -782,16 +783,16 @@
   
       /* Welcome to hv_store...  */
   
  -    if (!xhv->xhv_array) {
  +    if (!HvARRAY(hv)) {
   	/* Not sure if we can get here.  I think the only case of oentry being
   	   NULL is for %ENV with dynamic env fetch.  But that should disappear
   	   with magic in the previous code.  */
  -	Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
  -	     PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
  +	Newz(503, *(char **)&(HvARRAY(hv)),
  +	     PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv)+1),
   	     char);
       }
   
  -    oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
  +    oentry = &((HE**)HvARRAY(hv))[hash & (I32) HvMAX(hv)];
   
       entry = new_HE();
       /* share_hek_flags will do the free for us.  This might be considered
  @@ -805,14 +806,14 @@
       *oentry = entry;
   
       if (val == &PL_sv_placeholder)
  -	xhv->xhv_placeholders++;
  +	HvPLACEHOLDERS(hv)++;
       if (masked_flags & HVhek_ENABLEHVKFLAGS)
   	HvHASKFLAGS_on(hv);
   
  -    xhv->xhv_keys++; /* HvKEYS(hv)++ */
  +    HvTOTALKEYS(hv)++;
       if (!n_links) {				/* initial entry? */
  -	xhv->xhv_fill++; /* HvFILL(hv)++ */
  -    } else if ((xhv->xhv_keys > (IV)xhv->xhv_max)
  +	HvFILL(hv)++;
  +    } else if ((HvKEYS(hv) > (IV)HvMAX(hv))
   	       || ((n_links > HV_MAX_LENGTH_BEFORE_SPLIT) && !HvREHASH(hv))) {
   	/* Use only the old HvKEYS(hv) > HvMAX(hv) condition to limit bucket
   	   splits on a rehashed hash, as we're not going to split it again,
  @@ -921,7 +922,6 @@
   S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
   		   int k_flags, I32 d_flags, U32 hash)
   {
  -    register XPVHV* xhv;
       register I32 i;
       register HE *entry;
       register HE **oentry;
  @@ -980,8 +980,7 @@
   	    }
   	}
       }
  -    xhv = (XPVHV*)HvDATA(hv);
  -    if (!xhv->xhv_array /* !HvARRAY(hv) */)
  +    if (!HvARRAY(hv))
   	return Nullsv;
   
       if (is_utf8) {
  @@ -1015,8 +1014,8 @@
   
       masked_flags = (k_flags & HVhek_MASK);
   
  -    /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
  -    oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
  +    oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)];
  +    /*oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];*/
       entry = *oentry;
       i = 1;
       for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
  @@ -1060,17 +1059,17 @@
   	    HeVAL(entry) = &PL_sv_placeholder;
   	    /* We'll be saving this slot, so the number of allocated keys
   	     * doesn't go down, but the number placeholders goes up */
  -	    xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
  +	    HvPLACEHOLDERS(hv)++;
   	} else {
   	    *oentry = HeNEXT(entry);
   	    if (i && !*oentry)
  -		xhv->xhv_fill--; /* HvFILL(hv)-- */
  -	    if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
  +		HvFILL(hv)--;
  +	    if (entry == HvEITER(hv))
   		HvLAZYDEL_on(hv);
   	    else
   		hv_free_ent(hv, entry);
  -	    xhv->xhv_keys--; /* HvKEYS(hv)-- */
  -	    if (xhv->xhv_keys == 0)
  +	    HvTOTALKEYS(hv)--;
  +	    if (HvTOTALKEYS(hv) == 0)
   	        HvHASKFLAGS_off(hv);
   	}
   	return sv;
  @@ -1089,11 +1088,10 @@
   STATIC void
   S_hsplit(pTHX_ HV *hv)
   {
  -    register XPVHV* xhv = (XPVHV*)HvDATA(hv);
  -    I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
  +    I32 oldsize = (I32) HvMAX(hv)+1;
       register I32 newsize = oldsize * 2;
       register I32 i;
  -    register char *a = xhv->xhv_array; /* HvARRAY(hv) */
  +    register char *a = (char *) HvARRAY(hv);
       register HE **aep;
       register HE **bep;
       register HE *entry;
  @@ -1125,19 +1123,19 @@
         PL_nomemok = FALSE;
         return;
       }
  -    Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
  +    Copy(HvARRAY(hv), a, oldsize * sizeof(HE*), char);
       if (oldsize >= 64) {
  -	offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
  +	offer_nice_chunk(HvARRAY(hv),
   			PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
       }
       else
  -	Safefree(xhv->xhv_array /* HvARRAY(hv) */);
  +	Safefree(HvARRAY(hv));
   #endif
   
       PL_nomemok = FALSE;
       Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char);	/* zero 2nd half*/
  -    xhv->xhv_max = --newsize;	/* HvMAX(hv) = --newsize */
  -    xhv->xhv_array = a;		/* HvARRAY(hv) = a */
  +    HvMAX(hv) = --newsize;
  +    HvARRAY(hv) = (HE **)a;
       aep = (HE**)a;
   
       for (i=0; i<oldsize; i++,aep++) {
  @@ -1152,7 +1150,7 @@
   		*oentry = HeNEXT(entry);
   		HeNEXT(entry) = *bep;
   		if (!*bep)
  -		    xhv->xhv_fill++; /* HvFILL(hv)++ */
  +		    HvFILL(hv)++;
   		*bep = entry;
   		right_length++;
   		continue;
  @@ -1163,7 +1161,7 @@
   	    }
   	}
   	if (!*aep)				/* everything moved */
  -	    xhv->xhv_fill--; /* HvFILL(hv)-- */
  +	    HvFILL(hv)--;
   	/* I think we don't actually need to keep track of the longest length,
   	   merely flag if anything is too long. But for the moment while
   	   developing this code I'll track it.  */
  @@ -1194,11 +1192,11 @@
       Newz(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
       was_shared = HvSHAREKEYS(hv);
   
  -    xhv->xhv_fill = 0;
  +    HvFILL(hv) = 0;
       HvSHAREKEYS_off(hv);
       HvREHASH_on(hv);
   
  -    aep = (HE **) xhv->xhv_array;
  +    aep = HvARRAY(hv);
   
       for (i=0; i<newsize; i++,aep++) {
   	entry = *aep;
  @@ -1227,24 +1225,23 @@
   	    /*PerlIO_printf(PerlIO_stderr(), "%d\n", HeKFLAGS(entry));*/
   
   	    /* Copy oentry to the correct new chain.  */
  -	    bep = ((HE**)a) + (hash & (I32) xhv->xhv_max);
  +	    bep = ((HE**)a) + (hash & (I32) HvMAX(hv));
   	    if (!*bep)
  -		    xhv->xhv_fill++; /* HvFILL(hv)++ */
  +		HvFILL(hv)++;
   	    HeNEXT(entry) = *bep;
   	    *bep = entry;
   
   	    entry = next;
   	}
       }
  -    Safefree (xhv->xhv_array);
  -    xhv->xhv_array = a;		/* HvARRAY(hv) = a */
  +    Safefree (HvARRAY(hv));
  +    HvARRAY(hv) = (HE **)a;
   }
   
   void
   Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
   {
  -    register XPVHV* xhv = (XPVHV*)HvDATA(hv);
  -    I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
  +    I32 oldsize = (I32) HvMAX(hv)+1;
       register I32 newsize;
       register I32 i;
       register I32 j;
  @@ -1264,7 +1261,7 @@
       if (newsize < newmax)
   	return;					/* overflow detection */
   
  -    a = xhv->xhv_array; /* HvARRAY(hv) */
  +    a = (char *) HvARRAY(hv);
       if (a) {
   	PL_nomemok = TRUE;
   #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
  @@ -1279,13 +1276,12 @@
   	  PL_nomemok = FALSE;
   	  return;
   	}
  -	Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
  +	Copy(HvARRAY(hv), a, oldsize * sizeof(HE*), char);
   	if (oldsize >= 64) {
  -	    offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
  -			    PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
  +	    offer_nice_chunk(HvARRAY(hv), PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
   	}
   	else
  -	    Safefree(xhv->xhv_array /* HvARRAY(hv) */);
  +	    Safefree(HvARRAY(hv));
   #endif
   	PL_nomemok = FALSE;
   	Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
  @@ -1293,9 +1289,9 @@
       else {
   	Newz(0, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
       }
  -    xhv->xhv_max = --newsize; 	/* HvMAX(hv) = --newsize */
  -    xhv->xhv_array = a; 	/* HvARRAY(hv) = a */
  -    if (!xhv->xhv_fill /* !HvFILL(hv) */)	/* skip rest if no entries */
  +    HvMAX(hv) = --newsize;
  +    HvARRAY(hv) = (HE **) a;
  +    if (!HvFILL(hv))	/* skip rest if no entries */
   	return;
   
       aep = (HE**)a;
  @@ -1307,7 +1303,7 @@
   		j -= i;
   		*oentry = HeNEXT(entry);
   		if (!(HeNEXT(entry) = aep[j]))
  -		    xhv->xhv_fill++; /* HvFILL(hv)++ */
  +		    HvFILL(hv)++;
   		aep[j] = entry;
   		continue;
   	    }
  @@ -1315,7 +1311,7 @@
   		oentry = &HeNEXT(entry);
   	}
   	if (!*aep)				/* everything moved */
  -	    xhv->xhv_fill--; /* HvFILL(hv)-- */
  +	    HvFILL(hv)--;
       }
   }
   
  @@ -1331,20 +1327,18 @@
   Perl_newHV(pTHX)
   {
       register HV *hv;
  -    register XPVHV* xhv;
   
       hv = (HV*)NEWSV(502,0);
       sv_upgrade((SV *)hv, SVt_PVHV);
  -    xhv = (XPVHV*)HvDATA(hv);
       SvPOK_off(hv);
       SvNOK_off(hv);
   #ifndef NODEFAULT_SHAREKEYS
       HvSHAREKEYS_on(hv);         /* key-sharing on by default */
   #endif
   
  -    xhv->xhv_max    = 7;	/* HvMAX(hv) = 7 (start with 8 buckets) */
  -    xhv->xhv_fill   = 0;	/* HvFILL(hv) = 0 */
  -    xhv->xhv_pmroot = 0;	/* HvPMROOT(hv) = 0 */
  +    HvMAX(hv) = 7; /* (start with 8 buckets) */
  +    HvFILL(hv) = 0;
  +    HvPMROOT(hv) = 0;
       (void)hv_iterinit(hv);	/* so each() will start off right */
       return hv;
   }
  @@ -1479,20 +1473,17 @@
   void
   Perl_hv_clear(pTHX_ HV *hv)
   {
  -    register XPVHV* xhv;
       if (!hv)
   	return;
   
       DEBUG_A(Perl_hv_assert(aTHX_ hv));
   
  -    xhv = (XPVHV*)HvDATA(hv);
  -
  -    if (SvREADONLY(hv) && xhv->xhv_array != NULL) {
  +    if (SvREADONLY(hv) && HvARRAY(hv) != NULL) {
   	/* restricted hash: convert all keys to placeholders */
   	I32 i;
   	HE* entry;
  -	for (i = 0; i <= (I32) xhv->xhv_max; i++) {
  -	    entry = ((HE**)xhv->xhv_array)[i];
  +	for (i = 0; i <= (I32) HvMAX(hv); i++) {
  +	    entry = (HvARRAY(hv))[i];
   	    for (; entry; entry = HeNEXT(entry)) {
   		/* not already placeholder */
   		if (HeVAL(entry) != &PL_sv_placeholder) {
  @@ -1504,7 +1495,7 @@
   		    }
   		    SvREFCNT_dec(HeVAL(entry));
   		    HeVAL(entry) = &PL_sv_placeholder;
  -		    xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
  +		    HvPLACEHOLDERS(hv)++;
   		}
   	    }
   	}
  @@ -1512,10 +1503,9 @@
       }
   
       hfreeentries(hv);
  -    xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
  -    if (xhv->xhv_array /* HvARRAY(hv) */)
  -	(void)memzero(xhv->xhv_array /* HvARRAY(hv) */,
  -		      (xhv->xhv_max+1 /* HvMAX(hv)+1 */) * sizeof(HE*));
  +    HvPLACEHOLDERS(hv) = 0;
  +    if (HvARRAY(hv))
  +	(void)memzero(HvARRAY(hv), (HvMAX(hv)+1) * sizeof(HE*));
   
       if (SvRMAGICAL(hv))
   	mg_clear((SV*)hv);
  @@ -1608,7 +1598,7 @@
        * called for freed entries can't recusively mess with us */
       HvARRAY(hv) = Null(HE**); 
       HvFILL(hv) = 0;
  -    ((XPVHV*)HvDATA(hv))->xhv_keys = 0;
  +    HvTOTALKEYS(hv) = 0;
   
       entry = array[0];
       for (;;) {
  @@ -1638,22 +1628,20 @@
   void
   Perl_hv_undef(pTHX_ HV *hv)
   {
  -    register XPVHV* xhv;
       if (!hv)
   	return;
       DEBUG_A(Perl_hv_assert(aTHX_ hv));
  -    xhv = (XPVHV*)HvDATA(hv);
       hfreeentries(hv);
  -    Safefree(xhv->xhv_array /* HvARRAY(hv) */);
  +    Safefree(HvARRAY(hv));
       if (HvNAME(hv)) {
           if(PL_stashcache)
   	    hv_delete(PL_stashcache, HvNAME(hv), strlen(HvNAME(hv)), G_DISCARD);
   	Safefree(HvNAME(hv));
   	HvNAME(hv) = 0;
       }
  -    xhv->xhv_max   = 7;	/* HvMAX(hv) = 7 (it's a normal hash) */
  -    xhv->xhv_array = 0;	/* HvARRAY(hv) = 0 */
  -    xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
  +    HvMAX(hv) = 7; /* (it's a normal hash) */
  +    HvARRAY(hv) = 0;
  +    HvPLACEHOLDERS(hv) = 0;
   
       if (SvRMAGICAL(hv))
   	mg_clear((SV*)hv);
  @@ -1677,21 +1665,19 @@
   I32
   Perl_hv_iterinit(pTHX_ HV *hv)
   {
  -    register XPVHV* xhv;
       HE *entry;
   
       if (!hv)
   	Perl_croak(aTHX_ "Bad hash");
  -    xhv = (XPVHV*)HvDATA(hv);
  -    entry = xhv->xhv_eiter; /* HvEITER(hv) */
  +    entry = HvEITER(hv);
       if (entry && HvLAZYDEL(hv)) {	/* was deleted earlier? */
   	HvLAZYDEL_off(hv);
   	hv_free_ent(hv, entry);
       }
  -    xhv->xhv_riter = -1; 	/* HvRITER(hv) = -1 */
  -    xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
  +    HvRITER(hv) = -1;
  +    HvEITER(hv) = Null(HE*);
       /* used to be xhv->xhv_fill before 5.004_65 */
  -    return XHvTOTALKEYS(xhv);
  +    return HvTOTALKEYS(hv);
   }
   /*
   =for apidoc hv_iternext
  @@ -1733,15 +1719,13 @@
   HE *
   Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
   {
  -    register XPVHV* xhv;
       register HE *entry;
       HE *oldentry;
       MAGIC* mg;
   
       if (!hv)
   	Perl_croak(aTHX_ "Bad hash");
  -    xhv = (XPVHV*)HvDATA(hv);
  -    oldentry = entry = xhv->xhv_eiter; /* HvEITER(hv) */
  +    oldentry = entry = HvEITER(hv);
   
       if ((mg = SvTIED_mg((SV*)hv, PERL_MAGIC_tied))) {
   	SV *key = sv_newmortal();
  @@ -1754,7 +1738,7 @@
   	    HEK *hek;
   
   	    /* one HE per MAGICAL hash */
  -	    xhv->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
  +	    HvEITER(hv) = entry = new_HE();
   	    Zero(entry, 1, HE);
   	    Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
   	    hek = (HEK*)k;
  @@ -1771,7 +1755,7 @@
   	    SvREFCNT_dec(HeVAL(entry));
   	Safefree(HeKEY_hek(entry));
   	del_HE(entry);
  -	xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
  +	HvEITER(hv) = Null(HE*);
   	return Null(HE*);
       }
   #ifdef DYNAMIC_ENV_FETCH  /* set up %ENV for iteration */
  @@ -1779,9 +1763,9 @@
   	prime_env_iter();
   #endif
   
  -    if (!xhv->xhv_array /* !HvARRAY(hv) */)
  -	Newz(506, xhv->xhv_array /* HvARRAY(hv) */,
  -	     PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
  +    if (!HvARRAY(hv))
  +	Newz(506, *((char **)&(HvARRAY(hv))),
  +	     PERL_HV_ARRAY_ALLOC_BYTES(HvMAX(hv)+1),
   	     char);
       /* At start of hash, entry is NULL.  */
       if (entry)
  @@ -1800,14 +1784,13 @@
       while (!entry) {
   	/* OK. Come to the end of the current list.  Grab the next one.  */
   
  -	xhv->xhv_riter++; /* HvRITER(hv)++ */
  -	if (xhv->xhv_riter > (I32)xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
  +	HvRITER(hv)++;
  +	if (HvRITER(hv) > HvMAX(hv)) {
   	    /* There is no next one.  End of the hash.  */
  -	    xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
  +	    HvRITER(hv) = -1;
   	    break;
   	}
  -	/* entry = (HvARRAY(hv))[HvRITER(hv)]; */
  -	entry = ((HE**)xhv->xhv_array)[xhv->xhv_riter];
  +	entry = (HvARRAY(hv))[HvRITER(hv)];
   
           if (!(flags & HV_ITERNEXT_WANTPLACEHOLDERS)) {
               /* If we have an entry, but it's a placeholder, don't count it.
  @@ -1828,7 +1811,7 @@
       /*if (HvREHASH(hv) && entry && !HeKREHASH(entry))
         PerlIO_printf(PerlIO_stderr(), "Awooga %p %p\n", hv, entry);*/
   
  -    xhv->xhv_eiter = entry; /* HvEITER(hv) = entry */
  +    HvEITER(hv) = entry;
       return entry;
   }
   
  @@ -1995,7 +1978,6 @@
   STATIC void
   S_unshare_hek_or_pvn(pTHX_ HEK *hek, const char *str, I32 len, U32 hash)
   {
  -    register XPVHV* xhv;
       register HE *entry;
       register HE **oentry;
       register I32 i = 1;
  @@ -2023,11 +2005,9 @@
   	if (--*Svp == Nullsv)
   	    hv_delete(PL_strtab, str, len, G_DISCARD, hash);
       } */
  -    xhv = (XPVHV*)HvDATA(PL_strtab);
       /* assert(xhv_array != 0) */
       LOCK_STRTAB_MUTEX;
  -    /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
  -    oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
  +    oentry = &(HvARRAY(PL_strtab))[hash & (I32) HvMAX(PL_strtab)];
       if (hek) {
           for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
               if (HeKEY_hek(entry) != hek)
  @@ -2057,10 +2037,10 @@
           if (HeVAL(entry) == Nullsv) {
               *oentry = HeNEXT(entry);
               if (i && !*oentry)
  -                xhv->xhv_fill--; /* HvFILL(hv)-- */
  +                HvFILL(PL_strtab)--;
               Safefree(HeKEY_hek(entry));
               del_HE(entry);
  -            xhv->xhv_keys--; /* HvKEYS(hv)-- */
  +            HvTOTALKEYS(PL_strtab)--;
           }
       }
   
  @@ -2108,7 +2088,6 @@
   STATIC HEK *
   S_share_hek_flags(pTHX_ const char *str, I32 len, register U32 hash, int flags)
   {
  -    register XPVHV* xhv;
       register HE *entry;
       register HE **oentry;
       register I32 i = 1;
  @@ -2123,11 +2102,9 @@
   	Can't rehash the shared string table, so not sure if it's worth
   	counting the number of entries in the linked list
       */
  -    xhv = (XPVHV*)HvDATA(PL_strtab);
       /* assert(xhv_array != 0) */
       LOCK_STRTAB_MUTEX;
  -    /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
  -    oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
  +    oentry = &(HvARRAY(PL_strtab))[hash & (I32) HvMAX(PL_strtab)];
       for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
   	if (HeHASH(entry) != hash)		/* strings can't be equal */
   	    continue;
  @@ -2146,10 +2123,10 @@
   	HeVAL(entry) = Nullsv;
   	HeNEXT(entry) = *oentry;
   	*oentry = entry;
  -	xhv->xhv_keys++; /* HvKEYS(hv)++ */
  +	HvTOTALKEYS(PL_strtab)++;
   	if (i) {				/* initial entry? */
  -	    xhv->xhv_fill++; /* HvFILL(hv)++ */
  -	} else if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */) {
  +	    HvFILL(PL_strtab)++;
  +	} else if (HvKEYS(PL_strtab) > HvMAX(PL_strtab)) {
   		hsplit(PL_strtab);
   	}
       }
  
  
  
  1.7       +6 -14     ponie/perl/hv.h
  
  Index: hv.h
  ===================================================================
  RCS file: /cvs/public/ponie/perl/hv.h,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -w -r1.6 -r1.7
  --- hv.h	7 Apr 2004 10:37:27 -0000	1.6
  +++ hv.h	24 Jun 2004 10:04:16 -0000	1.7
  @@ -35,9 +35,8 @@
       char *	xhv_array;	/* pointer to malloced string */
       STRLEN	xhv_fill;	/* how full xhv_array currently is */
       STRLEN	xhv_max;	/* subscript of last element of xhv_array */
  -    IV		xhv_keys;	/* how many elements in the array */
  -    NV		xnv_nv;		/* numeric value, if any */
  -#define xhv_placeholders xnv_nv
  +    IV		wibble;	/* how many elements in the array */
  +    NV		wobble;		/* numeric value, if any */
       MAGIC*	xmg_magic;	/* magic for scalar array */
       HV*		xmg_stash;	/* class package */
   
  @@ -190,22 +189,15 @@
   /* Sadly we can't do this as an LVALUE */
   #define HvDATA(hv)          (Perl_macro_HvDATA   (aTHX_ (HV*)(hv)) )
   
  -#define XHvTOTALKEYS(xhv)    (xhv->xhv_keys)
  -#define XHvPLACEHOLDERS(xhv) (xhv->xhv_placeholders)
  -
  -
  -/* the number of keys that exist() (i.e. excluding placeholders) */
  -#define XHvUSEDKEYS(xhv)      (XHvTOTALKEYS(xhv) - (IV)XHvPLACEHOLDERS(xhv))
  -
   /*
    * HvKEYS gets the number of keys that actually exist(), and is provided
    * for backwards compatibility with old XS code. The core uses HvUSEDKEYS
    * (keys, excluding placeholdes) and HvTOTALKEYS (including placeholders)
    */
  -#define HvKEYS(hv)		XHvUSEDKEYS(HvDATA(hv))
  -#define HvUSEDKEYS(hv)		XHvUSEDKEYS(HvDATA(hv))
  -#define HvTOTALKEYS(hv)		XHvTOTALKEYS(HvDATA(hv))
  -#define HvPLACEHOLDERS(hv)	XHvPLACEHOLDERS(HvDATA(hv))
  +#define HvKEYS(hv)		HvUSEDKEYS(hv)
  +#define HvUSEDKEYS(hv)		(Perl_macro_HvUSEDKEYS(aTHX_ (HV*)(hv)))
  +#define HvTOTALKEYS(hv)		(*Perl_macro_HvTOTALKEYS(aTHX_ (HV*)(hv)))
  +#define HvPLACEHOLDERS(hv)	(*Perl_macro_HvPLACEHOLDERS(aTHX_ (HV*)(hv)))
   
   #define HvSHAREKEYS(hv)		(SvFLAGS(hv) & SVphv_SHAREKEYS)
   #define HvSHAREKEYS_on(hv)	(SvFLAGS(hv) |= SVphv_SHAREKEYS)
  
  
  
  1.29      +4 -2      ponie/perl/proto.h
  
  Index: proto.h
  ===================================================================
  RCS file: /cvs/public/ponie/perl/proto.h,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -w -r1.28 -r1.29
  --- proto.h	23 Jun 2004 10:54:24 -0000	1.28
  +++ proto.h	24 Jun 2004 10:04:16 -0000	1.29
  @@ -933,8 +933,9 @@
   PERL_CALLCONV HE**	Perl_macro_HvEITER(pTHX_ HV *);
   PERL_CALLCONV PMOP**	Perl_macro_HvPMROOT(pTHX_ HV *);
   PERL_CALLCONV char**	Perl_macro_HvNAME(pTHX_ HV *);
  -PERL_CALLCONV IV*	Perl_macro_XHvTOTALKEYS(pTHX_ HV *);
  -PERL_CALLCONV NV*	Perl_macro_XHvPLACEHOLDERS(pTHX_ HV *);
  +PERL_CALLCONV IV*	Perl_macro_HvTOTALKEYS(pTHX_ HV *);
  +PERL_CALLCONV NV*	Perl_macro_HvPLACEHOLDERS(pTHX_ HV *);
  +PERL_CALLCONV IV	Perl_macro_HvUSEDKEYS(pTHX_ HV *);
   PERL_CALLCONV XPVHV*	Perl_macro_HvDATA(pTHX_ HV *);
   
   PERL_CALLCONV SV***	Perl_macro_AvARRAY(pTHX_ AV *);
  @@ -943,6 +944,7 @@
   PERL_CALLCONV SV**	Perl_macro_AvARYLEN(pTHX_ AV *);
   PERL_CALLCONV SSize_t*	Perl_macro_AvFILLp(pTHX_ AV *);
   PERL_CALLCONV SSize_t*	Perl_macro_AvMAX(pTHX_ AV *);
  +PERL_CALLCONV IV*	Perl_macro_AvOFF(pTHX_ AV *);
   
   PERL_CALLCONV void**	Perl_macro_SvANY(pTHX_ SV *);
   PERL_CALLCONV U32*	Perl_macro_SvFLAGS(pTHX_ SV *);
  
  
  
  1.2       +11 -8     ponie/perl/ext/B/B.xs
  
  Index: B.xs
  ===================================================================
  RCS file: /cvs/public/ponie/perl/ext/B/B.xs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- B.xs	9 Sep 2003 11:58:58 -0000	1.1
  +++ B.xs	24 Jun 2004 10:04:17 -0000	1.2
  @@ -29,11 +29,11 @@
       "B::PVNV",
       "B::PVMG",
       "B::BM",
  +    "B::GV",
       "B::PVLV",
       "B::AV",
       "B::HV",
       "B::CV",
  -    "B::GV",
       "B::FM",
       "B::IO",
   };
  @@ -416,9 +416,9 @@
   {
       for(; o; o = o->op_next) {
   	SV *opsv;
  -	if (o->op_seq == 0) 
  +	if (o->op_opt == 0) 
   	    break;
  -	o->op_seq = 0;
  +	o->op_opt = 0;
   	opsv = sv_newmortal();
   	sv_setiv(newSVrv(opsv, cc_opclassname(aTHX_ (OP*)o)), PTR2IV(o));
   	XPUSHs(opsv);
  @@ -714,7 +714,8 @@
   #define OP_desc(o)	PL_op_desc[o->op_type]
   #define OP_targ(o)	o->op_targ
   #define OP_type(o)	o->op_type
  -#define OP_seq(o)	o->op_seq
  +#define OP_opt(o)	o->op_opt
  +#define OP_static(o)	o->op_static
   #define OP_flags(o)	o->op_flags
   #define OP_private(o)	o->op_private
   
  @@ -771,8 +772,12 @@
   OP_type(o)
   	B::OP		o
   
  -U16
  -OP_seq(o)
  +U8
  +OP_opt(o)
  +	B::OP		o
  +
  +U8
  +OP_static(o)
   	B::OP		o
   
   U8
  @@ -1508,8 +1513,6 @@
   AvMAX(av)
   	B::AV	av
   
  -#define AvOFF(av) ((XPVAV*)SvANY(av))->xof_off
  -
   IV
   AvOFF(av)
   	B::AV	av