1*898184e3Ssthen#!perl 2*898184e3Ssthen 3*898184e3Ssthenuse strict; 4*898184e3Ssthenuse warnings; 5*898184e3Ssthen 6*898184e3Ssthenuse Test::More tests => 53; 7*898184e3Ssthen 8*898184e3Ssthenuse_ok('XS::APItest'); 9*898184e3Ssthen 10*898184e3Ssthenmy $level = -1; 11*898184e3Ssthenmy @types = map { 'gv_fetchmeth' . $_ . "_autoload" } '', qw( _sv _pv _pvn ); 12*898184e3Ssthen 13*898184e3Ssthensub test { "Sanity check" } 14*898184e3Ssthen 15*898184e3Ssthenfor my $type ( 0..3 ) { 16*898184e3Ssthen is *{XS::APItest::gv_fetchmeth_autoload_type( 17*898184e3Ssthen \%::, "test", $type, $level, 0 18*898184e3Ssthen )}{CODE}->(), "Sanity check"; 19*898184e3Ssthen} 20*898184e3Ssthen 21*898184e3Ssthen{ 22*898184e3Ssthen ok !XS::APItest::gv_fetchmeth_autoload_type(\%::, "etc", 1, $level, 0), "fails when the glob doesn't exist and AUTOLOAD is undefined,"; 23*898184e3Ssthen local *AUTOLOAD = sub { 1 }; 24*898184e3Ssthen is XS::APItest::gv_fetchmeth_autoload_type(\%::, "etc", 1, $level, 0), "*main::etc", "..but defining AUTOLOAD makes it succeed."; 25*898184e3Ssthen} 26*898184e3Ssthen 27*898184e3Ssthenfor my $type ( 0..3 ) { 28*898184e3Ssthen my $meth = "gen$type"; 29*898184e3Ssthen ok !XS::APItest::gv_fetchmeth_autoload_type(\%::, $meth, $type, -1, 0), "With level = -1, $types[$type] returns false."; 30*898184e3Ssthen ok !$::{$meth}, "...and doesn't vivify the glob."; 31*898184e3Ssthen 32*898184e3Ssthen ok !XS::APItest::gv_fetchmeth_autoload_type(\%::, $meth, $type, 0, 0), "With level = 0, $types[$type] still returns false."; 33*898184e3Ssthen ok $::{$meth}, "...but does vivify the glob."; 34*898184e3Ssthen 35*898184e3Ssthen ok !XS::APItest::gv_fetchmeth_autoload_type(\%::, $meth . $type, $type, $level, 0), "$types[$type] fails when the glob doesn't exist and AUTOLOAD is undefined,"; 36*898184e3Ssthen local *AUTOLOAD = sub { 1 }; 37*898184e3Ssthen is XS::APItest::gv_fetchmeth_autoload_type(\%::, $meth . $type, $type, $level, 0), "*main::$meth$type", "..but defining AUTOLOAD makes it succeed."; 38*898184e3Ssthen} 39*898184e3Ssthen 40*898184e3Ssthen{ 41*898184e3Ssthen no warnings 'once'; 42*898184e3Ssthen *method = sub { 1 }; 43*898184e3Ssthen} 44*898184e3Ssthen 45*898184e3Ssthenok !XS::APItest::gv_fetchmeth_autoload_type(\%::, "method\0not quite!", 0, $level, 0), "gv_fetchmeth() is nul-clean"; 46*898184e3Ssthenok !XS::APItest::gv_fetchmeth_autoload_type(\%::, "method\0not quite!", 1, $level, 0), "gv_fetchmeth_autoload_sv() is nul-clean"; 47*898184e3Ssthenis XS::APItest::gv_fetchmeth_autoload_type(\%::, "method\0not quite!", 2, $level, 0), "*main::method", "gv_fetchmeth_autoload_pv() is not nul-clean"; 48*898184e3Ssthenok !XS::APItest::gv_fetchmeth_autoload_type(\%::, "method\0not quite!", 3, $level, 0), "gv_fetchmeth_autoload_pvn() is nul-clean"; 49*898184e3Ssthen 50*898184e3Ssthen{ 51*898184e3Ssthen use utf8; 52*898184e3Ssthen use open qw( :utf8 :std ); 53*898184e3Ssthen 54*898184e3Ssthen package main; 55*898184e3Ssthen 56*898184e3Ssthen sub method { 1 } 57*898184e3Ssthen 58*898184e3Ssthen my $meth_as_octets = 59*898184e3Ssthen "\357\275\215\357\275\205\357\275\224\357\275\210\357\275\217\357\275\204"; 60*898184e3Ssthen 61*898184e3Ssthen $level = -1; 62*898184e3Ssthen for my $type ( 1..3 ) { 63*898184e3Ssthen ::is XS::APItest::gv_fetchmeth_autoload_type(\%main::, "method", $type, $level, 0), "*main::method", "$types[$type] is UTF-8 clean"; 64*898184e3Ssthen ::ok !XS::APItest::gv_fetchmeth_autoload_type(\%main::, $meth_as_octets, $type, $level, 0); 65*898184e3Ssthen ::ok !XS::APItest::gv_fetchmeth_autoload_type(\%main::, "method", $type, $level, 0); 66*898184e3Ssthen 67*898184e3Ssthen { 68*898184e3Ssthen no warnings 'once'; 69*898184e3Ssthen local *AUTOLOAD = sub { 1 }; 70*898184e3Ssthen ::is XS::APItest::gv_fetchmeth_autoload_type(\%main::, "method$type", $type, $level, 0), "*main::method$type", "Autoloading UTF-8 subs works"; 71*898184e3Ssthen } 72*898184e3Ssthen 73*898184e3Ssthen { 74*898184e3Ssthen no strict 'refs'; 75*898184e3Ssthen ::ok !XS::APItest::gv_fetchmeth_autoload_type( 76*898184e3Ssthen \%{"\357\275\215\357\275\201\357\275\211\357\275\216::"}, 77*898184e3Ssthen "method", $type, $level, 0); 78*898184e3Ssthen ::ok !XS::APItest::gv_fetchmeth_autoload_type( 79*898184e3Ssthen \%{"\357\275\215\357\275\201\357\275\211\357\275\216::"}, 80*898184e3Ssthen "method", $type, $level, 0); 81*898184e3Ssthen } 82*898184e3Ssthen } 83*898184e3Ssthen} 84