Hello community,

here is the log from the commit of package perl-Lexical-SealRequireHints for 
openSUSE:Factory checked in at 2015-04-15 16:23:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Lexical-SealRequireHints (Old)
 and      /work/SRC/openSUSE:Factory/.perl-Lexical-SealRequireHints.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-Lexical-SealRequireHints"

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/perl-Lexical-SealRequireHints/perl-Lexical-SealRequireHints.changes
      2014-02-28 19:04:51.000000000 +0100
+++ 
/work/SRC/openSUSE:Factory/.perl-Lexical-SealRequireHints.new/perl-Lexical-SealRequireHints.changes
 2015-04-15 16:23:56.000000000 +0200
@@ -1,0 +2,44 @@
+Mon Apr 13 19:32:52 UTC 2015 - co...@suse.com
+
+- updated to 0.009
+   see /usr/share/doc/packages/perl-Lexical-SealRequireHints/Changes
+
+  version 0.009; 2015-03-20
+  
+    * in test of require for version checking, work around [perl #124135]
+      which was introduced in Perl 5.21.4
+  
+  version 0.008; 2015-03-20
+  
+    * bugfix: don't localise hints around a version-number require, so that
+      "use v5.10.0" can have its intentional effect of setting feature flags
+  
+    * bugfix: in pure Perl implementation, use a ($) prototype on
+      CORE::GLOBAL::require, so that the argument expression will be in
+      the correct context
+  
+    * better error message for refusing to use pure Perl implementation
+      on Perl 5.9.4 to 5.10.0
+  
+    * document that the pure Perl implementation breaks the use of the
+      implicit $_ parameter with require
+  
+    * in swash test, don't fail if utf8.pm was loaded unexpectedly early,
+      as has been seen to happen on some systems
+  
+    * test idempotence
+  
+    * fix test for thread safety, which risked false negatives
+  
+    * when preemptively loading Carp and Carp::Heavy, avoid the Perl core
+      bug regarding the context applied to file scope of required modules,
+      in case of future versions of those modules becoming vulnerable and
+      running on an old Perl
+  
+    * declare correct version for Test::More dependency
+  
+    * typo fix in documentation
+  
+    * typo fix in a comment
+
+-------------------------------------------------------------------

Old:
----
  Lexical-SealRequireHints-0.007.tar.gz

New:
----
  Lexical-SealRequireHints-0.009.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-Lexical-SealRequireHints.spec ++++++
--- /var/tmp/diff_new_pack.0AUhFh/_old  2015-04-15 16:23:56.000000000 +0200
+++ /var/tmp/diff_new_pack.0AUhFh/_new  2015-04-15 16:23:56.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package perl-Lexical-SealRequireHints
 #
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           perl-Lexical-SealRequireHints
-Version:        0.007
+Version:        0.009
 Release:        0
 %define cpan_name Lexical-SealRequireHints
 Summary:        prevent leakage of lexical hints
@@ -68,7 +68,9 @@
 systems that can't handle XS modules. The XS version has a better chance of
 playing nicely with other modules that modify 'require' handling. The pure
 Perl version can't work at all on some Perl versions; users of those
-versions must use the XS.
+versions must use the XS. On all Perl versions suffering the underlying
+hint leakage bug, pure Perl hooking of 'require' breaks the use of
+'require' without an explicit parameter (implicitly using '$_').
 
 %prep
 %setup -q -n %{cpan_name}-%{version}

++++++ Lexical-SealRequireHints-0.007.tar.gz -> 
Lexical-SealRequireHints-0.009.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/Build.PL 
new/Lexical-SealRequireHints-0.009/Build.PL
--- old/Lexical-SealRequireHints-0.007/Build.PL 2012-02-11 12:16:34.000000000 
+0100
+++ new/Lexical-SealRequireHints-0.009/Build.PL 2015-03-20 23:17:44.000000000 
+0100
@@ -68,7 +68,7 @@
        },
        build_requires => {
                "Module::Build" => 0,
-               "Test::More" => 0,
+               "Test::More" => "0.41",
                "perl" => "5.006",
                "strict" => 0,
                "warnings" => 0,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/Changes 
new/Lexical-SealRequireHints-0.009/Changes
--- old/Lexical-SealRequireHints-0.007/Changes  2012-02-11 12:16:34.000000000 
+0100
+++ new/Lexical-SealRequireHints-0.009/Changes  2015-03-20 23:17:44.000000000 
+0100
@@ -1,3 +1,41 @@
+version 0.009; 2015-03-20
+
+  * in test of require for version checking, work around [perl #124135]
+    which was introduced in Perl 5.21.4
+
+version 0.008; 2015-03-20
+
+  * bugfix: don't localise hints around a version-number require, so that
+    "use v5.10.0" can have its intentional effect of setting feature flags
+
+  * bugfix: in pure Perl implementation, use a ($) prototype on
+    CORE::GLOBAL::require, so that the argument expression will be in
+    the correct context
+
+  * better error message for refusing to use pure Perl implementation
+    on Perl 5.9.4 to 5.10.0
+
+  * document that the pure Perl implementation breaks the use of the
+    implicit $_ parameter with require
+
+  * in swash test, don't fail if utf8.pm was loaded unexpectedly early,
+    as has been seen to happen on some systems
+
+  * test idempotence
+
+  * fix test for thread safety, which risked false negatives
+
+  * when preemptively loading Carp and Carp::Heavy, avoid the Perl core
+    bug regarding the context applied to file scope of required modules,
+    in case of future versions of those modules becoming vulnerable and
+    running on an old Perl
+
+  * declare correct version for Test::More dependency
+
+  * typo fix in documentation
+
+  * typo fix in a comment
+
 version 0.007; 2012-02-11
 
   * be thread-safe, by mutex control on op check hooking
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/MANIFEST 
new/Lexical-SealRequireHints-0.009/MANIFEST
--- old/Lexical-SealRequireHints-0.007/MANIFEST 2012-02-11 12:16:35.000000000 
+0100
+++ new/Lexical-SealRequireHints-0.009/MANIFEST 2015-03-20 23:17:44.000000000 
+0100
@@ -15,9 +15,12 @@
 t/context_1.pm
 t/context_2.pm
 t/context_pp.t
+t/defsv.t
 t/eval.t
 t/eval_0.pm
 t/eval_pp.t
+t/idempotent.t
+t/idempotent_pp.t
 t/override.t
 t/override_pp.t
 t/package.t
@@ -38,4 +41,8 @@
 t/swash_pp.t
 t/threads.t
 t/threads_pp.t
+t/version_check.t
+t/version_check_pp.t
+t/version_feature.t
+t/version_feature_pp.t
 SIGNATURE    Added here by Module::Build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/META.json 
new/Lexical-SealRequireHints-0.009/META.json
--- old/Lexical-SealRequireHints-0.007/META.json        2012-02-11 
12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/META.json        2015-03-20 
23:17:44.000000000 +0100
@@ -4,7 +4,7 @@
       "Andrew Main (Zefram) <zef...@fysh.org>"
    ],
    "dynamic_config" : 1,
-   "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 
2.112621",
+   "generated_by" : "Module::Build version 0.4205",
    "license" : [
       "perl_5"
    ],
@@ -16,27 +16,27 @@
    "prereqs" : {
       "build" : {
          "requires" : {
-            "Module::Build" : 0,
-            "Test::More" : 0,
+            "Module::Build" : "0",
+            "Test::More" : "0.41",
             "perl" : "5.006",
-            "strict" : 0,
-            "warnings" : 0
+            "strict" : "0",
+            "warnings" : "0"
          }
       },
       "configure" : {
          "requires" : {
-            "Module::Build" : 0,
+            "Module::Build" : "0",
             "perl" : "5.006",
-            "strict" : 0,
-            "warnings" : 0
+            "strict" : "0",
+            "warnings" : "0"
          }
       },
       "runtime" : {
          "conflicts" : {
-            "B::Hooks::OP::Check" : 0
+            "B::Hooks::OP::Check" : "< 0.19"
          },
          "recommends" : {
-            "XSLoader" : 0
+            "XSLoader" : "0"
          },
          "requires" : {
             "perl" : "5.006"
@@ -46,7 +46,7 @@
    "provides" : {
       "Lexical::SealRequireHints" : {
          "file" : "lib/Lexical/SealRequireHints.pm",
-         "version" : "0.007"
+         "version" : "0.009"
       }
    },
    "release_status" : "stable",
@@ -55,5 +55,5 @@
          "http://dev.perl.org/licenses/";
       ]
    },
-   "version" : "0.007"
+   "version" : "0.009"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/META.yml 
new/Lexical-SealRequireHints-0.009/META.yml
--- old/Lexical-SealRequireHints-0.007/META.yml 2012-02-11 12:16:34.000000000 
+0100
+++ new/Lexical-SealRequireHints-0.009/META.yml 2015-03-20 23:17:44.000000000 
+0100
@@ -3,33 +3,33 @@
 author:
   - 'Andrew Main (Zefram) <zef...@fysh.org>'
 build_requires:
-  Module::Build: 0
-  Test::More: 0
-  perl: 5.006
-  strict: 0
-  warnings: 0
+  Module::Build: '0'
+  Test::More: '0.41'
+  perl: '5.006'
+  strict: '0'
+  warnings: '0'
 configure_requires:
-  Module::Build: 0
-  perl: 5.006
-  strict: 0
-  warnings: 0
+  Module::Build: '0'
+  perl: '5.006'
+  strict: '0'
+  warnings: '0'
 conflicts:
-  B::Hooks::OP::Check: 0
+  B::Hooks::OP::Check: '< 0.19'
 dynamic_config: 1
-generated_by: 'Module::Build version 0.38, CPAN::Meta::Converter version 
2.112621'
+generated_by: 'Module::Build version 0.4205, CPAN::Meta::Converter version 
2.131560'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: Lexical-SealRequireHints
 provides:
   Lexical::SealRequireHints:
     file: lib/Lexical/SealRequireHints.pm
-    version: 0.007
+    version: '0.009'
 recommends:
-  XSLoader: 0
+  XSLoader: '0'
 requires:
-  perl: 5.006
+  perl: '5.006'
 resources:
   license: http://dev.perl.org/licenses/
-version: 0.007
+version: '0.009'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/Makefile.PL 
new/Lexical-SealRequireHints-0.009/Makefile.PL
--- old/Lexical-SealRequireHints-0.007/Makefile.PL      2012-02-11 
12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/Makefile.PL      2015-03-20 
23:17:44.000000000 +0100
@@ -1,4 +1,4 @@
-# Note: this file was auto-generated by Module::Build::Compat version 0.3800
+# Note: this file was auto-generated by Module::Build::Compat version 0.4205
 require 5.006;
 
     unless (eval "use Module::Build::Compat 0.02; 1" ) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/README 
new/Lexical-SealRequireHints-0.009/README
--- old/Lexical-SealRequireHints-0.007/README   2012-02-11 12:16:34.000000000 
+0100
+++ new/Lexical-SealRequireHints-0.009/README   2015-03-20 23:17:44.000000000 
+0100
@@ -55,7 +55,7 @@
 
 COPYRIGHT
 
-Copyright (C) 2009, 2010, 2011, 2012
+Copyright (C) 2009, 2010, 2011, 2012, 2015
 Andrew Main (Zefram) <zef...@fysh.org>
 
 LICENSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/SIGNATURE 
new/Lexical-SealRequireHints-0.009/SIGNATURE
--- old/Lexical-SealRequireHints-0.007/SIGNATURE        2012-02-11 
12:16:41.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/SIGNATURE        2015-03-20 
23:17:52.000000000 +0100
@@ -1,5 +1,5 @@
 This file contains message digests of all files listed in MANIFEST,
-signed via the Module::Signature module, version 0.68.
+signed via the Module::Signature module, version 0.73.
 
 To verify the content in this distribution, first make sure you have
 Module::Signature installed, then type:
@@ -15,26 +15,29 @@
 Hash: SHA1
 
 SHA1 6950821fe34951e6170552099d0de2ee22e43714 .gitignore
-SHA1 cc637451b4394bbe449e558c2865bcfbb2698996 Build.PL
-SHA1 1561b6b5e01725c2adeacdf97940981180de6bc1 Changes
-SHA1 675cada784cd0ada13c868f959abab084f281d75 MANIFEST
-SHA1 31362999f1729383f21c3d4452c3be1c2d062b5b META.json
-SHA1 a29e34b013c3e2e60b3fe2d9a4bfe087334476ea META.yml
-SHA1 2157ae40589595d6cc1585fd7279b25bcf8f5852 Makefile.PL
-SHA1 5c7f6f24dbb8f162baf840f1c5c98861b19bed74 README
-SHA1 70e3750058671c254a36aa4f86bf88d129895953 lib/Lexical/SealRequireHints.pm
-SHA1 61d65de0636ca2ecb3c775bda849e5f125f363ee lib/Lexical/SealRequireHints.xs
+SHA1 cd9729601cf687ddd61f76175d4aaae77c89be3e Build.PL
+SHA1 d7013975ca8dd0bdc62762310f2fee0d0671868c Changes
+SHA1 8a0fd294cf9c6c2a0aa73eb594811f6ff9d4ad2a MANIFEST
+SHA1 420110294ca08a77f892b26f21ead15e7e99295a META.json
+SHA1 c2b3c2080c3ef9d87770c908ffd9ea3ebb9f6b53 META.yml
+SHA1 01014dbee096cf5abd3f05069cefa9c907a4aea1 Makefile.PL
+SHA1 e220c3530b5f359a04b0eca0c76ffe38e4b8e7c5 README
+SHA1 365f2fbb42b1aa995f0cdbc1d7d0863c92ffbf87 lib/Lexical/SealRequireHints.pm
+SHA1 b37bc49474485b81053e6140531279187db2c1ff lib/Lexical/SealRequireHints.xs
 SHA1 85aaf18e006530f42082c756aa1040649c8b09a0 t/before_warnings.t
 SHA1 61999cf7732bd0ae59043f1718b294598366bdeb t/before_warnings_pp.t
-SHA1 c6cc59cef58e4667494227ff90035fc292521a0d t/context.t
+SHA1 3df41730d40647226f508e56d154aa432491d004 t/context.t
 SHA1 d40cabac0840b217bd9790fcf9c61f53d84561ec t/context_0.pm
 SHA1 c38cbea405a2738de1e144063993d9958934b828 t/context_1.pm
 SHA1 f13b20d1b34f6765fa222a387c022e4543aef945 t/context_2.pm
 SHA1 82657c96b6ed89ce7bdb6285dbcfbb05d68eaeb3 t/context_pp.t
+SHA1 18a96f78b97cc043c8ced0aceefb8216a50e44b0 t/defsv.t
 SHA1 cafd4c3b6c5ea236bc2abec70b819b730cb90c4c t/eval.t
-SHA1 a310c06c38797639dc5967a43c4e317ae10210d7 t/eval_0.pm
+SHA1 e9a4397c1e339f95671c1b5e609426f624784efe t/eval_0.pm
 SHA1 b110d57bc147139e44f07d931e3d3698b404c244 t/eval_pp.t
-SHA1 0109e5dfa9cd027eb8c5dddeb3ffe6eefa45939c t/override.t
+SHA1 bba5f7f0083a8575478ddb642d80e27d6bf111c9 t/idempotent.t
+SHA1 ef1eea9ae1774a96b0955b0da0d703de32bbcfe2 t/idempotent_pp.t
+SHA1 1c2bfdf067bb2215729fe8ff60990c875799a22a t/override.t
 SHA1 d151cfac8c90f19137177b72eb2bff07488401ea t/override_pp.t
 SHA1 b064a061f38ee4924c7100180e8e8ff877bb25d1 t/package.t
 SHA1 8f88eba8be8441c0e078f3279b9220a2fdcd7c7c t/package_0.pm
@@ -50,14 +53,18 @@
 SHA1 e8478e388c78af43a2f3b50dd4c2d647dbd3b9ef t/seal_4.pm
 SHA1 bf9f3734c090121ff387eb85351b8abe17d6cff6 t/seal_pp.t
 SHA1 f8bd31bc8099cbb21c36cddc0508652fd092e332 t/setup_pp.pl
-SHA1 fb608255d353cd98087a1b014b327f65d3acb6c2 t/swash.t
+SHA1 6912741c04aa7b1a080bbe9216e453e489e9c218 t/swash.t
 SHA1 c2be3b40bb344403ac14899f5dfe05196373d1f9 t/swash_pp.t
-SHA1 188f8f22b5b2304027a9bb374be67f62322be25a t/threads.t
+SHA1 923e318828faaccdd2585f228535f44fae8b1842 t/threads.t
 SHA1 3dcc432bbe2d8f67f875e68d6501fd69683fab9f t/threads_pp.t
+SHA1 0ec3dd0164e1e852b1be5f78bbacebd4990f085e t/version_check.t
+SHA1 ed1cbf6ff3eed2268c517087e01814a940da658e t/version_check_pp.t
+SHA1 cbff8c2d9481b01beb691a498ae98511d0b25cbe t/version_feature.t
+SHA1 04c0a2e7e2291f9e74f8add832caa29eb2b538d4 t/version_feature_pp.t
 -----BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.10 (GNU/Linux)
+Version: GnuPG v1.4.12 (GNU/Linux)
 
-iEYEARECAAYFAk82ThMACgkQOV9mt2VyAVEMEwCfW4fb0GfXrM9aadSuV9WE/pjg
-/D8AnjcMTCb31yJNMccwSCUU8sfUWP1M
-=IQMc
+iEYEARECAAYFAlUMnIgACgkQOV9mt2VyAVGo8gCdEl9TWsnI/5dj5/o4o1krfFf9
+bKQAn0BXT0KTTLj/kiOqfB/9oJW6yrlq
+=l4Ln
 -----END PGP SIGNATURE-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Lexical-SealRequireHints-0.007/lib/Lexical/SealRequireHints.pm 
new/Lexical-SealRequireHints-0.009/lib/Lexical/SealRequireHints.pm
--- old/Lexical-SealRequireHints-0.007/lib/Lexical/SealRequireHints.pm  
2012-02-11 12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/lib/Lexical/SealRequireHints.pm  
2015-03-20 23:17:44.000000000 +0100
@@ -44,10 +44,12 @@
 This module is implemented in XS, with a pure Perl backup version for
 systems that can't handle XS modules.  The XS version has a better chance
 of playing nicely with other modules that modify C<require> handling.
-The pure Perl version can't work at all on some Perl versions; users of
-those versions must use the XS.
+The pure Perl version can't work at all on some Perl versions; users
+of those versions must use the XS.  On all Perl versions suffering the
+underlying hint leakage bug, pure Perl hooking of C<require> breaks the
+use of C<require> without an explicit parameter (implicitly using C<$_>).
 
-=head1 PERL VERION DIFFERENCES
+=head1 PERL VERSION DIFFERENCES
 
 The history of the C<%^H> bugs is complex.  Here is a chronological
 statement of the relevant changes.
@@ -143,7 +145,7 @@
 # Also don't "use strict", because of consequences of compiling
 # strict.pm's code.
 
-our $VERSION = "0.007";
+our $VERSION = "0.009";
 
 if("$]" >= 5.012) {
        # bug not present
@@ -161,9 +163,13 @@
        # may be subject to delayed require statements in XSLoader or
        # things that it loaded.
        foreach(qw(Carp.pm Carp/Heavy.pm)) {
-               eval { local $SIG{__DIE__}; require($_); };
+               eval { local $SIG{__DIE__}; require($_); 1; };
        }
-} elsif("$]" >= 5.007002 && !("$]" >= 5.009004 && "$]" < 5.010001)) {
+} elsif("$]" < 5.007002) {
+       die "pure Perl version of @{[__PACKAGE__]} can't work on pre-5.8 perl";
+} elsif("$]" >= 5.009004 && "$]" < 5.010001) {
+       die "pure Perl version of @{[__PACKAGE__]} can't work on perl 5.10.0";
+} else {
        my $done;
        *import = sub {
                die "$_[0] does not take any importation arguments\n"
@@ -189,15 +195,36 @@
                                $CORE::GLOBAL::{require} = $grequire;
                                return scalar($requirer->($arg));
                        };
-               *CORE::GLOBAL::require = sub {
+               *CORE::GLOBAL::require = sub ($) {
                        die "wrong number of arguments to require\n"
                                unless @_ == 1;
                        my($arg) = @_;
                        # Some reference to $next_require is required
                        # at this level of subroutine so that it will
                        # be closed over and hence made available to
-                       # the string eval below.
+                       # the string eval.
                        my $nr = $next_require;
+                       my $requirer = eval qq{
+                               package @{[scalar(caller(0))]};
+                               sub { scalar(\$next_require->(\$_[0])) };
+                       };
+                       # We must localise %^H when performing a require
+                       # with a filename, but not a require with a
+                       # version number.  This is because on Perl 5.9.5
+                       # and above require with a version number does an
+                       # internal importation from the "feature" module,
+                       # which is intentional behaviour that must be
+                       # allowed to affect %^H.  (That's logically the
+                       # wrong place for the feature importation, but
+                       # it's too late to change how old Perls do it.)
+                       # A version number is an argument that is either
+                       # numeric or, from Perl 5.9.2 onwards, a v-string.
+                       my $must_localise = ($arg^$arg) ne "0" &&
+                               !("$]" >= 5.009002 && ref(\$arg) eq "VSTRING");
+                       # On Perl 5.11 we need to set the HINT_LOCALIZE_HH
+                       # bit to get proper restoration of %^H by the
+                       # swash loading code.
+                       $^H |= 0x20000 if "$]" >= 5.011 && $must_localise;
                        # Compile-time %^H gets localised by the
                        # "local %^H".  Runtime %^H doesn't exist prior
                        # to Perl 5.9.4, and on Perl 5.10.1 and above is
@@ -206,21 +233,12 @@
                        # correctly localise runtime %^H in pure Perl,
                        # short of putting an eval frame around the
                        # require, so we don't use this implementation in
-                       # that region.  On Perl 5.11 we need to set the
-                       # HINT_LOCALIZE_HH bit to get proper restoration
-                       # of %^H by the swash loading code.
-                       my $requirer = eval qq{
-                               package @{[scalar(caller(0))]};
-                               sub { scalar(\$next_require->(\$_[0])) };
-                       };
-                       $^H |= 0x20000 if "$]" >= 5.011;
-                       local %^H;
+                       # that region.
+                       local %^H if $must_localise;
                        return scalar($requirer->($arg));
                };
        };
        *unimport = sub { die "$_[0] does not support unimportation\n" };
-} else {
-       die "pure Perl version of @{[__PACKAGE__]} can't work on pre-5.8 perl";
 }
 
 =head1 BUGS
@@ -230,6 +248,18 @@
 a C<require> statement that was compiled before this module was invoked.
 Where problems occur, this module must be invoked earlier.
 
+On all Perl versions that need a fix for the lexical hint leakage bug,
+the pure Perl implementation of this module unavoidably breaks the use
+of C<require> without an explicit parameter (implicitly using C<$_>).
+This is due to another bug in the Perl core, fixed in Perl 5.15.5, and is
+inherent to the mechanism by which pure Perl code can hook C<require>.
+The use of implicit C<$_> with C<require> is rare, so although this
+state of affairs is faulty it will actually work for most programs.
+Perl versions 5.12.0 and greater, despite having the C<require> hooking
+bug, don't actually exhibit a problem with the pure Perl version of this
+module, because with the lexical hint leakage bug fixed there is no need
+for this module to hook C<require>.
+
 =head1 SEE ALSO
 
 L<perlpragma>
@@ -240,7 +270,7 @@
 
 =head1 COPYRIGHT
 
-Copyright (C) 2009, 2010, 2011, 2012
+Copyright (C) 2009, 2010, 2011, 2012, 2015
 Andrew Main (Zefram) <zef...@fysh.org>
 
 =head1 LICENSE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Lexical-SealRequireHints-0.007/lib/Lexical/SealRequireHints.xs 
new/Lexical-SealRequireHints-0.009/lib/Lexical/SealRequireHints.xs
--- old/Lexical-SealRequireHints-0.007/lib/Lexical/SealRequireHints.xs  
2012-02-11 12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/lib/Lexical/SealRequireHints.xs  
2015-03-20 23:17:44.000000000 +0100
@@ -41,15 +41,53 @@
 }
 # endif /* !wrap_op_checker */
 
+# ifndef SvVOK
+#  define SvVOK(sv) 0
+# endif /* !SvVOK */
+
 # define refcounted_he_free(he) Perl_refcounted_he_free(aTHX_ he)
 
-static OP *pp_squashhints(pTHX)
+# define newDEFSVOP() THX_newDEFSVOP(aTHX)
+static OP *THX_newDEFSVOP(pTHX)
+{
+# if PERL_VERSION_GE(5,9,1)
+       /* hope nothing overrides the meaning of defined() */
+       OP *dop = newOP(OP_DEFINED, 0);
+       if(dop->op_type == OP_DEFINED && (dop->op_flags & OPf_KIDS)) {
+               OP *op = cUNOPx(dop)->op_first;
+               cUNOPx(dop)->op_first = op->op_sibling;
+               if(!op->op_sibling) dop->op_flags &= ~OPf_KIDS;
+               op->op_sibling = NULL;
+               op_free(dop);
+               return op;
+       }
+       op_free(dop);
+# endif /* >=5.9.1 */
+       return newSVREF(newGVOP(OP_GV, 0, PL_defgv));
+}
+
+# define op_scalar(op) THX_op_scalar(aTHX_ op)
+static OP *THX_op_scalar(pTHX_ OP *op)
+{
+       OP *sop = newUNOP(OP_SCALAR, 0, op);
+       if(!(sop->op_type == OP_SCALAR && (sop->op_flags & OPf_KIDS)))
+               return sop;
+       op = cUNOPx(sop)->op_first;
+       cUNOPx(sop)->op_first = op->op_sibling;
+       if(!op->op_sibling) sop->op_flags &= ~OPf_KIDS;
+       op->op_sibling = NULL;
+       op_free(sop);
+       return op;
+}
+
+# define pp_squashhints() THX_pp_squashhints(aTHX)
+static OP *THX_pp_squashhints(pTHX)
 {
        /*
         * SAVEHINTS() won't actually localise %^H unless the
         * HINT_LOCALIZE_HH bit is set.  Normally that bit would be set if
         * there were anything in %^H, but when affected by [perl #73174]
-        * the core's swash-loading code clears $^H without # changing
+        * the core's swash-loading code clears $^H without changing
         * %^H, so we set the bit here.  We localise $^H while doing this,
         * in order to not clobber $^H across a normal require where the
         * bit is legitimately clear, except on Perl 5.11, where the bit
@@ -70,22 +108,75 @@
        return PL_op->op_next;
 }
 
-#define gen_squashhints_op() THX_gen_squashhints_op(aTHX)
+# define gen_squashhints_op() THX_gen_squashhints_op(aTHX)
 static OP *THX_gen_squashhints_op(pTHX)
 {
        OP *squashhints_op = newOP(OP_PUSHMARK, 0);
        squashhints_op->op_type = OP_RAND;
-       squashhints_op->op_ppaddr = pp_squashhints;
+       squashhints_op->op_ppaddr = THX_pp_squashhints;
        return squashhints_op;
 }
 
+# define pp_maybesquashhints() THX_pp_maybesquashhints(aTHX)
+static OP *THX_pp_maybesquashhints(pTHX)
+{
+       dSP;
+       SV *arg = TOPs;
+       return SvNIOKp(arg) || (PERL_VERSION_GE(5,9,2) && SvVOK(arg)) ?
+               PL_op->op_next : pp_squashhints();
+}
+
+# define gen_maybesquashhints_op(argop) THX_gen_maybesquashhints_op(aTHX_ 
argop)
+static OP *THX_gen_maybesquashhints_op(pTHX_ OP *argop)
+{
+       OP *msh_op = newUNOP(OP_NULL, 0, argop);
+       msh_op->op_type = OP_RAND;
+       msh_op->op_ppaddr = THX_pp_maybesquashhints;
+       return msh_op;
+}
+
 static OP *(*nxck_require)(pTHX_ OP *op);
 
 static OP *myck_require(pTHX_ OP *op)
 {
-       op = nxck_require(aTHX_ op);
-       op = append_list(OP_LINESEQ, (LISTOP*)gen_squashhints_op(),
-                                       (LISTOP*)op);
+       OP *argop;
+       if(!(op->op_flags & OPf_KIDS)) {
+               /*
+                * We need to expand the implicit-parameter case
+                * to an explicit parameter that we can operate on.
+                * This duplicates what ck_fun() would do, including
+                * its invocation of a fresh chain of op checkers.
+                */
+               op_free(op);
+               return newUNOP(OP_REQUIRE, 0, newDEFSVOP());
+       }
+       argop = cUNOPx(op)->op_first;
+       if(argop->op_type == OP_CONST && (argop->op_private & OPpCONST_BARE)) {
+               /*
+                * Bareword argument gets special handling in standard
+                * checker, which we'd rather not interfere with by the
+                * process that we'd need to use a maybesquashhints op.
+                * Fortunately, we don't need access to the runtime
+                * argument in this case: we know it must be a module
+                * name, so we definitely want to squash hints at runtime.
+                * So build op tree with an unconditional squashhints op.
+                */
+               op = nxck_require(aTHX_ op);
+               op = append_list(OP_LINESEQ, (LISTOP*)gen_squashhints_op(),
+                                               (LISTOP*)op);
+       } else {
+               /*
+                * Whether we want to squash hints depends on whether
+                * the argument at runtime is a version number or not.
+                * So we wrap the argument op, separating it from the
+                * require op.
+                */
+               OP *sib = argop->op_sibling;
+               argop->op_sibling = NULL;
+               argop = gen_maybesquashhints_op(op_scalar(argop));
+               argop->op_sibling = sib;
+               cUNOPx(op)->op_first = argop;
+       }
        op = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), op);
        op->op_type = OP_LEAVE;
        op->op_ppaddr = PL_ppaddr[OP_LEAVE];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/context.t 
