This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Allow custom PL_strtab hash in perl_construct.
authorNicolas R <atoomic@cpan.org>
Wed, 8 Nov 2017 15:56:20 +0000 (08:56 -0700)
committerNicolas R <atoomic@cpan.org>
Wed, 8 Nov 2017 21:43:06 +0000 (14:43 -0700)
Such a patch allow PL_strtab optimizations at compile time
to statically malloc PL_strtab to an optimized size at startup.

Custom entries can then be added (after PL_hash_seed initialization)
without risking the hash to be reset by perl_construct.

perl.c

diff --git a/perl.c b/perl.c
index 2d04271..454cc75 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -371,15 +371,20 @@ perl_construct(pTHXx)
          * constructing hashes */
         PL_hash_seed_set= TRUE;
     }
-    /* Note that strtab is a rather special HV.  Assumptions are made
-       about not iterating on it, and not adding tie magic to it.
-       It is properly deallocated in perl_destruct() */
-    PL_strtab = newHV();
-
-    /* SHAREKEYS tells us that the hash has its keys shared with PL_strtab,
-     * which is not the case with PL_strtab itself */
-    HvSHAREKEYS_off(PL_strtab);                        /* mandatory */
-    hv_ksplit(PL_strtab, 1 << 11);
+
+    /* Allow PL_strtab to be pre-initialized before calling perl_construct.
+    * can use a custom optimized PL_strtab hash before calling perl_construct */
+    if (!PL_strtab) {
+        /* Note that strtab is a rather special HV.  Assumptions are made
+           about not iterating on it, and not adding tie magic to it.
+           It is properly deallocated in perl_destruct() */
+        PL_strtab = newHV();
+
+        /* SHAREKEYS tells us that the hash has its keys shared with PL_strtab,
+         * which is not the case with PL_strtab itself */
+        HvSHAREKEYS_off(PL_strtab);                    /* mandatory */
+        hv_ksplit(PL_strtab, 1 << 11);
+    }
 
     Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);