1b8851fccSafresh1#!perl 2b8851fccSafresh1 3b8851fccSafresh1# This file specifies an array-of-hashes that define snippets of code that 4b8851fccSafresh1# can be run by various measurement and profiling tools. 5b8851fccSafresh1# 6b8851fccSafresh1# The basic idea is that any time you add an optimisation that is intended 7b8851fccSafresh1# to make a particular construct faster, then you should add that construct 8b8851fccSafresh1# to this file. 9b8851fccSafresh1# 10b8851fccSafresh1# Under the normal test suite, the test file benchmarks.t does a basic 11b8851fccSafresh1# compile and run of each of these snippets; not to test performance, 12b8851fccSafresh1# but just to ensure that the code doesn't have errors. 13b8851fccSafresh1# 14b8851fccSafresh1# Over time, it is intended that various measurement and profiling tools 15b8851fccSafresh1# will be written that can run selected (or all) snippets in various 16b8851fccSafresh1# environments. These will not be run as part of a normal test suite run. 17b8851fccSafresh1# 18b8851fccSafresh1# It is intended that the tests in this file will be lightweight; e.g. 19b8851fccSafresh1# a hash access, an empty function call, or a single regex match etc. 20b8851fccSafresh1# 21b8851fccSafresh1# This file is designed to be read in by 'do' (and in such a way that 22b8851fccSafresh1# multiple versions of this file from different releases can be read in 23b8851fccSafresh1# by a single process). 24b8851fccSafresh1# 25b8851fccSafresh1# The top-level array has name/hash pairs (we use an array rather than a 26b8851fccSafresh1# hash so that duplicate keys can be spotted) Each name is a token that 27b8851fccSafresh1# describes a particular test. Code will be compiled in the package named 28b8851fccSafresh1# after the token, so it should match /^(\w|::)+$/a. It is intended that 29b8851fccSafresh1# this can be used on the command line of tools to select particular 30b8851fccSafresh1# tests. 31b8851fccSafresh1# In addition, the package names are arranged into an informal hierarchy 32b8851fccSafresh1# whose top members are (this is subject to change): 33b8851fccSafresh1# 34b8851fccSafresh1# call:: subroutine and method handling 35b8851fccSafresh1# expr:: expressions: e.g. $x=1, $foo{bar}[0] 365759b3d2Safresh1# func:: perl functions, e.g. func::sort::... 37b8851fccSafresh1# loop:: structural code like for, while(), etc 38b8851fccSafresh1# regex:: regular expressions 39b8851fccSafresh1# string:: string handling 40b8851fccSafresh1# 41b8851fccSafresh1# 425759b3d2Safresh1# Each hash has up to five fields: 43b8851fccSafresh1# 445759b3d2Safresh1# desc is a description of the test; if not present, it defaults 455759b3d2Safresh1# to the same value as the 'code' field 465759b3d2Safresh1# 475759b3d2Safresh1# setup is an optional string containing setup code that is run once 485759b3d2Safresh1# 49b8851fccSafresh1# code is a string containing the code to run in a loop 50b8851fccSafresh1# 515759b3d2Safresh1# pre is an optional string containing setup code which is executed 525759b3d2Safresh1# just before 'code' for every iteration, but whose execution 535759b3d2Safresh1# time is not included in the result 54b8851fccSafresh1# 555759b3d2Safresh1# post like pre, but executed just after 'code'. 565759b3d2Safresh1# 575759b3d2Safresh1# So typically a benchmark tool might execute variations on something like 585759b3d2Safresh1# 595759b3d2Safresh1# eval "package $name; $setup; for (1..1000000) { $pre; $code; $post }" 60b8851fccSafresh1# 61b8851fccSafresh1# Currently the only tool that uses this file is Porting/bench.pl; 62b8851fccSafresh1# try C<perl Porting/bench.pl --help> for more info 635759b3d2Safresh1# 645759b3d2Safresh1# ------ 655759b3d2Safresh1# 665759b3d2Safresh1# Note: for the cachegrind variant, an entry like 675759b3d2Safresh1# 'foo::bar' => { 685759b3d2Safresh1# setup => 'SETUP', 695759b3d2Safresh1# pre => 'PRE', 705759b3d2Safresh1# code => 'CODE', 715759b3d2Safresh1# post => 'POST', 725759b3d2Safresh1# } 735759b3d2Safresh1# creates two temporary perl sources looking like: 745759b3d2Safresh1# 755759b3d2Safresh1# package foo::bar; 765759b3d2Safresh1# BEGIN { srand(0) } 775759b3d2Safresh1# SETUP; 785759b3d2Safresh1# for my $__loop__ (1..$ARGV[0]) { 795759b3d2Safresh1# PRE; 1; POST; 805759b3d2Safresh1# } 815759b3d2Safresh1# 825759b3d2Safresh1# and as above, but with the loop body replaced with: 835759b3d2Safresh1# 845759b3d2Safresh1# PRE; CODE; POST; 855759b3d2Safresh1# 865759b3d2Safresh1# It then pipes each of the two sources into 875759b3d2Safresh1# 885759b3d2Safresh1# PERL_HASH_SEED=0 valgrind [options] someperl [options] - N 895759b3d2Safresh1# 905759b3d2Safresh1# where N is set to 10 and then 20. 915759b3d2Safresh1# 925759b3d2Safresh1# It then uses the result of those four cachegrind runs to subtract out 935759b3d2Safresh1# the perl startup and loop overheads (including SETUP, PRE and POST), leaving 945759b3d2Safresh1# (in theory only CODE); 955759b3d2Safresh1# 965759b3d2Safresh1# Note that misleading results may be obtained if each iteration is 975759b3d2Safresh1# not identical. For example with 985759b3d2Safresh1# 995759b3d2Safresh1# code => '$x .= "foo"', 1005759b3d2Safresh1# 1015759b3d2Safresh1# the string $x gets longer on each iteration. Similarly, a hash might be 1025759b3d2Safresh1# empty on the first iteration, but have entries on subsequent iterations. 1035759b3d2Safresh1# 1045759b3d2Safresh1# To avoid this, use 'pre' or 'post', e.g. 1055759b3d2Safresh1# 1065759b3d2Safresh1# pre => '$x = ""', 1075759b3d2Safresh1# code => '$x .= "foo"', 1085759b3d2Safresh1# 1095759b3d2Safresh1# Finally, the optional 'compile' key causes the code body to be wrapped 1105759b3d2Safresh1# in eval qw{ sub { ... }}, so that compile time rather than execution 1115759b3d2Safresh1# time is measured. 112b8851fccSafresh1 113b8851fccSafresh1 114b8851fccSafresh1[ 115b8851fccSafresh1 'call::sub::empty' => { 116b8851fccSafresh1 desc => 'function call with no args or body', 117b8851fccSafresh1 setup => 'sub f { }', 118b8851fccSafresh1 code => 'f()', 119b8851fccSafresh1 }, 120b8851fccSafresh1 'call::sub::amp_empty' => { 121b8851fccSafresh1 desc => '&foo function call with no args or body', 122b8851fccSafresh1 setup => 'sub f { }; @_ = ();', 123b8851fccSafresh1 code => '&f', 124b8851fccSafresh1 }, 125b8851fccSafresh1 'call::sub::args3' => { 126b8851fccSafresh1 desc => 'function call with 3 local lexical vars', 127b8851fccSafresh1 setup => 'sub f { my ($a, $b, $c) = @_; 1 }', 128b8851fccSafresh1 code => 'f(1,2,3)', 129b8851fccSafresh1 }, 130b8851fccSafresh1 'call::sub::args2_ret1' => { 131b8851fccSafresh1 desc => 'function call with 2 local lex vars and 1 return value', 132b8851fccSafresh1 setup => 'my $x; sub f { my ($a, $b) = @_; $a+$b }', 133b8851fccSafresh1 code => '$x = f(1,2)', 134b8851fccSafresh1 }, 135b8851fccSafresh1 'call::sub::args2_ret1temp' => { 136b8851fccSafresh1 desc => 'function call with 2 local lex vars and 1 return TEMP value', 137b8851fccSafresh1 setup => 'my $x; sub f { my ($a, $b) = @_; \$a }', 138b8851fccSafresh1 code => '$x = f(1,2)', 139b8851fccSafresh1 }, 140b8851fccSafresh1 'call::sub::args3_ret3' => { 141b8851fccSafresh1 desc => 'function call with 3 local lex vars and 3 return values', 142b8851fccSafresh1 setup => 'my @a; sub f { my ($a, $b, $c) = @_; $a+$b, $c, 1 }', 143b8851fccSafresh1 code => '@a = f(1,2,3)', 144b8851fccSafresh1 }, 145b8851fccSafresh1 'call::sub::args3_ret3str' => { 146b8851fccSafresh1 desc => 'function call with 3 local lex vars and 3 string return values', 147b8851fccSafresh1 setup => 'my @a; sub f { my ($a, $b, $c) = @_; my @s = ("aa","bb","cc"); @s }', 148b8851fccSafresh1 code => '@a = f(1,2,3)', 149b8851fccSafresh1 }, 150b8851fccSafresh1 'call::sub::args3_ret3temp' => { 151b8851fccSafresh1 desc => 'function call with 3 local lex vars and 3 TEMP return values', 152b8851fccSafresh1 setup => 'my @a; sub f { my ($a, $b, $c) = @_; 1..3 }', 153b8851fccSafresh1 code => '@a = f(1,2,3)', 154b8851fccSafresh1 }, 155b8851fccSafresh1 'call::sub::recursive' => { 156b8851fccSafresh1 desc => 'basic recursive function call', 157b8851fccSafresh1 setup => 'my $x; sub f { my ($i) = @_; $i > 0 ? $i + f($i-1) : 0 }', 158b8851fccSafresh1 code => '$x = f(1)', 159b8851fccSafresh1 }, 160b8851fccSafresh1 16156d68f1eSafresh1 'call::sub::scalar' => { 16256d68f1eSafresh1 desc => 'sub called in scalar context', 16356d68f1eSafresh1 setup => 'my $x; my @a = 1..4; sub f { @a }', 16456d68f1eSafresh1 code => '$x = f()', 16556d68f1eSafresh1 }, 16656d68f1eSafresh1 167b8851fccSafresh1 'call::goto::empty' => { 168b8851fccSafresh1 desc => 'goto &funtion with no args or body', 169b8851fccSafresh1 setup => 'sub f { goto &g } sub g {}', 170b8851fccSafresh1 code => 'f()', 171b8851fccSafresh1 }, 172b8851fccSafresh1 'call::goto::args3' => { 173b8851fccSafresh1 desc => 'goto &funtion with 3 local lexical vars', 174b8851fccSafresh1 setup => 'sub f { goto &g } sub g { my ($a, $b, $c) = @_ }', 175b8851fccSafresh1 code => 'f(1,2,3)', 176b8851fccSafresh1 }, 177b8851fccSafresh1 178b8851fccSafresh1 179b8851fccSafresh1 'expr::array::lex_1const_0' => { 180b8851fccSafresh1 desc => 'lexical $array[0]', 181b8851fccSafresh1 setup => 'my @a = (1)', 182b8851fccSafresh1 code => '$a[0]', 183b8851fccSafresh1 }, 184b8851fccSafresh1 'expr::array::lex_1const_m1' => { 185b8851fccSafresh1 desc => 'lexical $array[-1]', 186b8851fccSafresh1 setup => 'my @a = (1)', 187b8851fccSafresh1 code => '$a[-1]', 188b8851fccSafresh1 }, 189b8851fccSafresh1 'expr::array::lex_2const' => { 190b8851fccSafresh1 desc => 'lexical $array[const][const]', 191b8851fccSafresh1 setup => 'my @a = ([1,2])', 192b8851fccSafresh1 code => '$a[0][1]', 193b8851fccSafresh1 }, 194b8851fccSafresh1 'expr::array::lex_2var' => { 195b8851fccSafresh1 desc => 'lexical $array[$i1][$i2]', 196b8851fccSafresh1 setup => 'my ($i1,$i2) = (0,1); my @a = ([1,2])', 197b8851fccSafresh1 code => '$a[$i1][$i2]', 198b8851fccSafresh1 }, 199b8851fccSafresh1 'expr::array::ref_lex_2var' => { 200b8851fccSafresh1 desc => 'lexical $arrayref->[$i1][$i2]', 201b8851fccSafresh1 setup => 'my ($i1,$i2) = (0,1); my $r = [[1,2]]', 202b8851fccSafresh1 code => '$r->[$i1][$i2]', 203b8851fccSafresh1 }, 204b8851fccSafresh1 'expr::array::ref_lex_3const' => { 205b8851fccSafresh1 desc => 'lexical $arrayref->[const][const][const]', 206b8851fccSafresh1 setup => 'my $r = [[[1,2]]]', 207b8851fccSafresh1 code => '$r->[0][0][0]', 208b8851fccSafresh1 }, 209b8851fccSafresh1 'expr::array::ref_expr_lex_3const' => { 210b8851fccSafresh1 desc => '(lexical expr)->[const][const][const]', 211b8851fccSafresh1 setup => 'my $r = [[[1,2]]]', 212b8851fccSafresh1 code => '($r||0)->[0][0][0]', 213b8851fccSafresh1 }, 214b8851fccSafresh1 215b8851fccSafresh1 216b8851fccSafresh1 'expr::array::pkg_1const_0' => { 217b8851fccSafresh1 desc => 'package $array[0]', 218b8851fccSafresh1 setup => '@a = (1)', 219b8851fccSafresh1 code => '$a[0]', 220b8851fccSafresh1 }, 221b8851fccSafresh1 'expr::array::pkg_1const_m1' => { 222b8851fccSafresh1 desc => 'package $array[-1]', 223b8851fccSafresh1 setup => '@a = (1)', 224b8851fccSafresh1 code => '$a[-1]', 225b8851fccSafresh1 }, 226b8851fccSafresh1 'expr::array::pkg_2const' => { 227b8851fccSafresh1 desc => 'package $array[const][const]', 228b8851fccSafresh1 setup => '@a = ([1,2])', 229b8851fccSafresh1 code => '$a[0][1]', 230b8851fccSafresh1 }, 231b8851fccSafresh1 'expr::array::pkg_2var' => { 232b8851fccSafresh1 desc => 'package $array[$i1][$i2]', 233b8851fccSafresh1 setup => '($i1,$i2) = (0,1); @a = ([1,2])', 234b8851fccSafresh1 code => '$a[$i1][$i2]', 235b8851fccSafresh1 }, 236b8851fccSafresh1 'expr::array::ref_pkg_2var' => { 237b8851fccSafresh1 desc => 'package $arrayref->[$i1][$i2]', 238b8851fccSafresh1 setup => '($i1,$i2) = (0,1); $r = [[1,2]]', 239b8851fccSafresh1 code => '$r->[$i1][$i2]', 240b8851fccSafresh1 }, 241b8851fccSafresh1 'expr::array::ref_pkg_3const' => { 242b8851fccSafresh1 desc => 'package $arrayref->[const][const][const]', 243b8851fccSafresh1 setup => '$r = [[[1,2]]]', 244b8851fccSafresh1 code => '$r->[0][0][0]', 245b8851fccSafresh1 }, 246b8851fccSafresh1 'expr::array::ref_expr_pkg_3const' => { 247b8851fccSafresh1 desc => '(package expr)->[const][const][const]', 248b8851fccSafresh1 setup => '$r = [[[1,2]]]', 249b8851fccSafresh1 code => '($r||0)->[0][0][0]', 250b8851fccSafresh1 }, 251b8851fccSafresh1 2525759b3d2Safresh1 'expr::array::lex_bool_empty' => { 2535759b3d2Safresh1 desc => 'empty lexical array in boolean context', 2545759b3d2Safresh1 setup => 'my @a;', 2555759b3d2Safresh1 code => '!@a', 2565759b3d2Safresh1 }, 2575759b3d2Safresh1 'expr::array::lex_bool_full' => { 2585759b3d2Safresh1 desc => 'non-empty lexical array in boolean context', 2595759b3d2Safresh1 setup => 'my @a = 1..10;', 2605759b3d2Safresh1 code => '!@a', 2615759b3d2Safresh1 }, 2625759b3d2Safresh1 'expr::array::lex_scalar_empty' => { 2635759b3d2Safresh1 desc => 'empty lexical array in scalar context', 2645759b3d2Safresh1 setup => 'my (@a, $i);', 2655759b3d2Safresh1 code => '$i = @a', 2665759b3d2Safresh1 }, 2675759b3d2Safresh1 'expr::array::lex_scalar_full' => { 2685759b3d2Safresh1 desc => 'non-empty lexical array in scalar context', 2695759b3d2Safresh1 setup => 'my @a = 1..10; my $i', 2705759b3d2Safresh1 code => '$i = @a', 2715759b3d2Safresh1 }, 2725759b3d2Safresh1 'expr::array::pkg_bool_empty' => { 2735759b3d2Safresh1 desc => 'empty lexical array in boolean context', 2745759b3d2Safresh1 setup => 'our @a;', 2755759b3d2Safresh1 code => '!@a', 2765759b3d2Safresh1 }, 2775759b3d2Safresh1 'expr::array::pkg_bool_full' => { 2785759b3d2Safresh1 desc => 'non-empty lexical array in boolean context', 2795759b3d2Safresh1 setup => 'our @a = 1..10;', 2805759b3d2Safresh1 code => '!@a', 2815759b3d2Safresh1 }, 2825759b3d2Safresh1 'expr::array::pkg_scalar_empty' => { 2835759b3d2Safresh1 desc => 'empty lexical array in scalar context', 2845759b3d2Safresh1 setup => 'our @a; my $i;', 2855759b3d2Safresh1 code => '$i = @a', 2865759b3d2Safresh1 }, 2875759b3d2Safresh1 'expr::array::pkg_scalar_full' => { 2885759b3d2Safresh1 desc => 'non-empty lexical array in scalar context', 2895759b3d2Safresh1 setup => 'our @a = 1..10; my $i', 2905759b3d2Safresh1 code => '$i = @a', 2915759b3d2Safresh1 }, 292b8851fccSafresh1 293b8851fccSafresh1 'expr::arrayhash::lex_3var' => { 294b8851fccSafresh1 desc => 'lexical $h{$k1}[$i]{$k2}', 295b8851fccSafresh1 setup => 'my ($i, $k1, $k2) = (0,"foo","bar");' 296b8851fccSafresh1 . 'my %h = (foo => [ { bar => 1 } ])', 297b8851fccSafresh1 code => '$h{$k1}[$i]{$k2}', 298b8851fccSafresh1 }, 299b8851fccSafresh1 'expr::arrayhash::pkg_3var' => { 300b8851fccSafresh1 desc => 'package $h{$k1}[$i]{$k2}', 301b8851fccSafresh1 setup => '($i, $k1, $k2) = (0,"foo","bar");' 302b8851fccSafresh1 . '%h = (foo => [ { bar => 1 } ])', 303b8851fccSafresh1 code => '$h{$k1}[$i]{$k2}', 304b8851fccSafresh1 }, 305b8851fccSafresh1 306b8851fccSafresh1 'expr::hash::lex_1const' => { 307b8851fccSafresh1 desc => 'lexical $hash{const}', 308b8851fccSafresh1 setup => 'my %h = ("foo" => 1)', 309b8851fccSafresh1 code => '$h{foo}', 310b8851fccSafresh1 }, 311b8851fccSafresh1 'expr::hash::lex_2const' => { 312b8851fccSafresh1 desc => 'lexical $hash{const}{const}', 313b8851fccSafresh1 setup => 'my %h = (foo => { bar => 1 })', 314b8851fccSafresh1 code => '$h{foo}{bar}', 315b8851fccSafresh1 }, 316b8851fccSafresh1 'expr::hash::lex_2var' => { 317b8851fccSafresh1 desc => 'lexical $hash{$k1}{$k2}', 318b8851fccSafresh1 setup => 'my ($k1,$k2) = qw(foo bar); my %h = ($k1 => { $k2 => 1 })', 319b8851fccSafresh1 code => '$h{$k1}{$k2}', 320b8851fccSafresh1 }, 321b8851fccSafresh1 'expr::hash::ref_lex_2var' => { 322b8851fccSafresh1 desc => 'lexical $hashref->{$k1}{$k2}', 323b8851fccSafresh1 setup => 'my ($k1,$k2) = qw(foo bar); my $r = {$k1 => { $k2 => 1 }}', 324b8851fccSafresh1 code => '$r->{$k1}{$k2}', 325b8851fccSafresh1 }, 326b8851fccSafresh1 'expr::hash::ref_lex_3const' => { 327b8851fccSafresh1 desc => 'lexical $hashref->{const}{const}{const}', 328b8851fccSafresh1 setup => 'my $r = {foo => { bar => { baz => 1 }}}', 329b8851fccSafresh1 code => '$r->{foo}{bar}{baz}', 330b8851fccSafresh1 }, 331b8851fccSafresh1 'expr::hash::ref_expr_lex_3const' => { 332b8851fccSafresh1 desc => '(lexical expr)->{const}{const}{const}', 333b8851fccSafresh1 setup => 'my $r = {foo => { bar => { baz => 1 }}}', 334b8851fccSafresh1 code => '($r||0)->{foo}{bar}{baz}', 335b8851fccSafresh1 }, 336b8851fccSafresh1 337b8851fccSafresh1 'expr::hash::pkg_1const' => { 338b8851fccSafresh1 desc => 'package $hash{const}', 339b8851fccSafresh1 setup => '%h = ("foo" => 1)', 340b8851fccSafresh1 code => '$h{foo}', 341b8851fccSafresh1 }, 342b8851fccSafresh1 'expr::hash::pkg_2const' => { 343b8851fccSafresh1 desc => 'package $hash{const}{const}', 344b8851fccSafresh1 setup => '%h = (foo => { bar => 1 })', 345b8851fccSafresh1 code => '$h{foo}{bar}', 346b8851fccSafresh1 }, 347b8851fccSafresh1 'expr::hash::pkg_2var' => { 348b8851fccSafresh1 desc => 'package $hash{$k1}{$k2}', 349b8851fccSafresh1 setup => '($k1,$k2) = qw(foo bar); %h = ($k1 => { $k2 => 1 })', 350b8851fccSafresh1 code => '$h{$k1}{$k2}', 351b8851fccSafresh1 }, 352b8851fccSafresh1 'expr::hash::ref_pkg_2var' => { 353b8851fccSafresh1 desc => 'package $hashref->{$k1}{$k2}', 354b8851fccSafresh1 setup => '($k1,$k2) = qw(foo bar); $r = {$k1 => { $k2 => 1 }}', 355b8851fccSafresh1 code => '$r->{$k1}{$k2}', 356b8851fccSafresh1 }, 357b8851fccSafresh1 'expr::hash::ref_pkg_3const' => { 358b8851fccSafresh1 desc => 'package $hashref->{const}{const}{const}', 359b8851fccSafresh1 setup => '$r = {foo => { bar => { baz => 1 }}}', 360b8851fccSafresh1 code => '$r->{foo}{bar}{baz}', 361b8851fccSafresh1 }, 362b8851fccSafresh1 'expr::hash::ref_expr_pkg_3const' => { 363b8851fccSafresh1 desc => '(package expr)->{const}{const}{const}', 364b8851fccSafresh1 setup => '$r = {foo => { bar => { baz => 1 }}}', 365b8851fccSafresh1 code => '($r||0)->{foo}{bar}{baz}', 366b8851fccSafresh1 }, 367b8851fccSafresh1 368b8851fccSafresh1 369b8851fccSafresh1 'expr::hash::exists_lex_2var' => { 370b8851fccSafresh1 desc => 'lexical exists $hash{$k1}{$k2}', 371b8851fccSafresh1 setup => 'my ($k1,$k2) = qw(foo bar); my %h = ($k1 => { $k2 => 1 });', 372b8851fccSafresh1 code => 'exists $h{$k1}{$k2}', 373b8851fccSafresh1 }, 3745759b3d2Safresh1 3755759b3d2Safresh1 'expr::hash::bool_empty' => { 3765759b3d2Safresh1 desc => 'empty lexical hash in boolean context', 3775759b3d2Safresh1 setup => 'my %h;', 3785759b3d2Safresh1 code => '!%h', 3795759b3d2Safresh1 }, 3805759b3d2Safresh1 'expr::hash::bool_empty_unknown' => { 3815759b3d2Safresh1 desc => 'empty lexical hash in unknown context', 3825759b3d2Safresh1 setup => 'my ($i, %h); sub f { if (%h) { $i++ }}', 3835759b3d2Safresh1 code => 'f()', 3845759b3d2Safresh1 }, 3855759b3d2Safresh1 'expr::hash::bool_full' => { 3865759b3d2Safresh1 desc => 'non-empty lexical hash in boolean context', 3875759b3d2Safresh1 setup => 'my %h = 1..10;', 3885759b3d2Safresh1 code => '!%h', 3895759b3d2Safresh1 }, 3905759b3d2Safresh1 3915759b3d2Safresh1 3925759b3d2Safresh1 ( 3935759b3d2Safresh1 map { 3945759b3d2Safresh1 sprintf('expr::hash::notexists_lex_keylen%04d',$_) => { 3955759b3d2Safresh1 desc => 'exists on non-key of length '. $_, 3965759b3d2Safresh1 setup => 'my %h; my $key = "A" x ' . $_ . '; $h{$key."x"} = 1;', 3975759b3d2Safresh1 code => 'exists $h{$key}', 3985759b3d2Safresh1 }, 3995759b3d2Safresh1 } ( 4005759b3d2Safresh1 1 .. 24, 4015759b3d2Safresh1 # 1,2,3,7,8,9,14,15,16,20,24, 4025759b3d2Safresh1 50, 4035759b3d2Safresh1 100, 4045759b3d2Safresh1 1000, 4055759b3d2Safresh1 ) 4065759b3d2Safresh1 ), 4075759b3d2Safresh1 ( 4085759b3d2Safresh1 map { 4095759b3d2Safresh1 sprintf('expr::hash::exists_lex_keylen%04d',$_) => { 4105759b3d2Safresh1 desc => 'exists on existing key of length '. $_, 4115759b3d2Safresh1 setup => 'my %h; my $key = "A" x ' . $_ . '; $h{$key} = 1;', 4125759b3d2Safresh1 code => 'exists $h{$key}', 4135759b3d2Safresh1 }, 4145759b3d2Safresh1 } ( 4155759b3d2Safresh1 1 .. 24, 4165759b3d2Safresh1 # 1,2,3,7,8,9,14,15,16,20,24, 4175759b3d2Safresh1 50, 4185759b3d2Safresh1 100, 4195759b3d2Safresh1 1000, 4205759b3d2Safresh1 ) 4215759b3d2Safresh1 ), 4225759b3d2Safresh1 423b8851fccSafresh1 'expr::hash::delete_lex_2var' => { 424b8851fccSafresh1 desc => 'lexical delete $hash{$k1}{$k2}', 425b8851fccSafresh1 setup => 'my ($k1,$k2) = qw(foo bar); my %h = ($k1 => { $k2 => 1 });', 426b8851fccSafresh1 code => 'delete $h{$k1}{$k2}', 427b8851fccSafresh1 }, 428b8851fccSafresh1 429b8851fccSafresh1 430b8851fccSafresh1 # list assign, OP_AASSIGN 431b8851fccSafresh1 432b8851fccSafresh1 433b8851fccSafresh1 # (....) = () 434b8851fccSafresh1 435b8851fccSafresh1 'expr::aassign::ma_empty' => { 436b8851fccSafresh1 desc => 'my array assigned empty', 437b8851fccSafresh1 setup => '', 438b8851fccSafresh1 code => 'my @a = ()', 439b8851fccSafresh1 }, 440b8851fccSafresh1 'expr::aassign::lax_empty' => { 441b8851fccSafresh1 desc => 'non-empty lexical array assigned empty', 442b8851fccSafresh1 setup => 'my @a = 1..3;', 443b8851fccSafresh1 code => '@a = ()', 444b8851fccSafresh1 }, 445b8851fccSafresh1 'expr::aassign::llax_empty' => { 446b8851fccSafresh1 desc => 'non-empty lexical var and array assigned empty', 447b8851fccSafresh1 setup => 'my ($x, @a) = 1..4;', 448b8851fccSafresh1 code => '($x, @a) = ()', 449b8851fccSafresh1 }, 4505759b3d2Safresh1 'expr::aassign::mh_empty' => { 4515759b3d2Safresh1 desc => 'my hash assigned empty', 4525759b3d2Safresh1 setup => '', 4535759b3d2Safresh1 code => 'my %h = ()', 4545759b3d2Safresh1 }, 4555759b3d2Safresh1 'expr::aassign::lhx_empty' => { 4565759b3d2Safresh1 desc => 'non-empty lexical hash assigned empty', 4575759b3d2Safresh1 setup => 'my %h = 1..4;', 4585759b3d2Safresh1 code => '%h = ()', 4595759b3d2Safresh1 }, 4605759b3d2Safresh1 'expr::aassign::llhx_empty' => { 4615759b3d2Safresh1 desc => 'non-empty lexical var and hash assigned empty', 4625759b3d2Safresh1 setup => 'my ($x, %h) = 1..5;', 4635759b3d2Safresh1 code => '($x, %h) = ()', 4645759b3d2Safresh1 }, 465b8851fccSafresh1 'expr::aassign::3m_empty' => { 466b8851fccSafresh1 desc => 'three my vars assigned empty', 467b8851fccSafresh1 setup => '', 468b8851fccSafresh1 code => 'my ($x,$y,$z) = ()', 469b8851fccSafresh1 }, 470b8851fccSafresh1 'expr::aassign::3l_empty' => { 471b8851fccSafresh1 desc => 'three lexical vars assigned empty', 472b8851fccSafresh1 setup => 'my ($x,$y,$z)', 473b8851fccSafresh1 code => '($x,$y,$z) = ()', 474b8851fccSafresh1 }, 4755759b3d2Safresh1 'expr::aassign::3lref_empty' => { 4765759b3d2Safresh1 desc => 'three lexical ref vars assigned empty', 4775759b3d2Safresh1 setup => 'my ($x,$y,$z); my $r = []; ', 4785759b3d2Safresh1 code => '($x,$y,$z) = ($r,$r,$r); ($x,$y,$z) = ()', 4795759b3d2Safresh1 }, 480b8851fccSafresh1 'expr::aassign::pa_empty' => { 481b8851fccSafresh1 desc => 'package array assigned empty', 482b8851fccSafresh1 setup => '', 483b8851fccSafresh1 code => '@a = ()', 484b8851fccSafresh1 }, 485b8851fccSafresh1 'expr::aassign::pax_empty' => { 486b8851fccSafresh1 desc => 'non-empty package array assigned empty', 487b8851fccSafresh1 setup => '@a = (1,2,3)', 488b8851fccSafresh1 code => '@a = ()', 489b8851fccSafresh1 }, 490b8851fccSafresh1 'expr::aassign::3p_empty' => { 491b8851fccSafresh1 desc => 'three package vars assigned empty', 492b8851fccSafresh1 setup => '($x,$y,$z) = 1..3;', 493b8851fccSafresh1 code => '($x,$y,$z) = ()', 494b8851fccSafresh1 }, 495b8851fccSafresh1 496b8851fccSafresh1 # (....) = (1,2,3) 497b8851fccSafresh1 498b8851fccSafresh1 'expr::aassign::ma_3c' => { 499b8851fccSafresh1 desc => 'my array assigned 3 consts', 500b8851fccSafresh1 setup => '', 501b8851fccSafresh1 code => 'my @a = (1,2,3)', 502b8851fccSafresh1 }, 503b8851fccSafresh1 'expr::aassign::lax_3c' => { 504b8851fccSafresh1 desc => 'non-empty lexical array assigned 3 consts', 505b8851fccSafresh1 setup => 'my @a = 1..3;', 506b8851fccSafresh1 code => '@a = (1,2,3)', 507b8851fccSafresh1 }, 508b8851fccSafresh1 'expr::aassign::llax_3c' => { 509b8851fccSafresh1 desc => 'non-empty lexical var and array assigned 3 consts', 510b8851fccSafresh1 setup => 'my ($x, @a) = 1..4;', 511b8851fccSafresh1 code => '($x, @a) = (1,2,3)', 512b8851fccSafresh1 }, 5135759b3d2Safresh1 'expr::aassign::mh_4c' => { 5145759b3d2Safresh1 desc => 'my hash assigned 4 consts', 5155759b3d2Safresh1 setup => '', 5165759b3d2Safresh1 code => 'my %h = qw(a 1 b 2)', 5175759b3d2Safresh1 }, 5185759b3d2Safresh1 'expr::aassign::lhx_4c' => { 5195759b3d2Safresh1 desc => 'non-empty lexical hash assigned 4 consts', 5205759b3d2Safresh1 setup => 'my %h = qw(a 1 b 2);', 5215759b3d2Safresh1 code => '%h = qw(c 3 d 4)', 5225759b3d2Safresh1 }, 5235759b3d2Safresh1 'expr::aassign::llhx_5c' => { 5245759b3d2Safresh1 desc => 'non-empty lexical var and array assigned 5 consts', 5255759b3d2Safresh1 setup => 'my ($x, %h) = (1, qw(a 1 b 2));', 5265759b3d2Safresh1 code => '($x, %h) = (10, qw(c 3 d 4))', 5275759b3d2Safresh1 }, 528b8851fccSafresh1 'expr::aassign::3m_3c' => { 529b8851fccSafresh1 desc => 'three my vars assigned 3 consts', 530b8851fccSafresh1 setup => '', 531b8851fccSafresh1 code => 'my ($x,$y,$z) = (1,2,3)', 532b8851fccSafresh1 }, 533b8851fccSafresh1 'expr::aassign::3l_3c' => { 534b8851fccSafresh1 desc => 'three lexical vars assigned 3 consts', 535b8851fccSafresh1 setup => 'my ($x,$y,$z)', 536b8851fccSafresh1 code => '($x,$y,$z) = (1,2,3)', 537b8851fccSafresh1 }, 538b8851fccSafresh1 'expr::aassign::pa_3c' => { 539b8851fccSafresh1 desc => 'package array assigned 3 consts', 540b8851fccSafresh1 setup => '', 541b8851fccSafresh1 code => '@a = (1,2,3)', 542b8851fccSafresh1 }, 543b8851fccSafresh1 'expr::aassign::pax_3c' => { 544b8851fccSafresh1 desc => 'non-empty package array assigned 3 consts', 545b8851fccSafresh1 setup => '@a = (1,2,3)', 546b8851fccSafresh1 code => '@a = (1,2,3)', 547b8851fccSafresh1 }, 548b8851fccSafresh1 'expr::aassign::3p_3c' => { 549b8851fccSafresh1 desc => 'three package vars assigned 3 consts', 550b8851fccSafresh1 setup => '($x,$y,$z) = 1..3;', 551b8851fccSafresh1 code => '($x,$y,$z) = (1,2,3)', 552b8851fccSafresh1 }, 553b8851fccSafresh1 554b8851fccSafresh1 # (....) = @lexical 555b8851fccSafresh1 556b8851fccSafresh1 'expr::aassign::ma_la' => { 557b8851fccSafresh1 desc => 'my array assigned lexical array', 558b8851fccSafresh1 setup => 'my @init = 1..3;', 559b8851fccSafresh1 code => 'my @a = @init', 560b8851fccSafresh1 }, 561b8851fccSafresh1 'expr::aassign::lax_la' => { 562b8851fccSafresh1 desc => 'non-empty lexical array assigned lexical array', 563b8851fccSafresh1 setup => 'my @init = 1..3; my @a = 1..3;', 564b8851fccSafresh1 code => '@a = @init', 565b8851fccSafresh1 }, 566b8851fccSafresh1 'expr::aassign::llax_la' => { 567b8851fccSafresh1 desc => 'non-empty lexical var and array assigned lexical array', 568b8851fccSafresh1 setup => 'my @init = 1..3; my ($x, @a) = 1..4;', 569b8851fccSafresh1 code => '($x, @a) = @init', 570b8851fccSafresh1 }, 571b8851fccSafresh1 'expr::aassign::3m_la' => { 572b8851fccSafresh1 desc => 'three my vars assigned lexical array', 573b8851fccSafresh1 setup => 'my @init = 1..3;', 574b8851fccSafresh1 code => 'my ($x,$y,$z) = @init', 575b8851fccSafresh1 }, 576b8851fccSafresh1 'expr::aassign::3l_la' => { 577b8851fccSafresh1 desc => 'three lexical vars assigned lexical array', 578b8851fccSafresh1 setup => 'my @init = 1..3; my ($x,$y,$z)', 579b8851fccSafresh1 code => '($x,$y,$z) = @init', 580b8851fccSafresh1 }, 581b8851fccSafresh1 'expr::aassign::pa_la' => { 582b8851fccSafresh1 desc => 'package array assigned lexical array', 583b8851fccSafresh1 setup => 'my @init = 1..3;', 584b8851fccSafresh1 code => '@a = @init', 585b8851fccSafresh1 }, 586b8851fccSafresh1 'expr::aassign::pax_la' => { 587b8851fccSafresh1 desc => 'non-empty package array assigned lexical array', 588b8851fccSafresh1 setup => 'my @init = 1..3; @a = @init', 589b8851fccSafresh1 code => '@a = @init', 590b8851fccSafresh1 }, 591b8851fccSafresh1 'expr::aassign::3p_la' => { 592b8851fccSafresh1 desc => 'three package vars assigned lexical array', 593b8851fccSafresh1 setup => 'my @init = 1..3; ($x,$y,$z) = 1..3;', 594b8851fccSafresh1 code => '($x,$y,$z) = @init', 595b8851fccSafresh1 }, 596b8851fccSafresh1 597b8851fccSafresh1 # (....) = @package 598b8851fccSafresh1 599b8851fccSafresh1 'expr::aassign::ma_pa' => { 600b8851fccSafresh1 desc => 'my array assigned package array', 601b8851fccSafresh1 setup => '@init = 1..3;', 602b8851fccSafresh1 code => 'my @a = @init', 603b8851fccSafresh1 }, 604b8851fccSafresh1 'expr::aassign::lax_pa' => { 605b8851fccSafresh1 desc => 'non-empty lexical array assigned package array', 606b8851fccSafresh1 setup => '@init = 1..3; my @a = 1..3;', 607b8851fccSafresh1 code => '@a = @init', 608b8851fccSafresh1 }, 609b8851fccSafresh1 'expr::aassign::llax_pa' => { 610b8851fccSafresh1 desc => 'non-empty lexical var and array assigned package array', 611b8851fccSafresh1 setup => '@init = 1..3; my ($x, @a) = 1..4;', 612b8851fccSafresh1 code => '($x, @a) = @init', 613b8851fccSafresh1 }, 614b8851fccSafresh1 'expr::aassign::3m_pa' => { 615b8851fccSafresh1 desc => 'three my vars assigned package array', 616b8851fccSafresh1 setup => '@init = 1..3;', 617b8851fccSafresh1 code => 'my ($x,$y,$z) = @init', 618b8851fccSafresh1 }, 619b8851fccSafresh1 'expr::aassign::3l_pa' => { 620b8851fccSafresh1 desc => 'three lexical vars assigned package array', 621b8851fccSafresh1 setup => '@init = 1..3; my ($x,$y,$z)', 622b8851fccSafresh1 code => '($x,$y,$z) = @init', 623b8851fccSafresh1 }, 624b8851fccSafresh1 'expr::aassign::pa_pa' => { 625b8851fccSafresh1 desc => 'package array assigned package array', 626b8851fccSafresh1 setup => '@init = 1..3;', 627b8851fccSafresh1 code => '@a = @init', 628b8851fccSafresh1 }, 629b8851fccSafresh1 'expr::aassign::pax_pa' => { 630b8851fccSafresh1 desc => 'non-empty package array assigned package array', 631b8851fccSafresh1 setup => '@init = 1..3; @a = @init', 632b8851fccSafresh1 code => '@a = @init', 633b8851fccSafresh1 }, 634b8851fccSafresh1 'expr::aassign::3p_pa' => { 635b8851fccSafresh1 desc => 'three package vars assigned package array', 636b8851fccSafresh1 setup => '@init = 1..3; ($x,$y,$z) = 1..3;', 637b8851fccSafresh1 code => '($x,$y,$z) = @init', 638b8851fccSafresh1 }, 639b8851fccSafresh1 640b8851fccSafresh1 # (....) = @_; 641b8851fccSafresh1 642b8851fccSafresh1 'expr::aassign::ma_defary' => { 643b8851fccSafresh1 desc => 'my array assigned @_', 644b8851fccSafresh1 setup => '@_ = 1..3;', 645b8851fccSafresh1 code => 'my @a = @_', 646b8851fccSafresh1 }, 647b8851fccSafresh1 'expr::aassign::lax_defary' => { 648b8851fccSafresh1 desc => 'non-empty lexical array assigned @_', 649b8851fccSafresh1 setup => '@_ = 1..3; my @a = 1..3;', 650b8851fccSafresh1 code => '@a = @_', 651b8851fccSafresh1 }, 652b8851fccSafresh1 'expr::aassign::llax_defary' => { 653b8851fccSafresh1 desc => 'non-empty lexical var and array assigned @_', 654b8851fccSafresh1 setup => '@_ = 1..3; my ($x, @a) = 1..4;', 655b8851fccSafresh1 code => '($x, @a) = @_', 656b8851fccSafresh1 }, 657b8851fccSafresh1 'expr::aassign::3m_defary' => { 658b8851fccSafresh1 desc => 'three my vars assigned @_', 659b8851fccSafresh1 setup => '@_ = 1..3;', 660b8851fccSafresh1 code => 'my ($x,$y,$z) = @_', 661b8851fccSafresh1 }, 662b8851fccSafresh1 'expr::aassign::3l_defary' => { 663b8851fccSafresh1 desc => 'three lexical vars assigned @_', 664b8851fccSafresh1 setup => '@_ = 1..3; my ($x,$y,$z)', 665b8851fccSafresh1 code => '($x,$y,$z) = @_', 666b8851fccSafresh1 }, 667b8851fccSafresh1 'expr::aassign::pa_defary' => { 668b8851fccSafresh1 desc => 'package array assigned @_', 669b8851fccSafresh1 setup => '@_ = 1..3;', 670b8851fccSafresh1 code => '@a = @_', 671b8851fccSafresh1 }, 672b8851fccSafresh1 'expr::aassign::pax_defary' => { 673b8851fccSafresh1 desc => 'non-empty package array assigned @_', 674b8851fccSafresh1 setup => '@_ = 1..3; @a = @_', 675b8851fccSafresh1 code => '@a = @_', 676b8851fccSafresh1 }, 677b8851fccSafresh1 'expr::aassign::3p_defary' => { 678b8851fccSafresh1 desc => 'three package vars assigned @_', 679b8851fccSafresh1 setup => '@_ = 1..3; ($x,$y,$z) = 1..3;', 680b8851fccSafresh1 code => '($x,$y,$z) = @_', 681b8851fccSafresh1 }, 682b8851fccSafresh1 6835759b3d2Safresh1 # (....) = %lexical 6845759b3d2Safresh1 6855759b3d2Safresh1 'expr::aassign::ma_lh' => { 6865759b3d2Safresh1 desc => 'my array assigned lexical hash', 6875759b3d2Safresh1 setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)', 6885759b3d2Safresh1 code => 'my @a = %h', 6895759b3d2Safresh1 }, 6905759b3d2Safresh1 691b8851fccSafresh1 692b8851fccSafresh1 # (....) = ($lex1,$lex2,$lex3); 693b8851fccSafresh1 694b8851fccSafresh1 'expr::aassign::ma_3l' => { 695b8851fccSafresh1 desc => 'my array assigned lexicals', 696b8851fccSafresh1 setup => 'my ($v1,$v2,$v3) = 1..3;', 697b8851fccSafresh1 code => 'my @a = ($v1,$v2,$v3)', 698b8851fccSafresh1 }, 699b8851fccSafresh1 'expr::aassign::lax_3l' => { 700b8851fccSafresh1 desc => 'non-empty lexical array assigned lexicals', 701b8851fccSafresh1 setup => 'my ($v1,$v2,$v3) = 1..3; my @a = 1..3;', 702b8851fccSafresh1 code => '@a = ($v1,$v2,$v3)', 703b8851fccSafresh1 }, 704b8851fccSafresh1 'expr::aassign::llax_3l' => { 705b8851fccSafresh1 desc => 'non-empty lexical var and array assigned lexicals', 706b8851fccSafresh1 setup => 'my ($v1,$v2,$v3) = 1..3; my ($x, @a) = 1..4;', 707b8851fccSafresh1 code => '($x, @a) = ($v1,$v2,$v3)', 708b8851fccSafresh1 }, 709b8851fccSafresh1 'expr::aassign::3m_3l' => { 710b8851fccSafresh1 desc => 'three my vars assigned lexicals', 711b8851fccSafresh1 setup => 'my ($v1,$v2,$v3) = 1..3;', 712b8851fccSafresh1 code => 'my ($x,$y,$z) = ($v1,$v2,$v3)', 713b8851fccSafresh1 }, 714b8851fccSafresh1 'expr::aassign::3l_3l' => { 715b8851fccSafresh1 desc => 'three lexical vars assigned lexicals', 716b8851fccSafresh1 setup => 'my ($v1,$v2,$v3) = 1..3; my ($x,$y,$z)', 717b8851fccSafresh1 code => '($x,$y,$z) = ($v1,$v2,$v3)', 718b8851fccSafresh1 }, 719b8851fccSafresh1 'expr::aassign::pa_3l' => { 720b8851fccSafresh1 desc => 'package array assigned lexicals', 721b8851fccSafresh1 setup => 'my ($v1,$v2,$v3) = 1..3;', 722b8851fccSafresh1 code => '@a = ($v1,$v2,$v3)', 723b8851fccSafresh1 }, 724b8851fccSafresh1 'expr::aassign::pax_3l' => { 725b8851fccSafresh1 desc => 'non-empty package array assigned lexicals', 726b8851fccSafresh1 setup => 'my ($v1,$v2,$v3) = 1..3; @a = @_', 727b8851fccSafresh1 code => '@a = ($v1,$v2,$v3)', 728b8851fccSafresh1 }, 729b8851fccSafresh1 'expr::aassign::3p_3l' => { 730b8851fccSafresh1 desc => 'three package vars assigned lexicals', 731b8851fccSafresh1 setup => 'my ($v1,$v2,$v3) = 1..3; ($x,$y,$z) = 1..3;', 732b8851fccSafresh1 code => '($x,$y,$z) = ($v1,$v2,$v3)', 733b8851fccSafresh1 }, 734b8851fccSafresh1 735b8851fccSafresh1 736b8851fccSafresh1 # (....) = ($pkg1,$pkg2,$pkg3); 737b8851fccSafresh1 738b8851fccSafresh1 'expr::aassign::ma_3p' => { 739b8851fccSafresh1 desc => 'my array assigned 3 package vars', 740b8851fccSafresh1 setup => '($v1,$v2,$v3) = 1..3;', 741b8851fccSafresh1 code => 'my @a = ($v1,$v2,$v3)', 742b8851fccSafresh1 }, 743b8851fccSafresh1 'expr::aassign::lax_3p' => { 744b8851fccSafresh1 desc => 'non-empty lexical array assigned 3 package vars', 745b8851fccSafresh1 setup => '($v1,$v2,$v3) = 1..3; my @a = 1..3;', 746b8851fccSafresh1 code => '@a = ($v1,$v2,$v3)', 747b8851fccSafresh1 }, 748b8851fccSafresh1 'expr::aassign::llax_3p' => { 749b8851fccSafresh1 desc => 'non-empty lexical var and array assigned 3 package vars', 750b8851fccSafresh1 setup => '($v1,$v2,$v3) = 1..3; my ($x, @a) = 1..4;', 751b8851fccSafresh1 code => '($x, @a) = ($v1,$v2,$v3)', 752b8851fccSafresh1 }, 753b8851fccSafresh1 'expr::aassign::3m_3p' => { 754b8851fccSafresh1 desc => 'three my vars assigned 3 package vars', 755b8851fccSafresh1 setup => '($v1,$v2,$v3) = 1..3;', 756b8851fccSafresh1 code => 'my ($x,$y,$z) = ($v1,$v2,$v3)', 757b8851fccSafresh1 }, 758b8851fccSafresh1 'expr::aassign::3l_3p' => { 759b8851fccSafresh1 desc => 'three lexical vars assigned 3 package vars', 760b8851fccSafresh1 setup => '($v1,$v2,$v3) = 1..3; my ($x,$y,$z)', 761b8851fccSafresh1 code => '($x,$y,$z) = ($v1,$v2,$v3)', 762b8851fccSafresh1 }, 763b8851fccSafresh1 'expr::aassign::pa_3p' => { 764b8851fccSafresh1 desc => 'package array assigned 3 package vars', 765b8851fccSafresh1 setup => '($v1,$v2,$v3) = 1..3;', 766b8851fccSafresh1 code => '@a = ($v1,$v2,$v3)', 767b8851fccSafresh1 }, 768b8851fccSafresh1 'expr::aassign::pax_3p' => { 769b8851fccSafresh1 desc => 'non-empty package array assigned 3 package vars', 770b8851fccSafresh1 setup => '($v1,$v2,$v3) = 1..3; @a = @_', 771b8851fccSafresh1 code => '@a = ($v1,$v2,$v3)', 772b8851fccSafresh1 }, 773b8851fccSafresh1 'expr::aassign::3p_3p' => { 774b8851fccSafresh1 desc => 'three package vars assigned 3 package vars', 775b8851fccSafresh1 setup => '($v1,$v2,$v3) = 1..3; ($x,$y,$z) = 1..3;', 776b8851fccSafresh1 code => '($x,$y,$z) = ($v1,$v2,$v3)', 777b8851fccSafresh1 }, 778b8851fccSafresh1 779b8851fccSafresh1 780b8851fccSafresh1 # (....) = (1,2,$shared); 781b8851fccSafresh1 782b8851fccSafresh1 'expr::aassign::llax_2c1s' => { 783b8851fccSafresh1 desc => 'non-empty lexical var and array assigned 2 consts and 1 shared var', 784b8851fccSafresh1 setup => 'my ($x, @a) = 1..4;', 785b8851fccSafresh1 code => '($x, @a) = (1,2,$x)', 786b8851fccSafresh1 }, 787b8851fccSafresh1 'expr::aassign::3l_2c1s' => { 788b8851fccSafresh1 desc => 'three lexical vars assigned 2 consts and 1 shared var', 789b8851fccSafresh1 setup => 'my ($x,$y,$z) = 1..3;', 790b8851fccSafresh1 code => '($x,$y,$z) = (1,2,$x)', 791b8851fccSafresh1 }, 792b8851fccSafresh1 'expr::aassign::3p_2c1s' => { 793b8851fccSafresh1 desc => 'three package vars assigned 2 consts and 1 shared var', 794b8851fccSafresh1 setup => '($x,$y,$z) = 1..3;', 795b8851fccSafresh1 code => '($x,$y,$z) = (1,2,$x)', 796b8851fccSafresh1 }, 797b8851fccSafresh1 798b8851fccSafresh1 799b8851fccSafresh1 # ($a,$b) = ($b,$a); 800b8851fccSafresh1 801b8851fccSafresh1 'expr::aassign::2l_swap' => { 802b8851fccSafresh1 desc => 'swap two lexical vars', 803b8851fccSafresh1 setup => 'my ($a,$b) = (1,2)', 804b8851fccSafresh1 code => '($a,$b) = ($b,$a)', 805b8851fccSafresh1 }, 806b8851fccSafresh1 'expr::aassign::2p_swap' => { 807b8851fccSafresh1 desc => 'swap two package vars', 808b8851fccSafresh1 setup => '($a,$b) = (1,2)', 809b8851fccSafresh1 code => '($a,$b) = ($b,$a)', 810b8851fccSafresh1 }, 811b8851fccSafresh1 'expr::aassign::2laelem_swap' => { 812b8851fccSafresh1 desc => 'swap two lexical vars', 813b8851fccSafresh1 setup => 'my @a = (1,2)', 814b8851fccSafresh1 code => '($a[0],$a[1]) = ($a[1],$a[0])', 815b8851fccSafresh1 }, 816b8851fccSafresh1 817b8851fccSafresh1 # misc list assign 818b8851fccSafresh1 819b8851fccSafresh1 'expr::aassign::5l_4l1s' => { 820b8851fccSafresh1 desc => 'long list of lexical vars, 1 shared', 821b8851fccSafresh1 setup => 'my ($a,$b,$c,$d,$e) = 1..5', 822b8851fccSafresh1 code => '($a,$b,$c,$d,$e) = ($a,$a,$c,$d,$e)', 823b8851fccSafresh1 }, 824b8851fccSafresh1 825b8851fccSafresh1 'expr::aassign::5p_4p1s' => { 826b8851fccSafresh1 desc => 'long list of package vars, 1 shared', 827b8851fccSafresh1 setup => '($a,$b,$c,$d,$e) = 1..5', 828b8851fccSafresh1 code => '($a,$b,$c,$d,$e) = ($a,$a,$c,$d,$e)', 829b8851fccSafresh1 }, 830b8851fccSafresh1 'expr::aassign::5l_defary' => { 831b8851fccSafresh1 desc => 'long list of lexical vars to assign @_ to', 832b8851fccSafresh1 setup => '@_ = 1..5', 833b8851fccSafresh1 code => 'my ($a,$b,$c,$d,$e) = @_', 834b8851fccSafresh1 }, 835b8851fccSafresh1 'expr::aassign::5l1la_defary' => { 836b8851fccSafresh1 desc => 'long list of lexical vars plus long slurp to assign @_ to', 837b8851fccSafresh1 setup => '@_ = 1..20', 838b8851fccSafresh1 code => 'my ($a,$b,$c,$d,$e,@rest) = @_', 839b8851fccSafresh1 }, 840b8851fccSafresh1 'expr::aassign::1l_2l' => { 841b8851fccSafresh1 desc => 'single lexical LHS', 842b8851fccSafresh1 setup => 'my $x = 1;', 843b8851fccSafresh1 code => '(undef,$x) = ($x,$x)', 844b8851fccSafresh1 }, 845b8851fccSafresh1 'expr::aassign::2l_1l' => { 846b8851fccSafresh1 desc => 'single lexical RHS', 847b8851fccSafresh1 setup => 'my $x = 1;', 848b8851fccSafresh1 code => '($x,$x) = ($x)', 849b8851fccSafresh1 }, 850b8851fccSafresh1 'expr::aassign::2l_1ul' => { 851b8851fccSafresh1 desc => 'undef and single lexical RHS', 852b8851fccSafresh1 setup => 'my $x = 1;', 853b8851fccSafresh1 code => '($x,$x) = (undef, $x)', 854b8851fccSafresh1 }, 855b8851fccSafresh1 8565759b3d2Safresh1 'expr::aassign::2list_lex' => { 8575759b3d2Safresh1 desc => 'lexical ($x, $y) = (1, 2)', 8585759b3d2Safresh1 setup => 'my ($x, $y)', 8595759b3d2Safresh1 code => '($x, $y) = (1, 2)', 8605759b3d2Safresh1 }, 8615759b3d2Safresh1 8625759b3d2Safresh1 'expr::aassign::lex_rv' => { 8635759b3d2Safresh1 desc => 'lexical ($ref1, $ref2) = ($ref3, $ref4)', 8645759b3d2Safresh1 setup => 'my ($r1, $r2, $r3, $r4); 8655759b3d2Safresh1 ($r1, $r2) = (($r3, $r4) = ([], []));', 8665759b3d2Safresh1 code => '($r1, $r2) = ($r3, $r4)', 8675759b3d2Safresh1 }, 8685759b3d2Safresh1 8695759b3d2Safresh1 'expr::aassign::lex_rv1' => { 8705759b3d2Safresh1 desc => 'lexical ($ref1, $ref2) = ($ref3, $ref4) where ref1,2 are freed', 8715759b3d2Safresh1 setup => 'my ($r1, $r2);', 8725759b3d2Safresh1 code => '($r1, $r2) = ([], []);', 8735759b3d2Safresh1 }, 8745759b3d2Safresh1 8755759b3d2Safresh1 'expr::aassign::boolean' => { 8765759b3d2Safresh1 desc => '!(@a = @b)', 8775759b3d2Safresh1 setup => 'my ($s,@a, @b); @b = (1,2)', 8785759b3d2Safresh1 code => '!(@a = @b);', 8795759b3d2Safresh1 }, 8805759b3d2Safresh1 'expr::aassign::scalar' => { 8815759b3d2Safresh1 desc => '$scalar = (@a = @b)', 8825759b3d2Safresh1 setup => 'my ($s, @a, @b); @b = (1,2)', 8835759b3d2Safresh1 code => '$s = (@a = @b);', 8845759b3d2Safresh1 }, 8855759b3d2Safresh1 8865759b3d2Safresh1 # array assign of strings 8875759b3d2Safresh1 8885759b3d2Safresh1 'expr::aassign::la_3s' => { 8895759b3d2Safresh1 desc => 'assign 3 strings to empty lexical array', 8905759b3d2Safresh1 setup => 'my @a', 8915759b3d2Safresh1 code => '@a = (); @a = qw(abc defg hijkl);', 8925759b3d2Safresh1 }, 8935759b3d2Safresh1 'expr::aassign::la_3ts' => { 8945759b3d2Safresh1 desc => 'assign 3 temp strings to empty lexical array', 8955759b3d2Safresh1 setup => 'my @a', 8965759b3d2Safresh1 code => '@a = (); @a = map $_, qw(abc defg hijkl);', 8975759b3d2Safresh1 }, 8985759b3d2Safresh1 'expr::aassign::lan_3s' => { 8995759b3d2Safresh1 desc => 'assign 3 strings to non-empty lexical array', 9005759b3d2Safresh1 setup => 'my @a = qw(abc defg hijkl)', 9015759b3d2Safresh1 code => '@a = qw(abc defg hijkl);', 9025759b3d2Safresh1 }, 9035759b3d2Safresh1 'expr::aassign::lan_3ts' => { 9045759b3d2Safresh1 desc => 'assign 3 temp strings to non-empty lexical array', 9055759b3d2Safresh1 setup => 'my @a = qw(abc defg hijkl)', 9065759b3d2Safresh1 code => '@a = map $_, qw(abc defg hijkl);', 9075759b3d2Safresh1 }, 9085759b3d2Safresh1 9095759b3d2Safresh1 # hash assign of strings 9105759b3d2Safresh1 9115759b3d2Safresh1 'expr::aassign::lh_2s' => { 9125759b3d2Safresh1 desc => 'assign 2 strings to empty lexical hash', 9135759b3d2Safresh1 setup => 'my %h', 9145759b3d2Safresh1 code => '%h = (); %h = qw(k1 abc k2 defg);', 9155759b3d2Safresh1 }, 9165759b3d2Safresh1 'expr::aassign::lh_2ts' => { 9175759b3d2Safresh1 desc => 'assign 2 temp strings to empty lexical hash', 9185759b3d2Safresh1 setup => 'my %h', 9195759b3d2Safresh1 code => '%h = (); %h = map $_, qw(k1 abc k2 defg);', 9205759b3d2Safresh1 }, 9215759b3d2Safresh1 'expr::aassign::lhn_2s' => { 9225759b3d2Safresh1 desc => 'assign 2 strings to non-empty lexical hash', 9235759b3d2Safresh1 setup => 'my %h = qw(k1 abc k2 defg);', 9245759b3d2Safresh1 code => '%h = qw(k1 abc k2 defg);', 9255759b3d2Safresh1 }, 9265759b3d2Safresh1 'expr::aassign::lhn_2ts' => { 9275759b3d2Safresh1 desc => 'assign 2 temp strings to non-empty lexical hash', 9285759b3d2Safresh1 setup => 'my %h = qw(k1 abc k2 defg);', 9295759b3d2Safresh1 code => '%h = map $_, qw(k1 abc k2 defg);', 9305759b3d2Safresh1 }, 9315759b3d2Safresh1 932b8851fccSafresh1 933b8851fccSafresh1 'expr::arith::add_lex_ii' => { 934b8851fccSafresh1 desc => 'add two integers and assign to a lexical var', 935b8851fccSafresh1 setup => 'my ($x,$y,$z) = 1..3;', 936b8851fccSafresh1 code => '$z = $x + $y', 937b8851fccSafresh1 }, 938b8851fccSafresh1 'expr::arith::add_pkg_ii' => { 939b8851fccSafresh1 desc => 'add two integers and assign to a package var', 940b8851fccSafresh1 setup => 'my ($x,$y) = 1..2; $z = 3;', 941b8851fccSafresh1 code => '$z = $x + $y', 942b8851fccSafresh1 }, 943b8851fccSafresh1 'expr::arith::add_lex_nn' => { 944b8851fccSafresh1 desc => 'add two NVs and assign to a lexical var', 945b8851fccSafresh1 setup => 'my ($x,$y,$z) = (1.1, 2.2, 3.3);', 946b8851fccSafresh1 code => '$z = $x + $y', 947b8851fccSafresh1 }, 948b8851fccSafresh1 'expr::arith::add_pkg_nn' => { 949b8851fccSafresh1 desc => 'add two NVs and assign to a package var', 950b8851fccSafresh1 setup => 'my ($x,$y); ($x,$y,$z) = (1.1, 2.2, 3.3);', 951b8851fccSafresh1 code => '$z = $x + $y', 952b8851fccSafresh1 }, 953b8851fccSafresh1 'expr::arith::add_lex_ni' => { 954b8851fccSafresh1 desc => 'add an int and an NV and assign to a lexical var', 955eac174f2Safresh1 setup => 'my ($y,$z) = (2.2, 3.3);', 956eac174f2Safresh1 pre => 'my $x = 1', # after 1st iter gets upgraded to PVNV 957b8851fccSafresh1 code => '$z = $x + $y', 958b8851fccSafresh1 }, 959b8851fccSafresh1 'expr::arith::add_pkg_ni' => { 960b8851fccSafresh1 desc => 'add an int and an NV and assign to a package var', 961eac174f2Safresh1 setup => 'my ($y); ($y,$z) = (2.2, 3.3);', 962eac174f2Safresh1 pre => 'my $x = 1', # after 1st iter gets upgraded to PVNV 963b8851fccSafresh1 code => '$z = $x + $y', 964b8851fccSafresh1 }, 9655759b3d2Safresh1 'expr::arith::add_lex_ss' => { 9665759b3d2Safresh1 desc => 'add two short strings and assign to a lexical var', 9675759b3d2Safresh1 setup => 'my ($x,$y,$z) = ("1", "2", 1);', 9685759b3d2Safresh1 code => '$z = $x + $y; $x = "1"; ', 9695759b3d2Safresh1 }, 9705759b3d2Safresh1 9715759b3d2Safresh1 'expr::arith::add_lex_ll' => { 9725759b3d2Safresh1 desc => 'add two long strings and assign to a lexical var', 9735759b3d2Safresh1 setup => 'my ($x,$y,$z) = ("12345", "23456", 1);', 9745759b3d2Safresh1 code => '$z = $x + $y; $x = "12345"; ', 9755759b3d2Safresh1 }, 976b8851fccSafresh1 977b8851fccSafresh1 'expr::arith::sub_lex_ii' => { 978b8851fccSafresh1 desc => 'subtract two integers and assign to a lexical var', 979b8851fccSafresh1 setup => 'my ($x,$y,$z) = 1..3;', 980b8851fccSafresh1 code => '$z = $x - $y', 981b8851fccSafresh1 }, 982b8851fccSafresh1 'expr::arith::sub_pkg_ii' => { 983b8851fccSafresh1 desc => 'subtract two integers and assign to a package var', 984b8851fccSafresh1 setup => 'my ($x,$y) = 1..2; $z = 3;', 985b8851fccSafresh1 code => '$z = $x - $y', 986b8851fccSafresh1 }, 987b8851fccSafresh1 'expr::arith::sub_lex_nn' => { 988b8851fccSafresh1 desc => 'subtract two NVs and assign to a lexical var', 989b8851fccSafresh1 setup => 'my ($x,$y,$z) = (1.1, 2.2, 3.3);', 990b8851fccSafresh1 code => '$z = $x - $y', 991b8851fccSafresh1 }, 992b8851fccSafresh1 'expr::arith::sub_pkg_nn' => { 993b8851fccSafresh1 desc => 'subtract two NVs and assign to a package var', 994b8851fccSafresh1 setup => 'my ($x,$y); ($x,$y,$z) = (1.1, 2.2, 3.3);', 995b8851fccSafresh1 code => '$z = $x - $y', 996b8851fccSafresh1 }, 997b8851fccSafresh1 'expr::arith::sub_lex_ni' => { 998b8851fccSafresh1 desc => 'subtract an int and an NV and assign to a lexical var', 999b8851fccSafresh1 setup => 'my ($x,$y,$z) = (1, 2.2, 3.3);', 1000b8851fccSafresh1 code => '$z = $x - $y', 1001b8851fccSafresh1 }, 1002b8851fccSafresh1 'expr::arith::sub_pkg_ni' => { 1003b8851fccSafresh1 desc => 'subtract an int and an NV and assign to a package var', 1004b8851fccSafresh1 setup => 'my ($x,$y); ($x,$y,$z) = (1, 2.2, 3.3);', 1005b8851fccSafresh1 code => '$z = $x - $y', 1006b8851fccSafresh1 }, 1007b8851fccSafresh1 1008b8851fccSafresh1 'expr::arith::mult_lex_ii' => { 1009b8851fccSafresh1 desc => 'multiply two integers and assign to a lexical var', 1010b8851fccSafresh1 setup => 'my ($x,$y,$z) = 1..3;', 1011b8851fccSafresh1 code => '$z = $x * $y', 1012b8851fccSafresh1 }, 1013b8851fccSafresh1 'expr::arith::mult_pkg_ii' => { 1014b8851fccSafresh1 desc => 'multiply two integers and assign to a package var', 1015b8851fccSafresh1 setup => 'my ($x,$y) = 1..2; $z = 3;', 1016b8851fccSafresh1 code => '$z = $x * $y', 1017b8851fccSafresh1 }, 1018b8851fccSafresh1 'expr::arith::mult_lex_nn' => { 1019b8851fccSafresh1 desc => 'multiply two NVs and assign to a lexical var', 1020b8851fccSafresh1 setup => 'my ($x,$y,$z) = (1.1, 2.2, 3.3);', 1021b8851fccSafresh1 code => '$z = $x * $y', 1022b8851fccSafresh1 }, 1023b8851fccSafresh1 'expr::arith::mult_pkg_nn' => { 1024b8851fccSafresh1 desc => 'multiply two NVs and assign to a package var', 1025b8851fccSafresh1 setup => 'my ($x,$y); ($x,$y,$z) = (1.1, 2.2, 3.3);', 1026b8851fccSafresh1 code => '$z = $x * $y', 1027b8851fccSafresh1 }, 1028b8851fccSafresh1 'expr::arith::mult_lex_ni' => { 1029b8851fccSafresh1 desc => 'multiply an int and an NV and assign to a lexical var', 1030b8851fccSafresh1 setup => 'my ($x,$y,$z) = (1, 2.2, 3.3);', 1031b8851fccSafresh1 code => '$z = $x * $y', 1032b8851fccSafresh1 }, 1033b8851fccSafresh1 'expr::arith::mult_pkg_ni' => { 1034b8851fccSafresh1 desc => 'multiply an int and an NV and assign to a package var', 1035b8851fccSafresh1 setup => 'my ($x,$y); ($x,$y,$z) = (1, 2.2, 3.3);', 1036b8851fccSafresh1 code => '$z = $x * $y', 1037b8851fccSafresh1 }, 1038b8851fccSafresh1 10395759b3d2Safresh1 # use '!' to test SvTRUE on various classes of value 10405759b3d2Safresh1 10415759b3d2Safresh1 'expr::arith::not_PL_undef' => { 10425759b3d2Safresh1 desc => '!undef (using PL_sv_undef)', 10435759b3d2Safresh1 setup => 'my $x', 10445759b3d2Safresh1 code => '$x = !undef', 10455759b3d2Safresh1 }, 10465759b3d2Safresh1 'expr::arith::not_PL_no' => { 10475759b3d2Safresh1 desc => '!($x == $y) (using PL_sv_no)', 10485759b3d2Safresh1 setup => 'my ($x, $y) = (1,2); my $z;', 10495759b3d2Safresh1 code => '$z = !($x == $y)', 10505759b3d2Safresh1 }, 10515759b3d2Safresh1 'expr::arith::not_PL_zero' => { 10525759b3d2Safresh1 desc => '!%h (using PL_sv_zero)', 10535759b3d2Safresh1 setup => 'my ($x, %h)', 10545759b3d2Safresh1 code => '$x = !%h', 10555759b3d2Safresh1 }, 10565759b3d2Safresh1 'expr::arith::not_PL_yes' => { 10575759b3d2Safresh1 desc => '!($x == $y) (using PL_sv_yes)', 10585759b3d2Safresh1 setup => 'my ($x, $y) = (1,1); my $z;', 10595759b3d2Safresh1 code => '$z = !($x == $y)', 10605759b3d2Safresh1 }, 10615759b3d2Safresh1 'expr::arith::not_undef' => { 10625759b3d2Safresh1 desc => '!$y where $y is undef', 10635759b3d2Safresh1 setup => 'my ($x, $y)', 10645759b3d2Safresh1 code => '$x = !$y', 10655759b3d2Safresh1 }, 10665759b3d2Safresh1 'expr::arith::not_0' => { 10675759b3d2Safresh1 desc => '!$x where $x is 0', 10685759b3d2Safresh1 setup => 'my ($x, $y) = (0, 0)', 10695759b3d2Safresh1 code => '$y = !$x', 10705759b3d2Safresh1 }, 10715759b3d2Safresh1 'expr::arith::not_1' => { 10725759b3d2Safresh1 desc => '!$x where $x is 1', 10735759b3d2Safresh1 setup => 'my ($x, $y) = (1, 0)', 10745759b3d2Safresh1 code => '$y = !$x', 10755759b3d2Safresh1 }, 10765759b3d2Safresh1 'expr::arith::not_string' => { 10775759b3d2Safresh1 desc => '!$x where $x is "foo"', 10785759b3d2Safresh1 setup => 'my ($x, $y) = ("foo", 0)', 10795759b3d2Safresh1 code => '$y = !$x', 10805759b3d2Safresh1 }, 10815759b3d2Safresh1 'expr::arith::not_ref' => { 10825759b3d2Safresh1 desc => '!$x where $s is an array ref', 10835759b3d2Safresh1 setup => 'my ($x, $y) = ([], 0)', 10845759b3d2Safresh1 code => '$y = !$x', 10855759b3d2Safresh1 }, 10865759b3d2Safresh1 1087b8851fccSafresh1 'expr::arith::preinc' => { 1088b8851fccSafresh1 setup => 'my $x = 1;', 1089b8851fccSafresh1 code => '++$x', 1090b8851fccSafresh1 }, 1091b8851fccSafresh1 'expr::arith::predec' => { 1092b8851fccSafresh1 setup => 'my $x = 1;', 1093b8851fccSafresh1 code => '--$x', 1094b8851fccSafresh1 }, 1095b8851fccSafresh1 'expr::arith::postinc' => { 1096b8851fccSafresh1 desc => '$x++', 1097b8851fccSafresh1 setup => 'my $x = 1; my $y', 1098b8851fccSafresh1 code => '$y = $x++', # scalar context so not optimised to ++$x 1099b8851fccSafresh1 }, 1100b8851fccSafresh1 'expr::arith::postdec' => { 1101b8851fccSafresh1 desc => '$x--', 1102b8851fccSafresh1 setup => 'my $x = 1; my $y', 1103b8851fccSafresh1 code => '$y = $x--', # scalar context so not optimised to --$x 1104b8851fccSafresh1 }, 1105b8851fccSafresh1 11065759b3d2Safresh1 11075759b3d2Safresh1 # concatenation; quite possibly optimised to OP_MULTICONCAT 11085759b3d2Safresh1 11095759b3d2Safresh1 'expr::concat::cl' => { 11105759b3d2Safresh1 setup => 'my $lex = "abcd"', 11115759b3d2Safresh1 code => '"foo" . $lex', 11125759b3d2Safresh1 }, 11135759b3d2Safresh1 'expr::concat::lc' => { 11145759b3d2Safresh1 setup => 'my $lex = "abcd"', 11155759b3d2Safresh1 code => '$lex . "foo"', 11165759b3d2Safresh1 }, 11175759b3d2Safresh1 'expr::concat::ll' => { 11185759b3d2Safresh1 setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"', 11195759b3d2Safresh1 code => '$lex1 . $lex2', 11205759b3d2Safresh1 }, 11215759b3d2Safresh1 11225759b3d2Safresh1 'expr::concat::l_append_c' => { 11235759b3d2Safresh1 setup => 'my $lex', 11245759b3d2Safresh1 pre => '$lex = "abcd"', 11255759b3d2Safresh1 code => '$lex .= "foo"', 11265759b3d2Safresh1 }, 11275759b3d2Safresh1 'expr::concat::l_append_l' => { 11285759b3d2Safresh1 setup => 'my $lex1; my $lex2 = "wxyz"', 11295759b3d2Safresh1 pre => '$lex1 = "abcd"', 11305759b3d2Safresh1 code => '$lex1 .= $lex2', 11315759b3d2Safresh1 }, 11325759b3d2Safresh1 'expr::concat::l_append_ll' => { 11335759b3d2Safresh1 setup => 'my $lex1; my $lex2 = "pqrs"; my $lex3 = "wxyz"', 11345759b3d2Safresh1 pre => '$lex1 = "abcd"', 11355759b3d2Safresh1 code => '$lex1 .= $lex2 . $lex3', 11365759b3d2Safresh1 }, 11375759b3d2Safresh1 'expr::concat::l_append_clclc' => { 11385759b3d2Safresh1 setup => 'my $lex1; my $lex2 = "pqrs"; my $lex3 = "wxyz"', 11395759b3d2Safresh1 pre => '$lex1 = "abcd"', 11405759b3d2Safresh1 code => '$lex1 .= "-foo-$lex2-foo-$lex3-foo"', 11415759b3d2Safresh1 }, 11425759b3d2Safresh1 'expr::concat::l_append_lll' => { 11435759b3d2Safresh1 setup => 'my $lex1; my ($lex2, $lex3, $lex4) = qw(pqrs wxyz 1234)', 11445759b3d2Safresh1 pre => '$lex1 = "abcd"', 11455759b3d2Safresh1 code => '$lex1 .= $lex2 . $lex3 . $lex4', 11465759b3d2Safresh1 }, 11475759b3d2Safresh1 11485759b3d2Safresh1 'expr::concat::m_ll' => { 11495759b3d2Safresh1 setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"', 11505759b3d2Safresh1 code => 'my $lex = $lex1 . $lex2', 11515759b3d2Safresh1 }, 11525759b3d2Safresh1 'expr::concat::m_lll' => { 11535759b3d2Safresh1 setup => 'my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"', 11545759b3d2Safresh1 code => 'my $lex = $lex1 . $lex2 . $lex3', 11555759b3d2Safresh1 }, 11565759b3d2Safresh1 'expr::concat::m_cl' => { 11575759b3d2Safresh1 setup => 'my $lex1 = "abcd"', 11585759b3d2Safresh1 code => 'my $lex = "const$lex1"', 11595759b3d2Safresh1 }, 11605759b3d2Safresh1 'expr::concat::m_clclc' => { 11615759b3d2Safresh1 setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"', 11625759b3d2Safresh1 code => 'my $lex = "foo=$lex1 bar=$lex2\n"', 11635759b3d2Safresh1 }, 11645759b3d2Safresh1 'expr::concat::m_clclc_long' => { 11655759b3d2Safresh1 desc => 'my $lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars', 11665759b3d2Safresh1 setup => 'my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100', 11675759b3d2Safresh1 code => 'my $lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"', 11685759b3d2Safresh1 }, 11695759b3d2Safresh1 11705759b3d2Safresh1 'expr::concat::l_ll' => { 11715759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"', 11725759b3d2Safresh1 code => '$lex = $lex1 . $lex2', 11735759b3d2Safresh1 }, 11745759b3d2Safresh1 'expr::concat::l_ll_ldup' => { 11755759b3d2Safresh1 setup => 'my $lex1; my $lex2 = "wxyz"', 11765759b3d2Safresh1 pre => '$lex1 = "abcd"', 11775759b3d2Safresh1 code => '$lex1 = $lex1 . $lex2', 11785759b3d2Safresh1 }, 11795759b3d2Safresh1 'expr::concat::l_ll_rdup' => { 11805759b3d2Safresh1 setup => 'my $lex1; my $lex2 = "wxyz"', 11815759b3d2Safresh1 pre => '$lex1 = "abcd"', 11825759b3d2Safresh1 code => '$lex1 = $lex2 . $lex1', 11835759b3d2Safresh1 }, 11845759b3d2Safresh1 'expr::concat::l_ll_lrdup' => { 11855759b3d2Safresh1 setup => 'my $lex1', 11865759b3d2Safresh1 pre => '$lex1 = "abcd"', 11875759b3d2Safresh1 code => '$lex1 = $lex1 . $lex1', 11885759b3d2Safresh1 }, 11895759b3d2Safresh1 'expr::concat::l_lll' => { 11905759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"', 11915759b3d2Safresh1 code => '$lex = $lex1 . $lex2 . $lex3', 11925759b3d2Safresh1 }, 11935759b3d2Safresh1 'expr::concat::l_lllll' => { 11945759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"; my $lex4 = "the quick brown fox"; my $lex5 = "to be, or not to be..."', 11955759b3d2Safresh1 code => '$lex = $lex1 . $lex2 . $lex3 . $lex4 . $lex5', 11965759b3d2Safresh1 }, 11975759b3d2Safresh1 'expr::concat::l_cl' => { 11985759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"', 11995759b3d2Safresh1 code => '$lex = "const$lex1"', 12005759b3d2Safresh1 }, 12015759b3d2Safresh1 'expr::concat::l_clclc' => { 12025759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"', 12035759b3d2Safresh1 code => '$lex = "foo=$lex1 bar=$lex2\n"', 12045759b3d2Safresh1 }, 12055759b3d2Safresh1 'expr::concat::l_clclc_long' => { 12065759b3d2Safresh1 desc => '$lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars', 12075759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100', 12085759b3d2Safresh1 code => '$lex = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"', 12095759b3d2Safresh1 }, 12105759b3d2Safresh1 'expr::concat::l_clclclclclc' => { 12115759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "the quick brown fox"; my $lex4 = "to be, or not to be..."', 12125759b3d2Safresh1 code => '$lex = "foo1=$lex1 foo2=$lex2 foo3=$lex3 foo4=$lex4\n"', 12135759b3d2Safresh1 }, 12145759b3d2Safresh1 12155759b3d2Safresh1 'expr::concat::g_append_c' => { 12165759b3d2Safresh1 setup => 'our $pkg', 12175759b3d2Safresh1 pre => '$pkg = "abcd"', 12185759b3d2Safresh1 code => '$pkg .= "foo"', 12195759b3d2Safresh1 }, 12205759b3d2Safresh1 'expr::concat::g_append_l' => { 12215759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "wxyz"', 12225759b3d2Safresh1 pre => '$pkg = "abcd"', 12235759b3d2Safresh1 code => '$pkg .= $lex1', 12245759b3d2Safresh1 }, 12255759b3d2Safresh1 'expr::concat::g_append_ll' => { 12265759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "pqrs"; my $lex2 = "wxyz"', 12275759b3d2Safresh1 pre => '$pkg = "abcd"', 12285759b3d2Safresh1 code => '$pkg .= $lex1 . $lex2', 12295759b3d2Safresh1 }, 12305759b3d2Safresh1 'expr::concat::g_append_clclc' => { 12315759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "pqrs"; my $lex2 = "wxyz"', 12325759b3d2Safresh1 pre => '$pkg = "abcd"', 12335759b3d2Safresh1 code => '$pkg .= "-foo-$lex1-foo-$lex2-foo-"', 12345759b3d2Safresh1 }, 12355759b3d2Safresh1 12365759b3d2Safresh1 'expr::concat::g_ll' => { 12375759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"', 12385759b3d2Safresh1 code => '$pkg = $lex1 . $lex2', 12395759b3d2Safresh1 }, 12405759b3d2Safresh1 'expr::concat::g_gl_ldup' => { 12415759b3d2Safresh1 setup => 'our $pkg; my $lex2 = "wxyz"', 12425759b3d2Safresh1 pre => '$pkg = "abcd"', 12435759b3d2Safresh1 code => '$pkg = $pkg . $lex2', 12445759b3d2Safresh1 }, 12455759b3d2Safresh1 'expr::concat::g_lg_rdup' => { 12465759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "wxyz"', 12475759b3d2Safresh1 pre => '$pkg = "abcd"', 12485759b3d2Safresh1 code => '$pkg = $lex1 . $pkg', 12495759b3d2Safresh1 }, 12505759b3d2Safresh1 'expr::concat::g_gg_lrdup' => { 12515759b3d2Safresh1 setup => 'our $pkg', 12525759b3d2Safresh1 pre => '$pkg = "abcd"', 12535759b3d2Safresh1 code => '$pkg = $pkg . $pkg', 12545759b3d2Safresh1 }, 12555759b3d2Safresh1 'expr::concat::g_lll' => { 12565759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "pqrs"; my $lex3 = "wxyz"', 12575759b3d2Safresh1 code => '$pkg = $lex1 . $lex2 . $lex3', 12585759b3d2Safresh1 }, 12595759b3d2Safresh1 'expr::concat::g_cl' => { 12605759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"', 12615759b3d2Safresh1 code => '$pkg = "const$lex1"', 12625759b3d2Safresh1 }, 12635759b3d2Safresh1 'expr::concat::g_clclc' => { 12645759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"', 12655759b3d2Safresh1 code => '$pkg = "foo=$lex1 bar=$lex2\n"', 12665759b3d2Safresh1 }, 12675759b3d2Safresh1 'expr::concat::g_clclc_long' => { 12685759b3d2Safresh1 desc => '$pkg = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n" where lex1/2 are 400 chars', 12695759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd" x 100; my $lex2 = "wxyz" x 100', 12705759b3d2Safresh1 code => '$pkg = "foooooooooo=$lex1 baaaaaaaaar=$lex2\n"', 12715759b3d2Safresh1 }, 12725759b3d2Safresh1 12735759b3d2Safresh1 'expr::concat::utf8_uuu' => { 12745759b3d2Safresh1 desc => 'my $s = $a.$b.$c where all args are utf8', 12755759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"', 12765759b3d2Safresh1 code => '$s = $a.$b.$c', 12775759b3d2Safresh1 }, 12785759b3d2Safresh1 'expr::concat::utf8_suu' => { 12795759b3d2Safresh1 desc => 'my $s = "foo=$a bar=$b baz=$c" where $b,$c are utf8', 12805759b3d2Safresh1 setup => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"', 12815759b3d2Safresh1 code => '$s = "foo=$a bar=$b baz=$c"', 12825759b3d2Safresh1 }, 12835759b3d2Safresh1 'expr::concat::utf8_usu' => { 12845759b3d2Safresh1 desc => 'my $s = "foo=$a bar=$b baz=$c" where $a,$c are utf8', 12855759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"', 12865759b3d2Safresh1 code => '$s = "foo=$a bar=$b baz=$c"', 12875759b3d2Safresh1 }, 12885759b3d2Safresh1 'expr::concat::utf8_usx' => { 12895759b3d2Safresh1 desc => 'my $s = "foo=$a bar=$b baz=$c" where $a is utf8, $c has 0x80', 12905759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"', 12915759b3d2Safresh1 code => '$s = "foo=$a bar=$b baz=$c"', 12925759b3d2Safresh1 }, 12935759b3d2Safresh1 12945759b3d2Safresh1 'expr::concat::utf8_s_append_uuu' => { 12955759b3d2Safresh1 desc => '$s .= $a.$b.$c where all RH args are utf8', 12965759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"', 12975759b3d2Safresh1 pre => '$s = "abcd"', 12985759b3d2Safresh1 code => '$s .= $a.$b.$c', 12995759b3d2Safresh1 }, 13005759b3d2Safresh1 'expr::concat::utf8_s_append_suu' => { 13015759b3d2Safresh1 desc => '$s .= "foo=$a bar=$b baz=$c" where $b,$c are utf8', 13025759b3d2Safresh1 setup => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"', 13035759b3d2Safresh1 pre => '$s = "abcd"', 13045759b3d2Safresh1 code => '$s .= "foo=$a bar=$b baz=$c"', 13055759b3d2Safresh1 }, 13065759b3d2Safresh1 'expr::concat::utf8_s_append_usu' => { 13075759b3d2Safresh1 desc => '$s .= "foo=$a bar=$b baz=$c" where $a,$c are utf8', 13085759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"', 13095759b3d2Safresh1 pre => '$s = "abcd"', 13105759b3d2Safresh1 code => '$s .= "foo=$a bar=$b baz=$c"', 13115759b3d2Safresh1 }, 13125759b3d2Safresh1 'expr::concat::utf8_s_append_usx' => { 13135759b3d2Safresh1 desc => '$s .= "foo=$a bar=$b baz=$c" where $a is utf8, $c has 0x80', 13145759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"', 13155759b3d2Safresh1 pre => '$s = "abcd"', 13165759b3d2Safresh1 code => '$s .= "foo=$a bar=$b baz=$c"', 13175759b3d2Safresh1 }, 13185759b3d2Safresh1 13195759b3d2Safresh1 'expr::concat::utf8_u_append_uuu' => { 13205759b3d2Safresh1 desc => '$s .= $a.$b.$c where all args are utf8', 13215759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "\x{101}fghij"; my $c = "\x{102}klmn"', 13225759b3d2Safresh1 pre => '$s = "\x{100}wxyz"', 13235759b3d2Safresh1 code => '$s .= $a.$b.$c', 13245759b3d2Safresh1 }, 13255759b3d2Safresh1 'expr::concat::utf8_u_append_suu' => { 13265759b3d2Safresh1 desc => '$s .= "foo=$a bar=$b baz=$c" where $s,$b,$c are utf8', 13275759b3d2Safresh1 setup => 'my $s; my $a = "abcde"; my $b = "\x{100}fghij"; my $c = "\x{101}klmn"', 13285759b3d2Safresh1 pre => '$s = "\x{100}wxyz"', 13295759b3d2Safresh1 code => '$s .= "foo=$a bar=$b baz=$c"', 13305759b3d2Safresh1 }, 13315759b3d2Safresh1 'expr::concat::utf8_u_append_usu' => { 13325759b3d2Safresh1 desc => '$s .= "foo=$a bar=$b baz=$c" where $s,$a,$c are utf8', 13335759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"', 13345759b3d2Safresh1 pre => '$s = "\x{100}wxyz"', 13355759b3d2Safresh1 code => '$s .= "foo=$a bar=$b baz=$c"', 13365759b3d2Safresh1 }, 13375759b3d2Safresh1 'expr::concat::utf8_u_append_usx' => { 13385759b3d2Safresh1 desc => '$s .= "foo=$a bar=$b baz=$c" where $s,$a are utf8, $c has 0x80', 13395759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x80\x81klmn"', 13405759b3d2Safresh1 pre => '$s = "\x{100}wxyz"', 13415759b3d2Safresh1 code => '$s .= "foo=$a bar=$b baz=$c"', 13425759b3d2Safresh1 }, 13435759b3d2Safresh1 13445759b3d2Safresh1 'expr::concat::nested_mutator' => { 13455759b3d2Safresh1 setup => 'my $lex1; my ($lex2, $lex3, $lex4) = qw(abcd pqrs wxyz)', 13465759b3d2Safresh1 pre => '$lex1 = "QPR"', 13475759b3d2Safresh1 code => '(($lex1 .= $lex2) .= $lex3) .= $lex4', 13485759b3d2Safresh1 }, 13495759b3d2Safresh1 13505759b3d2Safresh1 1351*3d61058aSafresh1 # concatenation with magic vars; 1352*3d61058aSafresh1 # quite possibly optimised to OP_MULTICONCAT 1353*3d61058aSafresh1 1354*3d61058aSafresh1 'expr::concat::mg::cM' => { 1355*3d61058aSafresh1 setup => '"abcd" =~ /(.*)/', 1356*3d61058aSafresh1 code => '"foo" . $1', 1357*3d61058aSafresh1 }, 1358*3d61058aSafresh1 'expr::concat::mg::Mc' => { 1359*3d61058aSafresh1 setup => '"abcd" =~ /(.*)/', 1360*3d61058aSafresh1 code => '$1 . "foo"', 1361*3d61058aSafresh1 }, 1362*3d61058aSafresh1 'expr::concat::mg::MM' => { 1363*3d61058aSafresh1 setup => '"abcd" =~ /(.*)/', 1364*3d61058aSafresh1 code => '$1 . $1', 1365*3d61058aSafresh1 }, 1366*3d61058aSafresh1 1367*3d61058aSafresh1 'expr::concat::mg::l_append_M' => { 1368*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1369*3d61058aSafresh1 pre => '$lex = "abcd"', 1370*3d61058aSafresh1 code => '$lex .= $1', 1371*3d61058aSafresh1 }, 1372*3d61058aSafresh1 'expr::concat::mg::l_append_MM' => { 1373*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1374*3d61058aSafresh1 pre => '$lex = "abcd"', 1375*3d61058aSafresh1 code => '$lex .= $1 .$1', 1376*3d61058aSafresh1 }, 1377*3d61058aSafresh1 'expr::concat::mg::l_append_cMcMc' => { 1378*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1379*3d61058aSafresh1 pre => '$lex = "abcd"', 1380*3d61058aSafresh1 code => '$lex .= "-foo-$1-foo-$1-foo"', 1381*3d61058aSafresh1 }, 1382*3d61058aSafresh1 'expr::concat::mg::l_append_MMM' => { 1383*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1384*3d61058aSafresh1 pre => '$lex = "abcd"', 1385*3d61058aSafresh1 code => '$lex .= $1 .$1 . $1', 1386*3d61058aSafresh1 }, 1387*3d61058aSafresh1 1388*3d61058aSafresh1 'expr::concat::mg::m_MM' => { 1389*3d61058aSafresh1 setup => '"abcd" =~ /(.*)/;', 1390*3d61058aSafresh1 code => 'my $lex = $1 . $1', 1391*3d61058aSafresh1 }, 1392*3d61058aSafresh1 'expr::concat::mg::m_MMM' => { 1393*3d61058aSafresh1 setup => '"abcd" =~ /(.*)/;', 1394*3d61058aSafresh1 code => 'my $lex = $1 . $1 . $1', 1395*3d61058aSafresh1 }, 1396*3d61058aSafresh1 'expr::concat::mg::m_cL' => { 1397*3d61058aSafresh1 setup => '"abcd" =~ /(.*)/;', 1398*3d61058aSafresh1 code => 'my $lex = "const$1"', 1399*3d61058aSafresh1 }, 1400*3d61058aSafresh1 'expr::concat::mg::m_cMcMc' => { 1401*3d61058aSafresh1 setup => '"abcd" =~ /(.*)/;', 1402*3d61058aSafresh1 code => 'my $lex = "foo=$1 bar=$1\n"', 1403*3d61058aSafresh1 }, 1404*3d61058aSafresh1 'expr::concat::mg::m_cMcMc_long' => { 1405*3d61058aSafresh1 desc => 'my $lex = "foooooooooo=$1 baaaaaaaaar=$1\n" where $1 is 400 chars', 1406*3d61058aSafresh1 setup => 'my $s = "abcd" x 100; $s =~ /(.*)/;', 1407*3d61058aSafresh1 code => 'my $lex = "foooooooooo=$1 baaaaaaaaar=$1\n"', 1408*3d61058aSafresh1 }, 1409*3d61058aSafresh1 1410*3d61058aSafresh1 'expr::concat::mg::l_MM' => { 1411*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1412*3d61058aSafresh1 code => '$lex = $1 . $1', 1413*3d61058aSafresh1 }, 1414*3d61058aSafresh1 'expr::concat::mg::l_lM_ldup' => { 1415*3d61058aSafresh1 setup => 'my $lex1; "abcd" =~ /(.*)/;', 1416*3d61058aSafresh1 pre => '$lex1 = "abcd"', 1417*3d61058aSafresh1 code => '$lex1 = $lex1 . $1', 1418*3d61058aSafresh1 }, 1419*3d61058aSafresh1 'expr::concat::mg::l_Ml_rdup' => { 1420*3d61058aSafresh1 setup => 'my $lex1; "abcd" =~ /(.*)/;', 1421*3d61058aSafresh1 pre => '$lex1 = "abcd"', 1422*3d61058aSafresh1 code => '$lex1 = $1 . $lex1', 1423*3d61058aSafresh1 }, 1424*3d61058aSafresh1 'expr::concat::mg::l_MMM' => { 1425*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1426*3d61058aSafresh1 code => '$lex = $1 . $1 . $1', 1427*3d61058aSafresh1 }, 1428*3d61058aSafresh1 'expr::concat::mg::l_MMMMM' => { 1429*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1430*3d61058aSafresh1 code => '$lex = $1 . $1 . $1 . $1 . $1', 1431*3d61058aSafresh1 }, 1432*3d61058aSafresh1 'expr::concat::mg::l_cM' => { 1433*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1434*3d61058aSafresh1 code => '$lex = "const$1"', 1435*3d61058aSafresh1 }, 1436*3d61058aSafresh1 'expr::concat::mg::l_cMcMc' => { 1437*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1438*3d61058aSafresh1 code => '$lex = "foo=$1 bar=$1\n"', 1439*3d61058aSafresh1 }, 1440*3d61058aSafresh1 'expr::concat::mg::l_cMcMc_long' => { 1441*3d61058aSafresh1 desc => '$lex = "foooooooooo=$1 baaaaaaaaar=$1\n" where $1 is 400 chars', 1442*3d61058aSafresh1 setup => 'my $s = "abcd" x 100; $s =~ /(.*)/;', 1443*3d61058aSafresh1 code => '$lex = "foooooooooo=$1 baaaaaaaaar=$1\n"', 1444*3d61058aSafresh1 }, 1445*3d61058aSafresh1 'expr::concat::mg::l_cMcMcMcMcMc' => { 1446*3d61058aSafresh1 setup => 'my $lex; "abcd" =~ /(.*)/;', 1447*3d61058aSafresh1 code => '$lex = "foo1=$1 foo2=$1 foo3=$1 foo4=$1\n"', 1448*3d61058aSafresh1 }, 1449*3d61058aSafresh1 1450*3d61058aSafresh1 'expr::concat::mg::g_append_M' => { 1451*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1452*3d61058aSafresh1 pre => '$pkg = "abcd"', 1453*3d61058aSafresh1 code => '$pkg .= $1', 1454*3d61058aSafresh1 }, 1455*3d61058aSafresh1 'expr::concat::mg::g_append_MM' => { 1456*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1457*3d61058aSafresh1 pre => '$pkg = "abcd"', 1458*3d61058aSafresh1 code => '$pkg .= $1', 1459*3d61058aSafresh1 code => '$pkg .= $1 . $1', 1460*3d61058aSafresh1 }, 1461*3d61058aSafresh1 'expr::concat::mg::g_append_cMcMc' => { 1462*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1463*3d61058aSafresh1 pre => '$pkg = "abcd"', 1464*3d61058aSafresh1 code => '$pkg .= "-foo-$1-foo-$1-foo-"', 1465*3d61058aSafresh1 }, 1466*3d61058aSafresh1 1467*3d61058aSafresh1 'expr::concat::mg::g_MM' => { 1468*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1469*3d61058aSafresh1 code => '$pkg = $1 . $1', 1470*3d61058aSafresh1 }, 1471*3d61058aSafresh1 'expr::concat::mg::g_gM_ldup' => { 1472*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1473*3d61058aSafresh1 pre => '$pkg = "abcd"', 1474*3d61058aSafresh1 code => '$pkg = $pkg . $1', 1475*3d61058aSafresh1 }, 1476*3d61058aSafresh1 'expr::concat::mg::g_Mg_rdup' => { 1477*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1478*3d61058aSafresh1 pre => '$pkg = "abcd"', 1479*3d61058aSafresh1 code => '$pkg = $1 . $pkg', 1480*3d61058aSafresh1 }, 1481*3d61058aSafresh1 'expr::concat::mg::g_MMM' => { 1482*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1483*3d61058aSafresh1 code => '$pkg = $1 . $1 . $1', 1484*3d61058aSafresh1 }, 1485*3d61058aSafresh1 'expr::concat::mg::g_cM' => { 1486*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1487*3d61058aSafresh1 code => '$pkg = "const$1"', 1488*3d61058aSafresh1 }, 1489*3d61058aSafresh1 'expr::concat::mg::g_cMcMc' => { 1490*3d61058aSafresh1 setup => 'our $pkg; "abcd" =~ /(.*)/;', 1491*3d61058aSafresh1 code => '$pkg = "foo=$1 bar=$1\n"', 1492*3d61058aSafresh1 }, 1493*3d61058aSafresh1 'expr::concat::mg::g_cMcMc_long' => { 1494*3d61058aSafresh1 desc => '$lex = "foooooooooo=$1 baaaaaaaaar=$1\n" where $1 is 400 chars', 1495*3d61058aSafresh1 setup => 'our $pkg; my $s = "abcd" x 100; $s =~ /(.*)/;', 1496*3d61058aSafresh1 code => '$pkg = "foooooooooo=$1 baaaaaaaaar=$1\n"', 1497*3d61058aSafresh1 }, 1498*3d61058aSafresh1 1499*3d61058aSafresh1 'expr::concat::mg::utf8_uuu' => { 1500*3d61058aSafresh1 desc => 'my $s = $1.$1.$1 where $1 utf8', 1501*3d61058aSafresh1 setup => 'my $s; "ab\x{100}cde" =~ /(.*)/;', 1502*3d61058aSafresh1 code => '$s = $1.$1.$1', 1503*3d61058aSafresh1 }, 1504*3d61058aSafresh1 'expr::concat::mg::utf8_suu' => { 1505*3d61058aSafresh1 desc => 'my $s = "foo=$a bar=$1 baz=$1" where $1 is utf8', 1506*3d61058aSafresh1 setup => 'my $s; my $a = "abcde"; "ab\x{100}cde" =~ /(.*)/;', 1507*3d61058aSafresh1 code => '$s = "foo=$a bar=$1 baz=$1"', 1508*3d61058aSafresh1 }, 1509*3d61058aSafresh1 1510*3d61058aSafresh1 # OP_MULTICONCAT with magic within s///g - see GH #21360 1511*3d61058aSafresh1 1512*3d61058aSafresh1 'expr::concat::mg::subst1_1' => { 1513*3d61058aSafresh1 desc => 's/(.)/$1-/g, 1 iteration', 1514*3d61058aSafresh1 pre => '$_ = "a"', 1515*3d61058aSafresh1 code => 's/(.)/$1-/g', 1516*3d61058aSafresh1 }, 1517*3d61058aSafresh1 1518*3d61058aSafresh1 'expr::concat::mg::subst1_2' => { 1519*3d61058aSafresh1 desc => 's/(.)/$1-/g, 2 iterations', 1520*3d61058aSafresh1 pre => '$_ = "aa"', 1521*3d61058aSafresh1 code => 's/(.)/$1-/g', 1522*3d61058aSafresh1 }, 1523*3d61058aSafresh1 1524*3d61058aSafresh1 'expr::concat::mg::subst1_5' => { 1525*3d61058aSafresh1 desc => 's/(.)/$1-/g, 5 iterations', 1526*3d61058aSafresh1 pre => '$_ = "aaaaa"', 1527*3d61058aSafresh1 code => 's/(.)/$1-/g', 1528*3d61058aSafresh1 }, 1529*3d61058aSafresh1 1530*3d61058aSafresh1 'expr::concat::mg::subst2_1' => { 1531*3d61058aSafresh1 desc => 's/(.)/$1-$1/g, 1 iteration', 1532*3d61058aSafresh1 pre => '$_ = "a"', 1533*3d61058aSafresh1 code => 's/(.)/$1-/g', 1534*3d61058aSafresh1 }, 1535*3d61058aSafresh1 1536*3d61058aSafresh1 'expr::concat::mg::subst3_1' => { 1537*3d61058aSafresh1 desc => 's/(.)/$1-$1-$1/g, 1 iteration', 1538*3d61058aSafresh1 pre => '$_ = "a"', 1539*3d61058aSafresh1 code => 's/(.)/$1-$1-$1/g', 1540*3d61058aSafresh1 }, 1541*3d61058aSafresh1 1542*3d61058aSafresh1 1543*3d61058aSafresh1 15445759b3d2Safresh1 # scalar assign, OP_SASSIGN 15455759b3d2Safresh1 1546e0680481Safresh1 'expr::sassign::undef_lex' => { 1547e0680481Safresh1 setup => 'my $x', 1548e0680481Safresh1 code => '$x = undef', 1549e0680481Safresh1 }, 1550e0680481Safresh1 'expr::sassign::undef_lex_direc' => { 1551e0680481Safresh1 setup => 'my $x', 1552e0680481Safresh1 code => 'undef $x', 1553e0680481Safresh1 }, 1554e0680481Safresh1 'expr::sassign::undef_my_lex' => { 1555e0680481Safresh1 setup => '', 1556e0680481Safresh1 code => 'my $x = undef', 1557e0680481Safresh1 }, 1558e0680481Safresh1 'expr::sassign::undef_my_lex_direc' => { 1559e0680481Safresh1 setup => '', 1560e0680481Safresh1 code => 'undef my $x', 1561e0680481Safresh1 }, 1562e0680481Safresh1 1563e0680481Safresh1 'expr::sassign::anonlist' => { 1564e0680481Safresh1 setup => '', 1565e0680481Safresh1 code => '$x = []' 1566e0680481Safresh1 }, 1567e0680481Safresh1 'expr::sassign::anonlist_lex' => { 1568e0680481Safresh1 setup => 'my $x', 1569e0680481Safresh1 code => '$x = []' 1570e0680481Safresh1 }, 1571e0680481Safresh1 'expr::sassign::my_anonlist_lex' => { 1572e0680481Safresh1 setup => '', 1573e0680481Safresh1 code => 'my $x = []' 1574e0680481Safresh1 }, 1575e0680481Safresh1 'expr::sassign::anonhash' => { 1576e0680481Safresh1 setup => '', 1577e0680481Safresh1 code => '$x = {}' 1578e0680481Safresh1 }, 1579e0680481Safresh1 'expr::sassign::anonhash_lex' => { 1580e0680481Safresh1 setup => 'my $x', 1581e0680481Safresh1 code => '$x = {}' 1582e0680481Safresh1 }, 1583e0680481Safresh1 'expr::sassign::my_anonhash_lex' => { 1584e0680481Safresh1 setup => '', 1585e0680481Safresh1 code => 'my $x = {}' 1586e0680481Safresh1 }, 15875759b3d2Safresh1 15885759b3d2Safresh1 'expr::sassign::my_conststr' => { 15895759b3d2Safresh1 setup => '', 15905759b3d2Safresh1 code => 'my $x = "abc"', 15915759b3d2Safresh1 }, 15925759b3d2Safresh1 'expr::sassign::scalar_lex_int' => { 15935759b3d2Safresh1 desc => 'lexical $x = 1', 15945759b3d2Safresh1 setup => 'my $x', 15955759b3d2Safresh1 code => '$x = 1', 15965759b3d2Safresh1 }, 15975759b3d2Safresh1 'expr::sassign::scalar_lex_str' => { 15985759b3d2Safresh1 desc => 'lexical $x = "abc"', 15995759b3d2Safresh1 setup => 'my $x', 16005759b3d2Safresh1 code => '$x = "abc"', 16015759b3d2Safresh1 }, 16025759b3d2Safresh1 'expr::sassign::scalar_lex_strint' => { 16035759b3d2Safresh1 desc => 'lexical $x = 1 where $x was previously a string', 16045759b3d2Safresh1 setup => 'my $x = "abc"', 16055759b3d2Safresh1 code => '$x = 1', 16065759b3d2Safresh1 }, 16075759b3d2Safresh1 'expr::sassign::scalar_lex_intstr' => { 16085759b3d2Safresh1 desc => 'lexical $x = "abc" where $x was previously an int', 16095759b3d2Safresh1 setup => 'my $x = 1;', 16105759b3d2Safresh1 code => '$x = "abc"', 16115759b3d2Safresh1 }, 16125759b3d2Safresh1 'expr::sassign::lex_rv' => { 16135759b3d2Safresh1 desc => 'lexical $ref1 = $ref2;', 16145759b3d2Safresh1 setup => 'my $r1 = []; my $r = $r1;', 16155759b3d2Safresh1 code => '$r = $r1;', 16165759b3d2Safresh1 }, 16175759b3d2Safresh1 'expr::sassign::lex_rv1' => { 16185759b3d2Safresh1 desc => 'lexical $ref1 = $ref2; where $$ref1 gets freed', 16195759b3d2Safresh1 setup => 'my $r1 = []; my $r', 16205759b3d2Safresh1 code => '$r = []; $r = $r1;', 16215759b3d2Safresh1 }, 16225759b3d2Safresh1 1623e0680481Safresh1 'expr::sassign::aelemfast_lex_assign' => { 1624e0680481Safresh1 desc => 'lexical $x[0] = 1', 1625e0680481Safresh1 setup => 'my @x', 1626e0680481Safresh1 code => '$x[0] = 1', 1627e0680481Safresh1 }, 1628e0680481Safresh1 'expr::sassign::aelemfast_lex_assign_ref' => { 1629e0680481Safresh1 desc => 'lexical $x[0] = []', 1630e0680481Safresh1 setup => 'my @x', 1631e0680481Safresh1 code => '$x[0] = []', 1632e0680481Safresh1 }, 1633e0680481Safresh1 'expr::sassign::aelemfast_lex_assign_deref' => { 1634e0680481Safresh1 desc => 'lexical $x[0][1]', 1635e0680481Safresh1 setup => 'my @x = ([1,2])', 1636e0680481Safresh1 code => '$x[0][1] = 1', 1637e0680481Safresh1 }, 1638e0680481Safresh1 1639e0680481Safresh1 'expr::sassign::bless_lex' => { 1640e0680481Safresh1 setup => 'my $x', 1641e0680481Safresh1 code => '$x = bless {}, "X"' 1642e0680481Safresh1 }, 16435759b3d2Safresh1 16445759b3d2Safresh1 'func::grep::bool0' => { 16455759b3d2Safresh1 desc => 'grep returning 0 items in boolean context', 16465759b3d2Safresh1 setup => 'my @a;', 16475759b3d2Safresh1 code => '!grep $_, @a;', 16485759b3d2Safresh1 }, 16495759b3d2Safresh1 'func::grep::bool1' => { 16505759b3d2Safresh1 desc => 'grep returning 1 item in boolean context', 16515759b3d2Safresh1 setup => 'my @a =(1);', 16525759b3d2Safresh1 code => '!grep $_, @a;', 16535759b3d2Safresh1 }, 16545759b3d2Safresh1 'func::grep::scalar0' => { 16555759b3d2Safresh1 desc => 'returning 0 items in scalar context', 16565759b3d2Safresh1 setup => 'my $g; my @a;', 16575759b3d2Safresh1 code => '$g = grep $_, @a;', 16585759b3d2Safresh1 }, 16595759b3d2Safresh1 'func::grep::scalar1' => { 16605759b3d2Safresh1 desc => 'returning 1 item in scalar context', 16615759b3d2Safresh1 setup => 'my $g; my @a =(1);', 16625759b3d2Safresh1 code => '$g = grep $_, @a;', 16635759b3d2Safresh1 }, 16645759b3d2Safresh1 16655759b3d2Safresh1 # (index() == -1) and variants optimise away the op_const and op_eq 16665759b3d2Safresh1 # and any assignment to a lexical var 16675759b3d2Safresh1 'func::index::bool' => { 16685759b3d2Safresh1 desc => '(index() == -1) for match', 16695759b3d2Safresh1 setup => 'my $x = "aaaab"', 16705759b3d2Safresh1 code => 'index($x, "b") == -1', 16715759b3d2Safresh1 }, 16725759b3d2Safresh1 'func::index::bool_fail' => { 16735759b3d2Safresh1 desc => '(index() == -1) for no match', 16745759b3d2Safresh1 setup => 'my $x = "aaaab"', 16755759b3d2Safresh1 code => 'index($x, "c") == -1', 16765759b3d2Safresh1 }, 16775759b3d2Safresh1 'func::index::lex_bool' => { 16785759b3d2Safresh1 desc => '$lex = (index() == -1) for match', 16795759b3d2Safresh1 setup => 'my $r; my $x = "aaaab"', 16805759b3d2Safresh1 code => '$r = index($x, "b") == -1', 16815759b3d2Safresh1 }, 16825759b3d2Safresh1 'func::index::lex_bool_fail' => { 16835759b3d2Safresh1 desc => '$lex = (index() == -1) for no match', 16845759b3d2Safresh1 setup => 'my $r; my $x = "aaaab"', 16855759b3d2Safresh1 code => '$r = index($x, "c") == -1', 16865759b3d2Safresh1 }, 16875759b3d2Safresh1 16885759b3d2Safresh1 # using a const string as second arg to index triggers using FBM. 16895759b3d2Safresh1 # the FBM matcher special-cases 1,2-byte strings. 16905759b3d2Safresh1 # 16915759b3d2Safresh1 'func::index::short_const1' => { 16925759b3d2Safresh1 desc => 'index of a short string against a 1 char const substr', 16935759b3d2Safresh1 setup => 'my $x = "aaaab"', 16945759b3d2Safresh1 code => 'index $x, "b"', 16955759b3d2Safresh1 }, 16965759b3d2Safresh1 'func::index::long_const1' => { 16975759b3d2Safresh1 desc => 'index of a long string against a 1 char const substr', 16985759b3d2Safresh1 setup => 'my $x = "a" x 1000 . "b"', 16995759b3d2Safresh1 code => 'index $x, "b"', 17005759b3d2Safresh1 }, 17015759b3d2Safresh1 'func::index::short_const2aabc_bc' => { 17025759b3d2Safresh1 desc => 'index of a short string against a 2 char const substr', 17035759b3d2Safresh1 setup => 'my $x = "aaaabc"', 17045759b3d2Safresh1 code => 'index $x, "bc"', 17055759b3d2Safresh1 }, 17065759b3d2Safresh1 'func::index::long_const2aabc_bc' => { 17075759b3d2Safresh1 desc => 'index of a long string against a 2 char const substr', 17085759b3d2Safresh1 setup => 'my $x = "a" x 1000 . "bc"', 17095759b3d2Safresh1 code => 'index $x, "bc"', 17105759b3d2Safresh1 }, 17115759b3d2Safresh1 'func::index::long_const2aa_ab' => { 17125759b3d2Safresh1 desc => 'index of a long string aaa.. against const substr "ab"', 17135759b3d2Safresh1 setup => 'my $x = "a" x 1000', 17145759b3d2Safresh1 code => 'index $x, "ab"', 17155759b3d2Safresh1 }, 17165759b3d2Safresh1 'func::index::long_const2bb_ab' => { 17175759b3d2Safresh1 desc => 'index of a long string bbb.. against const substr "ab"', 17185759b3d2Safresh1 setup => 'my $x = "b" x 1000', 17195759b3d2Safresh1 code => 'index $x, "ab"', 17205759b3d2Safresh1 }, 17215759b3d2Safresh1 'func::index::long_const2aa_bb' => { 17225759b3d2Safresh1 desc => 'index of a long string aaa.. against const substr "bb"', 17235759b3d2Safresh1 setup => 'my $x = "a" x 1000', 17245759b3d2Safresh1 code => 'index $x, "bb"', 17255759b3d2Safresh1 }, 17265759b3d2Safresh1 # this one is designed to be pathological 17275759b3d2Safresh1 'func::index::long_const2ab_aa' => { 17285759b3d2Safresh1 desc => 'index of a long string abab.. against const substr "aa"', 17295759b3d2Safresh1 setup => 'my $x = "ab" x 500', 17305759b3d2Safresh1 code => 'index $x, "aa"', 17315759b3d2Safresh1 }, 17325759b3d2Safresh1 # near misses with gaps, 1st letter 17335759b3d2Safresh1 'func::index::long_const2aaxx_xy' => { 17345759b3d2Safresh1 desc => 'index of a long string with "xx"s against const substr "xy"', 17355759b3d2Safresh1 setup => 'my $x = "aaaaaaaaxx" x 100', 17365759b3d2Safresh1 code => 'index $x, "xy"', 17375759b3d2Safresh1 }, 17385759b3d2Safresh1 # near misses with gaps, 2nd letter 17395759b3d2Safresh1 'func::index::long_const2aayy_xy' => { 17405759b3d2Safresh1 desc => 'index of a long string with "yy"s against const substr "xy"', 17415759b3d2Safresh1 setup => 'my $x = "aaaaaaaayy" x 100', 17425759b3d2Safresh1 code => 'index $x, "xy"', 17435759b3d2Safresh1 }, 17445759b3d2Safresh1 # near misses with gaps, duplicate letter 17455759b3d2Safresh1 'func::index::long_const2aaxy_xx' => { 17465759b3d2Safresh1 desc => 'index of a long string with "xy"s against const substr "xx"', 17475759b3d2Safresh1 setup => 'my $x = "aaaaaaaaxy" x 100', 17485759b3d2Safresh1 code => 'index $x, "xx"', 17495759b3d2Safresh1 }, 17505759b3d2Safresh1 # alternating near misses with gaps 17515759b3d2Safresh1 'func::index::long_const2aaxxaayy_xy' => { 17525759b3d2Safresh1 desc => 'index of a long string with "xx/yy"s against const substr "xy"', 17535759b3d2Safresh1 setup => 'my $x = "aaaaaaaaxxbbbbbbbbyy" x 50', 17545759b3d2Safresh1 code => 'index $x, "xy"', 17555759b3d2Safresh1 }, 17565759b3d2Safresh1 'func::index::short_const3aabcd_bcd' => { 17575759b3d2Safresh1 desc => 'index of a short string against a 3 char const substr', 17585759b3d2Safresh1 setup => 'my $x = "aaaabcd"', 17595759b3d2Safresh1 code => 'index $x, "bcd"', 17605759b3d2Safresh1 }, 17615759b3d2Safresh1 'func::index::long_const3aabcd_bcd' => { 17625759b3d2Safresh1 desc => 'index of a long string against a 3 char const substr', 17635759b3d2Safresh1 setup => 'my $x = "a" x 1000 . "bcd"', 17645759b3d2Safresh1 code => 'index $x, "bcd"', 17655759b3d2Safresh1 }, 17665759b3d2Safresh1 'func::index::long_const3ab_abc' => { 17675759b3d2Safresh1 desc => 'index of a long string of "ab"s against a 3 char const substr "abc"', 17685759b3d2Safresh1 setup => 'my $x = "ab" x 500', 17695759b3d2Safresh1 code => 'index $x, "abc"', 17705759b3d2Safresh1 }, 17715759b3d2Safresh1 'func::index::long_const3bc_abc' => { 17725759b3d2Safresh1 desc => 'index of a long string of "bc"s against a 3 char const substr "abc"', 17735759b3d2Safresh1 setup => 'my $x = "bc" x 500', 17745759b3d2Safresh1 code => 'index $x, "abc"', 17755759b3d2Safresh1 }, 17765759b3d2Safresh1 'func::index::utf8_position_1' => { 17775759b3d2Safresh1 desc => 'index of a utf8 string, matching at position 1', 17785759b3d2Safresh1 setup => 'my $x = "abc". chr(0x100); chop $x', 17795759b3d2Safresh1 code => 'index $x, "b"', 17805759b3d2Safresh1 }, 17815759b3d2Safresh1 17825759b3d2Safresh1 17835759b3d2Safresh1 # JOIN 17845759b3d2Safresh1 17855759b3d2Safresh1 17865759b3d2Safresh1 'func::join::empty_l_ll' => { 17875759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"', 17885759b3d2Safresh1 code => '$lex = join "", $lex1, $lex2', 17895759b3d2Safresh1 }, 17905759b3d2Safresh1 17915759b3d2Safresh1 17925759b3d2Safresh1 # KEYS 17935759b3d2Safresh1 17945759b3d2Safresh1 17955759b3d2Safresh1 'func::keys::lex::void_cxt_empty' => { 17965759b3d2Safresh1 desc => ' keys() on an empty lexical hash in void context', 17975759b3d2Safresh1 setup => 'my %h = ()', 17985759b3d2Safresh1 code => 'keys %h', 17995759b3d2Safresh1 }, 18005759b3d2Safresh1 'func::keys::lex::void_cxt' => { 18015759b3d2Safresh1 desc => ' keys() on a non-empty lexical hash in void context', 18025759b3d2Safresh1 setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)', 18035759b3d2Safresh1 code => 'keys %h', 18045759b3d2Safresh1 }, 18055759b3d2Safresh1 'func::keys::lex::bool_cxt_empty' => { 18065759b3d2Safresh1 desc => ' keys() on an empty lexical hash in bool context', 18075759b3d2Safresh1 setup => 'my %h = ()', 18085759b3d2Safresh1 code => '!keys %h', 18095759b3d2Safresh1 }, 18105759b3d2Safresh1 'func::keys::lex::bool_cxt' => { 18115759b3d2Safresh1 desc => ' keys() on a non-empty lexical hash in bool context', 18125759b3d2Safresh1 setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)', 18135759b3d2Safresh1 code => '!keys %h', 18145759b3d2Safresh1 }, 18155759b3d2Safresh1 'func::keys::lex::scalar_cxt_empty' => { 18165759b3d2Safresh1 desc => ' keys() on an empty lexical hash in scalar context', 18175759b3d2Safresh1 setup => 'my $k; my %h = ()', 18185759b3d2Safresh1 code => '$k = keys %h', 18195759b3d2Safresh1 }, 18205759b3d2Safresh1 'func::keys::lex::scalar_cxt' => { 18215759b3d2Safresh1 desc => ' keys() on a non-empty lexical hash in scalar context', 18225759b3d2Safresh1 setup => 'my $k; my %h = qw(aardvark 1 banana 2 cucumber 3)', 18235759b3d2Safresh1 code => '$k = keys %h', 18245759b3d2Safresh1 }, 18255759b3d2Safresh1 'func::keys::lex::list_cxt_empty' => { 18265759b3d2Safresh1 desc => ' keys() on an empty lexical hash in list context', 18275759b3d2Safresh1 setup => 'my %h = ()', 18285759b3d2Safresh1 code => '() = keys %h', 18295759b3d2Safresh1 }, 18305759b3d2Safresh1 'func::keys::lex::list_cxt' => { 18315759b3d2Safresh1 desc => ' keys() on a non-empty lexical hash in list context', 18325759b3d2Safresh1 setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)', 18335759b3d2Safresh1 code => '() = keys %h', 18345759b3d2Safresh1 }, 18355759b3d2Safresh1 18365759b3d2Safresh1 'func::keys::pkg::void_cxt_empty' => { 18375759b3d2Safresh1 desc => ' keys() on an empty package hash in void context', 18385759b3d2Safresh1 setup => 'our %h = ()', 18395759b3d2Safresh1 code => 'keys %h', 18405759b3d2Safresh1 }, 18415759b3d2Safresh1 'func::keys::pkg::void_cxt' => { 18425759b3d2Safresh1 desc => ' keys() on a non-empty package hash in void context', 18435759b3d2Safresh1 setup => 'our %h = qw(aardvark 1 banana 2 cucumber 3)', 18445759b3d2Safresh1 code => 'keys %h', 18455759b3d2Safresh1 }, 18465759b3d2Safresh1 'func::keys::pkg::bool_cxt_empty' => { 18475759b3d2Safresh1 desc => ' keys() on an empty package hash in bool context', 18485759b3d2Safresh1 setup => 'our %h = ()', 18495759b3d2Safresh1 code => '!keys %h', 18505759b3d2Safresh1 }, 18515759b3d2Safresh1 'func::keys::pkg::bool_cxt' => { 18525759b3d2Safresh1 desc => ' keys() on a non-empty package hash in bool context', 18535759b3d2Safresh1 setup => 'our %h = qw(aardvark 1 banana 2 cucumber 3)', 18545759b3d2Safresh1 code => '!keys %h', 18555759b3d2Safresh1 }, 18565759b3d2Safresh1 'func::keys::pkg::scalar_cxt_empty' => { 18575759b3d2Safresh1 desc => ' keys() on an empty package hash in scalar context', 18585759b3d2Safresh1 setup => 'my $k; our %h = ()', 18595759b3d2Safresh1 code => '$k = keys %h', 18605759b3d2Safresh1 }, 18615759b3d2Safresh1 'func::keys::pkg::scalar_cxt' => { 18625759b3d2Safresh1 desc => ' keys() on a non-empty package hash in scalar context', 18635759b3d2Safresh1 setup => 'my $k; our %h = qw(aardvark 1 banana 2 cucumber 3)', 18645759b3d2Safresh1 code => '$k = keys %h', 18655759b3d2Safresh1 }, 18665759b3d2Safresh1 'func::keys::pkg::list_cxt_empty' => { 18675759b3d2Safresh1 desc => ' keys() on an empty package hash in list context', 18685759b3d2Safresh1 setup => 'our %h = ()', 18695759b3d2Safresh1 code => '() = keys %h', 18705759b3d2Safresh1 }, 18715759b3d2Safresh1 'func::keys::pkg::list_cxt' => { 18725759b3d2Safresh1 desc => ' keys() on a non-empty package hash in list context', 18735759b3d2Safresh1 setup => 'our %h = qw(aardvark 1 banana 2 cucumber 3)', 18745759b3d2Safresh1 code => '() = keys %h', 18755759b3d2Safresh1 }, 18765759b3d2Safresh1 18775759b3d2Safresh1 18785759b3d2Safresh1 'func::length::bool0' => { 18795759b3d2Safresh1 desc => 'length==0 in boolean context', 18805759b3d2Safresh1 setup => 'my $s = "";', 18815759b3d2Safresh1 code => '!length($s);', 18825759b3d2Safresh1 }, 18835759b3d2Safresh1 'func::length::bool10' => { 18845759b3d2Safresh1 desc => 'length==10 in boolean context', 18855759b3d2Safresh1 setup => 'my $s = "abcdefghijk";', 18865759b3d2Safresh1 code => '!length($s);', 18875759b3d2Safresh1 }, 18885759b3d2Safresh1 'func::length::scalar10' => { 18895759b3d2Safresh1 desc => 'length==10 in scalar context', 18905759b3d2Safresh1 setup => 'my $p; my $s = "abcdefghijk";', 18915759b3d2Safresh1 code => '$p = length($s);', 18925759b3d2Safresh1 }, 18935759b3d2Safresh1 'func::length::bool0_utf8' => { 18945759b3d2Safresh1 desc => 'utf8 string length==0 in boolean context', 18955759b3d2Safresh1 setup => 'my $s = "\x{100}"; chop $s;', 18965759b3d2Safresh1 code => '!length($s);', 18975759b3d2Safresh1 }, 18985759b3d2Safresh1 'func::length::bool10_utf8' => { 18995759b3d2Safresh1 desc => 'utf8 string length==10 in boolean context', 19005759b3d2Safresh1 setup => 'my $s = "abcdefghij\x{100}";', 19015759b3d2Safresh1 code => '!length($s);', 19025759b3d2Safresh1 }, 19035759b3d2Safresh1 'func::length::scalar10_utf8' => { 19045759b3d2Safresh1 desc => 'utf8 string length==10 in scalar context', 19055759b3d2Safresh1 setup => 'my $p; my $s = "abcdefghij\x{100}";', 19065759b3d2Safresh1 code => '$p = length($s);', 19075759b3d2Safresh1 }, 19085759b3d2Safresh1 19095759b3d2Safresh1 'func::pos::bool0' => { 19105759b3d2Safresh1 desc => 'pos==0 in boolean context', 19115759b3d2Safresh1 setup => 'my $s = "abc"; pos($s) = 0', 19125759b3d2Safresh1 code => '!pos($s);', 19135759b3d2Safresh1 }, 19145759b3d2Safresh1 'func::pos::bool10' => { 19155759b3d2Safresh1 desc => 'pos==10 in boolean context', 19165759b3d2Safresh1 setup => 'my $s = "abcdefghijk"; pos($s) = 10', 19175759b3d2Safresh1 code => '!pos($s);', 19185759b3d2Safresh1 }, 19195759b3d2Safresh1 'func::pos::scalar10' => { 19205759b3d2Safresh1 desc => 'pos==10 in scalar context', 19215759b3d2Safresh1 setup => 'my $p; my $s = "abcdefghijk"; pos($s) = 10', 19225759b3d2Safresh1 code => '$p = pos($s);', 19235759b3d2Safresh1 }, 19245759b3d2Safresh1 19255759b3d2Safresh1 'func::ref::notaref_bool' => { 19265759b3d2Safresh1 desc => 'ref($notaref) in boolean context', 19275759b3d2Safresh1 setup => 'my $r = "boo"', 19285759b3d2Safresh1 code => '!ref $r', 19295759b3d2Safresh1 }, 19305759b3d2Safresh1 'func::ref::ref_bool' => { 19315759b3d2Safresh1 desc => 'ref($ref) in boolean context', 19325759b3d2Safresh1 setup => 'my $r = []', 19335759b3d2Safresh1 code => '!ref $r', 19345759b3d2Safresh1 }, 19355759b3d2Safresh1 'func::ref::blessedref_bool' => { 19365759b3d2Safresh1 desc => 'ref($blessed_ref) in boolean context', 19375759b3d2Safresh1 setup => 'my $r = bless []', 19385759b3d2Safresh1 code => '!ref $r', 19395759b3d2Safresh1 }, 19405759b3d2Safresh1 19415759b3d2Safresh1 'func::ref::notaref' => { 19425759b3d2Safresh1 desc => 'ref($notaref) in scalar context', 19435759b3d2Safresh1 setup => 'my $x; my $r = "boo"', 19445759b3d2Safresh1 code => '$x = ref $r', 19455759b3d2Safresh1 }, 19465759b3d2Safresh1 'func::ref::ref' => { 19475759b3d2Safresh1 desc => 'ref($ref) in scalar context', 19485759b3d2Safresh1 setup => 'my $x; my $r = []', 19495759b3d2Safresh1 code => '$x = ref $r', 19505759b3d2Safresh1 }, 19515759b3d2Safresh1 'func::ref::blessedref' => { 19525759b3d2Safresh1 desc => 'ref($blessed_ref) in scalar context', 19535759b3d2Safresh1 setup => 'my $x; my $r = bless []', 19545759b3d2Safresh1 code => '$x = ref $r', 19555759b3d2Safresh1 }, 19565759b3d2Safresh1 19575759b3d2Safresh1 19585759b3d2Safresh1 19595759b3d2Safresh1 'func::sort::num' => { 19605759b3d2Safresh1 desc => 'plain numeric sort', 19615759b3d2Safresh1 setup => 'my (@a, @b); @a = reverse 1..10;', 19625759b3d2Safresh1 code => '@b = sort { $a <=> $b } @a', 19635759b3d2Safresh1 }, 19645759b3d2Safresh1 'func::sort::num_block' => { 19655759b3d2Safresh1 desc => 'codeblock numeric sort', 19665759b3d2Safresh1 setup => 'my (@a, @b); @a = reverse 1..10;', 19675759b3d2Safresh1 code => '@b = sort { $a + 1 <=> $b + 1 } @a', 19685759b3d2Safresh1 }, 19695759b3d2Safresh1 'func::sort::num_fn' => { 19705759b3d2Safresh1 desc => 'function numeric sort', 19715759b3d2Safresh1 setup => 'sub f { $a + 1 <=> $b + 1 } my (@a, @b); @a = reverse 1..10;', 19725759b3d2Safresh1 code => '@b = sort f @a', 19735759b3d2Safresh1 }, 19745759b3d2Safresh1 'func::sort::str' => { 19755759b3d2Safresh1 desc => 'plain string sort', 19765759b3d2Safresh1 setup => 'my (@a, @b); @a = reverse "a".."j";', 19775759b3d2Safresh1 code => '@b = sort { $a cmp $b } @a', 19785759b3d2Safresh1 }, 19795759b3d2Safresh1 'func::sort::str_block' => { 19805759b3d2Safresh1 desc => 'codeblock string sort', 19815759b3d2Safresh1 setup => 'my (@a, @b); @a = reverse "a".."j";', 19825759b3d2Safresh1 code => '@b = sort { ($a . "") cmp ($b . "") } @a', 19835759b3d2Safresh1 }, 19845759b3d2Safresh1 'func::sort::str_fn' => { 19855759b3d2Safresh1 desc => 'function string sort', 19865759b3d2Safresh1 setup => 'sub f { ($a . "") cmp ($b . "") } my (@a, @b); @a = reverse "a".."j";', 19875759b3d2Safresh1 code => '@b = sort f @a', 19885759b3d2Safresh1 }, 19895759b3d2Safresh1 19905759b3d2Safresh1 'func::sort::num_inplace' => { 19915759b3d2Safresh1 desc => 'plain numeric sort in-place', 19925759b3d2Safresh1 setup => 'my @a = reverse 1..10;', 19935759b3d2Safresh1 code => '@a = sort { $a <=> $b } @a', 19945759b3d2Safresh1 }, 19955759b3d2Safresh1 'func::sort::num_block_inplace' => { 19965759b3d2Safresh1 desc => 'codeblock numeric sort in-place', 19975759b3d2Safresh1 setup => 'my @a = reverse 1..10;', 19985759b3d2Safresh1 code => '@a = sort { $a + 1 <=> $b + 1 } @a', 19995759b3d2Safresh1 }, 20005759b3d2Safresh1 'func::sort::num_fn_inplace' => { 20015759b3d2Safresh1 desc => 'function numeric sort in-place', 20025759b3d2Safresh1 setup => 'sub f { $a + 1 <=> $b + 1 } my @a = reverse 1..10;', 20035759b3d2Safresh1 code => '@a = sort f @a', 20045759b3d2Safresh1 }, 20055759b3d2Safresh1 'func::sort::str_inplace' => { 20065759b3d2Safresh1 desc => 'plain string sort in-place', 20075759b3d2Safresh1 setup => 'my @a = reverse "a".."j";', 20085759b3d2Safresh1 code => '@a = sort { $a cmp $b } @a', 20095759b3d2Safresh1 }, 20105759b3d2Safresh1 'func::sort::str_block_inplace' => { 20115759b3d2Safresh1 desc => 'codeblock string sort in-place', 20125759b3d2Safresh1 setup => 'my @a = reverse "a".."j";', 20135759b3d2Safresh1 code => '@a = sort { ($a . "") cmp ($b . "") } @a', 20145759b3d2Safresh1 }, 20155759b3d2Safresh1 'func::sort::str_fn_inplace' => { 20165759b3d2Safresh1 desc => 'function string sort in-place', 20175759b3d2Safresh1 setup => 'sub f { ($a . "") cmp ($b . "") } my @a = reverse "a".."j";', 20185759b3d2Safresh1 code => '@a = sort f @a', 20195759b3d2Safresh1 }, 20205759b3d2Safresh1 20215759b3d2Safresh1 20225759b3d2Safresh1 'func::split::vars' => { 20235759b3d2Safresh1 desc => 'split into two lexical vars', 20245759b3d2Safresh1 setup => 'my $s = "abc:def";', 20255759b3d2Safresh1 code => 'my ($x, $y) = split /:/, $s, 2;', 20265759b3d2Safresh1 }, 20275759b3d2Safresh1 20285759b3d2Safresh1 'func::split::array' => { 20295759b3d2Safresh1 desc => 'split into a lexical array', 20305759b3d2Safresh1 setup => 'my @a; my $s = "abc:def";', 20315759b3d2Safresh1 code => '@a = split /:/, $s, 2;', 20325759b3d2Safresh1 }, 20335759b3d2Safresh1 'func::split::myarray' => { 20345759b3d2Safresh1 desc => 'split into a lexical array declared in the assign', 20355759b3d2Safresh1 setup => 'my $s = "abc:def";', 20365759b3d2Safresh1 code => 'my @a = split /:/, $s, 2;', 20375759b3d2Safresh1 }, 20385759b3d2Safresh1 'func::split::arrayexpr' => { 20395759b3d2Safresh1 desc => 'split into an @{$expr} ', 20405759b3d2Safresh1 setup => 'my $s = "abc:def"; my $r = []', 20415759b3d2Safresh1 code => '@$r = split /:/, $s, 2;', 20425759b3d2Safresh1 }, 20435759b3d2Safresh1 'func::split::arraylist' => { 20445759b3d2Safresh1 desc => 'split into an array with extra arg', 20455759b3d2Safresh1 setup => 'my @a; my $s = "abc:def";', 20465759b3d2Safresh1 code => '@a = (split(/:/, $s, 2), 1);', 20475759b3d2Safresh1 }, 20485759b3d2Safresh1 20495759b3d2Safresh1 # SPRINTF 20505759b3d2Safresh1 20515759b3d2Safresh1 20525759b3d2Safresh1 'func::sprintf::d' => { 20535759b3d2Safresh1 desc => '%d', 20545759b3d2Safresh1 setup => 'my $s; my $a1 = 1234;', 20555759b3d2Safresh1 code => '$s = sprintf "%d", $a1', 20565759b3d2Safresh1 }, 20575759b3d2Safresh1 'func::sprintf::d8' => { 20585759b3d2Safresh1 desc => '%8d', 20595759b3d2Safresh1 setup => 'my $s; my $a1 = 1234;', 20605759b3d2Safresh1 code => '$s = sprintf "%8d", $a1', 20615759b3d2Safresh1 }, 20625759b3d2Safresh1 'func::sprintf::foo_d8' => { 20635759b3d2Safresh1 desc => 'foo=%8d', 20645759b3d2Safresh1 setup => 'my $s; my $a1 = 1234;', 20655759b3d2Safresh1 code => '$s = sprintf "foo=%8d", $a1', 20665759b3d2Safresh1 }, 20675759b3d2Safresh1 20685759b3d2Safresh1 'func::sprintf::f0' => { 20695759b3d2Safresh1 # "%.0f" is very special-cased 20705759b3d2Safresh1 desc => 'sprintf "%.0f"', 20715759b3d2Safresh1 setup => 'my $s; my $a1 = 123.456;', 20725759b3d2Safresh1 code => '$s = sprintf "%.0f", $a1', 20735759b3d2Safresh1 }, 20745759b3d2Safresh1 'func::sprintf::foo_f0' => { 20755759b3d2Safresh1 # "...%.0f..." is special-cased 20765759b3d2Safresh1 desc => 'sprintf "foo=%.0f"', 20775759b3d2Safresh1 setup => 'my $s; my $a1 = 123.456;', 20785759b3d2Safresh1 code => '$s = sprintf "foo=%.0f\n", $a1', 20795759b3d2Safresh1 }, 20805759b3d2Safresh1 'func::sprintf::foo_f93' => { 20815759b3d2Safresh1 desc => 'foo=%9.3f', 20825759b3d2Safresh1 setup => 'my $s; my $a1 = 123.456;', 20835759b3d2Safresh1 code => '$s = sprintf "foo=%9.3f\n", $a1', 20845759b3d2Safresh1 }, 20855759b3d2Safresh1 20865759b3d2Safresh1 'func::sprintf::g9' => { 20875759b3d2Safresh1 # "...%.NNNg..." is special-cased 20885759b3d2Safresh1 desc => '%.9g', 20895759b3d2Safresh1 setup => 'my $s; my $a1 = 123.456;', 20905759b3d2Safresh1 code => '$s = sprintf "%.9g", $a1', 20915759b3d2Safresh1 }, 20925759b3d2Safresh1 'func::sprintf::foo_g9' => { 20935759b3d2Safresh1 # "...%.NNNg..." is special-cased 20945759b3d2Safresh1 desc => 'foo=%.9g', 20955759b3d2Safresh1 setup => 'my $s; my $a1 = 123.456;', 20965759b3d2Safresh1 code => '$s = sprintf "foo=%.9g\n", $a1', 20975759b3d2Safresh1 }, 20985759b3d2Safresh1 'func::sprintf::foo_g93' => { 20995759b3d2Safresh1 desc => 'foo=%9.3g', 21005759b3d2Safresh1 setup => 'my $s; my $a1 = 123.456;', 21015759b3d2Safresh1 code => '$s = sprintf "foo=%9.3g\n", $a1', 21025759b3d2Safresh1 }, 21035759b3d2Safresh1 21045759b3d2Safresh1 'func::sprintf::s' => { 21055759b3d2Safresh1 desc => '%s', 21065759b3d2Safresh1 setup => 'my $s; my $a1 = "abcd";', 21075759b3d2Safresh1 code => '$s = sprintf "%s", $a1', 21085759b3d2Safresh1 }, 21095759b3d2Safresh1 'func::sprintf::foo_s' => { 21105759b3d2Safresh1 desc => 'foo=%s', 21115759b3d2Safresh1 setup => 'my $s; my $a1 = "abcd";', 21125759b3d2Safresh1 code => '$s = sprintf "foo=%s", $a1', 21135759b3d2Safresh1 }, 21145759b3d2Safresh1 'func::sprintf::mixed_utf8_sss' => { 21155759b3d2Safresh1 desc => 'foo=%s bar=%s baz=%s', 21165759b3d2Safresh1 setup => 'my $s;my $a = "ab\x{100}cd"; my $b = "efg"; my $c = "h\x{101}ij"', 21175759b3d2Safresh1 code => '$s = sprintf "foo=%s bar=%s baz=%s", $a, $b, $c', 21185759b3d2Safresh1 }, 21195759b3d2Safresh1 21205759b3d2Safresh1 # sprint that's likely to be optimised to an OP_MULTICONCAT 21215759b3d2Safresh1 21225759b3d2Safresh1 'func::sprintf::l' => { 21235759b3d2Safresh1 setup => 'my $lex1 = "abcd"', 21245759b3d2Safresh1 code => 'sprintf "%s", $lex1', 21255759b3d2Safresh1 }, 21265759b3d2Safresh1 'func::sprintf::g_l' => { 21275759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"', 21285759b3d2Safresh1 code => '$pkg = sprintf "%s", $lex1', 21295759b3d2Safresh1 }, 21305759b3d2Safresh1 'func::sprintf::g_append_l' => { 21315759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"', 21325759b3d2Safresh1 pre => '$pkg = "pqrs"', 21335759b3d2Safresh1 code => '$pkg .= sprintf "%s", $lex1', 21345759b3d2Safresh1 }, 21355759b3d2Safresh1 'func::sprintf::g_ll' => { 21365759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"', 21375759b3d2Safresh1 code => '$pkg = sprintf "%s%s", $lex1, $lex2', 21385759b3d2Safresh1 }, 21395759b3d2Safresh1 'func::sprintf::g_append_ll' => { 21405759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"', 21415759b3d2Safresh1 pre => '$pkg = "pqrs"', 21425759b3d2Safresh1 code => '$pkg .= sprintf "%s%s", $lex1, $lex2', 21435759b3d2Safresh1 }, 21445759b3d2Safresh1 'func::sprintf::g_cl' => { 21455759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"', 21465759b3d2Safresh1 code => '$pkg = sprintf "foo=%s", $lex1', 21475759b3d2Safresh1 }, 21485759b3d2Safresh1 'func::sprintf::g_clclc' => { 21495759b3d2Safresh1 setup => 'our $pkg; my $lex1 = "abcd"; my $lex2 = "wxyz"', 21505759b3d2Safresh1 code => '$pkg = sprintf "foo=%s bar=%s\n", $lex1, $lex2', 21515759b3d2Safresh1 }, 21525759b3d2Safresh1 21535759b3d2Safresh1 'func::sprintf::l_l' => { 21545759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"', 21555759b3d2Safresh1 code => '$lex = sprintf "%s", $lex1', 21565759b3d2Safresh1 }, 21575759b3d2Safresh1 'func::sprintf::l_append_l' => { 21585759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"', 21595759b3d2Safresh1 pre => '$lex = "pqrs"', 21605759b3d2Safresh1 code => '$lex .= sprintf "%s", $lex1', 21615759b3d2Safresh1 }, 21625759b3d2Safresh1 'func::sprintf::ll' => { 21635759b3d2Safresh1 setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"', 21645759b3d2Safresh1 code => 'sprintf "%s%s", $lex1, $lex2', 21655759b3d2Safresh1 }, 21665759b3d2Safresh1 'func::sprintf::l_ll' => { 21675759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"', 21685759b3d2Safresh1 code => '$lex = sprintf "%s%s", $lex1, $lex2', 21695759b3d2Safresh1 }, 21705759b3d2Safresh1 'func::sprintf::l_append_ll' => { 21715759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"', 21725759b3d2Safresh1 pre => '$lex = "pqrs"', 21735759b3d2Safresh1 code => '$lex .= sprintf "%s%s", $lex1, $lex2', 21745759b3d2Safresh1 }, 21755759b3d2Safresh1 'func::sprintf::l_cl' => { 21765759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"', 21775759b3d2Safresh1 code => '$lex = sprintf "foo=%s", $lex1', 21785759b3d2Safresh1 }, 21795759b3d2Safresh1 'func::sprintf::l_clclc' => { 21805759b3d2Safresh1 setup => 'my $lex; my $lex1 = "abcd"; my $lex2 = "wxyz"', 21815759b3d2Safresh1 code => '$lex = sprintf "foo=%s bar=%s\n", $lex1, $lex2', 21825759b3d2Safresh1 }, 21835759b3d2Safresh1 21845759b3d2Safresh1 'func::sprintf::m_l' => { 21855759b3d2Safresh1 setup => 'my $lex1 = "abcd"', 21865759b3d2Safresh1 code => 'my $lex = sprintf "%s", $lex1', 21875759b3d2Safresh1 }, 21885759b3d2Safresh1 'func::sprintf::m_ll' => { 21895759b3d2Safresh1 setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"', 21905759b3d2Safresh1 code => 'my $lex = sprintf "%s%s", $lex1, $lex2', 21915759b3d2Safresh1 }, 21925759b3d2Safresh1 'func::sprintf::m_cl' => { 21935759b3d2Safresh1 setup => 'my $lex1 = "abcd"', 21945759b3d2Safresh1 code => 'my $lex = sprintf "foo=%s", $lex1', 21955759b3d2Safresh1 }, 21965759b3d2Safresh1 'func::sprintf::m_clclc' => { 21975759b3d2Safresh1 setup => 'my $lex1 = "abcd"; my $lex2 = "wxyz"', 21985759b3d2Safresh1 code => 'my $lex = sprintf "foo=%s bar=%s\n", $lex1, $lex2', 21995759b3d2Safresh1 }, 22005759b3d2Safresh1 22015759b3d2Safresh1 'func::sprintf::utf8__l_lll' => { 22025759b3d2Safresh1 desc => '$s = sprintf("foo=%s bar=%s baz=%s", $a, $b, $c) where $a,$c are utf8', 22035759b3d2Safresh1 setup => 'my $s; my $a = "ab\x{100}cde"; my $b = "fghij"; my $c = "\x{101}klmn"', 22045759b3d2Safresh1 code => '$s = sprintf "foo=%s bar=%s baz=%s", $a, $b, $c', 22055759b3d2Safresh1 }, 22065759b3d2Safresh1 22075759b3d2Safresh1 22085759b3d2Safresh1 # S/// 22095759b3d2Safresh1 22105759b3d2Safresh1 'func::subst::bool' => { 22115759b3d2Safresh1 desc => 's/// in boolean context', 22125759b3d2Safresh1 setup => '', 22135759b3d2Safresh1 code => '$_ = "aaa"; !s/./x/g;' 22145759b3d2Safresh1 }, 22155759b3d2Safresh1 22165759b3d2Safresh1 22175759b3d2Safresh1 'func::values::scalar_cxt_empty' => { 22185759b3d2Safresh1 desc => ' values() on an empty hash in scalar context', 22195759b3d2Safresh1 setup => 'my $k; my %h = ()', 22205759b3d2Safresh1 code => '$k = values %h', 22215759b3d2Safresh1 }, 22225759b3d2Safresh1 'func::values::scalar_cxt' => { 22235759b3d2Safresh1 desc => ' values() on a non-empty hash in scalar context', 22245759b3d2Safresh1 setup => 'my $k; my %h = qw(aardvark 1 banana 2 cucumber 3)', 22255759b3d2Safresh1 code => '$k = values %h', 22265759b3d2Safresh1 }, 22275759b3d2Safresh1 'func::values::list_cxt_empty' => { 22285759b3d2Safresh1 desc => ' values() on an empty hash in list context', 22295759b3d2Safresh1 setup => 'my %h = ()', 22305759b3d2Safresh1 code => '() = values %h', 22315759b3d2Safresh1 }, 22325759b3d2Safresh1 'func::values::list_cxt' => { 22335759b3d2Safresh1 desc => ' values() on a non-empty hash in list context', 22345759b3d2Safresh1 setup => 'my %h = qw(aardvark 1 banana 2 cucumber 3)', 22355759b3d2Safresh1 code => '() = values %h', 22365759b3d2Safresh1 }, 22375759b3d2Safresh1 22385759b3d2Safresh1 22395759b3d2Safresh1 2240b8851fccSafresh1 'loop::block' => { 2241b8851fccSafresh1 desc => 'empty basic loop', 22425759b3d2Safresh1 setup => '', 2243b8851fccSafresh1 code => '{1;}', 2244b8851fccSafresh1 }, 2245b8851fccSafresh1 2246b8851fccSafresh1 'loop::do' => { 2247b8851fccSafresh1 desc => 'basic do block', 2248b8851fccSafresh1 setup => 'my $x; my $y = 2;', 2249b8851fccSafresh1 code => '$x = do {1; $y}', # the ';' stops the do being optimised 2250b8851fccSafresh1 }, 2251b8851fccSafresh1 2252b8851fccSafresh1 'loop::for::my_range1' => { 2253b8851fccSafresh1 desc => 'empty for loop with my var and 1 integer range', 2254b8851fccSafresh1 setup => '', 2255b8851fccSafresh1 code => 'for my $x (1..1) {}', 2256b8851fccSafresh1 }, 2257b8851fccSafresh1 'loop::for::lex_range1' => { 2258b8851fccSafresh1 desc => 'empty for loop with lexical var and 1 integer range', 2259b8851fccSafresh1 setup => 'my $x;', 2260b8851fccSafresh1 code => 'for $x (1..1) {}', 2261b8851fccSafresh1 }, 2262b8851fccSafresh1 'loop::for::pkg_range1' => { 2263b8851fccSafresh1 desc => 'empty for loop with package var and 1 integer range', 2264b8851fccSafresh1 setup => '$x = 1;', 2265b8851fccSafresh1 code => 'for $x (1..1) {}', 2266b8851fccSafresh1 }, 2267b8851fccSafresh1 'loop::for::defsv_range1' => { 2268b8851fccSafresh1 desc => 'empty for loop with $_ and integer 1 range', 2269b8851fccSafresh1 setup => ';', 2270b8851fccSafresh1 code => 'for (1..1) {}', 2271b8851fccSafresh1 }, 2272b8851fccSafresh1 'loop::for::my_range4' => { 2273b8851fccSafresh1 desc => 'empty for loop with my var and 4 integer range', 2274b8851fccSafresh1 setup => '', 2275b8851fccSafresh1 code => 'for my $x (1..4) {}', 2276b8851fccSafresh1 }, 2277b8851fccSafresh1 'loop::for::lex_range4' => { 2278b8851fccSafresh1 desc => 'empty for loop with lexical var and 4 integer range', 2279b8851fccSafresh1 setup => 'my $x;', 2280b8851fccSafresh1 code => 'for $x (1..4) {}', 2281b8851fccSafresh1 }, 2282b8851fccSafresh1 'loop::for::pkg_range4' => { 2283b8851fccSafresh1 desc => 'empty for loop with package var and 4 integer range', 2284b8851fccSafresh1 setup => '$x = 1;', 2285b8851fccSafresh1 code => 'for $x (1..4) {}', 2286b8851fccSafresh1 }, 2287b8851fccSafresh1 'loop::for::defsv_range4' => { 2288b8851fccSafresh1 desc => 'empty for loop with $_ and integer 4 range', 2289b8851fccSafresh1 setup => ';', 2290b8851fccSafresh1 code => 'for (1..4) {}', 2291b8851fccSafresh1 }, 2292b8851fccSafresh1 2293b8851fccSafresh1 'loop::for::my_list1' => { 2294b8851fccSafresh1 desc => 'empty for loop with my var and 1 integer list', 2295b8851fccSafresh1 setup => '', 2296b8851fccSafresh1 code => 'for my $x (1) {}', 2297b8851fccSafresh1 }, 2298b8851fccSafresh1 'loop::for::lex_list1' => { 2299b8851fccSafresh1 desc => 'empty for loop with lexical var and 1 integer list', 2300b8851fccSafresh1 setup => 'my $x;', 2301b8851fccSafresh1 code => 'for $x (1) {}', 2302b8851fccSafresh1 }, 2303b8851fccSafresh1 'loop::for::pkg_list1' => { 2304b8851fccSafresh1 desc => 'empty for loop with package var and 1 integer list', 2305b8851fccSafresh1 setup => '$x = 1;', 2306b8851fccSafresh1 code => 'for $x (1) {}', 2307b8851fccSafresh1 }, 2308b8851fccSafresh1 'loop::for::defsv_list1' => { 2309b8851fccSafresh1 desc => 'empty for loop with $_ and integer 1 list', 2310b8851fccSafresh1 setup => ';', 2311b8851fccSafresh1 code => 'for (1) {}', 2312b8851fccSafresh1 }, 2313b8851fccSafresh1 'loop::for::my_list4' => { 2314b8851fccSafresh1 desc => 'empty for loop with my var and 4 integer list', 2315b8851fccSafresh1 setup => '', 2316b8851fccSafresh1 code => 'for my $x (1,2,3,4) {}', 2317b8851fccSafresh1 }, 2318b8851fccSafresh1 'loop::for::lex_list4' => { 2319b8851fccSafresh1 desc => 'empty for loop with lexical var and 4 integer list', 2320b8851fccSafresh1 setup => 'my $x;', 2321b8851fccSafresh1 code => 'for $x (1,2,3,4) {}', 2322b8851fccSafresh1 }, 2323b8851fccSafresh1 'loop::for::pkg_list4' => { 2324b8851fccSafresh1 desc => 'empty for loop with package var and 4 integer list', 2325b8851fccSafresh1 setup => '$x = 1;', 2326b8851fccSafresh1 code => 'for $x (1,2,3,4) {}', 2327b8851fccSafresh1 }, 2328b8851fccSafresh1 'loop::for::defsv_list4' => { 2329b8851fccSafresh1 desc => 'empty for loop with $_ and integer 4 list', 2330b8851fccSafresh1 setup => '', 2331b8851fccSafresh1 code => 'for (1,2,3,4) {}', 2332b8851fccSafresh1 }, 2333b8851fccSafresh1 2334b8851fccSafresh1 'loop::for::my_array1' => { 2335b8851fccSafresh1 desc => 'empty for loop with my var and 1 integer array', 2336b8851fccSafresh1 setup => 'my @a = (1);', 2337b8851fccSafresh1 code => 'for my $x (@a) {}', 2338b8851fccSafresh1 }, 2339b8851fccSafresh1 'loop::for::lex_array1' => { 2340b8851fccSafresh1 desc => 'empty for loop with lexical var and 1 integer array', 2341b8851fccSafresh1 setup => 'my $x; my @a = (1);', 2342b8851fccSafresh1 code => 'for $x (@a) {}', 2343b8851fccSafresh1 }, 2344b8851fccSafresh1 'loop::for::pkg_array1' => { 2345b8851fccSafresh1 desc => 'empty for loop with package var and 1 integer array', 2346b8851fccSafresh1 setup => '$x = 1; my @a = (1);', 2347b8851fccSafresh1 code => 'for $x (@a) {}', 2348b8851fccSafresh1 }, 2349b8851fccSafresh1 'loop::for::defsv_array1' => { 2350b8851fccSafresh1 desc => 'empty for loop with $_ and integer 1 array', 2351b8851fccSafresh1 setup => 'my @a = (@a);', 2352b8851fccSafresh1 code => 'for (1) {}', 2353b8851fccSafresh1 }, 2354b8851fccSafresh1 'loop::for::my_array4' => { 2355b8851fccSafresh1 desc => 'empty for loop with my var and 4 integer array', 2356b8851fccSafresh1 setup => 'my @a = (1..4);', 2357b8851fccSafresh1 code => 'for my $x (@a) {}', 2358b8851fccSafresh1 }, 2359b8851fccSafresh1 'loop::for::lex_array4' => { 2360b8851fccSafresh1 desc => 'empty for loop with lexical var and 4 integer array', 2361b8851fccSafresh1 setup => 'my $x; my @a = (1..4);', 2362b8851fccSafresh1 code => 'for $x (@a) {}', 2363b8851fccSafresh1 }, 2364b8851fccSafresh1 'loop::for::pkg_array4' => { 2365b8851fccSafresh1 desc => 'empty for loop with package var and 4 integer array', 2366b8851fccSafresh1 setup => '$x = 1; my @a = (1..4);', 2367b8851fccSafresh1 code => 'for $x (@a) {}', 2368b8851fccSafresh1 }, 2369b8851fccSafresh1 'loop::for::defsv_array4' => { 2370b8851fccSafresh1 desc => 'empty for loop with $_ and integer 4 array', 2371b8851fccSafresh1 setup => 'my @a = (1..4);', 2372b8851fccSafresh1 code => 'for (@a) {}', 2373b8851fccSafresh1 }, 2374b8851fccSafresh1 2375b8851fccSafresh1 'loop::for::next4' => { 2376b8851fccSafresh1 desc => 'for loop containing only next with my var and integer 4 array', 2377b8851fccSafresh1 setup => 'my @a = (1..4);', 2378b8851fccSafresh1 code => 'for my $x (@a) {next}', 2379b8851fccSafresh1 }, 2380b8851fccSafresh1 2381b8851fccSafresh1 'loop::grep::expr_3int' => { 2382b8851fccSafresh1 desc => 'grep $_ > 0, 1,2,3', 2383b8851fccSafresh1 setup => 'my @a', 2384b8851fccSafresh1 code => '@a = grep $_ > 0, 1,2,3', 2385b8851fccSafresh1 }, 2386b8851fccSafresh1 2387b8851fccSafresh1 'loop::grep::block_3int' => { 2388b8851fccSafresh1 desc => 'grep { 1; $_ > 0} 1,2,3', 2389b8851fccSafresh1 setup => 'my @a', 2390b8851fccSafresh1 code => '@a = grep { 1; $_ > 0} 1,2,3', 2391b8851fccSafresh1 }, 2392b8851fccSafresh1 2393b8851fccSafresh1 'loop::map::expr_3int' => { 2394b8851fccSafresh1 desc => 'map $_+1, 1,2,3', 2395b8851fccSafresh1 setup => 'my @a', 2396b8851fccSafresh1 code => '@a = map $_+1, 1,2,3', 2397b8851fccSafresh1 }, 2398b8851fccSafresh1 2399b8851fccSafresh1 'loop::map::block_3int' => { 2400b8851fccSafresh1 desc => 'map { 1; $_+1} 1,2,3', 2401b8851fccSafresh1 setup => 'my @a', 2402b8851fccSafresh1 code => '@a = map { 1; $_+1} 1,2,3', 2403b8851fccSafresh1 }, 2404b8851fccSafresh1 2405b8851fccSafresh1 'loop::while::i1' => { 2406b8851fccSafresh1 desc => 'empty while loop 1 iteration', 2407b8851fccSafresh1 setup => 'my $i = 0;', 2408b8851fccSafresh1 code => 'while (++$i % 2) {}', 2409b8851fccSafresh1 }, 2410b8851fccSafresh1 'loop::while::i4' => { 2411b8851fccSafresh1 desc => 'empty while loop 4 iterations', 2412b8851fccSafresh1 setup => 'my $i = 0;', 2413b8851fccSafresh1 code => 'while (++$i % 4) {}', 2414b8851fccSafresh1 }, 2415b8851fccSafresh1 24165759b3d2Safresh1 24175759b3d2Safresh1 'regex::anyof_plus::anchored' => { 24185759b3d2Safresh1 setup => '$_ = "a" x 100;', 24195759b3d2Safresh1 code => '/^[acgt]+/', 24205759b3d2Safresh1 }, 24215759b3d2Safresh1 'regex::anyof_plus::floating' => { 24225759b3d2Safresh1 desc => '/[acgt]+where match starts at position 0 for 100 chars/', 24235759b3d2Safresh1 setup => '$_ = "a" x 100;', 24245759b3d2Safresh1 code => '/[acgt]+/', 24255759b3d2Safresh1 }, 24265759b3d2Safresh1 'regex::anyof_plus::floating_away' => { 24275759b3d2Safresh1 desc => '/[acgt]+/ where match starts at position 100 for 100 chars', 24285759b3d2Safresh1 setup => '$_ = ("0" x 100) . ("a" x 100);', 24295759b3d2Safresh1 code => '/[acgt]+/', 24305759b3d2Safresh1 }, 24315759b3d2Safresh1 24325759b3d2Safresh1 'regex::whilem::min_captures_fail' => { 24335759b3d2Safresh1 desc => '/WHILEM with anon-greedy match and captures that fails', 24345759b3d2Safresh1 setup => '$_ = ("a" x 20)', 24355759b3d2Safresh1 code => '/^(?:(.)(.))*?[XY]/', 24365759b3d2Safresh1 }, 24375759b3d2Safresh1 'regex::whilem::max_captures_fail' => { 24385759b3d2Safresh1 desc => '/WHILEM with a greedy match and captures that fails', 24395759b3d2Safresh1 setup => '$_ = ("a" x 20)', 24405759b3d2Safresh1 code => '/^(?:(.)(.))*[XY]/', 24415759b3d2Safresh1 }, 2442b8851fccSafresh1]; 2443