[inseparable changes from patch from perl5.003_12 to perl5.003_13]
[p5sagit/p5-mst-13.2.git] / hv.h
diff --git a/hv.h b/hv.h
index a9de8ca..5256eac 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -8,13 +8,18 @@
  */
 
 typedef struct he HE;
+typedef struct hek HEK;
 
 struct he {
     HE         *hent_next;
-    char       *hent_key;
+    HEK                *hent_hek;
     SV         *hent_val;
-    U32                hent_hash;
-    I32                hent_klen;
+};
+
+struct hek {
+    U32                hek_hash;
+    I32                hek_len;
+    char       hek_key[1];
 };
 
 struct xpvhv {
@@ -43,10 +48,8 @@ struct xpvhv {
     } STMT_END
 
 
-/* these hash entry flags ride on hent_klen */
-
-#define HEf_LAZYDEL    -1      /* entry must be deleted during next iter step */
-#define HEf_SVKEY      -2      /* hent_key is a SV* (only for magic/tied HVs) */
+/* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
+#define HEf_SVKEY      -2      /* hent_key is a SV* */
 
 
 #define Nullhv Null(HV*)
@@ -63,6 +66,10 @@ struct xpvhv {
 #define HvSHAREKEYS_on(hv)     (SvFLAGS(hv) |= SVphv_SHAREKEYS)
 #define HvSHAREKEYS_off(hv)    (SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
 
+#define HvLAZYDEL(hv)          (SvFLAGS(hv) & SVphv_LAZYDEL)
+#define HvLAZYDEL_on(hv)       (SvFLAGS(hv) |= SVphv_LAZYDEL)
+#define HvLAZYDEL_off(hv)      (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
+
 #ifdef OVERLOAD
 
 /* Maybe amagical: */
@@ -82,20 +89,29 @@ struct xpvhv {
 
 #define Nullhe Null(HE*)
 #define HeNEXT(he)             (he)->hent_next
-#define HeKEY(he)              (he)->hent_key
-#define HeKLEN(he)             (he)->hent_klen
+#define HeKEY_hek(he)          (he)->hent_hek
+#define HeKEY(he)              HEK_KEY(HeKEY_hek(he))
+#define HeKEY_sv(he)           (*(SV**)HeKEY(he))
+#define HeKLEN(he)             HEK_LEN(HeKEY_hek(he))
 #define HeVAL(he)              (he)->hent_val
-#define HeHASH(he)             (he)->hent_hash
-#define HePV(he)               ((he)->hent_klen == HEf_SVKEY) ?                \
-                               SvPV((SV*)((he)->hent_key),na) :                \
-                               (he)->hent_key))
-#define HeSVKEY(he)            (((he)->hent_key &&                             \
-                                 (he)->hent_klen == HEf_SVKEY) ?               \
-                                (SV*)((he)->hent_key) : Nullsv)
-
-#define HeSVKEY_force(he)      ((he)->hent_key ?                               \
-                                (((he)->hent_klen == HEf_SVKEY) ?              \
-                                 (SV*)((he)->hent_key) :                       \
-                                 sv_2mortal(newSVpv((he)->hent_key,            \
-                                                    (he)->hent_klen))) :       \
+#define HeHASH(he)             HEK_HASH(HeKEY_hek(he))
+#define HePV(he)               ((HeKLEN(he) == HEf_SVKEY) ?            \
+                                SvPV(HeKEY_sv(he),na) :                \
+                                HeKEY(he))
+#define HeSVKEY(he)            ((HeKEY(he) &&                          \
+                                 HeKLEN(he) == HEf_SVKEY) ?            \
+                                HeKEY_sv(he) : Nullsv)
+
+#define HeSVKEY_force(he)      (HeKEY(he) ?                            \
+                                ((HeKLEN(he) == HEf_SVKEY) ?           \
+                                 HeKEY_sv(he) :                        \
+                                 sv_2mortal(newSVpv(HeKEY(he),         \
+                                                    HeKLEN(he)))) :    \
                                 &sv_undef)
+#define HeSVKEY_set(he,sv)     (HeKEY_sv(he) = sv)
+
+#define Nullhek Null(HEK*)
+#define HEK_BASESIZE           OFFSETOF(HEK, hek_key[0])
+#define HEK_HASH(hek)          (hek)->hek_hash
+#define HEK_LEN(hek)           (hek)->hek_len
+#define HEK_KEY(hek)           (hek)->hek_key