From: Peter Rabbitson Date: Wed, 21 Dec 2011 11:33:54 +0000 (+0100) Subject: Fix careless handling of the hinthash in PP mode (RT#73402) X-Git-Tag: 0.22~10 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2Fnamespace-clean.git;a=commitdiff_plain;h=656ec55b51c454ca3d8a06a728a4f6c06d6db5d5 Fix careless handling of the hinthash in PP mode (RT#73402) --- diff --git a/Changes b/Changes index e3a6849..8352a79 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,4 @@ + - More robust handling of the tied %^H in pure perl mode (RT#73402) - Limit the debugger workarounds to perls between 5.8.8 and 5.14, extend debugger support to all perl versions (FC) (RT#69862) - If possible, automatically install (but not load) the debugger diff --git a/lib/namespace/clean.pm b/lib/namespace/clean.pm index fbcfeec..1e6d51a 100644 --- a/lib/namespace/clean.pm +++ b/lib/namespace/clean.pm @@ -80,7 +80,10 @@ EOE push @$stack, namespace::clean::_ScopeGuard->arm(shift); } else { + my %old_contents = %^H; + %^H = (); tie( %^H, 'namespace::clean::_TieHintHash', namespace::clean::_ScopeGuard->arm(shift) ); + $^H{$_} = $old_contents{$_} for keys %old_contents; } } diff --git a/t/09-fiddle-hinthash.t b/t/09-fiddle-hinthash.t new file mode 100644 index 0000000..adc1923 --- /dev/null +++ b/t/09-fiddle-hinthash.t @@ -0,0 +1,48 @@ +use strict; +use warnings; + +use Test::More 0.88; + +{ + package Bar; + use sort 'stable'; + use namespace::clean; + use sort 'stable'; + { + 1; + } + + Test::More::pass('no segfault'); +} + +{ + package Foo; + BEGIN { + $^H{'foo'} = 'bar'; + } + + use namespace::clean; + + BEGIN { + Test::More::is( $^H{'foo'}, 'bar', 'hinthash intact' ); + } + + { + 1; + } + + BEGIN { + SKIP: { + Test::More::skip( + 'Tied hinthash values not present in extended caller() on perls older than 5.10' + .', regardless of mode (PP or XS)', + 1 + ) if ($] < 5.010_000); + package DB; + Test::More::is( ( (caller(0))[10] || {} )->{foo}, 'bar', 'hinthash values visible in caller' ); + } + } +} + + +done_testing;