Data::Dumper: restore XS-mode deparse support in older Perls
authorAaron Crane <arc@cpan.org>
Sat, 21 Apr 2018 18:16:05 +0000 (20:16 +0200)
committerAaron Crane <arc@cpan.org>
Sun, 22 Jul 2018 12:41:37 +0000 (13:41 +0100)
dist/Data-Dumper/Dumper.pm
dist/Data-Dumper/Dumper.xs

index 06ca52d..8aa12dc 100644 (file)
@@ -19,7 +19,6 @@ use 5.006_001;
 require Exporter;
 
 use constant IS_PRE_516_PERL => $] < 5.016;
-use constant IS_PRE_520_PERL => $] < 5.020;
 
 use Carp ();
 
@@ -227,14 +226,6 @@ sub Names {
 sub DESTROY {}
 
 sub Dump {
-  # On old versions of perl, the xs-deparse support can fail
-  # mysteriously. Barring copious spare time, it's best to revert
-  # to the previously standard behavior of using the pure perl dumper
-  # for deparsing on old perls. --Steffen
-  if (IS_PRE_520_PERL and ($Data::Dumper::Deparse or (ref($_[0]) && $_[0]->{deparse}))) {
-    return &Dumpperl;
-  }
-
   return &Dumpxs
     unless $Data::Dumper::Useperl || (ref($_[0]) && $_[0]->{useperl})
             # Use pure perl version on earlier releases on EBCDIC platforms
index 9557191..66bd1fd 100644 (file)
@@ -555,8 +555,23 @@ deparsed_output(pTHX_ SV *val)
      * modifies it (so we also can't reuse it below) */
     SV *pkg = newSVpvs("B::Deparse");
 
+    /* Commit ebdc88085efa6fca8a1b0afaa388f0491bdccd5a (first released as part
+     * of 5.19.7) changed core S_process_special_blocks() to use a new stack
+     * for anything using a BEGIN block, on the grounds that doing so "avoids
+     * the stack moving underneath anything that directly or indirectly calls
+     * Perl_load_module()". If we're in an older Perl, we can't rely on that
+     * stack, and must create a fresh sacrificial stack of our own. */
+#if PERL_VERSION < 20
+    PUSHSTACKi(PERLSI_REQUIRE);
+#endif
+
     load_module(PERL_LOADMOD_NOIMPORT, pkg, 0);
 
+#if PERL_VERSION < 20
+    POPSTACK;
+    SPAGAIN;
+#endif
+
     SAVETMPS;
 
     PUSHMARK(SP);