new/Lexical-SealRequireHints-0.009/t/context.t
--- old/Lexical-SealRequireHints-0.007/t/context.t      2012-02-11 
12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/context.t      2015-03-20 
23:17:44.000000000 +0100
@@ -1,7 +1,7 @@
 use warnings;
 use strict;
 
-use Test::More tests => 11;
+use Test::More tests => 14;
 
 BEGIN { use_ok "Lexical::SealRequireHints"; }
 
@@ -29,4 +29,14 @@
 eval { require t::context_2; 1 };
 is $@, "";
 
+sub diecxt() {
+       die wantarray ? "ARRAY\n" : defined(wantarray) ? "SCALAR\n" : "VOID\n";
+}
+eval { $retval = require(diecxt()); 1 };
+is $@, "SCALAR\n";
+eval { $retval = [ require(diecxt()) ]; 1 };
+is $@, "SCALAR\n";
+eval { require(diecxt()); 1 };
+is $@, "SCALAR\n";
+
 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/defsv.t 
new/Lexical-SealRequireHints-0.009/t/defsv.t
--- old/Lexical-SealRequireHints-0.007/t/defsv.t        1970-01-01 
01:00:00.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/defsv.t        2015-03-20 
23:17:44.000000000 +0100
@@ -0,0 +1,29 @@
+use warnings;
+use strict;
+
+use Test::More tests => 5;
+
+BEGIN { use_ok "Lexical::SealRequireHints"; }
+
+SKIP: {
+       skip "CORE::GLOBAL::require breaks require() on this perl", 4
+               if defined(&CORE::GLOBAL::require) && "$]" < 5.015005;
+       my $retval;
+       eval q{ our $_ = "t/context_0.pm"; $retval = require; 1 };
+       is $@, "";
+       is $retval, "t::context_0 return";
+       SKIP: {
+               skip "no lexical \$_ on this perl", 2 if "$]" < 5.009001;
+               eval q{
+                       no warnings "$]" >= 5.017009 ? "experimental" :
+                                                       "deprecated";
+                       my $_ = "t/context_1.pm";
+                       $retval = require;
+                       1;
+               };
+               is $@, "";
+               is $retval, "t::context_1 return";
+       }
+}
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/eval_0.pm 
new/Lexical-SealRequireHints-0.009/t/eval_0.pm
--- old/Lexical-SealRequireHints-0.007/t/eval_0.pm      2012-02-11 
12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/eval_0.pm      2015-03-20 
23:17:44.000000000 +0100
@@ -3,7 +3,7 @@
 use warnings;
 use strict;
 
