/* These control hash traversal randomization and the environment variable PERL_PERTURB_KEYS.
* Currently disabling this functionality will break a few tests, but should otherwise work fine.
* See perlrun for more details. */
-#define PERL_HASH_RANDOMIZE_KEYS 1
-#define USE_PERL_PERTURB_KEYS 1
-
-#ifdef PERL_HASH_RANDOMIZE_KEYS
-# if defined(DEBUGGING) || defined(USE_PERL_PERTURB_KEYS)
-# define PL_HASH_RAND_BITS_ENABLED PL_hash_rand_bits_enabled
-# endif
-# define PERL_HASH_ITER_BUCKET(iter) (((iter)->xhv_riter) ^ ((iter)->xhv_rand))
+#if defined(PERL_PERTURB_KEYS_DISABLED)
+# define PL_HASH_RAND_BITS_ENABLED 0
+# define PERL_HASH_ITER_BUCKET(iter) ((iter)->xhv_riter)
#else
-# define PERL_HASH_ITER_BUCKET(iter) ((iter)->xhv_riter)
+# define PERL_HASH_RANDOMIZE_KEYS 1
+# if defined(PERL_PERTURB_KEYS_RANDOM)
+# define PL_HASH_RAND_BITS_ENABLED 1
+# elif defined(PERL_PERTURB_KEYS_DETERMINISTIC)
+# define PL_HASH_RAND_BITS_ENABLED 2
+# else
+# define USE_PERL_PERTURB_KEYS 1
+# define PL_HASH_RAND_BITS_ENABLED PL_hash_rand_bits_enabled
+# endif
+# define PERL_HASH_ITER_BUCKET(iter) (((iter)->xhv_riter) ^ ((iter)->xhv_rand))
#endif
/* entry in hash value chain */
U32 xhv_last_rand; /* last random value for hash traversal,
used to detect each() after insert for warnings */
#endif
+ U32 xhv_fill_lazy;
};
/* hash structure: */
# define Nullhv Null(HV*)
#endif
#define HvARRAY(hv) ((hv)->sv_u.svu_hash)
-#define HvFILL(hv) Perl_hv_fill(aTHX_ (const HV *)(hv))
+#define HvFILL(hv) Perl_hv_fill(aTHX_ MUTABLE_HV(hv))
#define HvMAX(hv) ((XPVHV*) SvANY(hv))->xhv_max
/* This quite intentionally does no flag checking first. That's your
responsibility. */