summaryrefslogtreecommitdiff
path: root/hv.h
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2005-05-21 22:46:50 +0000
committerNicholas Clark <nick@ccl4.org>2005-05-21 22:46:50 +0000
commite4305a6302fd35f8f8c1a7e612369beaaea58a4a (patch)
tree6ac771d6994c71db69f780e38918c56d399bdfef /hv.h
parent0e66cca035ceb727a3ab9256f4ef9b63b31b7c37 (diff)
downloadperl-e4305a6302fd35f8f8c1a7e612369beaaea58a4a.tar.gz
Add a union in place of xnv_nv, which allows AVs and HVs to re-use
the memory to store pointers and integers. (Part 1 - will be reworked to be more efficient when IV or void* is 64 bit soon) p4raw-id: //depot/perl@24538
Diffstat (limited to 'hv.h')
-rw-r--r--hv.h19
1 files changed, 15 insertions, 4 deletions
diff --git a/hv.h b/hv.h
index 63454b9ab4..60d2eed70d 100644
--- a/hv.h
+++ b/hv.h
@@ -44,15 +44,26 @@ struct xpvhv_aux {
struct xpvhv {
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 */
+ IV for_rent;
+ union {
+ NV xnvu_nv; /* numeric value, if any */
+ struct {
+ void *xnv_p1;
+ union {
+ void *xnv_p2;
+ IV xnv_i2; /* how many elements in the array */
+ } xnv_u2;
+ } xnv_s;
+ } xnv_u;
MAGIC* xmg_magic; /* magic for scalar array */
HV* xmg_stash; /* class package */
-
- struct xpvhv_aux* xhv_aux;
/* list of pm's for this package is now stored in symtab magic. */
};
+#define xhv_aux xnv_u.xnv_s.xnv_p1
+#define xhv_keys xnv_u.xnv_s.xnv_u2.xnv_i2
+
+
/* hash a key */
/* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins
* from requirements by Colin Plumb.