-use Test::More;
+use Test::More 0.41;
 
 sub _ok_no_eval() {
        my $lastsub = "";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/idempotent.t 
new/Lexical-SealRequireHints-0.009/t/idempotent.t
--- old/Lexical-SealRequireHints-0.007/t/idempotent.t   1970-01-01 
01:00:00.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/idempotent.t   2015-03-20 
23:17:44.000000000 +0100
@@ -0,0 +1,9 @@
+use warnings;
+use strict;
+
+alarm 10;
+
+use Lexical::SealRequireHints;
+do "t/seal.t" or die $@ || $!;
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/idempotent_pp.t 
new/Lexical-SealRequireHints-0.009/t/idempotent_pp.t
--- old/Lexical-SealRequireHints-0.007/t/idempotent_pp.t        1970-01-01 
01:00:00.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/idempotent_pp.t        2015-03-20 
23:17:44.000000000 +0100
@@ -0,0 +1,7 @@
+use warnings;
+use strict;
+
+do "t/setup_pp.pl" or die $@ || $!;
+do "t/idempotent.t" or die $@ || $!;
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/override.t 
new/Lexical-SealRequireHints-0.009/t/override.t
--- old/Lexical-SealRequireHints-0.007/t/override.t     2012-02-11 
12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/override.t     2015-03-20 
23:17:44.000000000 +0100
@@ -44,7 +44,8 @@
        my $next_require = defined(&CORE::GLOBAL::require) ?
                \&CORE::GLOBAL::require : sub { CORE::require($_[0]) };
        no warnings "redefine";
-       *CORE::GLOBAL::require = sub {
+       no warnings "prototype";
+       *CORE::GLOBAL::require = sub ($) {
                push @require_activity, "b";
                return $next_require->(@_);
        };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/swash.t 
new/Lexical-SealRequireHints-0.009/t/swash.t
--- old/Lexical-SealRequireHints-0.007/t/swash.t        2012-02-11 
12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/swash.t        2015-03-20 
23:17:44.000000000 +0100
@@ -28,7 +28,14 @@
        %^H = ( foo=>1, bar=>2 );
        $^H |= 0x20000;
        is_deeply [ sort keys(%^H) ], [qw(bar foo)];
-       ok !exists($INC{"utf8.pm"});
+       if(exists $INC{"utf8.pm"}) {
+               SKIP: {
+                       skip "utf8.pm loaded too early ".
+                               "(breaking following tests)", 1;
+               }
+       } else {
+               pass;
+       }
 }
 BEGIN {
        # Up to Perl 5.7.0, it is the compilation of this regexp match
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/threads.t 
new/Lexical-SealRequireHints-0.009/t/threads.t
--- old/Lexical-SealRequireHints-0.007/t/threads.t      2012-02-11 
12:16:34.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/threads.t      2015-03-20 
23:17:44.000000000 +0100
@@ -16,12 +16,18 @@
                require Test::More;
                Test::More::plan(skip_all => "Thread::Semaphore unavailable");
        }
+       eval { require threads::shared; };
+       if($@ ne "") {
+               require Test::More;
+               Test::More::plan(skip_all => "threads::shared unavailable");
+       }
 }
 
 use threads;
 
 use Test::More tests => 3;
 use Thread::Semaphore ();
