X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDevel%2FGlobalDestruction.pm;fp=lib%2FDevel%2FGlobalDestruction.pm;h=9ce9a7068a3f16f04bcc30a59bdeddee3693687d;hb=350bef653f634d1c7cb7357b45e1835b1489f9b7;hp=2072b3e26ec3b2ccdd7d495a052cd9b531c6058f;hpb=e00dea6cd9072706aa8b8e705b9ecb8b7f7b913c;p=p5sagit%2FDevel-GlobalDestruction.git diff --git a/lib/Devel/GlobalDestruction.pm b/lib/Devel/GlobalDestruction.pm index 2072b3e..9ce9a70 100644 --- a/lib/Devel/GlobalDestruction.pm +++ b/lib/Devel/GlobalDestruction.pm @@ -27,17 +27,11 @@ elsif (eval { # the eval already installed everything, nothing to do } else { - # internally, PL_main_start is nulled immediately before entering global destruction - # and we can use B to detect that. It will also be null before the main runloop starts, - # so we check install a CHECK if needed to detect that. + # internally, PL_main_cv is set to Nullcv immediately before entering + # global destruction and we can use B to detect that. B::main_cv will + # only ever be a B::CV or a B::SPECIAL that is a reference to 0 require B; - my $started = !B::main_start()->isa(q[B::NULL]); - unless ($started) { - # work around 5.6 eval bug - eval '0 && $started; CHECK { $started = 1 }; 1' - or die $@; - } - eval '0 && $started; sub in_global_destruction () { $started && B::main_start()->isa(q[B::NULL]) }; 1' + eval 'sub in_global_destruction () { ${B::main_cv()} == 0 }; 1' or die $@; } @@ -87,7 +81,7 @@ aliased, etc. if L is present. Returns true if the interpreter is in global destruction. In perl 5.14+, this returns C<${^GLOBAL_PHASE} eq 'DESTRUCT'>, and on earlier perls, detects it using -the value of C or C. +the value of C or C. =back