File: 10inline-is.t

package info (click to toggle)
libsyntax-operator-is-perl 0.02-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 128 kB
  • sloc: perl: 108; makefile: 3
file content (48 lines) | stat: -rw-r--r-- 1,294 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/perl

use v5.14;
use warnings;

use Test2::V0;

use Syntax::Operator::Is;
BEGIN { plan skip_all => "No PL_infix_plugin" unless XS::Parse::Infix::HAVE_PL_INFIX_PLUGIN; }

use Data::Checks qw( Num );

use B qw( svref_2object walkoptree );

sub count_ops
{
   my ( $code ) = @_;
   my %opcounts;

   # B::walkoptree() is stupid
   #   https://github.com/Perl/perl5/issues/19101
   no warnings 'once';
   local *B::OP::collect_opnames = sub {
      my ( $op ) = @_;
      $opcounts{ $op->name }++ unless $op->name eq "null";
   };
   walkoptree( svref_2object( $code )->ROOT, "collect_opnames" );

   return %opcounts;
}

my %opcounts;

# Const-folded op should use OP_STATIC_IS and no OP_ENTERSUB
%opcounts = count_ops sub { $_[0] is Num };
ok( $opcounts{static_is}, 'LHS is Num uses OP_STATIC_IS' );

# Non-constfolded op should appear like a regular OP_PADSV + OP_INFIX_IS_...
my $constraint_Num = Num;
%opcounts = count_ops sub { $_[0] is $constraint_Num };
# We can't predict what the addr will be
$opcounts{$_ =~ s/_0x[[:xdigit:]]+$/_ADDR/r} = delete $opcounts{$_}
   for grep { m/_0x[[:xdigit:]]+$/ } keys %opcounts;

ok( $opcounts{infix_Syntax__Operator__Is__is_ADDR}, 'LHS is $padsv uses OP_IS (dynamic)' );
ok( $opcounts{padsv}, 'LHS is $padsv uses OP_PADSV' );

done_testing;