This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Store the BM table in mg_ptr instead of after SvCUR().
[perl5.git] / ext / B / B.xs
index 1ca4fd8..44f8402 100644 (file)
@@ -1619,10 +1619,19 @@ PV(sv)
        U32 utf8 = 0;
     CODE:
        if (ix == 3) {
+#ifndef PERL_FBM_TABLE_OFFSET
+           const MAGIC *const mg = mg_find(sv, PERL_MAGIC_bm);
+
+           if (!mg)
+                croak("argument to B::BM::TABLE is not a PVBM");
+           p = mg->mg_ptr;
+           len = mg->mg_len;
+#else
            p = SvPV(sv, len);
            /* Boyer-Moore table is just after string and its safety-margin \0 */
            p += len + PERL_FBM_TABLE_OFFSET;
            len = 256;
+#endif
        } else if (ix == 2) {
            /* This used to read 257. I think that that was buggy - should have
               been 258. (The "\0", the flags byte, and 256 for the table.)
@@ -1635,9 +1644,17 @@ PV(sv)
               first used by the compiler in 651aa52ea1faa806. It's used to
               get a "complete" dump of the buffer at SvPVX(), not just the
               PVBM table. This permits the generated bytecode to "load"
-              SvPVX in "one" hit.  */
+              SvPVX in "one" hit.
+
+              5.15 and later store the BM table via MAGIC, so the compiler
+              should handle this just fine without changes if PVBM now
+              always returns the SvPVX() buffer.  */
            p = SvPVX_const(sv);
+#ifdef PERL_FBM_TABLE_OFFSET
            len = SvCUR(sv) + (SvVALID(sv) ? 256 + PERL_FBM_TABLE_OFFSET : 0);
+#else
+           len = SvCUR(sv);
+#endif
        } else if (ix) {
            p = SvPVX(sv);
            len = strlen(p);