3 # Test the core keywords.
5 # Initially this test file just checked that CORE::foo got correctly
6 # deparsed as CORE::foo, hence the name. It's since been expanded
7 # to fully test both CORE:: versus none, plus that any arguments
8 # are correctly deparsed. It also cross-checks against regen/keywords.pl
9 # to make sure we've tested all keywords, and with the correct strength.
11 # A keyword can be either weak or strong. Strong keywords can never be
12 # overridden, while weak ones can. So deparsing of weak keywords depends
13 # on whether a sub of that name has been created:
15 # for both: keyword(..) deparsed as keyword(..)
16 # for weak: CORE::keyword(..) deparsed as CORE::keyword(..)
17 # for strong: CORE::keyword(..) deparsed as keyword(..)
19 # Three permutations of lex/nonlex args are checked for:
22 # foo(my $a,$b,$c,...)
23 # my ($a,$b,$c,...); foo($a,$b,$c,...)
25 # Note that tests for prefixing feature.pm-enabled keywords with CORE:: when
26 # feature.pm is not enabled are in deparse.t, as they fit that format better.
31 if (($Config::Config{extensions} !~ /\bB\b/) ){
32 print "1..0 # Skip -- Perl configured without B module\n";
41 use feature (sprintf(":%vd", $^V)); # to avoid relying on the feature
44 my $deparse = B::Deparse->new();
49 # For a given keyword, create a sub of that name,
50 # then deparse 3 different assignment expressions
51 # using that keyword. See if the $expr we get back
52 # matches $expected_expr.
55 my ($keyword, $expr, $expected_expr, $lexsub) = @_;
57 $expected_expr //= $expr;
60 # lex=0: () = foo($a,$b,$c)
61 # lex=1: my ($a,$b); () = foo($a,$b,$c)
62 # lex=2: () = foo(my $a,$b,$c)
63 for my $lex (0, 1, 2) {
64 next if ($lex and $keyword =~ /local|our|state|my/);
65 my $vars = $lex == 1 ? 'my($a, $b, $c, $d, $e);' . "\n " : "";
69 if ($expr =~ 'CORE::do') {
70 # do foo() is a syntax error, so B::Deparse emits
71 # do (foo()), but does not distinguish between foo and my,
72 # because it is too complicated.
75 s/\$a/$repl/ for $expr, $expected_expr;
78 my $desc = "$keyword: lex=$lex $expr => $expected_expr";
79 $desc .= " (lex sub)" if $lexsub;
85 no warnings 'experimental::lexical_subs', 'experimental::isa';
86 use feature 'lexical_subs';
88 $code = "sub { state sub $keyword; ${vars}() = $expr }";
89 $code = "use feature 'isa';\n$code" if $keyword eq "isa";
90 $code = "use feature 'switch';\n$code" if $keyword eq "break";
91 $code_ref = eval $code or die "$@ in $expr";
95 no warnings 'experimental::isa';
98 $code = "no strict 'vars'; sub { ${vars}() = $expr }";
99 $code = "use feature 'isa';\n$code" if $keyword eq "isa";
100 $code = "use feature 'switch';\n$code" if $keyword eq "break";
101 $code_ref = eval $code or die "$@ in $expr";
104 my $got_text = $deparse->coderef2text($code_ref);
106 unless ($got_text =~ /
107 package (?:lexsub)?test;
108 (?: BEGIN \{\$\{\^WARNING_BITS\} = "[^"]+"\}
109 )? use strict 'refs', 'subs';
111 (?: (?:CORE::)?state sub \w+;
112 )? \Q$vars\E\(\) = (.*)
115 ::diag("couldn't extract line from boilerplate\n");
121 is $got_expr, $expected_expr, $desc
122 or ::diag("ORIGINAL CODE:\n$code");;
127 # Deparse can't distinguish 'and' from '&&' etc
128 my %infix_map = qw(and && or ||);
130 # Test a keyword that is a binary infix operator, like 'cmp'.
131 # $parens - "$a op $b" is deparsed as "($a op $b)"
132 # $strong - keyword is strong
134 sub do_infix_keyword {
135 my ($keyword, $parens, $strong) = @_;
136 $SEEN_STRENGTH{$keyword} = $strong;
137 my $expr = "(\$a $keyword \$b)";
138 my $nkey = $infix_map{$keyword} // $keyword;
139 my $expr = "(\$a $keyword \$b)";
140 my $exp = "\$a $nkey \$b";
141 $exp = "($exp)" if $parens;
143 # with infix notation, a keyword is always interpreted as core,
144 # so no need for Deparse to disambiguate with CORE::
145 testit $keyword, "(\$a CORE::$keyword \$b)", $exp;
146 testit $keyword, "(\$a $keyword \$b)", $exp;
147 testit $keyword, "(\$a CORE::$keyword \$b)", $exp, 1;
148 testit $keyword, "(\$a $keyword \$b)", $exp, 1;
150 # B::Deparse fully qualifies any sub whose name is a keyword,
151 # imported or not, since the importedness may not be reproduced by
152 # the deparsed code. x is special.
153 my $pre = "test::" x ($keyword ne 'x');
154 testit $keyword, "$keyword(\$a, \$b)", "$pre$keyword(\$a, \$b);";
156 testit $keyword, "$keyword(\$a, \$b)", "$keyword(\$a, \$b);", 1;
159 # Test a keyword that is a standard op/function, like 'index(...)'.
160 # $narg - how many args to test it with
161 # $parens - "foo $a, $b" is deparsed as "foo($a, $b)"
162 # $dollar - an extra '$_' arg will appear in the deparsed output
163 # $strong - keyword is strong
167 my ($keyword, $narg, $parens, $dollar, $strong) = @_;
169 $SEEN_STRENGTH{$keyword} = $strong;
171 for my $core (0,1) { # if true, add CORE:: to keyword being deparsed
172 for my $lexsub (0,1) { # if true, define lex sub
174 for my $do_exp(0, 1) { # first create expr, then expected-expr
175 my @args = map "\$$_", (undef,"a".."z")[1..$narg];
177 if $dollar && $do_exp && ($strong && !$lexsub or $core);
178 my $args = join(', ', @args);
179 # XXX $lex_parens is temporary, until lex subs are
182 !$core && $do_exp && $lexsub && $keyword ne 'map';
183 $args = ((!$core && !$strong) || $parens || $lex_parens)
189 ($core && !($do_exp && $strong))
193 : $do_exp && !$core && !$strong
196 ) . "$keyword$args;";
198 # code[0]: to run; code[1]: expected
199 testit $keyword, @code, $lexsub;
211 die "not 3 fields" unless @fields == 3;
212 my ($keyword, $args, $flags) = @fields;
214 $args = '012' if $args eq '@';
216 my $parens = $flags =~ s/p//;
217 my $invert1 = $flags =~ s/1//;
218 my $dollar = $flags =~ s/\$//;
219 my $strong = $flags =~ s/\+//;
220 die "unrecognised flag(s): '$flags'" unless $flags =~ /^-?$/;
222 if ($args eq 'B') { # binary infix
223 die "$keyword: binary (B) op can't have '\$' flag\\n" if $dollar;
224 die "$keyword: binary (B) op can't have '1' flag\\n" if $invert1;
225 do_infix_keyword($keyword, $parens, $strong);
228 my @narg = split //, $args;
229 for my $n (0..$#narg) {
230 my $narg = $narg[$n];
232 $p = !$p if ($n == 0 && $invert1);
233 do_std_keyword($keyword, $narg, $p, (!$n && $dollar), $strong);
241 testit dbmopen => 'CORE::dbmopen(%foo, $bar, $baz);';
242 testit dbmclose => 'CORE::dbmclose %foo;';
244 testit delete => 'CORE::delete $h{\'foo\'};', 'delete $h{\'foo\'};';
245 testit delete => 'CORE::delete $h{\'foo\'};', undef, 1;
246 testit delete => 'CORE::delete @h{\'foo\'};', undef, 1;
247 testit delete => 'CORE::delete $h[0];', undef, 1;
248 testit delete => 'CORE::delete @h[0];', undef, 1;
249 testit delete => 'delete $h{\'foo\'};', 'delete $h{\'foo\'};';
251 # do is listed as strong, but only do { block } is strong;
252 # do $file is weak, so test it separately here
253 testit do => 'CORE::do $a;';
254 testit do => 'do $a;', 'test::do($a);';
255 testit do => 'CORE::do { 1 }',
257 testit do => 'CORE::do { 1 }',
258 "CORE::do {\n 1\n };", 1;
259 testit do => 'do { 1 };',
262 testit each => 'CORE::each %bar;';
263 testit each => 'CORE::each @foo;';
265 testit eof => 'CORE::eof();';
267 testit exists => 'CORE::exists $h{\'foo\'};', 'exists $h{\'foo\'};';
268 testit exists => 'CORE::exists $h{\'foo\'};', undef, 1;
269 testit exists => 'CORE::exists &foo;', undef, 1;
270 testit exists => 'CORE::exists $h[0];', undef, 1;
271 testit exists => 'exists $h{\'foo\'};', 'exists $h{\'foo\'};';
273 testit exec => 'CORE::exec($foo $bar);';
275 testit glob => 'glob;', 'glob($_);';
276 testit glob => 'CORE::glob;', 'CORE::glob($_);';
277 testit glob => 'glob $a;', 'glob($a);';
278 testit glob => 'CORE::glob $a;', 'CORE::glob($a);';
280 testit grep => 'CORE::grep { $a } $b, $c', 'grep({$a;} $b, $c);';
282 testit keys => 'CORE::keys %bar;';
283 testit keys => 'CORE::keys @bar;';
285 testit map => 'CORE::map { $a } $b, $c', 'map({$a;} $b, $c);';
287 testit not => '3 unless CORE::not $a && $b;';
289 testit pop => 'CORE::pop @foo;';
291 testit push => 'CORE::push @foo;', 'CORE::push(@foo);';
292 testit push => 'CORE::push @foo, 1;', 'CORE::push(@foo, 1);';
293 testit push => 'CORE::push @foo, 1, 2;', 'CORE::push(@foo, 1, 2);';
295 testit readline => 'CORE::readline $a . $b;';
297 testit readpipe => 'CORE::readpipe $a + $b;';
299 testit reverse => 'CORE::reverse sort(@foo);';
301 testit shift => 'CORE::shift @foo;';
303 testit splice => q{CORE::splice @foo;}, q{CORE::splice(@foo);};
304 testit splice => q{CORE::splice @foo, 0;}, q{CORE::splice(@foo, 0);};
305 testit splice => q{CORE::splice @foo, 0, 1;}, q{CORE::splice(@foo, 0, 1);};
306 testit splice => q{CORE::splice @foo, 0, 1, 'a';}, q{CORE::splice(@foo, 0, 1, 'a');};
307 testit splice => q{CORE::splice @foo, 0, 1, 'a', 'b';}, q{CORE::splice(@foo, 0, 1, 'a', 'b');};
309 # note that the test does '() = split...' which is why the
310 # limit is optimised to 1
311 testit split => 'split;', q{split(' ', $_, 1);};
312 testit split => 'CORE::split;', q{split(' ', $_, 1);};
313 testit split => 'split $a;', q{split(/$a/u, $_, 1);};
314 testit split => 'CORE::split $a;', q{split(/$a/u, $_, 1);};
315 testit split => 'split $a, $b;', q{split(/$a/u, $b, 1);};
316 testit split => 'CORE::split $a, $b;', q{split(/$a/u, $b, 1);};
317 testit split => 'split $a, $b, $c;', q{split(/$a/u, $b, $c);};
318 testit split => 'CORE::split $a, $b, $c;', q{split(/$a/u, $b, $c);};
320 testit sub => 'CORE::sub { $a, $b }',
321 "sub {\n \$a, \$b;\n }\n ;";
323 testit system => 'CORE::system($foo $bar);';
325 testit unshift => 'CORE::unshift @foo;', 'CORE::unshift(@foo);';
326 testit unshift => 'CORE::unshift @foo, 1;', 'CORE::unshift(@foo, 1);';
327 testit unshift => 'CORE::unshift @foo, 1, 2;', 'CORE::unshift(@foo, 1, 2);';
329 testit values => 'CORE::values %bar;';
330 testit values => 'CORE::values @foo;';
333 # XXX These are deparsed wrapped in parens.
334 # whether they should be, I don't know!
336 testit dump => '(CORE::dump);';
337 testit dump => '(CORE::dump FOO);';
338 testit goto => '(CORE::goto);', '(goto);';
339 testit goto => '(CORE::goto FOO);', '(goto FOO);';
340 testit last => '(CORE::last);', '(last);';
341 testit last => '(CORE::last FOO);', '(last FOO);';
342 testit next => '(CORE::next);', '(next);';
343 testit next => '(CORE::next FOO);', '(next FOO);';
344 testit redo => '(CORE::redo);', '(redo);';
345 testit redo => '(CORE::redo FOO);', '(redo FOO);';
346 testit redo => '(CORE::redo);', '(redo);';
347 testit redo => '(CORE::redo FOO);', '(redo FOO);';
348 testit return => '(return);', '(return);';
349 testit return => '(CORE::return);', '(return);';
351 # these are the keywords I couldn't think how to test within this framework
353 my %not_tested = map { $_ => 1} qw(
396 # Sanity check against keyword data:
397 # make sure we haven't missed any keywords,
398 # and that we got the strength right.
402 skip "sanity checks when not PERL_CORE", 1 unless defined $ENV{PERL_CORE};
404 my $file = '../regen/keywords.pl';
406 if (open my $fh, '<', $file) {
411 next unless /^([+\-])(\w+)$/;
412 my ($strength, $key) = ($1, $2);
413 $strength = ($strength eq '+') ? 1 : 0;
415 if (!$SEEN{$key} && !$not_tested{$key}) {
416 diag("keyword '$key' seen in $file, but not tested here!!");
419 if (exists $SEEN_STRENGTH{$key} and $SEEN_STRENGTH{$key} != $strength) {
420 diag("keyword '$key' strengh as seen in $file doen't match here!!");
426 diag("Can't open $file: $!");
431 diag("Saw $count keywords: less than 200!");
434 ok($pass, "sanity checks");
443 # * one of more digits indictating which lengths of args the function accepts,
444 # * or 'B' to indiate a binary infix operator,
445 # * or '@' to indicate a list function.
447 # Flags consists of the following (or '-' if no flags):
448 # + : strong keyword: can't be overrriden
449 # p : the args are parenthesised on deparsing;
450 # 1 : parenthesising of 1st arg length is inverted
451 # so '234 p1' means: foo a1,a2; foo(a1,a2,a3); foo(a1,a2,a3,a4)
452 # $ : on the first argument length, there is an implicit extra
453 # '$_' arg which will appear on deparsing;
454 # e.g. 12p$ will be tested as: foo(a1); foo(a1,a2);
455 # and deparsed as: foo(a1, $_); foo(a1,a2);
457 # XXX Note that we really should get this data from regen/keywords.pl
458 # and regen/opcodes (augmented if necessary), rather than duplicating it
486 # dbmopen handled specially
487 # dbmclose handled specially
489 # delete handled specially
491 # do handled specially
492 # dump handled specially
493 # each handled specially
500 eof 01 - # also tested specially
504 exec @ p1 # also tested specially
505 # exists handled specially
541 # given handled specially
542 grep 123 p+ # also tested specially
543 # glob handled specially
544 # goto handled specially
553 # keys handled specially
555 # last handled specially
568 map 123 p+ # also tested specially
574 my 123 p+ # skip with 0 args, as my() => ()
576 # next handled specially
577 # not handled specially
583 our 123 p+ # skip with 0 args, as our() => ()
586 pop 0 1 # also tested specially
591 # push handled specially
596 # readline handled specially
598 # readpipe handled specially
600 # redo handled specially
603 # XXX This code prints 'Undefined subroutine &main::require called':
604 # use subs (); import subs 'require';
605 # eval q[no strict 'vars'; sub { () = require; }]; print $@;
609 # return handled specially
610 reverse @ p1 # also tested specially
632 shift 0 1 # also tested specially
643 # split handled specially
644 # splice handled specially
649 state 123 p1+ # skip with 0 args, as state() => ()
651 # sub handled specially
658 system @ p1 # also tested specially
673 # unshift handled specially
676 # values handled specially