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