X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FB%2Ft%2Foptree_specials.t;h=5db9d020781f5f0b4815a11275fab4ad26bcce1e;hb=ce5d06123ae0253bf2e33033ffbfba16ce3bb79e;hp=dda1adcc3d5ccc77b1f7469fa6850dd5feae6e18;hpb=5638aaacc9150fc0f24c4cbd2aba01385e12f1da;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/B/t/optree_specials.t b/ext/B/t/optree_specials.t index dda1adc..5db9d02 100644 --- a/ext/B/t/optree_specials.t +++ b/ext/B/t/optree_specials.t @@ -1,5 +1,12 @@ #!./perl +# This tests the B:: module(s) with CHECK, BEGIN, END and INIT blocks. The +# text excerpts below marked with "# " in front are the expected output. They +# are there twice, EOT for threading, and EONT for a non-threading Perl. The +# output is matched losely. If the match fails even though the "got" and +# "expected" output look exactly the same, then watch for trailing, invisible +# spaces. + BEGIN { if ($ENV{PERL_CORE}){ chdir('t') if -d 't'; @@ -13,19 +20,14 @@ BEGIN { print "1..0 # Skip -- Perl configured without B module\n"; exit 0; } - if ($Config::Config{'extensions'} !~ /\bData\/Dumper\b/) { - print - "1..0 # Skip: Data::Dumper was not built, needed by OptreeCheck\n"; - exit 0; - } - require 'test.pl'; + # require 'test.pl'; # now done by OptreeCheck } # import checkOptree(), and %gOpts (containing test state) use OptreeCheck; # ALSO DOES @ARGV HANDLING !!!!!! use Config; -plan tests => 6; +plan tests => 8; require_ok("B::Concise"); @@ -36,96 +38,76 @@ my $out = runperl( #print "out:$out\n"; -my $src = q[our ($beg, $chk, $init, $end) = qq{'foo'}; BEGIN { $beg++ } CHECK { $chk++ } INIT { $init++ } END { $end++ }]; +my $src = q[our ($beg, $chk, $init, $end, $uc) = qq{'foo'}; BEGIN { $beg++ } CHECK { $chk++ } INIT { $init++ } END { $end++ } UNITCHECK {$uc++}]; +my @warnings_todo; +@warnings_todo = (todo => + "Change 23768 (Remove Carp from warnings.pm) alters expected output, not" + . "propagated to 5.8.x") + if $] < 5.009; checkOptree ( name => 'BEGIN', bcopts => 'BEGIN', prog => $src, + @warnings_todo, + @open_todo, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); # BEGIN 1: # b <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->b -# 1 <;> nextstate(B::Concise -242 Concise.pm:304) v/2 ->2 +# 1 <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ ->2 # 3 <1> require sK/1 ->4 -# 2 <$> const[PV "strict.pm"] s/BARE ->3 -# 4 <;> nextstate(B::Concise -242 Concise.pm:304) v/2 ->5 +# 2 <$> const[PV "warnings.pm"] s/BARE ->3 +# 4 <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ ->5 # - <@> lineseq K ->- -# 5 <;> nextstate(B::Concise -242 Concise.pm:304) /2 ->6 +# 5 <;> nextstate(B::Concise -234 Concise.pm:328) :*,&,{,$ ->6 # a <1> entersub[t1] KS*/TARG,2 ->b # 6 <0> pushmark s ->7 -# 7 <$> const[PV "strict"] sM ->8 -# 8 <$> const[PV "refs"] sM ->9 -# 9 <$> method_named[PVIV 1520340202] ->a +# 7 <$> const[PV "warnings"] sM ->8 +# 8 <$> const[PV "qw"] sM ->9 +# 9 <$> method_named[PV "import"] ->a # BEGIN 2: -# m <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->m -# c <;> nextstate(B::Concise -227 Concise.pm:327) v/2 ->d -# e <1> require sK/1 ->f -# d <$> const[PV "warnings.pm"] s/BARE ->e -# f <;> nextstate(B::Concise -227 Concise.pm:327) v/2 ->g -# - <@> lineseq K ->- -# g <;> nextstate(B::Concise -227 Concise.pm:327) /2 ->h -# l <1> entersub[t1] KS*/TARG,2 ->m -# h <0> pushmark s ->i -# i <$> const[PV "warnings"] sM ->j -# j <$> const[PV "qw"] sM ->k -# k <$> method_named[PVIV 1520340202] ->l -# BEGIN 3: -# q <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->q -# n <;> nextstate(main 2 -e:3) v ->o -# p <1> postinc[t3] sK/1 ->q -# - <1> ex-rv2sv sKRM/1 ->p -# o <#> gvsv[*beg] s ->p +# f <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->f +# c <;> nextstate(main 2 -e:1) v:{ ->d +# e <1> postinc[t3] sK/1 ->f +# - <1> ex-rv2sv sKRM/1 ->e +# d <#> gvsv[*beg] s ->e EOT_EOT # BEGIN 1: # b <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->b -# 1 <;> nextstate(B::Concise -242 Concise.pm:304) v/2 ->2 +# 1 <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ ->2 # 3 <1> require sK/1 ->4 -# 2 <$> const(PV "strict.pm") s/BARE ->3 -# 4 <;> nextstate(B::Concise -242 Concise.pm:304) v/2 ->5 +# 2 <$> const(PV "warnings.pm") s/BARE ->3 +# 4 <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ ->5 # - <@> lineseq K ->- -# 5 <;> nextstate(B::Concise -242 Concise.pm:304) /2 ->6 +# 5 <;> nextstate(B::Concise -234 Concise.pm:328) :*,&,{,$ ->6 # a <1> entersub[t1] KS*/TARG,2 ->b # 6 <0> pushmark s ->7 -# 7 <$> const(PV "strict") sM ->8 -# 8 <$> const(PV "refs") sM ->9 -# 9 <$> method_named(PVIV 1520340202) ->a +# 7 <$> const(PV "warnings") sM ->8 +# 8 <$> const(PV "qw") sM ->9 +# 9 <$> method_named(PV "import") ->a # BEGIN 2: -# m <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->m -# c <;> nextstate(B::Concise -227 Concise.pm:327) v/2 ->d -# e <1> require sK/1 ->f -# d <$> const(PV "warnings.pm") s/BARE ->e -# f <;> nextstate(B::Concise -227 Concise.pm:327) v/2 ->g -# - <@> lineseq K ->- -# g <;> nextstate(B::Concise -227 Concise.pm:327) /2 ->h -# l <1> entersub[t1] KS*/TARG,2 ->m -# h <0> pushmark s ->i -# i <$> const(PV "warnings") sM ->j -# j <$> const(PV "qw") sM ->k -# k <$> method_named(PVIV 1520340202) ->l -# BEGIN 3: -# q <1> leavesub[1 ref] K/REFC,1 ->(end) -# - <@> lineseq KP ->q -# n <;> nextstate(main 2 -e:3) v ->o -# p <1> postinc[t2] sK/1 ->q -# - <1> ex-rv2sv sKRM/1 ->p -# o <$> gvsv(*beg) s ->p +# f <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->f +# c <;> nextstate(main 2 -e:1) v:{ ->d +# e <1> postinc[t2] sK/1 ->f +# - <1> ex-rv2sv sKRM/1 ->e +# d <$> gvsv(*beg) s ->e EONT_EONT checkOptree ( name => 'END', bcopts => 'END', prog => $src, + @open_todo, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); # END 1: # 4 <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->4 -# 1 <;> nextstate(main 5 -e:6) v ->2 +# 1 <;> nextstate(main 5 -e:6) v:{ ->2 # 3 <1> postinc[t3] sK/1 ->4 # - <1> ex-rv2sv sKRM/1 ->3 # 2 <#> gvsv[*end] s ->3 @@ -133,7 +115,7 @@ EOT_EOT # END 1: # 4 <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->4 -# 1 <;> nextstate(main 5 -e:6) v ->2 +# 1 <;> nextstate(main 5 -e:6) v:{ ->2 # 3 <1> postinc[t2] sK/1 ->4 # - <1> ex-rv2sv sKRM/1 ->3 # 2 <$> gvsv(*end) s ->3 @@ -143,11 +125,12 @@ EONT_EONT checkOptree ( name => 'CHECK', bcopts => 'CHECK', prog => $src, + @open_todo, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); # CHECK 1: # 4 <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->4 -# 1 <;> nextstate(main 3 -e:4) v ->2 +# 1 <;> nextstate(main 3 -e:4) v:{ ->2 # 3 <1> postinc[t3] sK/1 ->4 # - <1> ex-rv2sv sKRM/1 ->3 # 2 <#> gvsv[*chk] s ->3 @@ -155,22 +138,45 @@ EOT_EOT # CHECK 1: # 4 <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->4 -# 1 <;> nextstate(main 3 -e:4) v ->2 +# 1 <;> nextstate(main 3 -e:4) v:{ ->2 # 3 <1> postinc[t2] sK/1 ->4 # - <1> ex-rv2sv sKRM/1 ->3 # 2 <$> gvsv(*chk) s ->3 EONT_EONT +checkOptree ( name => 'UNITCHECK', + bcopts => 'UNITCHECK', + prog => $src, + @open_todo, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# UNITCHECK 1: +# 4 <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->4 +# 1 <;> nextstate(main 3 -e:4) v:{ ->2 +# 3 <1> postinc[t3] sK/1 ->4 +# - <1> ex-rv2sv sKRM/1 ->3 +# 2 <#> gvsv[*uc] s ->3 +EOT_EOT +# UNITCHECK 1: +# 4 <1> leavesub[1 ref] K/REFC,1 ->(end) +# - <@> lineseq KP ->4 +# 1 <;> nextstate(main 3 -e:4) v:{ ->2 +# 3 <1> postinc[t2] sK/1 ->4 +# - <1> ex-rv2sv sKRM/1 ->3 +# 2 <$> gvsv(*uc) s ->3 +EONT_EONT + checkOptree ( name => 'INIT', bcopts => 'INIT', #todo => 'get working', prog => $src, + @open_todo, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); # INIT 1: # 4 <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->4 -# 1 <;> nextstate(main 4 -e:5) v ->2 +# 1 <;> nextstate(main 4 -e:5) v:{ ->2 # 3 <1> postinc[t3] sK/1 ->4 # - <1> ex-rv2sv sKRM/1 ->3 # 2 <#> gvsv[*init] s ->3 @@ -178,105 +184,129 @@ EOT_EOT # INIT 1: # 4 <1> leavesub[1 ref] K/REFC,1 ->(end) # - <@> lineseq KP ->4 -# 1 <;> nextstate(main 4 -e:5) v ->2 +# 1 <;> nextstate(main 4 -e:5) v:{ ->2 # 3 <1> postinc[t2] sK/1 ->4 # - <1> ex-rv2sv sKRM/1 ->3 # 2 <$> gvsv(*init) s ->3 EONT_EONT -checkOptree ( name => 'all of BEGIN END INIT CHECK -exec', - bcopts => [qw/ BEGIN END INIT CHECK -exec /], - #todo => 'get working', +checkOptree ( name => 'all of BEGIN END INIT CHECK UNITCHECK -exec', + bcopts => [qw/ BEGIN END INIT CHECK UNITCHECK -exec /], prog => $src, + @warnings_todo, + @open_todo, expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); # BEGIN 1: -# 1 <;> nextstate(B::Concise -242 Concise.pm:304) v/2 -# 2 <$> const[PV "strict.pm"] s/BARE +# 1 <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ +# 2 <$> const[PV "warnings.pm"] s/BARE # 3 <1> require sK/1 -# 4 <;> nextstate(B::Concise -242 Concise.pm:304) v/2 -# 5 <;> nextstate(B::Concise -242 Concise.pm:304) /2 +# 4 <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ +# 5 <;> nextstate(B::Concise -234 Concise.pm:328) :*,&,{,$ # 6 <0> pushmark s -# 7 <$> const[PV "strict"] sM -# 8 <$> const[PV "refs"] sM -# 9 <$> method_named[PVIV 1520340202] +# 7 <$> const[PV "warnings"] sM +# 8 <$> const[PV "qw"] sM +# 9 <$> method_named[PV "unimport"] # a <1> entersub[t1] KS*/TARG,2 # b <1> leavesub[1 ref] K/REFC,1 # BEGIN 2: -# c <;> nextstate(B::Concise -227 Concise.pm:327) v/2 -# d <$> const[PV "warnings.pm"] s/BARE -# e <1> require sK/1 -# f <;> nextstate(B::Concise -227 Concise.pm:327) v/2 -# g <;> nextstate(B::Concise -227 Concise.pm:327) /2 -# h <0> pushmark s -# i <$> const[PV "warnings"] sM -# j <$> const[PV "qw"] sM -# k <$> method_named[PVIV 1520340202] -# l <1> entersub[t1] KS*/TARG,2 -# m <1> leavesub[1 ref] K/REFC,1 -# BEGIN 3: -# n <;> nextstate(main 2 -e:3) v -# o <#> gvsv[*beg] s -# p <1> postinc[t3] sK/1 -# q <1> leavesub[1 ref] K/REFC,1 +# c <;> nextstate(main 2 -e:1) v:{ +# d <#> gvsv[*beg] s +# e <1> postinc[t3] sK/1 +# f <1> leavesub[1 ref] K/REFC,1 # END 1: -# r <;> nextstate(main 5 -e:6) v -# s <#> gvsv[*end] s -# t <1> postinc[t3] sK/1 -# u <1> leavesub[1 ref] K/REFC,1 +# g <;> nextstate(main 5 -e:1) v:{ +# h <#> gvsv[*end] s +# i <1> postinc[t3] sK/1 +# j <1> leavesub[1 ref] K/REFC,1 # INIT 1: -# v <;> nextstate(main 4 -e:5) v -# w <#> gvsv[*init] s -# x <1> postinc[t3] sK/1 -# y <1> leavesub[1 ref] K/REFC,1 +# k <;> nextstate(main 4 -e:1) v:{ +# l <#> gvsv[*init] s +# m <1> postinc[t3] sK/1 +# n <1> leavesub[1 ref] K/REFC,1 # CHECK 1: -# z <;> nextstate(main 3 -e:4) v -# 10 <#> gvsv[*chk] s -# 11 <1> postinc[t3] sK/1 -# 12 <1> leavesub[1 ref] K/REFC,1 +# o <;> nextstate(main 3 -e:1) v:{ +# p <#> gvsv[*chk] s +# q <1> postinc[t3] sK/1 +# r <1> leavesub[1 ref] K/REFC,1 +# UNITCHECK 1: +# s <;> nextstate(main 6 -e:1) v:{ +# t <#> gvsv[*uc] s +# u <1> postinc[t3] sK/1 +# v <1> leavesub[1 ref] K/REFC,1 EOT_EOT # BEGIN 1: -# 1 <;> nextstate(B::Concise -242 Concise.pm:304) v/2 -# 2 <$> const(PV "strict.pm") s/BARE +# 1 <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ +# 2 <$> const(PV "warnings.pm") s/BARE # 3 <1> require sK/1 -# 4 <;> nextstate(B::Concise -242 Concise.pm:304) v/2 -# 5 <;> nextstate(B::Concise -242 Concise.pm:304) /2 +# 4 <;> nextstate(B::Concise -234 Concise.pm:328) v:*,&,{,$ +# 5 <;> nextstate(B::Concise -234 Concise.pm:328) :*,&,{,$ # 6 <0> pushmark s -# 7 <$> const(PV "strict") sM -# 8 <$> const(PV "refs") sM -# 9 <$> method_named(PVIV 1520340202) +# 7 <$> const(PV "warnings") sM +# 8 <$> const(PV "qw") sM +# 9 <$> method_named(PV "unimport") # a <1> entersub[t1] KS*/TARG,2 # b <1> leavesub[1 ref] K/REFC,1 # BEGIN 2: -# c <;> nextstate(B::Concise -227 Concise.pm:327) v/2 -# d <$> const(PV "warnings.pm") s/BARE -# e <1> require sK/1 -# f <;> nextstate(B::Concise -227 Concise.pm:327) v/2 -# g <;> nextstate(B::Concise -227 Concise.pm:327) /2 -# h <0> pushmark s -# i <$> const(PV "warnings") sM -# j <$> const(PV "qw") sM -# k <$> method_named(PVIV 1520340202) -# l <1> entersub[t1] KS*/TARG,2 -# m <1> leavesub[1 ref] K/REFC,1 -# BEGIN 3: -# n <;> nextstate(main 2 -e:3) v -# o <$> gvsv(*beg) s -# p <1> postinc[t2] sK/1 -# q <1> leavesub[1 ref] K/REFC,1 +# c <;> nextstate(main 2 -e:1) v:{ +# d <$> gvsv(*beg) s +# e <1> postinc[t2] sK/1 +# f <1> leavesub[1 ref] K/REFC,1 # END 1: -# r <;> nextstate(main 5 -e:6) v -# s <$> gvsv(*end) s -# t <1> postinc[t2] sK/1 -# u <1> leavesub[1 ref] K/REFC,1 +# g <;> nextstate(main 5 -e:1) v:{ +# h <$> gvsv(*end) s +# i <1> postinc[t2] sK/1 +# j <1> leavesub[1 ref] K/REFC,1 # INIT 1: -# v <;> nextstate(main 4 -e:5) v -# w <$> gvsv(*init) s -# x <1> postinc[t2] sK/1 -# y <1> leavesub[1 ref] K/REFC,1 +# k <;> nextstate(main 4 -e:1) v:{ +# l <$> gvsv(*init) s +# m <1> postinc[t2] sK/1 +# n <1> leavesub[1 ref] K/REFC,1 # CHECK 1: -# z <;> nextstate(main 3 -e:4) v -# 10 <$> gvsv(*chk) s -# 11 <1> postinc[t2] sK/1 -# 12 <1> leavesub[1 ref] K/REFC,1 +# o <;> nextstate(main 3 -e:1) v:{ +# p <$> gvsv(*chk) s +# q <1> postinc[t2] sK/1 +# r <1> leavesub[1 ref] K/REFC,1 +# UNITCHECK 1: +# s <;> nextstate(main 6 -e:1) v:{ +# t <$> gvsv(*uc) s +# u <1> postinc[t2] sK/1 +# v <1> leavesub[1 ref] K/REFC,1 +EONT_EONT + + +# perl "-I../lib" -MO=Concise,BEGIN,CHECK,INIT,END,-exec -e '$a=$b && print q/foo/' + + + +checkOptree ( name => 'regression test for patch 25352', + bcopts => [qw/ BEGIN END INIT CHECK -exec /], + prog => 'print q/foo/', + @warnings_todo, + expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); +# BEGIN 1: +# 1 <;> nextstate(B::Concise -234 Concise.pm:359) v:*,&,{,$ +# 2 <$> const[PV "warnings.pm"] s/BARE +# 3 <1> require sK/1 +# 4 <;> nextstate(B::Concise -234 Concise.pm:359) v:*,&,{,$ +# 5 <;> nextstate(B::Concise -234 Concise.pm:359) :*,&,{,$ +# 6 <0> pushmark s +# 7 <$> const[PV "warnings"] sM +# 8 <$> const[PV "qw"] sM +# 9 <$> method_named[PV "unimport"] +# a <1> entersub[t1] KS*/TARG,2 +# b <1> leavesub[1 ref] K/REFC,1 +EOT_EOT +# BEGIN 1: +# 1 <;> nextstate(B::Concise -234 Concise.pm:359) v:*,&,{,$ +# 2 <$> const(PV "warnings.pm") s/BARE +# 3 <1> require sK/1 +# 4 <;> nextstate(B::Concise -234 Concise.pm:359) v:*,&,{,$ +# 5 <;> nextstate(B::Concise -234 Concise.pm:359) :*,&,{,$ +# 6 <0> pushmark s +# 7 <$> const(PV "warnings") sM +# 8 <$> const(PV "qw") sM +# 9 <$> method_named(PV "unimport") +# a <1> entersub[t1] KS*/TARG,2 +# b <1> leavesub[1 ref] K/REFC,1 EONT_EONT