This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
syscall() declaration in perl.h needs to have an EXTERN_C prefixing
[perl5.git] / hv.h
diff --git a/hv.h b/hv.h
index 4ae5e1a..bd157f8 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -323,6 +323,7 @@ C<SV*>.
 #define HVhek_UTF8     0x01 /* Key is utf8 encoded. */
 #define HVhek_WASUTF8  0x02 /* Key is bytes here, but was supplied as utf8. */
 #define HVhek_REHASH   0x04 /* This key is in an hv using a custom HASH . */
+#define HVhek_UNSHARED 0x08 /* This key isn't a shared hash key. */
 #define HVhek_FREEKEY  0x100 /* Internal flag to say key is malloc()ed.  */
 #define HVhek_PLACEHOLD        0x200 /* Internal flag to create placeholder.
                                * (may change, but Storable is a core module) */
@@ -333,10 +334,11 @@ C<SV*>.
    into all keys as hv_iternext has no access to the hash flags. At this
    point Storable's tests get upset, because sometimes hashes are "keyed"
    and sometimes not, depending on the order of data insertion, and whether
-   it triggered rehashing. So currently HVhek_REHAS is exempt.
+   it triggered rehashing. So currently HVhek_REHASH is exempt.
+   Similarly UNSHARED
 */
    
-#define HVhek_ENABLEHVKFLAGS   (HVhek_MASK - HVhek_REHASH)
+#define HVhek_ENABLEHVKFLAGS   (HVhek_MASK & ~(HVhek_REHASH|HVhek_UNSHARED))
 
 #define HEK_UTF8(hek)          (HEK_FLAGS(hek) & HVhek_UTF8)
 #define HEK_UTF8_on(hek)       (HEK_FLAGS(hek) |= HVhek_UTF8)
@@ -386,13 +388,35 @@ C<SV*>.
 
 #ifdef PERL_CORE
 
+/* Gosh. This really isn't a good name any longer.  */
 struct refcounted_he {
     struct refcounted_he *refcounted_he_next;  /* next entry in chain */
+#ifdef USE_ITHREADS
+    U32                   refcounted_he_hash;
+    U32                   refcounted_he_keylen;
+#else
     HEK                  *refcounted_he_hek;   /* hint key */
-    SV                   *refcounted_he_val;   /* hint value */
+#endif
     U32                          refcounted_he_refcnt; /* reference count */
+    union {
+       IV                refcounted_he_u_iv;
+       UV                refcounted_he_u_uv;
+       STRLEN            refcounted_he_u_len;
+    } refcounted_he_val;
+    /* First byte is flags. Then NUL-terminated value. Then for ithreads,
+       non-NUL terminated key.  */
+    char                  refcounted_he_data[1];
 };
 
+/* Flag bits are HVhek_UTF8, HVhek_WASUTF8, then */
+#define HVrhek_undef   0x00 /* Value is undef. */
+#define HVrhek_PV      0x10 /* Value is a string. */
+#define HVrhek_IV      0x20 /* Value is IV/UV. */
+#define HVrhek_delete  0x30 /* Value is placeholder - signifies delete. */
+#define HVrhek_typemask        0x30
+#define HVrhek_UTF8    0x40 /* string value is utf8. */
+#define HVrhek_UV      0x40 /* integer value is UV. */
+
 #  ifdef USE_ITHREADS
 #    define HINTS_REFCNT_LOCK          MUTEX_LOCK(&PL_hints_mutex)
 #    define HINTS_REFCNT_UNLOCK                MUTEX_UNLOCK(&PL_hints_mutex)