Commit | Line | Data |
---|---|---|
6911735f FC |
1 | #!perl |
2 | ||
8fa6a409 FC |
3 | # This script tests not only the interface for XS AUTOLOAD routines to find |
4 | # out the sub name, but also that that interface does not interfere with | |
5 | # prototypes, the way it did before 5.15.4. | |
6 | ||
6911735f FC |
7 | use strict; |
8 | use warnings; | |
9 | ||
8fa6a409 | 10 | use Test::More tests => 14; |
6911735f FC |
11 | |
12 | use XS::APItest; | |
13 | ||
14 | is XS::APItest::AutoLoader::frob(), 'frob', 'name passed to XS AUTOLOAD'; | |
15 | is "XS::APItest::AutoLoader::fr\0b"->(), "fr\0b", | |
16 | 'name with embedded null passed to XS AUTOLOAD'; | |
17 | is "XS::APItest::AutoLoader::fr\x{1ed9}b"->(), "fr\x{1ed9}b", | |
18 | 'Unicode name passed to XS AUTOLOAD'; | |
8fa6a409 FC |
19 | |
20 | *AUTOLOAD = *XS::APItest::AutoLoader::AUTOLOADp; | |
21 | ||
22 | is frob(), 'frob', 'name passed to XS AUTOLOAD with proto'; | |
23 | is prototype \&AUTOLOAD, '*$', 'prototype is unchanged'; | |
24 | is "fr\0b"->(), "fr\0b", | |
25 | 'name with embedded null passed to XS AUTOLOAD with proto'; | |
26 | is prototype \&AUTOLOAD, '*$', 'proto unchanged after embedded-null call'; | |
27 | is "fr\x{1ed9}b"->(), "fr\x{1ed9}b", | |
28 | 'Unicode name passed to XS AUTOLOAD with proto'; | |
29 | is prototype \&AUTOLOAD, '*$', 'prototype is unchanged after Unicode call'; | |
30 | ||
31 | # Test that the prototype was preserved from the parser’s point of view | |
32 | ||
33 | ok !eval "sub { ::AUTOLOAD(1) }", | |
34 | 'parse failure due to AUTOLOAD prototype'; | |
35 | ok eval "sub { ::AUTOLOAD(1,2) }", 'successful parse respecting prototype' | |
36 | or diag $@; | |
37 | ||
38 | package fribble { sub a { return 7 } } | |
39 | no warnings 'once'; | |
40 | *a = \&AUTOLOAD; | |
41 | '$'->(); | |
42 | # &a('fribble') will return '$' | |
43 | # But if intuit_method does not see the (*...) proto, this compiles as | |
44 | # fribble->a | |
45 | no strict; | |
46 | is eval 'a fribble, 3', '$', 'intuit_method sees * in AUTOLOAD proto' | |
47 | or diag $@; | |
48 | ||
49 | # precedence check | |
50 | # *$ should parse as a list operator, but right now the AUTOLOAD | |
51 | # sub name is $ | |
52 | is join(" ", eval 'a "b", "c"'), '$', | |
53 | 'precedence determination respects prototype of AUTOLOAD sub'; | |
54 | ||
55 | { | |
56 | my $w; | |
57 | local $SIG{__WARN__} = sub { $w .= shift }; | |
58 | eval 'sub a($){}'; | |
59 | like $w, qr/^Prototype mismatch: sub main::a \(\*\$\) vs \(\$\)/m, | |
60 | 'proto warnings respect AUTOLOAD prototypes'; | |
61 | } |