+use threads::shared;
 
 alarm 10;   # failure mode may involve an infinite loop
 
@@ -30,26 +36,30 @@
 my $done2 = Thread::Semaphore->new(0);
 my $exit2 = Thread::Semaphore->new(0);
 
-my $ok1 = 1;
+my $ok1 :shared;
 my $thread1 = threads->create(sub {
+       my $ok = 1;
        eval(q{
                use Lexical::SealRequireHints;
                require t::context_1;
                1;
-       }) or $ok1 = 0;
+       }) or $ok = 0;
+       $ok1 = $ok;
        $done1->up;
        $exit1->down;
 });
 $done1->down;
 ok $ok1;
 
-my $ok2 = 1;
+my $ok2 :shared;
 my $thread2 = threads->create(sub {
+       my $ok = 1;
        eval(q{
                use Lexical::SealRequireHints;
                require t::context_2;
                1;
-       }) or $ok2 = 0;
+       }) or $ok = 0;
+       $ok2 = $ok;
        $done2->up;
        $exit2->down;
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/version_check.t 
new/Lexical-SealRequireHints-0.009/t/version_check.t
--- old/Lexical-SealRequireHints-0.007/t/version_check.t        1970-01-01 
01:00:00.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/version_check.t        2015-03-20 
23:17:44.000000000 +0100
@@ -0,0 +1,44 @@
+use warnings;
+use strict;
+
+use Test::More tests => 19;
+
+BEGIN { use_ok "Lexical::SealRequireHints"; }
+
+no warnings "portable";
+
+foreach(
+       q{ use 5.006; },
+       q{ use 5.6.0; },
+       q{ use v5.6.0; },
+       q{ require 5.006; },
+       q{ require 5.6.0; },
+       q{ require v5.6.0; },
+       q{ require(5.006); },
+       ("$]" >= 5.009002 ? (
+               q{ my $v = 5.6.0; require($v); },
+               q{ my $v = 5.6.0; require($v); },
+       ) : ("", "")),
+) {
+       eval $_;
+       is $@, "";
+}
+
+foreach(
+       q{ use 6.006; },
+       q{ use 6.6.0; },
+       q{ use v6.6.0; },
+       q{ require 6.006; },
+       q{ require 6.6.0; },
+       q{ require v6.6.0; },
+       q{ require(6.006); },
+       ("$]" >= 5.009002 ? (
+               q{ my $v = 6.6.0; require($v); },
+               q{ my $v = 6.6.0; require($v); },
+       ) : ("use 6.006;", "use 6.006;")),
+) {
+       eval $_;
+       like $@, qr/\APerl v6\.6\.0 required/;
+}
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/version_check_pp.t 
new/Lexical-SealRequireHints-0.009/t/version_check_pp.t
--- old/Lexical-SealRequireHints-0.007/t/version_check_pp.t     1970-01-01 
01:00:00.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/version_check_pp.t     2015-03-20 
23:17:44.000000000 +0100
@@ -0,0 +1,7 @@
+use warnings;
+use strict;
+
+do "t/setup_pp.pl" or die $@ || $!;
+do "t/version_check.t" or die $@ || $!;
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Lexical-SealRequireHints-0.007/t/version_feature.t 
new/Lexical-SealRequireHints-0.009/t/version_feature.t
--- old/Lexical-SealRequireHints-0.007/t/version_feature.t      1970-01-01 
01:00:00.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/version_feature.t      2015-03-20 
23:17:44.000000000 +0100
@@ -0,0 +1,36 @@
+use warnings;
+use strict;
+
+BEGIN {
+       if("$]" < 5.009005) {
+               require Test::More;
+               Test::More::plan(skip_all =>
+                       "no version-implied features on this perl");
+       }
+}
+
+use Test::More tests => 4;
+
+BEGIN { use_ok "Lexical::SealRequireHints"; }
+
+eval q{
+       use 5.009005;
+       sub t0 { say "foo"; }
+};
+is $@, "";
+
+eval q{
+       no warnings "portable";
+       use 5.9.5;
+       sub t1 { say "foo"; }
+};
+is $@, "";
+
+eval q{
+       no warnings "portable";
+       use v5.9.5;
+       sub t2 { say "foo"; }
+};
+is $@, "";
+
+1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Lexical-SealRequireHints-0.007/t/version_feature_pp.t 
new/Lexical-SealRequireHints-0.009/t/version_feature_pp.t
--- old/Lexical-SealRequireHints-0.007/t/version_feature_pp.t   1970-01-01 
01:00:00.000000000 +0100
+++ new/Lexical-SealRequireHints-0.009/t/version_feature_pp.t   2015-03-20 
23:17:44.000000000 +0100
@@ -0,0 +1,7 @@
+use warnings;
+use strict;
+
+do "t/setup_pp.pl" or die $@ || $!;
+do "t/version_feature.t" or die $@ || $!;
+
+1;


Reply via email to