In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/d1718a7cf54f01c3c9d449a1ea96c9bba32d1126?hp=65ae6364e899062042cfe8a0cd81f9b2768fc2b5>

- Log -----------------------------------------------------------------
commit d1718a7cf54f01c3c9d449a1ea96c9bba32d1126
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Sat Mar 31 13:50:04 2012 -0700

    [perl #111462] Move strict hints from %^H to $^H
    
    With commit b50b20584, strict.pm starting putting hints in %^H to
    indicate that strict mode has been enabled or disabled explicitly, so
    version declarations should not change the setting.
    
    This causes ‘Unbalanced string table refcount’ warnings when Safe.pm
    encounters prohibited ops.
    
    This happens because ops are leaking when those ops point to HEKs (in
    the internal form that %^H takes when attached to ops).
    
    This commit moves those new strict hints into $^H, to avoid those
    warnings.  This does simply paper over the real problem (leaked ops),
    but at least it gets the warnings back down to the 5.14 amount.
    
    Because of the new hints in $^H, B::Concise has been updated to
    account for them, and so have all its tests.  I modified OptreeCheck
    to avoid setting the hints with ‘no strict;’, as that resulted in
    slightly fewer changes to the tests.  It will also result in fewer
    changes to the tests in future.
    
    Two B::Deparse tests started failing due to %^H not being localised.
    Apparently there is a bug somewhere (in perl, Deparse.pm or deparse.t)
    that got triggered as a result.  In fact, one of the tests exhibited
    *two* bugs.  But for now, I’ve simply added a workaround to the two
    tests so they don’t trigger those bugs (which bugs will have to wait
    till after 5.16).

M       dist/B-Deparse/Deparse.pm
M       dist/B-Deparse/t/deparse.t
M       dist/Safe/t/safeops.t
M       ext/B/B/Concise.pm
M       ext/B/t/OptreeCheck.pm
M       ext/B/t/f_map.t
M       ext/B/t/f_sort.t
M       ext/B/t/optree_check.t
M       ext/B/t/optree_constants.t
M       ext/B/t/optree_samples.t
M       ext/B/t/optree_specials.t
M       lib/strict.pm
M       op.c
M       perl.h

commit 6331a2f5f6ee89f25cb6803c1d9ef97d6d1799e5
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Mon Apr 2 22:13:11 2012 -0700

    Maintainers.pl: Make blead upstream for B::Concise
    
    ‘undef’ (its previous value) means that it hasn’t been discussed yet.
    But, for all intents and purposes, this module is maintained in blead,
    since it is very tightly coupled with the perl core and is used mostly
    in debugging perl itself.
    
    What’s annoying about having it set to ‘undef’ is that
    t/porting/cmp_version.t skips it.
    
    (I almost forgot to update a version as a result.)

M       Porting/Maintainers.pl

commit a69d13d979965074ce4fde0863c01d36d48f0be1
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Mon Apr 2 22:13:59 2012 -0700

    Increase $B::Concise::VERSION to 0.89

M       ext/B/B/Concise.pm

commit 20471d32147ebc8b177dae26c7a73f4811c88027
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Mon Apr 2 22:01:51 2012 -0700

    Increase $OptreeCheck::VERSION to 0.07
    
    I am still baffled as to why this module needs a version.

M       ext/B/t/OptreeCheck.pm

commit d3e57cd5db1ab85c006b42587d85fce558c4535e
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Sat Mar 31 13:33:42 2012 -0700

    Increase $B::Deparse::VERSION to 1.14

M       dist/B-Deparse/Deparse.pm

commit 1c389bff36c57eefe2a89bf883b80bbc7fd006a3
Author: Father Chrysostomos <spr...@cpan.org>
Date:   Sat Mar 31 13:33:33 2012 -0700

    Increase $strict::VERSION to 1.07

M       lib/strict.pm
-----------------------------------------------------------------------

Summary of changes:
 Porting/Maintainers.pl     |    2 +-
 dist/B-Deparse/Deparse.pm  |    4 +-
 dist/B-Deparse/t/deparse.t |   10 ++++-
 dist/Safe/t/safeops.t      |   10 ++++-
 ext/B/B/Concise.pm         |    7 ++-
 ext/B/t/OptreeCheck.pm     |    4 +-
 ext/B/t/f_map.t            |   52 ++++++++++++------------
 ext/B/t/f_sort.t           |   92 ++++++++++++++++++++++----------------------
 ext/B/t/optree_check.t     |    4 +-
 ext/B/t/optree_constants.t |   24 ++++++------
 ext/B/t/optree_samples.t   |   28 +++++++-------
 ext/B/t/optree_specials.t  |   72 +++++++++++++++++-----------------
 lib/strict.pm              |    9 +++-
 op.c                       |   15 +++----
 perl.h                     |    5 ++
 15 files changed, 181 insertions(+), 157 deletions(-)

diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index 905215b..97c5545 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -283,7 +283,7 @@ use File::Glob qw(:case);
     'B::Concise' => {
         'MAINTAINER' => 'smccam',
         'FILES'      => q[ext/B/B/Concise.pm ext/B/t/concise.t],
-        'UPSTREAM'   => undef,
+        'UPSTREAM'   => 'blead',
     },
 
     'B::Debug' => {
diff --git a/dist/B-Deparse/Deparse.pm b/dist/B-Deparse/Deparse.pm
index eb24214..46af5e4 100644
--- a/dist/B-Deparse/Deparse.pm
+++ b/dist/B-Deparse/Deparse.pm
@@ -20,7 +20,7 @@ use B qw(class main_root main_start main_cv svref_2object 
opnumber perlstring
          CVf_METHOD CVf_LVALUE
         PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
         PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED);
-$VERSION = '1.13';
+$VERSION = '1.14';
 use strict;
 use vars qw/$AUTOLOAD/;
 use warnings ();
@@ -710,7 +710,7 @@ sub coderef2text {
 }
 
 my %strict_bits = do {
-    local %^H;
+    local $^H;
     map +($_ => strict::bits($_)), qw/refs subs vars/
 };
 
diff --git a/dist/B-Deparse/t/deparse.t b/dist/B-Deparse/t/deparse.t
index 0fa3cbf..5085a5e 100644
--- a/dist/B-Deparse/t/deparse.t
+++ b/dist/B-Deparse/t/deparse.t
@@ -230,10 +230,10 @@ unlike($a, qr/BEGIN/,
 SKIP: {
     skip "requires 5.11", 1 unless $] >= 5.011;
     eval q`
-       no strict;
        BEGIN {
-           # Clear out the strict hints from %^H
+           # Clear out all hints
            %^H = ();
+           $^H = 0;
            new B::Deparse -> ambient_pragmas(strict => 'all');
        }
        use 5.011;  # should enable strict
@@ -1069,6 +1069,9 @@ print sort(foo('bar'));
 substr(my $a, 0, 0) = (foo(), bar());
 $a++;
 ####
+# This following line works around an unfixed bug that we are not trying to 
+# test for here:
+# CONTEXT BEGIN { $^H{a} = "b"; delete $^H{a} } # make %^H localised
 # hint hash
 BEGIN { $^H{'foo'} = undef; }
 {
@@ -1085,6 +1088,9 @@ BEGIN { $^H{'foo'} = undef; }
 BEGIN { $^H{q[']} = '('; }
 print $_;
 ####
+# This following line works around an unfixed bug that we are not trying to 
+# test for here:
+# CONTEXT BEGIN { $^H{a} = "b"; delete $^H{a} } # make %^H localised
 # hint hash changes that serialise the same way with sort %hh
 BEGIN { $^H{'a'} = 'b'; }
 {
diff --git a/dist/Safe/t/safeops.t b/dist/Safe/t/safeops.t
index 885b0db..8edb223 100644
--- a/dist/Safe/t/safeops.t
+++ b/dist/Safe/t/safeops.t
@@ -40,7 +40,7 @@ while (<$fh>) {
 }
 close $fh;
 
-plan(tests => scalar @op + 1);
+plan(tests => scalar @op + 2);
 
 sub testop {
     my ($op, $opname, $code) = @_;
@@ -73,6 +73,14 @@ foreach (@op) {
        ),
        qr/Unbalanced/,
        'No Unbalanced warnings when disallowing ops';
+    unlike
+       runperl(
+           switches => [ '-MSafe', '-w' ],
+           prog     => 'Safe->new->reval(q(use strict), 1)',
+           stderr   => 1,
+       ),
+       qr/Unbalanced/,
+       'No Unbalanced warnings when disallowing ops';
 }
 
 # things that begin with SKIP are skipped, for various reasons (notably
diff --git a/ext/B/B/Concise.pm b/ext/B/B/Concise.pm
index 476b949..49a4c16 100644
--- a/ext/B/B/Concise.pm
+++ b/ext/B/B/Concise.pm
@@ -14,7 +14,7 @@ use warnings; # uses #3 and #4, since warnings uses Carp
 
 use Exporter (); # use #5
 
-our $VERSION   = "0.88";
+our $VERSION   = "0.89";
 our @ISA       = qw(Exporter);
 our @EXPORT_OK = qw( set_style set_style_standard add_callback
                     concise_subref concise_cv concise_main
@@ -668,7 +668,7 @@ $priv{$_}{128} = '+1' for qw "caller wantarray runcv";
 our %hints; # used to display each COP's op_hints values
 
 # strict refs, subs, vars
-@hints{2,512,1024} = ('$', '&', '*');
+@hints{2,512,1024,2<<28,4<<28,8<<28} = ('$', '&', '*', 'x$', 'x&', 'x*');
 # integers, locale, bytes
 @hints{1,4,8,16} = ('i', 'l', 'b');
 # block scope, localise %^H, $^OPEN (in), $^OPEN (out)
@@ -1547,6 +1547,9 @@ string if this is not a COP. Here are the symbols used:
     $ strict refs
     & strict subs
     * strict vars
+   x$ explicit use/no strict refs
+   x& explicit use/no strict subs
+   x* explicit use/no strict vars
     i integers
     l locale
     b bytes
diff --git a/ext/B/t/OptreeCheck.pm b/ext/B/t/OptreeCheck.pm
index 7aa7898..8cfc5b6 100644
--- a/ext/B/t/OptreeCheck.pm
+++ b/ext/B/t/OptreeCheck.pm
@@ -5,7 +5,7 @@ use warnings;
 use vars qw($TODO $Level $using_open);
 require "test.pl";
 
-our $VERSION = '0.06';
+our $VERSION = '0.07';
 
 # now export checkOptree, and those test.pl functions used by tests
 our @EXPORT = qw( checkOptree plan skip skip_all pass is like unlike
@@ -482,7 +482,7 @@ sub getRendering {
            #  in caller's package ( to test arg-fixup, comment next line)
            my $pkg = '{ package '.caller(1) .';';
            {
-               no strict;
+               BEGIN { $^H = 0 }
                no warnings;
                $code = eval "$pkg sub { $code } }";
            }
diff --git a/ext/B/t/f_map.t b/ext/B/t/f_map.t
index bedb7a0..2fa2ec9 100644
--- a/ext/B/t/f_map.t
+++ b/ext/B/t/f_map.t
@@ -46,7 +46,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@chars = map(chr, @nums); },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 475 (eval 10):1) v:%
+# 1  <;> nextstate(main 475 (eval 10):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*nums] s
@@ -62,7 +62,7 @@ checkOptree(note   => q{},
 # d  <2> aassign[t9] KS/COMMON
 # e  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 559 (eval 15):1) v:%
+# 1  <;> nextstate(main 559 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*nums) s
@@ -90,7 +90,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{%hash = map { getkey($_) => $_ } @array; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 476 (eval 10):1) v:%,{
+# 1  <;> nextstate(main 476 (eval 10):1) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
@@ -98,7 +98,7 @@ checkOptree(note   => q{},
 # 6  <@> mapstart lK*
 # 7  <|> mapwhile(other->8)[t9] lK
 # 8      <0> enter l
-# 9      <;> nextstate(main 475 (eval 10):1) v:%,{
+# 9      <;> nextstate(main 475 (eval 10):1) v:{
 # a      <0> pushmark s
 # b      <0> pushmark s
 # c      <#> gvsv[*_] s
@@ -114,7 +114,7 @@ checkOptree(note   => q{},
 # l  <2> aassign[t10] KS/COMMON
 # m  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 560 (eval 15):1) v:%,{
+# 1  <;> nextstate(main 560 (eval 15):1) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
@@ -122,7 +122,7 @@ EOT_EOT
 # 6  <@> mapstart lK*
 # 7  <|> mapwhile(other->8)[t4] lK
 # 8      <0> enter l
-# 9      <;> nextstate(main 559 (eval 15):1) v:%,{
+# 9      <;> nextstate(main 559 (eval 15):1) v:{
 # a      <0> pushmark s
 # b      <0> pushmark s
 # c      <$> gvsv(*_) s
@@ -155,15 +155,15 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{{ %hash = (); foreach $_ (@array) { $hash{getkey($_)} = 
$_; } } },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 478 (eval 10):1) v:%,{
+# 1  <;> nextstate(main 478 (eval 10):1) v:{
 # 2  <{> enterloop(next->u last->u redo->3) 
-# 3  <;> nextstate(main 475 (eval 10):1) v:%
+# 3  <;> nextstate(main 475 (eval 10):1) v
 # 4  <0> pushmark s
 # 5  <0> pushmark s
 # 6  <#> gv[*hash] s
 # 7  <1> rv2hv[t2] lKRM*/1
 # 8  <2> aassign[t3] vKS
-# 9  <;> nextstate(main 476 (eval 10):1) v:%,{
+# 9  <;> nextstate(main 476 (eval 10):1) v:{
 # a  <0> pushmark sM
 # b  <#> gv[*array] s
 # c  <1> rv2av[t6] sKRM/1
@@ -172,7 +172,7 @@ checkOptree(note   => q{},
 # f  <{> enteriter(next->q last->t redo->g) lKS/8
 # r  <0> iter s
 # s  <|> and(other->g) K/1
-# g      <;> nextstate(main 475 (eval 10):1) v:%,{
+# g      <;> nextstate(main 475 (eval 10):1) v:{
 # h      <#> gvsv[*_] s
 # i      <#> gv[*hash] s
 # j      <1> rv2hv sKR/1
@@ -188,15 +188,15 @@ checkOptree(note   => q{},
 # u  <2> leaveloop K/2
 # v  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 562 (eval 15):1) v:%,{
+# 1  <;> nextstate(main 562 (eval 15):1) v:{
 # 2  <{> enterloop(next->u last->u redo->3) 
-# 3  <;> nextstate(main 559 (eval 15):1) v:%
+# 3  <;> nextstate(main 559 (eval 15):1) v
 # 4  <0> pushmark s
 # 5  <0> pushmark s
 # 6  <$> gv(*hash) s
 # 7  <1> rv2hv[t1] lKRM*/1
 # 8  <2> aassign[t2] vKS
-# 9  <;> nextstate(main 560 (eval 15):1) v:%,{
+# 9  <;> nextstate(main 560 (eval 15):1) v:{
 # a  <0> pushmark sM
 # b  <$> gv(*array) s
 # c  <1> rv2av[t3] sKRM/1
@@ -205,7 +205,7 @@ EOT_EOT
 # f  <{> enteriter(next->q last->t redo->g) lKS/8
 # r  <0> iter s
 # s  <|> and(other->g) K/1
-# g      <;> nextstate(main 559 (eval 15):1) v:%,{
+# g      <;> nextstate(main 559 (eval 15):1) v:{
 # h      <$> gvsv(*_) s
 # i      <$> gv(*hash) s
 # j      <1> rv2hv sKR/1
@@ -234,7 +234,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{%hash = map { +"\L$_", 1 } @array; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 476 (eval 10):1) v:%
+# 1  <;> nextstate(main 476 (eval 10):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
@@ -255,7 +255,7 @@ checkOptree(note   => q{},
 # h  <2> aassign[t10] KS/COMMON
 # i  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 560 (eval 15):1) v:%
+# 1  <;> nextstate(main 560 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
@@ -288,7 +288,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{%hash = map { ("\L$_", 1) } @array; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 476 (eval 10):1) v:%
+# 1  <;> nextstate(main 476 (eval 10):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
@@ -309,7 +309,7 @@ checkOptree(note   => q{},
 # h  <2> aassign[t10] KS/COMMON
 # i  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 560 (eval 15):1) v:%
+# 1  <;> nextstate(main 560 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
@@ -342,7 +342,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{%hash = map { lc($_), 1 } @array; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 476 (eval 10):1) v:%
+# 1  <;> nextstate(main 476 (eval 10):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
@@ -362,7 +362,7 @@ checkOptree(note   => q{},
 # g  <2> aassign[t9] KS/COMMON
 # h  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 589 (eval 26):1) v:%
+# 1  <;> nextstate(main 589 (eval 26):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
@@ -394,7 +394,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{%hash = map +( lc($_), 1 ), @array; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 475 (eval 10):1) v:%
+# 1  <;> nextstate(main 475 (eval 10):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
@@ -413,7 +413,7 @@ checkOptree(note   => q{},
 # g  <2> aassign[t8] KS/COMMON
 # h  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 593 (eval 28):1) v:%
+# 1  <;> nextstate(main 593 (eval 28):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
@@ -444,7 +444,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{%hash = map ( lc($_), 1 ), @array; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 475 (eval 10):1) v:%
+# 1  <;> nextstate(main 475 (eval 10):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <0> pushmark s
@@ -463,7 +463,7 @@ checkOptree(note   => q{},
 # g  <@> list K
 # h  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 597 (eval 30):1) v:%
+# 1  <;> nextstate(main 597 (eval 30):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <0> pushmark s
@@ -494,7 +494,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@hashes = map +{ lc($_), 1 }, @array },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 475 (eval 10):1) v:%
+# 1  <;> nextstate(main 475 (eval 10):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*array] s
@@ -513,7 +513,7 @@ checkOptree(note   => q{},
 # g  <2> aassign[t8] KS/COMMON
 # h  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 601 (eval 32):1) v:%
+# 1  <;> nextstate(main 601 (eval 32):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*array) s
diff --git a/ext/B/t/f_sort.t b/ext/B/t/f_sort.t
index 108f23c..58a8cf2 100644
--- a/ext/B/t/f_sort.t
+++ b/ext/B/t/f_sort.t
@@ -51,7 +51,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@articles = sort @files; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 545 (eval 15):1) v:%
+# 1  <;> nextstate(main 545 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*files] s
@@ -63,7 +63,7 @@ checkOptree(note   => q{},
 # a  <2> aassign[t5] KS/COMMON
 # b  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 545 (eval 15):1) v:%
+# 1  <;> nextstate(main 545 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*files) s
@@ -88,7 +88,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@articles = sort {$a cmp $b} @files; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*files] s
@@ -100,7 +100,7 @@ checkOptree(note   => q{},
 # a  <2> aassign[t3] KS/COMMON
 # b  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*files) s
@@ -125,7 +125,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@articles = sort {uc($a) cmp uc($b)} @files; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*files] s
@@ -137,7 +137,7 @@ checkOptree(note   => q{},
 # a  <2> aassign[t10] KS/COMMON
 # b  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*files) s
@@ -162,7 +162,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@articles = sort {$b cmp $a} @files; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*files] s
@@ -174,7 +174,7 @@ checkOptree(note   => q{},
 # a  <2> aassign[t3] KS/COMMON
 # b  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*files) s
@@ -199,7 +199,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@articles = sort {$a <=> $b} @files; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*files] s
@@ -211,7 +211,7 @@ checkOptree(note   => q{},
 # a  <2> aassign[t3] KS/COMMON
 # b  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*files) s
@@ -236,7 +236,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@articles = sort {$b <=> $a} @files; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 587 (eval 26):1) v:%
+# 1  <;> nextstate(main 587 (eval 26):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*files] s
@@ -248,7 +248,7 @@ checkOptree(note   => q{},
 # a  <2> aassign[t3] KS/COMMON
 # b  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*files) s
@@ -274,7 +274,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@eldest = sort { $age{$b} <=> $age{$a} } keys %age; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 592 (eval 28):1) v:%
+# 1  <;> nextstate(main 592 (eval 28):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*age] s
@@ -287,7 +287,7 @@ checkOptree(note   => q{},
 # b  <2> aassign[t11] KS/COMMON
 # c  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*age) s
@@ -316,7 +316,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{sub byage { $age{$a} <=> $age{$b}; } @sortedclass = 
sort byage @class; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 597 (eval 30):1) v:%
+# 1  <;> nextstate(main 597 (eval 30):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> const[PV "byage"] s/BARE
@@ -329,7 +329,7 @@ checkOptree(note   => q{},
 # b  <2> aassign[t5] KS/COMMON
 # c  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> const(PV "byage") s/BARE
@@ -366,7 +366,7 @@ checkOptree(name   => q{sort USERSUB LIST },
                        print sort @harry; print sort backwards @harry; 
                        print sort @george, 'to', @harry; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 602 (eval 32):2) v:%
+# 1  <;> nextstate(main 602 (eval 32):2) v
 # 2  <0> pushmark s
 # 3  <$> const[PV "dog"] s
 # 4  <$> const[PV "cat"] s
@@ -377,7 +377,7 @@ checkOptree(name   => q{sort USERSUB LIST },
 # 9  <#> gv[*harry] s
 # a  <1> rv2av[t2] lKRM*/1
 # b  <2> aassign[t3] vKS
-# c  <;> nextstate(main 602 (eval 32):3) v:%
+# c  <;> nextstate(main 602 (eval 32):3) v
 # d  <0> pushmark s
 # e  <$> const[PV "gone"] s
 # f  <$> const[PV "chased"] s
@@ -388,14 +388,14 @@ checkOptree(name   => q{sort USERSUB LIST },
 # k  <#> gv[*george] s
 # l  <1> rv2av[t5] lKRM*/1
 # m  <2> aassign[t6] vKS
-# n  <;> nextstate(main 602 (eval 32):4) v:%,{
+# n  <;> nextstate(main 602 (eval 32):4) v:{
 # o  <0> pushmark s
 # p  <0> pushmark s
 # q  <#> gv[*harry] s
 # r  <1> rv2av[t8] lK/1
 # s  <@> sort lK
 # t  <@> print vK
-# u  <;> nextstate(main 602 (eval 32):4) v:%,{
+# u  <;> nextstate(main 602 (eval 32):4) v:{
 # v  <0> pushmark s
 # w  <0> pushmark s
 # x  <$> const[PV "backwards"] s/BARE
@@ -403,7 +403,7 @@ checkOptree(name   => q{sort USERSUB LIST },
 # z  <1> rv2av[t10] lK/1
 # 10 <@> sort lKS
 # 11 <@> print vK
-# 12 <;> nextstate(main 602 (eval 32):5) v:%,{
+# 12 <;> nextstate(main 602 (eval 32):5) v:{
 # 13 <0> pushmark s
 # 14 <0> pushmark s
 # 15 <#> gv[*george] s
@@ -415,7 +415,7 @@ checkOptree(name   => q{sort USERSUB LIST },
 # 1b <@> print sK
 # 1c <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 602 (eval 32):2) v:%
+# 1  <;> nextstate(main 602 (eval 32):2) v
 # 2  <0> pushmark s
 # 3  <$> const(PV "dog") s
 # 4  <$> const(PV "cat") s
@@ -426,7 +426,7 @@ EOT_EOT
 # 9  <$> gv(*harry) s
 # a  <1> rv2av[t1] lKRM*/1
 # b  <2> aassign[t2] vKS
-# c  <;> nextstate(main 602 (eval 32):3) v:%
+# c  <;> nextstate(main 602 (eval 32):3) v
 # d  <0> pushmark s
 # e  <$> const(PV "gone") s
 # f  <$> const(PV "chased") s
@@ -437,14 +437,14 @@ EOT_EOT
 # k  <$> gv(*george) s
 # l  <1> rv2av[t3] lKRM*/1
 # m  <2> aassign[t4] vKS
-# n  <;> nextstate(main 602 (eval 32):4) v:%,{
+# n  <;> nextstate(main 602 (eval 32):4) v:{
 # o  <0> pushmark s
 # p  <0> pushmark s
 # q  <$> gv(*harry) s
 # r  <1> rv2av[t5] lK/1
 # s  <@> sort lK
 # t  <@> print vK
-# u  <;> nextstate(main 602 (eval 32):4) v:%,{
+# u  <;> nextstate(main 602 (eval 32):4) v:{
 # v  <0> pushmark s
 # w  <0> pushmark s
 # x  <$> const(PV "backwards") s/BARE
@@ -452,7 +452,7 @@ EOT_EOT
 # z  <1> rv2av[t6] lK/1
 # 10 <@> sort lKS
 # 11 <@> print vK
-# 12 <;> nextstate(main 602 (eval 32):5) v:%,{
+# 12 <;> nextstate(main 602 (eval 32):5) v:{
 # 13 <0> pushmark s
 # 14 <0> pushmark s
 # 15 <$> gv(*george) s
@@ -493,7 +493,7 @@ checkOptree(name   => q{Compound sort/map Expression },
                         sort { $b->[1] <=> $a->[1] || $a->[2] cmp $b->[2] }
                         map { [$_, /=(\d+)/, uc($_)] } @old; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 609 (eval 34):3) v:%,{
+# 1  <;> nextstate(main 609 (eval 34):3) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <0> pushmark s
@@ -503,7 +503,7 @@ checkOptree(name   => q{Compound sort/map Expression },
 # 8  <@> mapstart lK*
 # 9  <|> mapwhile(other->a)[t20] lK
 # a      <0> enter l
-# b      <;> nextstate(main 608 (eval 34):2) v:%,{
+# b      <;> nextstate(main 608 (eval 34):2) v:{
 # c      <0> pushmark s
 # d      <#> gvsv[*_] s
 # e      </> match(/"=(\\d+)"/) l/RTIME
@@ -528,7 +528,7 @@ checkOptree(name   => q{Compound sort/map Expression },
 # u  <2> aassign[t27] KS/COMMON
 # v  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 609 (eval 34):3) v:%,{
+# 1  <;> nextstate(main 609 (eval 34):3) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <0> pushmark s
@@ -538,7 +538,7 @@ EOT_EOT
 # 8  <@> mapstart lK*
 # 9  <|> mapwhile(other->a)[t11] lK
 # a      <0> enter l
-# b      <;> nextstate(main 608 (eval 34):2) v:%,{
+# b      <;> nextstate(main 608 (eval 34):2) v:{
 # c      <0> pushmark s
 # d      <$> gvsv(*_) s
 # e      </> match(/"=(\\d+)"/) l/RTIME
@@ -581,7 +581,7 @@ checkOptree(name   => q{sort other::sub LIST },
            code   => q{package other; sub backwards ($$) { $_[1] cmp $_[0]; }
                        package main; @new = sort other::backwards @old; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 614 (eval 36):2) v:%,{
+# 1  <;> nextstate(main 614 (eval 36):2) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> const[PV "other::backwards"] s/BARE
@@ -594,7 +594,7 @@ checkOptree(name   => q{sort other::sub LIST },
 # b  <2> aassign[t5] KS/COMMON
 # c  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 614 (eval 36):2) v:%,{
+# 1  <;> nextstate(main 614 (eval 36):2) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> const(PV "other::backwards") s/BARE
@@ -621,7 +621,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{sub other::backwards ($$) { $_[1] cmp $_[0]; } @new = 
sort other::backwards @old; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 619 (eval 38):1) v:%
+# 1  <;> nextstate(main 619 (eval 38):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> const[PV "other::backwards"] s/BARE
@@ -634,7 +634,7 @@ checkOptree(note   => q{},
 # b  <2> aassign[t5] KS/COMMON
 # c  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> const(PV "other::backwards") s/BARE
@@ -742,7 +742,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@articles = sort {$FooPack::b <=> $FooPack::a} @files; 
},
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 667 (eval 44):1) v:%
+# 1  <;> nextstate(main 667 (eval 44):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*files] s
@@ -754,7 +754,7 @@ checkOptree(note   => q{},
 # a  <2> aassign[t8] KS/COMMON
 # b  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*files) s
@@ -779,7 +779,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{@result = sort { $a <=> $b } grep { $_ == $_ } @input; 
},
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 673 (eval 46):1) v:%
+# 1  <;> nextstate(main 673 (eval 46):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <0> pushmark s
@@ -799,7 +799,7 @@ checkOptree(note   => q{},
 # g  <2> aassign[t3] KS/COMMON
 # h  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 547 (eval 15):1) v:%
+# 1  <;> nextstate(main 547 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <0> pushmark s
@@ -832,14 +832,14 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{sort { $a <=> $b } @input; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 678 (eval 48):1) v:%
+# 1  <;> nextstate(main 678 (eval 48):1) v
 # 2  <0> pushmark s
 # 3  <#> gv[*input] s
 # 4  <1> rv2av[t5] lK/1
 # 5  <@> sort K/NUM
 # 6  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%
+# 1  <;> nextstate(main 546 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <$> gv(*input) s
 # 4  <1> rv2av[t2] lK/1
@@ -859,7 +859,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{sort { $a <=> $b } grep { $_ == $_ } @input; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 684 (eval 50):1) v:%
+# 1  <;> nextstate(main 684 (eval 50):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*input] s
@@ -874,7 +874,7 @@ checkOptree(note   => q{},
 # b  <@> sort K/NUM
 # c  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 547 (eval 15):1) v:%
+# 1  <;> nextstate(main 547 (eval 15):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*input) s
@@ -902,7 +902,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{$s = sort { $a <=> $b } @input; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 689 (eval 52):1) v:%,{
+# 1  <;> nextstate(main 689 (eval 52):1) v:{
 # 2  <0> pushmark s
 # 3  <#> gv[*input] s
 # 4  <1> rv2av[t6] lK/1
@@ -911,7 +911,7 @@ checkOptree(note   => q{},
 # 7  <2> sassign sKS/2
 # 8  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 546 (eval 15):1) v:%,{
+# 1  <;> nextstate(main 546 (eval 15):1) v:{
 # 2  <0> pushmark s
 # 3  <$> gv(*input) s
 # 4  <1> rv2av[t2] lK/1
@@ -932,7 +932,7 @@ checkOptree(note   => q{},
            bcopts => q{-exec},
            code   => q{$s = sort { $a <=> $b } grep { $_ == $_ } @input; },
            expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 695 (eval 54):1) v:%,{
+# 1  <;> nextstate(main 695 (eval 54):1) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*input] s
@@ -949,7 +949,7 @@ checkOptree(note   => q{},
 # d  <2> sassign sKS/2
 # e  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 547 (eval 15):1) v:%,{
+# 1  <;> nextstate(main 547 (eval 15):1) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*input) s
diff --git a/ext/B/t/optree_check.t b/ext/B/t/optree_check.t
index c84e2f9..bcbb554 100644
--- a/ext/B/t/optree_check.t
+++ b/ext/B/t/optree_check.t
@@ -202,7 +202,7 @@ EONT_EONT
 checkOptree ( code     => '$a=$b+42',
              bcopts    => '-exec',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 837 (eval 24):1) v:%,{
+# 1  <;> nextstate(main 837 (eval 24):1) v:{
 # 2  <#> gvsv[*b] s
 # 3  <$> const[IV 42] s
 # 4  <2> add[t3] sK/2
@@ -210,7 +210,7 @@ checkOptree ( code  => '$a=$b+42',
 # 6  <2> sassign sKS/2
 # 7  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 837 (eval 24):1) v:%,{
+# 1  <;> nextstate(main 837 (eval 24):1) v:{
 # 2  <$> gvsv(*b) s
 # 3  <$> const(IV 42) s
 # 4  <2> add[t1] sK/2
diff --git a/ext/B/t/optree_constants.t b/ext/B/t/optree_constants.t
index 7c109f0..7c04b22 100644
--- a/ext/B/t/optree_constants.t
+++ b/ext/B/t/optree_constants.t
@@ -109,12 +109,12 @@ for $func (sort keys %$want) {
                  expect  => <<EOT_EOT, expect_nt => <<EONT_EONT);
 3  <1> leavesub[2 refs] K/REFC,1 ->(end)
 -     <\@> lineseq KP ->3
-1        <;> dbstate(main 833 (eval 44):1) v:% ->2
+1        <;> dbstate(main 833 (eval 44):1) v ->2
 2        <\$> const[$want->{$func}[0] $want->{$func}[1]] s* ->3
 EOT_EOT
 3  <1> leavesub[2 refs] K/REFC,1 ->(end)
 -     <\@> lineseq KP ->3
-1        <;> dbstate(main 833 (eval 44):1) v:% ->2
+1        <;> dbstate(main 833 (eval 44):1) v ->2
 2        <\$> const($want->{$func}[0] $want->{$func}[1]) s* ->3
 EONT_EONT
 
@@ -181,12 +181,12 @@ EONT_EONT
 my ($expect, $expect_nt) = (<<'EOT_EOT', <<'EONT_EONT');
 # 3  <1> leavesub[2 refs] K/REFC,1 ->(end)
 # -     <@> lineseq K ->3
-# 1        <;> nextstate(constant 61 constant.pm:118) v:%,*,& ->2
+# 1        <;> nextstate(constant 61 constant.pm:118) v:x*,x&,x$,*,& ->2
 # 2        <0> padav[@list:FAKE:m:96] ->3
 EOT_EOT
 # 3  <1> leavesub[2 refs] K/REFC,1 ->(end)
 # -     <@> lineseq K ->3
-# 1        <;> nextstate(constant 61 constant.pm:118) v:%,*,& ->2
+# 1        <;> nextstate(constant 61 constant.pm:118) v:x*,x&,x$,*,& ->2
 # 2        <0> padav[@list:FAKE:m:71] ->3
 EONT_EONT
 
@@ -254,14 +254,14 @@ checkOptree ( name        => 'arithmetic constant folding 
in print',
              expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 937 (eval 53):1) v:% ->2
+# 1        <;> nextstate(main 937 (eval 53):1) v ->2
 # 4        <@> print sK ->5
 # 2           <0> pushmark s ->3
 # 3           <$> const[IV 6] s ->4
 EOT_EOT
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 937 (eval 53):1) v:% ->2
+# 1        <;> nextstate(main 937 (eval 53):1) v ->2
 # 4        <@> print sK ->5
 # 2           <0> pushmark s ->3
 # 3           <$> const(IV 6) s ->4
@@ -273,14 +273,14 @@ checkOptree ( name        => 'string constant folding in 
print',
              expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 942 (eval 55):1) v:% ->2
+# 1        <;> nextstate(main 942 (eval 55):1) v ->2
 # 4        <@> print sK ->5
 # 2           <0> pushmark s ->3
 # 3           <$> const[PV "foobar"] s ->4
 EOT_EOT
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 942 (eval 55):1) v:% ->2
+# 1        <;> nextstate(main 942 (eval 55):1) v ->2
 # 4        <@> print sK ->5
 # 2           <0> pushmark s ->3
 # 3           <$> const(PV "foobar") s ->4
@@ -292,14 +292,14 @@ checkOptree ( name        => 'boolean or folding',
              expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 942 (eval 55):1) v:% ->2
+# 1        <;> nextstate(main 942 (eval 55):1) v ->2
 # 4        <@> print sK ->5
 # 2           <0> pushmark s ->3
 # 3           <$> const[PV "foobar"] s ->4
 EOT_EOT
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 942 (eval 55):1) v:% ->2
+# 1        <;> nextstate(main 942 (eval 55):1) v ->2
 # 4        <@> print sK ->5
 # 2           <0> pushmark s ->3
 # 3           <$> const(PV "foobar") s ->4
@@ -384,14 +384,14 @@ checkOptree ( name        => 'mixed constant folding, 
with explicit braces',
              expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 977 (eval 28):1) v:% ->2
+# 1        <;> nextstate(main 977 (eval 28):1) v ->2
 # 4        <@> print sK ->5
 # 2           <0> pushmark s ->3
 # 3           <$> const[PV "foobar5"] s ->4
 EOT_EOT
 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->5
-# 1        <;> nextstate(main 977 (eval 28):1) v:% ->2
+# 1        <;> nextstate(main 977 (eval 28):1) v ->2
 # 4        <@> print sK ->5
 # 2           <0> pushmark s ->3
 # 3           <$> const(PV "foobar5") s ->4
diff --git a/ext/B/t/optree_samples.t b/ext/B/t/optree_samples.t
index a8f608f..3e0b7f8 100644
--- a/ext/B/t/optree_samples.t
+++ b/ext/B/t/optree_samples.t
@@ -424,7 +424,7 @@ checkOptree ( name  => '@foo = grep(!/^\#/, @bar)',
              code      => '@foo = grep(!/^\#/, @bar)',
              bcopts    => '-exec',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 496 (eval 20):1) v:%,{
+# 1  <;> nextstate(main 496 (eval 20):1) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*bar] s
@@ -440,7 +440,7 @@ checkOptree ( name  => '@foo = grep(!/^\#/, @bar)',
 # d  <2> aassign[t6] KS/COMMON
 # e  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 496 (eval 20):1) v:%,{
+# 1  <;> nextstate(main 496 (eval 20):1) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*bar) s
@@ -464,7 +464,7 @@ checkOptree ( name  => '%h = map { getkey($_) => $_ } @a',
              code      => '%h = map { getkey($_) => $_ } @a',
              bcopts    => '-exec',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 501 (eval 22):1) v:%,{
+# 1  <;> nextstate(main 501 (eval 22):1) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*a] s
@@ -472,7 +472,7 @@ checkOptree ( name  => '%h = map { getkey($_) => $_ } @a',
 # 6  <@> mapstart lK*
 # 7  <|> mapwhile(other->8)[t9] lK
 # 8      <0> enter l
-# 9      <;> nextstate(main 500 (eval 22):1) v:%,{
+# 9      <;> nextstate(main 500 (eval 22):1) v:{
 # a      <0> pushmark s
 # b      <0> pushmark s
 # c      <#> gvsv[*_] s
@@ -488,7 +488,7 @@ checkOptree ( name  => '%h = map { getkey($_) => $_ } @a',
 # l  <2> aassign[t10] KS/COMMON
 # m  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 501 (eval 22):1) v:%,{
+# 1  <;> nextstate(main 501 (eval 22):1) v:{
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*a) s
@@ -496,7 +496,7 @@ EOT_EOT
 # 6  <@> mapstart lK*
 # 7  <|> mapwhile(other->8)[t4] lK
 # 8      <0> enter l
-# 9      <;> nextstate(main 500 (eval 22):1) v:%,{
+# 9      <;> nextstate(main 500 (eval 22):1) v:{
 # a      <0> pushmark s
 # b      <0> pushmark s
 # c      <$> gvsv(*_) s
@@ -517,13 +517,13 @@ checkOptree ( name        => '%h=(); for 
$_(@a){$h{getkey($_)} = $_}',
              code      => '%h=(); for $_(@a){$h{getkey($_)} = $_}',
              bcopts    => '-exec',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 505 (eval 24):1) v:%
+# 1  <;> nextstate(main 505 (eval 24):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <#> gv[*h] s
 # 5  <1> rv2hv[t2] lKRM*/1
 # 6  <2> aassign[t3] vKS
-# 7  <;> nextstate(main 506 (eval 24):1) v:%,{
+# 7  <;> nextstate(main 506 (eval 24):1) v:{
 # 8  <0> pushmark sM
 # 9  <#> gv[*a] s
 # a  <1> rv2av[t6] sKRM/1
@@ -532,7 +532,7 @@ checkOptree ( name  => '%h=(); for $_(@a){$h{getkey($_)} = 
$_}',
 # d  <{> enteriter(next->o last->r redo->e) lKS/8
 # p  <0> iter s
 # q  <|> and(other->e) K/1
-# e      <;> nextstate(main 505 (eval 24):1) v:%,{
+# e      <;> nextstate(main 505 (eval 24):1) v:{
 # f      <#> gvsv[*_] s
 # g      <#> gv[*h] s
 # h      <1> rv2hv sKR/1
@@ -547,13 +547,13 @@ checkOptree ( name        => '%h=(); for 
$_(@a){$h{getkey($_)} = $_}',
 # r  <2> leaveloop KP/2
 # s  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 505 (eval 24):1) v:%
+# 1  <;> nextstate(main 505 (eval 24):1) v
 # 2  <0> pushmark s
 # 3  <0> pushmark s
 # 4  <$> gv(*h) s
 # 5  <1> rv2hv[t1] lKRM*/1
 # 6  <2> aassign[t2] vKS
-# 7  <;> nextstate(main 506 (eval 24):1) v:%,{
+# 7  <;> nextstate(main 506 (eval 24):1) v:{
 # 8  <0> pushmark sM
 # 9  <$> gv(*a) s
 # a  <1> rv2av[t3] sKRM/1
@@ -562,7 +562,7 @@ EOT_EOT
 # d  <{> enteriter(next->o last->r redo->e) lKS/8
 # p  <0> iter s
 # q  <|> and(other->e) K/1
-# e      <;> nextstate(main 505 (eval 24):1) v:%,{
+# e      <;> nextstate(main 505 (eval 24):1) v:{
 # f      <$> gvsv(*_) s
 # g      <$> gv(*h) s
 # h      <1> rv2hv sKR/1
@@ -582,7 +582,7 @@ checkOptree ( name  => 'map $_+42, 10..20',
              code      => 'map $_+42, 10..20',
              bcopts    => '-exec',
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
-# 1  <;> nextstate(main 497 (eval 20):1) v:%
+# 1  <;> nextstate(main 497 (eval 20):1) v
 # 2  <0> pushmark s
 # 3  <$> const[AV ] s
 # 4  <1> rv2av lKPM/1
@@ -594,7 +594,7 @@ checkOptree ( name  => 'map $_+42, 10..20',
 #            goto 6
 # a  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
-# 1  <;> nextstate(main 511 (eval 26):1) v:%
+# 1  <;> nextstate(main 511 (eval 26):1) v
 # 2  <0> pushmark s
 # 3  <$> const(AV ) s
 # 4  <1> rv2av lKPM/1
diff --git a/ext/B/t/optree_specials.t b/ext/B/t/optree_specials.t
index c6e4199..5af6bd2 100644
--- a/ext/B/t/optree_specials.t
+++ b/ext/B/t/optree_specials.t
@@ -49,10 +49,10 @@ checkOptree ( name  => 'BEGIN',
 # BEGIN 1:
 # a  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->a
-# 1        <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$ ->2
+# 1        <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$ ->2
 # 3        <1> require sK/1 ->4
 # 2           <$> const[PV "strict.pm"] s/BARE ->3
-# 4        <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$ ->5
+# 4        <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$ ->5
 # -        <@> lineseq K ->-
 # -           <0> null ->5
 # 9           <1> entersub[t1] KS*/TARG,2 ->a
@@ -63,10 +63,10 @@ checkOptree ( name  => 'BEGIN',
 # BEGIN 2:
 # k  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq K ->k
-# b        <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$ ->c
+# b        <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$ ->c
 # d        <1> require sK/1 ->e
 # c           <$> const[PV "strict.pm"] s/BARE ->d
-# e        <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$ ->f
+# e        <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$ ->f
 # -        <@> lineseq K ->-
 # -           <0> null ->f
 # j           <1> entersub[t1] KS*/TARG,2 ->k
@@ -77,10 +77,10 @@ checkOptree ( name  => 'BEGIN',
 # BEGIN 3:
 # u  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->u
-# l        <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$ ->m
+# l        <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$ ->m
 # n        <1> require sK/1 ->o
 # m           <$> const[PV "warnings.pm"] s/BARE ->n
-# o        <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$ ->p
+# o        <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$ ->p
 # -        <@> lineseq K ->-
 # -           <0> null ->p
 # t           <1> entersub[t1] KS*/TARG,2 ->u
@@ -99,10 +99,10 @@ EOT_EOT
 # BEGIN 1:
 # a  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->a
-# 1        <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$ ->2
+# 1        <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$ ->2
 # 3        <1> require sK/1 ->4
 # 2           <$> const(PV "strict.pm") s/BARE ->3
-# 4        <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$ ->5
+# 4        <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$ ->5
 # -        <@> lineseq K ->-
 # -           <0> null ->5
 # 9           <1> entersub[t1] KS*/TARG,2 ->a
@@ -113,10 +113,10 @@ EOT_EOT
 # BEGIN 2:
 # k  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq K ->k
-# b        <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$ ->c
+# b        <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$ ->c
 # d        <1> require sK/1 ->e
 # c           <$> const(PV "strict.pm") s/BARE ->d
-# e        <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$ ->f
+# e        <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$ ->f
 # -        <@> lineseq K ->-
 # -           <0> null ->f
 # j           <1> entersub[t1] KS*/TARG,2 ->k
@@ -127,10 +127,10 @@ EOT_EOT
 # BEGIN 3:
 # u  <1> leavesub[1 ref] K/REFC,1 ->(end)
 # -     <@> lineseq KP ->u
-# l        <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$ ->m
+# l        <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$ ->m
 # n        <1> require sK/1 ->o
 # m           <$> const(PV "warnings.pm") s/BARE ->n
-# o        <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$ ->p
+# o        <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$ ->p
 # -        <@> lineseq K ->-
 # -           <0> null ->p
 # t           <1> entersub[t1] KS*/TARG,2 ->u
@@ -248,10 +248,10 @@ checkOptree ( name        => 'all of BEGIN END INIT CHECK 
UNITCHECK -exec',
              strip_open_hints => 1,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # BEGIN 1:
-# 1  <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$
+# 1  <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$
 # 2  <$> const[PV "strict.pm"] s/BARE
 # 3  <1> require sK/1
-# 4  <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$
+# 4  <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$
 # 5  <0> pushmark s
 # 6  <$> const[PV "strict"] sM
 # 7  <$> const[PV "refs"] sM
@@ -259,10 +259,10 @@ checkOptree ( name        => 'all of BEGIN END INIT CHECK 
UNITCHECK -exec',
 # 9  <1> entersub[t1] KS*/TARG,2
 # a  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
-# b  <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$
+# b  <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$
 # c  <$> const[PV "strict.pm"] s/BARE
 # d  <1> require sK/1
-# e  <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$
+# e  <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$
 # f  <0> pushmark s
 # g  <$> const[PV "strict"] sM
 # h  <$> const[PV "refs"] sM
@@ -270,10 +270,10 @@ checkOptree ( name        => 'all of BEGIN END INIT CHECK 
UNITCHECK -exec',
 # j  <1> entersub[t1] KS*/TARG,2
 # k  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 3:
-# l  <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$
+# l  <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$
 # m  <$> const[PV "warnings.pm"] s/BARE
 # n  <1> require sK/1
-# o  <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$
+# o  <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$
 # p  <0> pushmark s
 # q  <$> const[PV "warnings"] sM
 # r  <$> const[PV "qw"] sM
@@ -307,10 +307,10 @@ checkOptree ( name        => 'all of BEGIN END INIT CHECK 
UNITCHECK -exec',
 # 1e <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
 # BEGIN 1:
-# 1  <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$
+# 1  <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$
 # 2  <$> const(PV "strict.pm") s/BARE
 # 3  <1> require sK/1
-# 4  <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$
+# 4  <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$
 # 5  <0> pushmark s
 # 6  <$> const(PV "strict") sM
 # 7  <$> const(PV "refs") sM
@@ -318,10 +318,10 @@ EOT_EOT
 # 9  <1> entersub[t1] KS*/TARG,2
 # a  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
-# b  <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$
+# b  <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$
 # c  <$> const(PV "strict.pm") s/BARE
 # d  <1> require sK/1
-# e  <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$
+# e  <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$
 # f  <0> pushmark s
 # g  <$> const(PV "strict") sM
 # h  <$> const(PV "refs") sM
@@ -329,10 +329,10 @@ EOT_EOT
 # j  <1> entersub[t1] KS*/TARG,2
 # k  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 3:
-# l  <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$
+# l  <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$
 # m  <$> const(PV "warnings.pm") s/BARE
 # n  <1> require sK/1
-# o  <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$
+# o  <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$
 # p  <0> pushmark s
 # q  <$> const(PV "warnings") sM
 # r  <$> const(PV "qw") sM
@@ -377,10 +377,10 @@ checkOptree ( name        => 'regression test for patch 
25352',
              @warnings_todo,
              expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
 # BEGIN 1:
-# 1  <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$
+# 1  <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$
 # 2  <$> const[PV "strict.pm"] s/BARE
 # 3  <1> require sK/1
-# 4  <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$
+# 4  <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$
 # 5  <0> pushmark s
 # 6  <$> const[PV "strict"] sM
 # 7  <$> const[PV "refs"] sM
@@ -388,10 +388,10 @@ checkOptree ( name        => 'regression test for patch 
25352',
 # 9  <1> entersub[t1] KS*/TARG,2
 # a  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
-# b  <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$
+# b  <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$
 # c  <$> const[PV "strict.pm"] s/BARE
 # d  <1> require sK/1
-# e  <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$
+# e  <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$
 # f  <0> pushmark s
 # g  <$> const[PV "strict"] sM
 # h  <$> const[PV "refs"] sM
@@ -399,10 +399,10 @@ checkOptree ( name        => 'regression test for patch 
25352',
 # j  <1> entersub[t1] KS*/TARG,2
 # k  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 3:
-# l  <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$
+# l  <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$
 # m  <$> const[PV "warnings.pm"] s/BARE
 # n  <1> require sK/1
-# o  <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$
+# o  <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$
 # p  <0> pushmark s
 # q  <$> const[PV "warnings"] sM
 # r  <$> const[PV "qw"] sM
@@ -411,10 +411,10 @@ checkOptree ( name        => 'regression test for patch 
25352',
 # u  <1> leavesub[1 ref] K/REFC,1
 EOT_EOT
 # BEGIN 1:
-# 1  <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$
+# 1  <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$
 # 2  <$> const(PV "strict.pm") s/BARE
 # 3  <1> require sK/1
-# 4  <;> nextstate(B::Concise -275 Concise.pm:356) v:%,*,&,{,$
+# 4  <;> nextstate(B::Concise -275 Concise.pm:356) v:x*,x&,x$,*,&,{,$
 # 5  <0> pushmark s
 # 6  <$> const(PV "strict") sM
 # 7  <$> const(PV "refs") sM
@@ -422,10 +422,10 @@ EOT_EOT
 # 9  <1> entersub[t1] KS*/TARG,2
 # a  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 2:
-# b  <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$
+# b  <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$
 # c  <$> const(PV "strict.pm") s/BARE
 # d  <1> require sK/1
-# e  <;> nextstate(B::Concise -265 Concise.pm:367) v:%,*,&,$
+# e  <;> nextstate(B::Concise -265 Concise.pm:367) v:x*,x&,x$,*,&,$
 # f  <0> pushmark s
 # g  <$> const(PV "strict") sM
 # h  <$> const(PV "refs") sM
@@ -433,10 +433,10 @@ EOT_EOT
 # j  <1> entersub[t1] KS*/TARG,2
 # k  <1> leavesub[1 ref] K/REFC,1
 # BEGIN 3:
-# l  <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$
+# l  <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$
 # m  <$> const(PV "warnings.pm") s/BARE
 # n  <1> require sK/1
-# o  <;> nextstate(B::Concise -254 Concise.pm:386) v:%,*,&,{,$
+# o  <;> nextstate(B::Concise -254 Concise.pm:386) v:x*,x&,x$,*,&,{,$
 # p  <0> pushmark s
 # q  <$> const(PV "warnings") sM
 # r  <$> const(PV "qw") sM
diff --git a/lib/strict.pm b/lib/strict.pm
index e9fc4ff..43b7ebf 100644
--- a/lib/strict.pm
+++ b/lib/strict.pm
@@ -1,6 +1,6 @@
 package strict;
 
-$strict::VERSION = "1.06";
+$strict::VERSION = "1.07";
 
 # Verify that we're called correctly so that strictures will work.
 unless ( __FILE__ =~ /(^|[\/\\])\Q${\__PACKAGE__}\E\.pmc?$/ ) {
@@ -14,13 +14,18 @@ refs => 0x00000002,
 subs => 0x00000200,
 vars => 0x00000400
 );
+my %explicit_bitmask = (
+refs => 0x20000000,
+subs => 0x40000000,
+vars => 0x80000000
+);
 
 sub bits {
     my $bits = 0;
     my @wrong;
     foreach my $s (@_) {
        if (exists $bitmask{$s}) {
-           $^H{"strict/$s"} = undef;
+           $^H |= $explicit_bitmask{$s};
        }
        else { push @wrong, $s };
         $bits |= $bitmask{$s} || 0;
diff --git a/op.c b/op.c
index 1e6addb..c585b98 100644
--- a/op.c
+++ b/op.c
@@ -4688,9 +4688,6 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP 
*idop, OP *arg)
            newSTATEOP(0, NULL, imop) ));
 
     if (use_version) {
-       HV * const hinthv = GvHV(PL_hintgv);
-       const bool hhoff = !hinthv || !(PL_hints & HINT_LOCALIZE_HH);
-
        /* Enable the
         * feature bundle that corresponds to the required version. */
        use_version = sv_2mortal(new_version(use_version));
@@ -4699,20 +4696,20 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP 
*idop, OP *arg)
        /* If a version >= 5.11.0 is requested, strictures are on by default! */
        if (vcmp(use_version,
                 sv_2mortal(upg_version(newSVnv(5.011000), FALSE))) >= 0) {
-           if (hhoff || !hv_exists(hinthv, "strict/refs", 11))
+           if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS))
                PL_hints |= HINT_STRICT_REFS;
-           if (hhoff || !hv_exists(hinthv, "strict/subs", 11))
+           if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS))
                PL_hints |= HINT_STRICT_SUBS;
-           if (hhoff || !hv_exists(hinthv, "strict/vars", 11))
+           if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS))
                PL_hints |= HINT_STRICT_VARS;
        }
        /* otherwise they are off */
        else {
-           if (hhoff || !hv_exists(hinthv, "strict/refs", 11))
+           if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS))
                PL_hints &= ~HINT_STRICT_REFS;
-           if (hhoff || !hv_exists(hinthv, "strict/subs", 11))
+           if (!(PL_hints & HINT_EXPLICIT_STRICT_SUBS))
                PL_hints &= ~HINT_STRICT_SUBS;
-           if (hhoff || !hv_exists(hinthv, "strict/vars", 11))
+           if (!(PL_hints & HINT_EXPLICIT_STRICT_VARS))
                PL_hints &= ~HINT_STRICT_VARS;
        }
     }
diff --git a/perl.h b/perl.h
index 361bbf6..190d579 100644
--- a/perl.h
+++ b/perl.h
@@ -4848,6 +4848,11 @@ typedef enum {
 
 #define HINT_FEATURE_MASK      0x1c000000 /* 3 bits for feature bundles */
 
+#define HINT_EXPLICIT_STRICT_REFS      0x20000000 /* strict.pm */
+#define HINT_EXPLICIT_STRICT_SUBS      0x40000000 /* strict.pm */
+#define HINT_EXPLICIT_STRICT_VARS      0x80000000 /* strict.pm */
+
+
 /* The following are stored in $^H{sort}, not in PL_hints */
 #define HINT_SORT_SORT_BITS    0x000000FF /* allow 256 different ones */
 #define HINT_SORT_QUICKSORT    0x00000001

--
Perl5 Master Repository

Reply via email to