summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/perl/dist/Devel-PPPort
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.bin/perl/dist/Devel-PPPort')
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/Changes70
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS673
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/MANIFEST.SKIP1
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL150
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs2
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL284
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/RealPPPort_xs.PL128
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/TODO345
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL2
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl29
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl109
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkapidoc.pl132
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkppport_fnc.pl165
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo62
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl364
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate93
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov281
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL25
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl315
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc1519
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5003007549
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500400078
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50040012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50040021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50040031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50040043
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500400549
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005000107
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50050011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50050021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50050035
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50050042
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000361
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500600127
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500700146
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007002100
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500700396
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500800018
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500800150
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50080091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500900014
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50090017
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500900230
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009003118
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500900489
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/500900555
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501000012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501000117
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501100021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50110014
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501100218
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50110042
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130016
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501300212
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130037
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130043
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130057
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501300645
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501300748
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130085
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501300913
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501301012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50130111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50140002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501500115
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150026
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150035
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501500417
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150053
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150069
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150077
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150085
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50150093
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50160008
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170014
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170029
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170036
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501700429
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170053
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170065
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501700711
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501700815
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170092
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170102
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50170111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190015
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501900212
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190036
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501900420
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/501900517
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190064
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190072
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190084
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190093
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50190105
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502100113
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210025
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210032
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502100411
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502100518
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210069
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502100722
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210084
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502100910
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50210106
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50220021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50220031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50220041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230007
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230024
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230062
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50230073
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502300823
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502300926
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502400070
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50240011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50240021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50240031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50240041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250022
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250034
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250044
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502500513
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502500622
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250076
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250082
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502500941
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250105
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50250121
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50260001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50260011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50260021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50260031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270014
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270027
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270035
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270046
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502700610
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270074
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502700833
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/502700920
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270102
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50270114
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50280001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50280011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290023
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290043
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290052
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290062
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290072
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290086
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290099
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50290103
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50300001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50310012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50310023
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50310037
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/503100422
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/503100523
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/503100610
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/503100713
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/50310084
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc2437
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/01_test13
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME6
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV175
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set182
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call144
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop20
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception10
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format57
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok16
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv43
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/inctools127
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/locale58
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH22
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic241
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory4
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess283
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc2170
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB21
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV20
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type22
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv36
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest6
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin336
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc4
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest88
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools34
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs22
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv8
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf4
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf10
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs2
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/subparse29
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf41
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads16
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/utf8926
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv426
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables16
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn2
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc87
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl245
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5003007912
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500400046
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50040055
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050009
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050034
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50050041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000139
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500600112
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500700124
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50070025
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500700354
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080003
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080016
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080081
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50080091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500900015
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50090023
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/500900310
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50090045
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50090058
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50100005
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50100012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501100013
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501100216
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50110041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130025
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130054
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501300610
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501300732
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130084
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130099
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50130103
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150022
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501500411
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150077
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50150091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50160002
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/501700419
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170076
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170085
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170092
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50170111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190022
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190032
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190043
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50190091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210023
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210042
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210056
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210062
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/502100712
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210083
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210091
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50210103
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50220001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50220021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50220031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50220041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230007
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230023
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/502300816
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50230094
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/502400044
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50240011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50240021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50240031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50240041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250012
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250033
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250058
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/502500616
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250075
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250082
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250092
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250102
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50250121
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50260001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50260011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50260021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50260031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270013
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270024
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270034
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270044
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270062
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270072
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270087
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270097
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270101
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50270111
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50280001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50280011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290031
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290041
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290051
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290061
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290071
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290081
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290094
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50290103
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50300001
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50310011
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50310021
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50310036
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/503100413
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/503100523
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50310061
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50310077
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/50310081
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/01_test.t57
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t24
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t18
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t126
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t18
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t74
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t96
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t34
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t28
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t43
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t34
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t30
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t18
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/locale.t67
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t40
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t157
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t20
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t217
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t553
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t24
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t22
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t20
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t34
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t24
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t106
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t52
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t40
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t20
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t22
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t22
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t20
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t36
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl481
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t20
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/utf8.t300
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t158
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t28
-rw-r--r--gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t20
386 files changed, 15708 insertions, 5138 deletions
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/Changes b/gnu/usr.bin/perl/dist/Devel-PPPort/Changes
index ce9add54ea0..2c7a1646639 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/Changes
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/Changes
@@ -1,5 +1,75 @@
Revision history for Devel-PPPort
+ 3.57 - 2020-01-31
+
+ * Fix eval_sv for Perl versions prior to 5.6.0 (Pali)
+ * Fix t/ppphtest.t for Perl versions prior to 5.6.0 (Pali)
+ * Fix compilation of sv_setsv_flags when GCC extensions are not present (Pali)
+ * Fix SV_NOSTEAL on 5.7.2 (Karl Williamson)
+ * Fix multiple unit test issues (Craig A. Berry, Karl Williamson, Pali)
+ * Avoid generating warnings on early Perls (Karl Williamson)
+ * Backport memCHRs (Karl Williamson)
+ * Implement sv_setsv_flags() with SV_NOSTEAL and SV_GMAGIC flags for Perl versions < 5.7.3 (Pali)
+ * Implement UTF8f format and its UTF8fARG macro (Pali)
+
+ 3.56 - 2019-11-25
+
+ * mktests.PL: use FindBin for INC setup
+ * devel/regenerate: Adjust POD line length
+ * Fix compilation with Visual C++ bugs introduced in 3.55 (Tomasz Konojacki)
+ * Fix mess.t failures when on VC++ when $0 contains backslashes (Tomasz Konojacki)
+ * Fix failing builds on 5.20.[1-3] introduced in 3.55 (Karl Williamson)
+ * Change tests to accept and use Test::More-like functions (Karl Williamson)
+
+ 3.55 - 2019-11-07
+
+ * Fix p5-Text-Xslate on Perl 5.8.5 (Nicolas R)
+ * Fix EBCDIC build problem (Karl Williamson)
+ * Fix isGRAPH_L1() bug (Karl Williamson)
+ * utf8_to_uvchr_buf: Fix error checking on early EBCDICs and proper length (Karl Williamson)
+ * HACKERS: fix typos and clarification (Karl Williamson)
+ * Update bugtracker and repository URLs (Nicolas R) (upstream/urls)
+ * Add warning about UTF-8 unreliable in early perls (Karl Williamson)
+ * Add withinCOUNT and inRANGE (Karl Williamson)
+ * Implement G_RETHROW for eval_sv (Pali)
+ * Backport some isFOO_LC macros (Karl Williamson)
+ * Backport isFOO_LC_utf8_safe() (Karl Williamson)
+ * Backport toFOO_uvchr() (Karl Williamson)
+ * Backport isFOO_uvchr() (Karl Williamson)
+ * Backport isFOO_utf8_safe() macros (Karl Williamson)
+ * Backport toLOWER_utf8_safe and kin (Karl Williamson)
+ * Backport UTF8_MAXBYTES_CASE (Karl Williamson)
+ * Backport UTF8_CHK_SKIP (Karl Williamson)
+ * Backport UTF8_SKIP (Karl Williamson)
+ * Backport UNI to/from NATIVE (Karl Williamson)
+
+ 3.54 - 2019-09-27
+
+ * Fix Unix-format path in Devel::PPPort's Makefile.PL
+ * Fix utf8_to_uvchr_buf for 5.7.0
+ * Add hint for utf8_to_uvchr()
+ * Fix hints for is_ascii_string
+ * Use numeric comparisons with $]
+ * Fix 'for loops' to work on early perls
+ * Can't use GCC brace groups before 5.4
+ * Add script to regenerate ppport.fnc
+ * Suppress useless warning
+ * Fix mktests.PL for Perl 5.8.0
+ * Implement sv_len_utf8_nomg() and sv_len_utf8()
+ * Fix eval_pv for Perl versions prior to 5.31.2
+ * Consolidate UTF-8 functions/macros into new file
+ * Implement sv_mortalcopy_flags()
+ * Implement newSVsv_flags()
+ * Enable Perl compile-time warnings at all place
+ * Improve Makefile.PL
+ * Add tests for IVdf, UVuf, IV_MAX and UV_MAX
+
+ 3.53 - 2019-09-27
+
+ * Rename PPPort_xs.PL to RealPPPort_xs.PL
+ * Fix compilation issues with version older than 5.010
+ * Fix compilation issues with version older than 5.010
+
3.52 - 2019-05-14
* fix utf8_to_uvchr_buf retval in 5.30
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS b/gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS
index 8cd57a95d81..03437942b1c 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/HACKERS
@@ -11,266 +11,305 @@ lying around in this distribution.
=head1 DESCRIPTION
-=head2 How to build 366 versions of Perl
+=head2 How to backport something
+
+First, make sure that what you want to backport is documented. If it's worth
+backporting, it surely is worth documenting. Send a documentation patch to
+L<perlbug@perl.org|mailto:perlbug@perl.org> if necessary. Also,
+C<Devel::PPPort> cannot automatically generate proper information about the
+item without at least knowing its API prototype. It can get this from
+F<embed.fnc> if the item is a function, but if it is a macro, there needs to be
+at least a S<C<=for apidoc>> line for C<Devel::PPPort> to be able to figure
+things out on its own.
+
+Next, figure out where to place your implementation. Look at all the files in
+F<parts/inc/> for one that fits what you're planning. If there isn't one,
+just start a new one and remember to include it from within F<PPPort_pm.PL>.
+If you do create a new file, it's usually the best approach to just copy an
+existing file and use it as a template.
-C<Devel::PPPort> supports Perl versions between 5.003 and bleadperl.
-To guarantee this support, I need some of these versions on my
-machine. I currently have 366 different Perl version/configuration
-combinations installed on my laptop.
-
-As many of the old Perl distributions need patching to compile
-cleanly on newer systems (and because building 366 Perls by hand
-just isn't fun), I wrote a tool to build all the different
-versions and configurations. You can find it in F<devel/buildperl.pl>.
-It can currently build the following Perl releases:
+Each file holds all relevant data for implementing a certain part
+of the API:
- 5.003
- 5.004 - 5.004_05
- 5.005 - 5.005_04
- 5.6.x
- 5.7.x
- 5.8.x
- 5.9.x
- 5.1x.x
+=over 2
-=head2 Fully automatic API checks
+=item *
-Knowing which parts of the API are not backwards compatible and
-probably need C<Devel::PPPort> support is another problem that's
-not easy to deal with manually. If you run
+A list of the provided API in the C<=provides> section.
- perl Makefile.PL --with-apicheck
+=item *
-a C file is generated by F<parts/apicheck.pl> that is compiled
-and linked with C<Devel::PPPort>. This C file has the purpose of
-using each of the public API functions/macros once.
+The optional C<=dontwarn> section is used to suppress warnings about particular
+API elements. Don't use this unless you get such a warning, and be sure to
+think about using other other alternatives before resorting to adding something
+in this section.
-The required information is derived from F<parts/embed.fnc> (just
-a copy of bleadperl's F<embed.fnc>), F<parts/apidoc.fnc> (which
-is generated by F<devel/mkapidoc.sh> and simply collects the rest
-of the apidoc entries spread over the Perl source code) and
-F<parts/ppport.fnc> (which lists all API provided purely by
-Devel::PPPort).
-The generated C file F<apicheck.c> is currently about 500k in size
-and takes quite a while to compile.
+=item *
-Usually, F<apicheck.c> won't compile with older perls. And even if
-it compiles, there's still a good chance of the dynamic linker
-failing at C<make test> time. But that's on purpose!
+The implementation to add to F<ppport.h> in the C<=implementation>
+section. See L</Implementation Section Details>.
-We can use these failures to find changes in the API automatically.
-The two Perl scripts F<devel/mktodo> and F<devel/mktodo.pl>
-repeatedly run C<Devel::PPPort> with the apicheck code through
-all different versions of perl. Scanning the output of the compiler
-and the dynamic linker for errors, the files in F<parts/todo/> are
-generated. These files list all parts of the public API that don't
-work with less than a certain version of Perl.
-
-This information is in turn used by F<parts/apicheck.pl> to mask
-API calls in the generated C file for these versions, so the
-process can be stopped by the time F<apicheck.c> compiles cleanly
-and the dynamic linker is happy. (Actually, this process may generate
-false positives, so by default each API call is checked once more
-afterwards.)
-
-Running F<devel/mktodo> takes about an hour, depending of course
-on the machine you're running it on. If you run it with
-the C<--nocheck> option, it won't recheck the API calls that failed
-in the compilation stage and it'll take significantly less time.
-Running with C<--nocheck> should usually be safe.
-
-When running F<devel/mktodo> with the C<--base> option, it will
-generate the I<baseline> todo files by disabling all functionality
-provided by C<Devel::PPPort>. These are required for implementing
-the C<--compat-version> option of the F<ppport.h> script. The
-baseline todo files hold the information about which version of
-Perl lacks a certain part of the API.
-
-However, only the documented public API can be checked this way.
-And since C<Devel::PPPort> provides more macros, these would not be
-affected by C<--compat-version>. It's the job of F<devel/scanprov>
-to figure out the baseline information for all remaining provided
-macros by scanning the include files in the F<CORE> directory of
-various Perl versions.
-
-The whole process isn't platform independent. It has currently been
-tested only under Linux, and it definitely requires at least C<gcc> and
-the C<nm> utility.
-
-It's not very often that one has to regenerate the baseline and todo
-files. If you have to, you can either run F<devel/regenerate> or just
-execute the following steps by hand:
+=item *
-=over 4
+The code required to add to PPPort.xs for testing the implementation.
+This code goes into the C<=xshead>, C<=xsinit>, C<=xsmisc>, C<=xsboot>
+and C<=xsubs> section. Have a look at the template at the bottom
+of F<RealPPPort_xs.PL> to see where the code ends up.
=item *
-You need a whole bunch of different Perls. The more, the better.
-You can use F<devel/buildperl.pl> to build them. I keep my perls
-in F</tmp/perl>, so most of the tools take this as a default.
+The tests in the C<=tests> section. Remember not to use any fancy
+modules or syntax elements, as the test code needs to be able to run
+with Perl 5.003. (This is because Devel::PPPort itself will run all test files
+in the process of generating the information about when a feature came into
+existence.) This means, for example
-=item *
+=over
-You also need a freshly built bleadperl that is in the path under
-exactly this name. (The name of the executable is currently hardcoded
-in F<devel/mktodo> and F<devel/scanprov>.)
+=item C<my> isn't supported in C<for>-loops
-=item *
+ for my $x (1, 2, 3) { } # won't work with 5.003
-Remove all existing todo files in the F<parts/base> and
-F<parts/todo> directories.
+Instead declare C<$x> just before the statement
-=item *
+=item The postfix C<for> statement modifier isn't supported
-Update the API information. Copy the latest F<embed.fnc> file from
-bleadperl to the F<parts> directory and run F<devel/mkapidoc.sh> to
-collect the remaining information in F<parts/apidoc.fnc>.
+ foo for 1..2
-=item *
+won't compile. Instead enclose C<foo> in a loop.
-Build the new baseline by running
+=item You can't use plain C<qr//>
- perl devel/mktodo --base
+Instead, wrap it in a string eval C<eval "qr//">, and be sure it's skipped at
+execution time on perls earlier than 5.005
-in the root directory of the distribution. When it's finished,
-move all files from the F<parts/todo> directory to F<parts/base>.
+=back
-=item *
+As of version 3.56 of Devel::PPPort, the old Test style tests have been
+replaced with the more modern Test::More style, with some limitations. This
+means, for example, that C<is> is finally available, as well as
+C<done_testing>. You can pass the number of tests to C<skip>, instead of
+having to have your own C<for> loop.
+
+There is no C<like> nor C<unlike> (as those require C<qr> which didn't exist in
+the earliest perls that Devel::PPPort runs on).
+
+C<skip> doesn't do a S<C<last SKIP>>. (Perhaps it could, but that would mean
+converting all the skips in the existing tests.)
+
+The existing tests have been changed only as much as necessary so as to get
+things to work. But feel free to use the full functionality for any new tests
+you write.
+
+Here's a list of the supported functions:
+
+ cmp_ok
+ curr_test
+ diag
+ display
+ done_testing
+ eq_array
+ eq_hash
+ fail
+ is
+ isnt
+ next_test
+ note
+ ok
+ pass
+ plan
+ skip
+ skip_all
+ within
+
+These are copied from F<t/test.pl> in the perl distribution. Not all of them
+have been tested back as far as Devel::PPPort supports. Bug reports welcome.
+
+It's fine to backport an element only as far as convenient and necessary. But
+remember that your test file will end up being called on all perl versions
+available, likely including ones earlier than your backport. That may mean
+that elements in the C<=xs> sections will have to be C<#idef>'d out so that the
+object will not get missing symbols when loaded.
+
+It also means you have to check for and skip tests that aren't relevant to this
+version. The recommended way to do this is like:
+
+ if (ivers($]) < ivers(5.6.2)) {
+ skip "reason", $count;
+ }
+ elsif (if (ivers($]) > ivers(5.5) {
+ skip "other reason", $count;
+ }
+
+C<ivers()> is a function automatically made available to all F<.t> files. It
+converts any reasonble expression of a version number into an integer, which
+can reliably be compared using numeric comparison operators, with the output of
+a second C<ivers()> call on a different version number, like in the result above.
-Build the new todo files by running
+=back
- perl devel/mktodo
+In all sections, lines that begin with C<##> are completely ignored.
-in the root directory of the distribution.
+=head2 Implementation Section Details
-=item *
+You can implement API elements via C functions or macros, or simple variables.
+For a function, just place its body in this C<=implementation> section. But it
+is preferable to use a macro if feasible. Otherwise, the user must explicitly
+request that it get loaded, by defining a C<NEED_I<function>> (or I<variable>)
+as described in F<ppport.h>.
-Finally, add the remaining baseline information by running
+=over
- perl Makefile.PL && make
- perl devel/scanprov --mode=write
+=item __UNDEFINED__
-=back
+If you add the line C<__UNDEFINED__> to the C<=provides> section, you can use
+lines like this in the C<=implementation> section:
-=head2 Implementation
+ __UNDEFINED__ macro some definition
-Residing in F<parts/inc/> is the "heart" of C<Devel::PPPort>. Each
-of the files implements a part of the supported API, along with
-hints, dependency information, XS code and tests.
-The files are in a POD-like format that is parsed using the
-functions in F<parts/ppptools.pl>.
+to both define C<macro> and indicate that it is provided by F<ppport.h>. This
+replaces these C<=implementation> section lines:
-The scripts F<PPPort_pm.PL>, F<PPPort_xs.PL> and F<mktests.PL> all
-use the information in F<parts/inc/> to generate the main module
-F<PPPort.pm>, the XS code in F<RealPPPort.xs> and various test files
-in F<t/>.
+ #ifndef macro
+ # define macro some definition
+ #endif
-All of these files could be generated on the fly while building
-C<Devel::PPPort>, but not having the tests in F<t/> will confuse
-TEST/harness in the core. Not having F<PPPort.pm> will be bad for
-viewing the docs on C<search.cpan.org>. So unfortunately, it's
-unavoidable to put some redundancy into the package.
+besides automagically making it be considered to be provided. C<macro> can
+have optional arguments and the definition can even span multiple lines, like
+in
-=head2 Adding stuff to Devel::PPPort
+ __UNDEFINED__ SvMAGIC_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } \
+ STMT_END
-First, check if the code you plan to add fits into one of the
-existing files in F<parts/inc/>. If not, just start a new one and
-remember to include it from within F<PPPort_pm.PL>.
+This usually makes the code more compact and readable.
-Each file holds all relevant data for implementing a certain part
-of the API:
+But you should only use this on things that you plan to publicly provide. If
+something, such as a mnemonic for a constant needs to be defined but isn't
+really needed for the public at large to know about, you should use
-=over 2
+ __UNDEF_NOT_PROVIDED__ macro some definition
-=item *
+instead. To avoid name space conflicts, follow what's in L</Helper macros>,
+below.
-A list of the provided API in the C<=provides> section.
+=item Helper macros
-=item *
+If you need to define a helper macro which is not part of C<Devel::PPPort> API
+and its usage is only for the definition of other C<Devel::PPPort> macros, then
+use the C<D_PPP_> prefix for this macro name (e.g. C<D_PPP_SVPV_NOLEN_LP_ARG>).
+This suppresses any warnings when a macro is defined which is not part of the
+Perl public API.
-The implementation to add to F<ppport.h> in the C<=implementation>
-section.
+=item Version numbers
-=item *
+Version checking can be tricky to get correct (besides being buggy in some perl
+versions).
+C<ivers()> is used in the C<=tests> section to overcome this, and constructs
+like the following in the C language sections.
-The code required to add to PPPort.xs for testing the implementation.
-This code goes into the C<=xshead>, C<=xsinit>, C<=xsmisc>, C<=xsboot>
-and C<=xsubs> section. Have a look at the template at the bottom
-of F<PPPort_xs.PL> to see where the code ends up.
+ #if { VERSION < 5.9.3 }
-=item *
+instead of
-The tests in the C<=tests> section. Remember not to use any fancy
-modules or syntax elements, as the test code should be able to run
-with Perl 5.003, which, for example, doesn't support C<my> in
-C<for>-loops:
+ #if ((PERL_VERSION < 9) \
+ || (PERL_VERSION == 9 && PERL_SUBVERSION < 3))
- for my $x (1, 2, 3) { } # won't work with 5.003
+The version number can be either of the new form C<5.x.x> or the older
+form C<5.00x_yy>. Both are translated into the correct preprocessor
+statements. It is also possible to combine this with other statements:
+
+ #if { VERSION >= 5.004 } && !defined(sv_vcatpvf)
+ /* a */
+ #elif { VERSION < 5.004_63 } && { VERSION != 5.004_05 }
+ /* b */
+ #endif
-You can use C<ok()> to report success or failure:
+This not only works in the C<=implementation> section, but also in
+the C<=xsubs>, C<=xsinit>, C<=xsmisc>, C<=xshead> and C<=xsboot> sections.
- ok($got == 42);
- ok($got, $expected);
+=item Hints
-Regular expressions are not supported as the second argument to C<ok>,
-because older perls do not support the C<qr> operator.
+If you add a comment like so:
-=back
+ /* Hint: PL_expect, PL_copline, PL_rsfp
+ paragraphs of stuff about foo you want to have
+ shown when ppport.h outputs something about PL_expect or
+ PL_copline or PL_rsfp
+ */
-It's usually the best approach to just copy an existing file and
-use it as a template.
+Earlier versions of F<ppport.h> required an asterisk at the beginning of every
+continuation line, or else the content would be silently dropped.
-=head2 Implementation Hints
+=item Warnings
-In the C<=implementation> section, you can use
+A more serious caution about C<foo> can be displayed by instead saying
- __UNDEFINED__ macro some definition
+ /* Warning: PL_expect, PL_copline, PL_rsfp
+ paragraphs of stuff about foo you want to have
+ shown when ppport.h outputs something about PL_expect or
+ PL_copline or PL_rsfp
+ */
-instead of
+Earlier versions of F<ppport.h> required an asterisk at the beginning of every
+continuation line, or else the content would be silently dropped.
- #ifndef macro
- # define macro some definition
- #endif
+=item Replace
-The macro can have optional arguments and the definition can even
-span multiple lines, like in
+When F<ppport.h> is run on a file(s), you can cause it to automatically flag
+occurrences of the constructs you specify, encouraging the author to replace
+them with different (presumably better) ones. These also are used in any
+suggested edits and generated patches.
- __UNDEFINED__ SvMAGIC_set(sv, val) \
- STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
- (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+There are three ways to do this
-This usually makes the code more compact and readable. And you only have to add
-the line C<__UNDEFINED__> to the C<=provides> section to get all macros
-implemented this way to be imported into this section, so they all get
-documented as being provided.
+=over 4
-Version checking can be tricky if you want to do it correct.
-You can use
+=item in-line comment
- #if { VERSION < 5.9.3 }
+You can add a trailing comment like so:
-instead of
+ #define bar foo /* Replace */
+ __UNDEFINED__ bar foo /* Replace */
- #if ((PERL_VERSION < 9) || (PERL_VERSION == 9 && PERL_SUBVERSION < 3))
+These say that C<foo> should be replaced by C<bar>. NOT the other way around.
-The version number can be either of the new form C<5.x.x> or of the older
-form C<5.00x_yy>. Both are translated into the correct preprocessor
-statements. It is also possible to combine this with other statements:
+=item separate comment
- #if { VERSION >= 5.004 } && !defined(sv_vcatpvf)
- /* a */
- #elif { VERSION < 5.004_63 } && { VERSION != 5.004_05 }
- /* b */
- #endif
+For situations not amenable to the above, you can say
-This not only works in the C<=implementation> section, but also in
-the C<=xsubs>, C<=xsinit>, C<=xsmisc>, C<=xshead> and C<=xsboot> sections.
+ /* Replace foo with bar */
+
+=item define a replacement region
+
+It you have several replacements, you can group them together like so:
+
+ /* Replace: 1 */
+ #define foo bar
+ #define bat baz
+ /* Replace: 0 */
+
+These replace C<bar> with C<foo>; C<baz> with C<bat>. NOT the other way
+around.
+
+=back
+
+=item Dependencies
+
+F<ppport.h> automatically gathers information as to what functions are
+dependent on what other things from inspecting the source, but if this is
+insufficient for you, you can add lines like the following:
+
+ /* foo, bar depends on baz, bat */
+
+Each of C<foo>, C<bar> depends on each of C<baz>, C<bat>.
+
+=back
=head2 Testing
-To automatically test C<Devel::PPPort> with lots of different Perl
-versions, you can use the F<soak> script. Just pass it a list of
-all Perl binaries you want to test.
+After you have furnished your implementation, you need to test it.
=head2 Special Makefile targets
@@ -286,11 +325,256 @@ use
That's it.
+To automatically test C<Devel::PPPort> with lots of different Perl
+versions, you can use the F<soak> script. Just pass it a list of
+all Perl binaries you want to test.
+
+=head2 Regenerating F<ppport.h> and F<PPPort.pm>
+
+C<Devel::PPPort> keeps two directories of generated files, in F<parts/base> and
+F<parts/todo>. The files in each are named after Perl version numbers. When a
+function or macro came into existence is indicated by placing its name in the
+corresponding file in F<parts/base>. The files in F<parts/todo> are the same,
+except they indicate the earliest release that F<ppport.h> supports the
+element. The delta is effectively what F<ppport.h> buys you.
+
+The generation process described in this section creates these files. It does
+so by examining as many perl versions as are available to it. It tries to make
+sure each element actually compiles, and it runs the test scripts you have
+furnished on every version.
+
+Ideally, this should be done before every release that includes new backporting
+and/or when blead has added new public API. At a minimum, it should be done as
+the next major Perl release comes out.
+
+The process isn't platform independent. It has currently been tested only under
+Linux, and it definitely requires at least C<gcc> and the C<nm> utility.
+The process used to be problematic, with random failures. But it has now been
+fixed to be reliable.
+
+Before starting the regeneration, you need to have gathered certain data.
+(Options listed below apply to the tools that eventually will use the data, and
+which are described further below).
+
+=over 4
+
+=item *
+
+You will first need a whole bunch of different Perls, the more, the better, but
+only one per version tag (which one is random) will actually get used.
+dromedary has a sufficient set. They should all have the same Configure
+options with respect to what functions and macros are enabled. For example,
+they should all be threaded, or all non-threaded. A mixture will screw up the
+results. Similarly, they should all or none have quad math (at least as far
+back as that became available). You can use F<devel/buildperl.pl> to build
+them.
+
+Previous maintainers of this module kept those perls in
+F</tmp/perl/install/default>, so most of the tools use this as a default, but
+you'll likely simply use the C<--install=> option to specify where. This
+should be a path where a S<C<make install>> has been done, so has immediate
+subdirectories of C</bin> and C</lib>. C</bin> should contain the binaries.
+It will use all files in this directory whose names begin with C<perl5>.
+
+Actually, not all the binaries need be in this directory. You can specify
+additional places to look since C<--install=> takes a comma separated list of
+directories.
+
+=item *
+
+You also need a freshly built bleadperl. The C<--blead=I<path>> option should
+be used to specify it. (Some of the tools have a default of C<bleadperl-debug>
+if this option is omitted.) Again, it needs the same Configure options as the
+earlier versions had. Using C<-DNO_MATHOMS> will change the results, and
+probably should be avoided. True, these functions are allegedly on their way
+out, so it could be argued that they shouldn't be encouraged in any way; but
+some of these have been in limbo for many years, so should be documented.
+
+=item *
+
+And you will need updated API information. Copy the latest F<embed.fnc> file
+from bleadperl to the F<parts> directory and run F<devel/mkapidoc.pl> to
+collect the remaining information in F<parts/apidoc.fnc>.
+
+=item *
+
+The final step before regenerating everything is to run
+F</devel/mkppport_fnc.pl> to update the F</parts/ppport.fnc> file.
+
+=back
+
+Having done this, run F<devel/regenerate> which wraps the following steps
+(which you could instead do by hand, but it's easy to forget things):
+
+=over
+
+=item *
+
+It first does some sanity checking
+
+=item *
+
+Then it asks you if it's ok to remove all existing todo files in the
+F<parts/base> and F<parts/todo> directories. If you answer no, the process
+aborts.
+
+This is crtical to getting accurate results.
+
+=item *
+
+It builds the new baseline by running
+
+ perl devel/mktodo --base
+
+in the root directory of the distribution.
+
+If there are warnings in blead, it will ask you to examine them, and to ok if
+it's all right to go ahead. If there are issues with blead, everything
+following could be wrong.
+
+=item *
+
+It builds the new todo files by running
+
+ perl devel/mktodo
+
+in the root directory of the distribution.
+
+=item *
+
+Finally, it adds the remaining information by running
+
+ perl Makefile.PL && make
+ perl devel/scanprov --mode=write
+
+=back
+
+=head2 How to build gobs of versions of Perl
+
+C<Devel::PPPort> supports Perl versions between 5.003 and bleadperl.
+To guarantee this support, its good to have as many versions as possible to
+test on. dromedary currently has many such versions.
+
+There is a tool to build all the different
+versions and configurations. You can find it in F<devel/buildperl.pl>.
+It can currently build the following Perl releases:
+
+ 5.003
+ 5.004 - 5.004_05
+ 5.005 - 5.005_04
+ 5.6.x
+ 5.7.x
+ 5.8.x
+ 5.9.x
+ 5.1x.x
+ 5.2x.x
+ 5.3x.x
+
+=head2 Implementation
+
+Knowing which parts of the API are not backwards compatible and
+probably need C<Devel::PPPort> support is another problem that's
+not easy to deal with manually. If you run
+
+ perl Makefile.PL --with-apicheck
+
+a C file is generated by F<parts/apicheck.pl> that is compiled
+and linked with C<Devel::PPPort>. This C file has the purpose of
+using each of the public API functions/macros once.
+
+The required information is derived from F<parts/embed.fnc> (just
+a copy of bleadperl's F<embed.fnc>), F<parts/apidoc.fnc> (which
+is generated by F<devel/mkapidoc.pl> and simply collects the rest
+of the apidoc entries spread over the Perl source code) and
+F<parts/ppport.fnc> (which lists the API provided purely by
+Devel::PPPort, along with other elements that are tested only using
+F<ppport.h>).
+
+The generated C file (usually, F<apicheck.c>) won't compile as-is
+with older perls. And even if it compiles, there's still a good chance of the
+dynamic linker failing at C<make test> time. But that's on purpose!
+
+We can use these failures to find changes in the API automatically.
+The Perl script F<devel/mktodo> calls another script F<devel/mktodo.pl>
+repeatedly to run C<Devel::PPPort> on version after version of perl, in
+decreasing version order, so we start with blead and work backwards. The
+latter script generates an F<apicheck.c>. It starts with the code that
+successfully worked in the previously tested Perl version, which should be the
+version one higher than the current one. Call the current one I<n>, and the
+previous one I<n+1>. The items that fail to compile in I<n>, but did compile
+in I<n+1> must have become available in I<n+1>. We run the Linux command C<nm>
+to find those undefined symbols in I<n>. We change F<apicheck.c> to ignore
+(through C<#ifdef>'s) those and recompile, repeating until F<apicheck.c>
+successfully compiles, the dynamic linker is happy, and C<make test> runs on
+this version. Then we repeat the process for I<n-1>, and so on. (Actually,
+this process may generate false positives, so by default each failing API call
+is checked again. If possible, this is done by generating an F<apicheck.c> for
+just the one failing API.) Note that the make test is run using F<ppport.h>
+during both passes.
+
+Running F<devel/mktodo> currently takes a couple hours on dromedary.
+
+If you run it with the C<--nocheck> option, it won't recheck the API calls
+that failed in the compilation stage and it'll take significantly less time.
+No one currently associated with maintaining this module understands under what
+circumstances it is safe to run with C<--nocheck>.
+
+By repeating the process over and over, we build up information on when every
+element first became supported. This information is stored in files in the
+F<parts/base> directory, one file per version. The file for version I<n+1> is
+generated by running version I<n> of perl.
+
+We actually want a second piece of information, which is how much F<ppport.h>
+buys you. What happens when regenerating is actually two entire runs through
+all the perls. The first is accomplished by calling F<devel/mktodo> with the
+C<--base> option. It automically will call F<devel/mktodo.pl> with each
+version of perl, NOT using anything in F<ppport.h>. When done the results
+indicate when each API element became available in stock perl, without using
+F<ppport.h>.
+
+And then the whole process is repeated, but this time F<ppport.h> is included.
+The files are placed in F<parts/todo>. Thus, at the end, we know when each
+element became available in modified perl, using F<ppport.h>.
+
+However, only the public API that is implemented as functions (and must appear
+in F<embed.fnc>) plus macros whose calling sequence is documented can be
+checked this way. The final step in the process is calling F<devel/scanprov>.
+It looks through the header files for when all the symbols provided by
+C<Devel::PPPort> first became defined. It doesn't test the symbols or try to
+compile them, as it doesn't generally know the API, but it can tell that
+something exists in release I<n+1> but not I<n> (by scanning the include files
+in the F<CORE> directory of various Perl versions). (It does know if a macro
+has zero arguments or non-zero arguments, so it does get extra information from
+the zero argument ones.)
+
+=head2 Files
+
+Residing in F<parts/inc/> is the "heart" of C<Devel::PPPort>. Each
+of the files implements a part of the supported API, along with
+hints, dependency information, XS code and tests.
+The files are in a POD-like format that is parsed using the
+functions in F<parts/ppptools.pl>.
+
+The scripts F<PPPort_pm.PL>, F<RealPPPort_xs.PL> and F<mktests.PL> all
+use the information in F<parts/inc/> to generate the main module
+F<PPPort.pm>, the XS code in F<RealPPPort.xs> and various test files
+in F<t/>.
+
+You can get extra information from F<PPPort_pm.PL> by setting the environment
+variable C<DPPP_CHECK_LEVEL> to 1 or 2.
+
+All of these files could be generated on the fly while building
+C<Devel::PPPort>, but not having the tests in F<t/> will confuse
+TEST/harness in the core. Not having F<PPPort.pm> will be bad for
+viewing the docs on C<search.cpan.org>. So unfortunately, it's
+unavoidable to put some redundancy into the package.
+
=head2 Submitting Patches
If you've added some functionality to C<Devel::PPPort>, please
-consider submitting a patch with your work to P5P by sending a mail
-L<perlbug@perl.org|mailto:perlbug@perl.org>.
+consider submitting a patch with your work to P5P by sending a pull request to
+
+L<https://github.com/Dual-Life/Devel-PPPort/pulls>.
When submitting patches, please only add the relevant changes
and don't include the differences of the generated files. You
@@ -308,9 +592,14 @@ module in the core:
META.yml
PPPort.pm
+=head1 BUGS
+
+No known bugs.
+
=head1 COPYRIGHT
-Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+Version 3.x, Copyright (C) 2004-2019, Marcus Holland-Moritz
+and Perl 5 porters
Version 2.x, Copyright (C) 2001, Paul Marquess.
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/MANIFEST.SKIP b/gnu/usr.bin/perl/dist/Devel-PPPort/MANIFEST.SKIP
index 05f98d45590..90b86af73c5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/MANIFEST.SKIP
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/MANIFEST.SKIP
@@ -17,7 +17,6 @@
^parts/base-
^ppport\.h$
^PPPort\.c$
-^PPPort.pm$
^RealPPPort\.
^testing
Devel-PPPort.*
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL
index 62ba014cf66..bc5f502e98c 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/Makefile.PL
@@ -16,10 +16,21 @@
require 5.003;
use strict;
+BEGIN { $^W = 1; }
+
use ExtUtils::MakeMaker;
+use Config;
use vars '%opt'; # needs to be global, and we can't use 'our'
+sub cat_file
+{
+ eval { require File::Spec };
+ return $@ ? join('/', @_) : File::Spec->catfile(@_);
+}
+
+my $t_01_test = cat_file('t', '01_test.t');
+
unless ($ENV{'PERL_CORE'}) {
$ENV{'PERL_CORE'} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
}
@@ -27,39 +38,76 @@ unless ($ENV{'PERL_CORE'}) {
@ARGV = map { /^--with-(apicheck)$/ && ++$opt{$1} ? () : $_ } @ARGV;
my %mf = (
- NAME => 'Devel::PPPort',
- VERSION_FROM => 'PPPort_pm.PL',
- PM => { 'PPPort.pm' => '$(INST_LIBDIR)/PPPort.pm' },
- H => [ qw(ppport.h) ],
- OBJECT => 'RealPPPort$(OBJ_EXT) $(O_FILES)',
- XSPROTOARG => '-noprototypes',
- CONFIGURE => \&configure,
+ NAME => 'Devel::PPPort',
+ VERSION_FROM => 'PPPort_pm.PL',
+ PM => { 'PPPort.pm' => '$(INST_LIBDIR)/PPPort.pm' },
+ H => [ qw(ppport.h) ],
+ OBJECT => 'RealPPPort$(OBJ_EXT) $(O_FILES)',
+ XSPROTOARG => '-noprototypes',
+ CONFIGURE => \&configure,
+ BUILD_REQUIRES => {
+ "FindBin" => "0",
+ },
);
-delete $mf{META_MERGE} unless eval { ExtUtils::MakeMaker->VERSION (6.46) };
WriteMakefile(%mf);
sub configure
{
my @clean = qw{ $(H_FILES) RealPPPort.xs RealPPPort.c PPPort.pm };
- my %depend = ('$(OBJECT)' => '$(H_FILES)');
+ my %depend = (
+ '$(OBJECT)' => '$(H_FILES)',
+ 'Makefile' => '$(VERSION_FROM)',
+ );
my @C_FILES = qw{ module2.c module3.c },
my %PL_FILES = (
'ppport_h.PL' => 'ppport.h',
'PPPort_pm.PL' => 'PPPort.pm',
- 'PPPort_xs.PL' => 'RealPPPort.xs',
+ 'RealPPPort_xs.PL' => 'RealPPPort.xs',
+ 'mktests.PL' => $t_01_test,
);
my @moreopts;
- if (eval $ExtUtils::MakeMaker::VERSION >= 6) {
+ if (eval { ExtUtils::MakeMaker->VERSION(6) }) {
push @moreopts, AUTHOR => 'Marcus Holland-Moritz <mhx@cpan.org>';
- push @moreopts, ABSTRACT_FROM => 'PPPort_pm.PL';
+ push @moreopts, ABSTRACT => 'Perl/Pollution/Portability';
}
- if (eval $ExtUtils::MakeMaker::VERSION >= 6.30_01) {
+ if (eval { ExtUtils::MakeMaker->VERSION(6.30_01) }) {
print "Setting license tag...\n";
push @moreopts, LICENSE => 'perl';
}
+ if (eval { ExtUtils::MakeMaker->VERSION (6.46) }) {
+ open FH, '<PPPort_pm.PL' or die "cannot open PPPort_pm.PL for reading: $!";
+ my $version;
+ my $line;
+ while ($line = <FH>) {
+ ($version) = $line =~ /^\$VERSION = '([\d.]+(_\d+)?)';$/ and last;
+ };
+ die 'failed to extract $VERSION from PPPort_pm.PL' if not $version;
+ close FH;
+ print "Adding META_MERGE...\n";
+ push @moreopts, META_MERGE => {
+ 'meta-spec' => { version => 2 },
+ provides => {
+ 'Devel::PPPort' => {
+ file => 'PPPort.pm',
+ version => $version,
+ },
+ },
+ resources => {
+ bugtracker => {
+ web => 'https://github.com/Dual-Life/Devel-PPPort/issues',
+ },
+ repository => {
+ type => 'git',
+ url => 'git://github.com/Dual-Life/Devel-PPPort.git',
+ web => 'https://github.com/Dual-Life/Devel-PPPort',
+ },
+ },
+ };
+ }
+
if (not $ENV{'PERL_CORE'}) {
# Devel::PPPort is in the core since 5.7.3
# 5.11.0+ has site before perl
@@ -77,13 +125,11 @@ sub configure
$depend{'apicheck.i'} = 'ppport.h';
}
- open my $fh, '<', 'PPPort_pm.PL' or die "cannot open PPPort_pm.PL for reading: $!";
- my $version;
- while (my $line = <$fh>) {
- ($version) = $line =~ /^\$VERSION = '([\d.]+)';$/ and last;
- };
- die 'failed to extract $VERSION from PPPort_pm.PL' if not $version;
- close $fh;
+ if ($Config{gccversion}) {
+ my $define = '-W -Wall';
+ $define .= ' -Wdeclaration-after-statement' if $Config{gccversion} =~ /^(\d+\.\d+)\./ && $1 >= 3.4;
+ push @moreopts, DEFINE => $define;
+ }
return {
C => \@C_FILES,
@@ -91,25 +137,6 @@ sub configure
PL_FILES => \%PL_FILES,
depend => \%depend,
clean => { FILES => "@clean" },
- META_MERGE => {
- 'meta-spec' => { version => 2 },
- provides => {
- 'Devel::PPPort' => {
- file => 'PPPort_pm.PL',
- version => $version,
- },
- },
- resources => {
- bugtracker => {
- web => 'https://rt.perl.org/rt3/',
- },
- repository => {
- type => 'git',
- url => 'git://perl5.git.perl.org/perl.git',
- web => 'https://perl5.git.perl.org/perl.git',
- },
- },
- },
@moreopts,
};
}
@@ -127,7 +154,7 @@ regen_pm:
$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) PPPort_pm.PL
regen_xs:
- $(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) PPPort_xs.PL
+ $(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) RealPPPort_xs.PL
regen_tests:
$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) mktests.PL
@@ -141,6 +168,45 @@ POSTAMBLE
return $post;
}
+sub MY::processPL
+{
+ package MY;
+ my $original = shift->SUPER::processPL(@_);
+
+ require "./parts/ppptools.pl";
+ my $includes = join ' ', all_files_in_dir('parts/inc');
+
+ my $updated = '';
+ my @rules = split( m{^\s*$}m, $original );
+ my $rule;
+ foreach $rule ( @rules ) {
+ if ( $rule =~ m{^\s*^PPPort\.pm\s+:}m ) {
+ $rule =~ s{^(\s*^PPPort\.pm\s+:.*)}{$1 $includes}m; # PPPort.pm depends on all files from parts/inc
+ $rule =~ s{pm_to_blib}{}m; # PPPort.pm must not depend on built PPPort.pm in blib/
+ } elsif ( $rule =~ m{^\s*^ppport\.h\s+:}m ) {
+ $rule =~ s{^(\s*^ppport\.h\s+:.*)}{$1 PPPort.pm}m; # ppport.h depends on PPPort.pm
+ $rule =~ s{pm_to_blib}{}m; # ppport.h is used to build RealPPPort.xs so cannot depend on built PPPort in blib/
+ } elsif ( $rule =~ m{^\s*^RealPPPort\.xs\s+:}m ) {
+ $rule =~ s{^(\s*^RealPPPort\.xs\s+:.*)}{$1 ppport.h}m; # RealPPPort.xs depends on ppport.h
+ $rule =~ s{pm_to_blib}{}m; # RealPPPort.xs is used to build PPPort binary, so it cannot depend on it
+ } elsif ( $rule =~ m{^\s*\S+\b01_test\.t\s+:}m ) {
+ $rule =~ s{^(\s*^\S+\b01_test\.t\s+:.*)}{$1 $includes}m; # all tests in t/ depends on all files from parts/inc
+ $rule =~ s{pm_to_blib}{}m; # Generating test files does not depend on built PPPort in blib/
+ }
+ $updated .= $rule;
+ }
+
+ # All test targets depends on pure_all target, so ensure that t/01_test.t generated by mktests.PL is up-to-date
+ $updated .= <<"TESTS_IN_T";
+
+pure_all :: $t_01_test
+ \$(NOECHO) \$(NOOP)
+
+TESTS_IN_T
+
+ return $updated;
+}
+
sub MY::dist_core
{
package MY;
@@ -148,8 +214,10 @@ sub MY::dist_core
my $updated = '';
my @rules = split( m{^\s*$}m, $dist );
- foreach my $rule ( @rules ) {
+ my $rule;
+ foreach $rule ( @rules ) {
if ( $rule =~ m{^\s*^dist\s+:}m ) {
+ $rule =~ s{:}{: PPPort.pm manifest}; # make sure we update PPPort.pm
$rule .= qq[\t].q[$(NOECHO) $(ECHO) "Warning: Please check '__MAX_PERL__' value in PPPort_pm.PL"].qq[\n];
}
$updated .= $rule;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs
index 2586824ebb0..72d4cabd47b 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort.xs
@@ -1,3 +1,3 @@
This is just a dummy file to let Configure know that Devel::PPPort
-is an XS module. The real XS code is autogenerated from PPPort_xs.PL
+is an XS module. The real XS code is autogenerated from RealPPPort_xs.PL
when this module is built and will go to RealPPPort.xs.
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL
index abce21de2ef..f578954c198 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/PPPort_pm.PL
@@ -2,6 +2,9 @@
#
# PPPort_pm.PL -- generate PPPort.pm
#
+# Set the environment variable DPPP_CHECK_LEVEL to more than zero for some
+# extra checking. 1 or 2 currently
+
################################################################################
#
# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
@@ -15,27 +18,42 @@
################################################################################
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
require "./parts/ppptools.pl";
+require "./parts/inc/inctools";
my $INCLUDE = 'parts/inc';
my $DPPP = 'DPPP_';
+# The keys of %embed are the names of the items found in all the .fnc files,
+# and each value is all the information parse_embed returns for that item.
my %embed = map { ( $_->{name} => $_ ) }
parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc));
my(%provides, %prototypes, %explicit);
my $data = do { local $/; <DATA> };
+
+# Call include(file, params) for every line that begins with %include
+# These fill in %provides and %prototypes.
+# The keys of %provides are the items provided by Devel::PPPort, and each
+# value is the name of the file (in parts/inc/) that has the code to provide
+# it.
+# An entry in %prototypes looks like:
+# 'grok_bin' => 'UV grok_bin(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result)',
+
$data =~ s{^\%(include)\s+(\w+)((?:[^\S\r\n]+.*?)?)\s*$}
{eval "$1('$2', $3)" or die $@}gem;
+# And expand it.
$data = expand($data);
-my @api = sort { lc $a cmp lc $b or $a cmp $b } keys %provides;
+# Just the list of provided items.
+my @provided = sort dictionary_order keys %provides;
+# which further expands $data.
$data =~ s{^(.*)__PROVIDED_API__(\s*?)^}
- {join '', map "$1$_\n", @api}gem;
+ {join '', map "$1$_\n", @provided}gem;
{
my $len = 0;
@@ -49,79 +67,182 @@ $data =~ s!^(.*)__EXPLICIT_API__(\s*?)^!
sprintf("$1$format\n", 'Function / Variable', 'Static Request', 'Global Request') .
$1 . '-'x$len . "\n" .
join('', map { sprintf "$1$format\n", $explicit{$_} eq 'var' ? $_ : "$_()", "NEED_$_", "NEED_${_}_GLOBAL" }
- sort keys %explicit)
+ sort dictionary_order keys %explicit)
!gem;
}
+# These hashes look like:
+# { ... 'gv_check' => '5.003007',
+# 'gv_const_sv' => '5.009003',
+# 'gv_dump' => '5.006000',
+# ... },
+
+# What's provided when without ppport.h, as far as we've been able to
+# determine
my %raw_base = %{&parse_todo('parts/base')};
+
+# What's provided when using ppport.h, as far as we've been able to
+# determine
my %raw_todo = %{&parse_todo('parts/todo')};
+# Invert so each key is the 7 digit version number, and it's value is an array
+# of all symbols within it, like:
+# '5005003' => [
+# 'POPpx',
+# 'get_vtbl',
+# 'save_generic_svref'
+# ],
my %todo;
for (keys %raw_todo) {
- push @{$todo{$raw_todo{$_}}}, $_;
+ push @{$todo{int_parse_version($raw_todo{$_}{version})}}, $_;
}
-# check consistency
-for (@api) {
- if (exists $raw_todo{$_} and exists $raw_base{$_}) {
- if ($raw_base{$_} eq $raw_todo{$_}) {
+# Most recent first
+my @todo_list = reverse sort keys %todo;
+
+# Here, @todo_list contains the integer version numbers that have support.
+# The first and final elements give the extremes of the supported versions.
+# (Use defaults that were reasonable at the time of this commit if the
+# directories are empty (which should only happen during regeneration of the
+# base and todo files).). Actually the final element is for blead (at the
+# time things were regenerated), which is 1 beyond the max version supported.
+my $INT_MAX_PERL = (@todo_list) ? $todo_list[0] - 1 : '5030000'; # used for __MAX_PERL__
+my $MAX_PERL = format_version($INT_MAX_PERL);
+my $INT_MIN_PERL = (@todo_list) ? $todo_list[-1] : 5003007;
+my $MIN_PERL = format_version($INT_MIN_PERL);
+
+# Get rid of blead. It contains the things marked as todo, meaning they
+# don't compile at all, and not getting rid of it would mean they would be
+# listed as working but introduced in blead.
+shift @todo_list if @todo_list && $todo_list[0] > $INT_MAX_PERL;
+
+# check consistency between our list of everything provided, and our lists of
+# what got provided when
+for (@provided) {
+ if ( exists $raw_todo{$_}
+ && $raw_todo{$_}{version} > $INT_MIN_PERL # INT_MIN_PERL contents are real
+ # symbols, not something to do
+ && $raw_todo{$_}{version} <= $INT_MAX_PERL # Above this would be things that
+ # don't compile in blead
+ && exists $raw_base{$_})
+ {
+ if ($raw_base{$_}{version} == $raw_todo{$_}{version}) {
warn "$INCLUDE/$provides{$_} provides $_, which is still marked "
. "todo for " . format_version($raw_todo{$_}) . "\n";
}
else {
- check(2, "$_ was ported back to " . format_version($raw_todo{$_}) .
- " (baseline revision: " . format_version($raw_base{$_}) . ").");
+ check(2, "$_ was ported back to " . format_version($raw_todo{$_}{version})
+ . " (baseline revision: " . format_version($raw_base{$_}{version})
+ . ").");
}
}
}
my @perl_api;
-for (keys %provides) {
+for (@provided) {
next if /^Perl_(.*)/ && exists $embed{$1};
next if exists $embed{$_};
push @perl_api, $_;
check(2, "No API definition for provided element $_ found.");
}
+# At this point @perl_api is the list of things we provide that weren't found
+# in the .fnc files.
+my @prototype_unknown = @perl_api;
+
+# Add in the .fnc file definitions.
push @perl_api, keys %embed;
+@perl_api = sort dictionary_order @perl_api;
-for (@perl_api) {
+for (@perl_api) { # $_ is the item name
if (exists $provides{$_} && !exists $raw_base{$_}) {
check(2, "Mmmh, $_ doesn't seem to need backporting.");
}
- my $line = "$_|" . (exists $provides{$_} && exists $raw_base{$_} ? $raw_base{$_} : '') . '|';
- $line .= ($raw_todo{$_} || '') . '|';
+
+ # Create the lines that ppport.h reads. These look like
+ # CopyD|5.009002|5.003007|p
+ my $line = "$_|";
+ $line .= $raw_base{$_}{version} if exists $raw_base{$_}
+ # If is above the max, it means it never actually got defined
+ && int_parse_version($raw_base{$_}{version}) <= $INT_MAX_PERL;
+ $line .= '|';
+ $line .= $raw_todo{$_}{version}
+ if exists $raw_todo{$_}
+ && int_parse_version($raw_todo{$_}{version}) <= $INT_MAX_PERL;
+ $line .= '|';
$line .= 'p' if exists $provides{$_};
- if (exists $embed{$_}) {
- my $e = $embed{$_};
- if (exists $e->{flags}{p}) {
+ my $e;
+ $e = $embed{$_} if exists $embed{$_};
+ my $is_documented = 0;
+ my $is_accessible = 0;
+ if (defined $e) {
+ if (exists $e->{flags}{'p'}) { # Has 'Perl_' prefix
my $args = $e->{args};
$line .= 'v' if @$args && $args->[-1][0] eq '...';
}
- $line .= 'n' if exists $e->{flags}{n};
+ $line .= 'o' if exists $e->{ppport_fnc};
+ $line .= 'n' if exists $e->{flags}{'T'}; # No thread context parameter
+ $line .= 'd' if exists $e->{flags}{'D'}; # deprecated
+ $line .= 'x' if exists $e->{flags}{'x'}; # experimental
+ $line .= 'c' if exists $e->{flags}{'C'} # core-only
+ || ( exists $e->{flags}{'X'}
+ && (exists $e->{flags}{'E'} || ! exists $e->{flags}{'m'}));
+ $is_accessible = 1 if exists $e->{flags}{'A'}
+ || exists $e->{flags}{'C'}
+ || ( exists $e->{flags}{'X'}
+ && ! exists $e->{flags}{'E'}
+ && exists $e->{flags}{'m'});
+ $is_documented = 1 if exists $e->{flags}{'d'};
}
+
+ # scanprov adds the M and F flags. The M is for provided macros; F for
+ # functions we didn't find in testing (usually because they are hidden
+ # behind ifdefs, like PERL_GLOBAL_STRUCT_PRIVATE). None of them were
+ # verified
+ if (exists $raw_base{$_}{code}) {
+ $line .= 'V' if $raw_base{$_}{code} =~ /[MFX]/;
+ $is_accessible = 1 if $raw_base{$_}{code} =~ /M/;
+ }
+ $line .= 'i' unless $is_accessible;
+ $line .= 'u' unless $is_documented;
+
$_ = $line;
}
$data =~ s/^([\t ]*)__PERL_API__(\s*?)$/
- join "\n", map "$1$_", sort @perl_api
+ join "\n", map "$1$_", sort dictionary_order @perl_api
/gem;
+my $undocumented = "(undocumented)";
+
my @todo;
-for (reverse sort keys %todo) {
+for (@todo_list) {
my $ver = format_version($_);
+ $ver .= " (at least)" if $_ == $todo_list[-1];
my $todo = "=item perl $ver\n\n";
- for (sort @{$todo{$_}}) {
- $todo .= " $_\n";
+ for (sort dictionary_order @{$todo{$_}}) {
+ $todo .= " $_";
+ $todo .= " (DEPRECATED)" if $embed{$_}->{flags}{'D'};
+ $todo .= " (marked experimental)" if $embed{$_}->{flags}{'x'};
+ $todo .= " $undocumented" unless $embed{$_}->{flags}{'d'};
+ $todo .= "\n";
}
push @todo, $todo;
}
+if (@prototype_unknown) {
+ my $todo = "=item Backported version unknown\n\n";
+ for (sort dictionary_order @prototype_unknown) {
+ $todo .= " $_ $undocumented\n";
+ }
+ push @todo, $todo;
+}
+
$data =~ s{^__UNSUPPORTED_API__(\s*?)^}
{join "\n", @todo}gem;
-$data =~ s{__MIN_PERL__}{5.003}g;
-$data =~ s{__MAX_PERL__}{5.30}g;
+$data =~ s{__MIN_PERL__}{$MIN_PERL}g;
+$data =~ s{__MAX_PERL__}{$MAX_PERL}g;
open FH, ">PPPort.pm" or die "PPPort.pm: $!\n";
print FH $data;
@@ -150,6 +271,7 @@ sub include
for (keys %{$data->{prototypes}}) {
$prototypes{$_} = $data->{prototypes}{$_};
+ $prototypes{$_} = normalize_prototype($data->{prototypes}{$_});
$data->{implementation} =~ s/^$_(?=\s*\()/$DPPP(my_$_)/mg;
}
@@ -167,7 +289,7 @@ sub expand
my $code = shift;
$code =~ s{^(\s*#\s*(?:el)?if\s+)(.*)$}{$1.expand_pp_expressions($2)}gem;
$code =~ s{^\s*
- __UNDEFINED__
+ __(?:UNDEFINED|UNDEF_NOT_PROVIDED)__
\s+
(
( \w+ )
@@ -274,7 +396,14 @@ sub expand_pp_expr
my $proto = make_prototype($e);
if (exists $prototypes{$func}) {
if (compare_prototypes($proto, $prototypes{$func})) {
- check(1, "differing prototypes for $func:\n API: $proto\n PPP: $prototypes{$func}");
+ my $proto_no_pTHX = $proto;
+ $proto_no_pTHX =~ s/pTHX_\s*//;
+ if (compare_prototypes($proto_no_pTHX, $prototypes{$func})) {
+ check(1, "differing prototypes for $func:\n API: $proto\n PPP: $prototypes{$func}");
+ }
+ else {
+ check(1, "prototypes differ in pTHX_ for $func:\n API: $proto\n PPP: $prototypes{$func}");
+ }
$proto = $prototypes{$func};
}
}
@@ -309,8 +438,8 @@ sub make_embed
my $a = do { my $x = 'a'; join ',', map { $x++ } 1 .. @{$f->{args}} };
my $lastarg = ${$f->{args}}[-1];
- if ($f->{flags}{n}) {
- if ($f->{flags}{p}) {
+ if ($f->{flags}{'T'}) {
+ if ($f->{flags}{'p'}) {
return "#define $n $DPPP(my_$n)\n" .
"#define Perl_$n $DPPP(my_$n)";
}
@@ -324,8 +453,8 @@ sub make_embed
# undef $n
#endif
UNDEF
- if ($f->{flags}{p}) {
- if ($f->{flags}{f}) {
+ if ($f->{flags}{'p'}) {
+ if ($f->{flags}{'f'}) {
return "#define Perl_$n $DPPP(my_$n)";
}
elsif (@$lastarg && $lastarg->[0] =~ /\.\.\./) {
@@ -424,7 +553,7 @@ You should use F<ppport.h> in modern code so that your code will work
with the widest range of Perl interpreters possible, without significant
additional work.
-You should attempt older code to fully use F<ppport.h>, because the
+You should attempt to get older code to fully use F<ppport.h>, because the
reduced pollution of newer Perl versions is an important thing. It's so
important that the old polluting ways of original Perl modules will not be
supported very far into the future, and your module will almost certainly
@@ -434,7 +563,7 @@ having done the electronic ecology some good.
=head2 How to use ppport.h
Don't direct the users of your module to download C<Devel::PPPort>.
-They are most probably no XS writers. Also, don't make F<ppport.h>
+They are most probably not XS writers. Also, don't make F<ppport.h>
optional. Rather, just take the most recent copy of F<ppport.h> that
you can find (e.g. by generating it with the latest C<Devel::PPPort>
release from CPAN), copy it into your project, adjust your project to
@@ -478,20 +607,51 @@ in threaded and non-threaded configurations.
=head2 Provided Perl compatibility API
-The header file written by this module, typically F<ppport.h>, provides
-access to the following elements of the Perl API that is not available
-in older Perl releases:
+The header file written by this module, typically F<ppport.h>, provides access
+to the following elements of the Perl API that are not otherwise available in
+Perl releases older than when the elements were first introduced. (Note that
+many of these are not supported all the way back to __MIN_PERL__, but it may
+be that they are supported back as far as you need; see L</Supported Perl API,
+sorted by version> for that information.)
__PROVIDED_API__
-=head2 Perl API not supported by ppport.h
+=head2 Supported Perl API, sorted by version
+
+The table in this section lists all the Perl API elements available, sorted by
+the version in which support starts. This includes all the elements that
+F<ppport.h> helps out with, as well as those elements that it doesn't.
+
+In some cases, it doesn't make practical sense for elements to be supported
+earlier than they already are. For example, UTF-8 functionality isn't
+provided prior to the release where it was first introduced.
+
+But in other cases, it just is that no one has implemented support yet.
+Patches welcome! Some elements are ported backward for some releases, but not
+all the way to __MIN_PERL__.
+
+If an element, call it ELEMENT, is not on this list, try using this command to
+find out why:
+
+ perl ppport.h --api-info=ELEMENT
-There is still a big part of the API not supported by F<ppport.h>.
-Either because it doesn't make sense to back-port that part of the API,
-or simply because it hasn't been implemented yet. Patches welcome!
+A few of the entries in the list below are marked as DEPRECATED. You should
+not use these for new code, and should be converting existing uses to use
+something better.
-Here's a list of the currently unsupported API, and also the version of
-Perl below which it is unsupported:
+Some of the entries in the list are marked as "experimental". This means
+these should not generally be used. They may be removed or changed without
+notice. You can ask why they are experimental by sending email to
+L<mailto:perl5-porters@perl.org>.
+
+And some of the entries are marked as "undocumented". This means that they
+aren't necessarily considered stable, and could be changed or removed in some
+future release without warning. It is therefore a bad idea to use them
+without further checking. It could be that these are considered to be for
+perl core use only; or it could be, though, that C<Devel::PPPort> doesn't know
+where to find their documentation, or that it's just an oversight that they
+haven't been documented. If you want to use one, and potentially have it
+backported, first send mail to L<mailto:perl5-porters@perl.org>.
=over 4
@@ -503,7 +663,7 @@ __UNSUPPORTED_API__
If you find any bugs, C<Devel::PPPort> doesn't seem to build on your
system, or any of its tests fail, please send a bug report to
-L<perlbug@perl.org|mailto:perlbug@perl.org>.
+L<https://github.com/Dual-Life/Devel-PPPort/issues/new>.
=head1 AUTHORS
@@ -521,9 +681,9 @@ Version 2.x was ported to the Perl core by Paul Marquess.
Version 3.x was ported back to CPAN by Marcus Holland-Moritz.
-=item *
+=item *
-Versions >= 3.22 are maintained with support from Matthew Horsfall (alh).
+Versions >= 3.22 are maintained by perl5 porters
=back
@@ -551,7 +711,7 @@ package Devel::PPPort;
use strict;
use vars qw($VERSION $data);
-$VERSION = '3.52';
+$VERSION = '3.57';
sub _init_data
{
@@ -607,6 +767,8 @@ SKIP
%include ppphdoc { indent => '|>' }
+%include inctools
+
%include ppphbin
__DATA__
@@ -628,44 +790,46 @@ __DATA__
%include limits
+%include variables
+
+%include subparse
+
+%include newCONSTSUB
+
+%include magic_defs
+
%include misc
+%include sv_xpvf
+
+%include SvPV
+
%include warn
+%include format
+
%include uv
%include memory
-%include magic_defs
-
%include mess
-%include variables
-
%include mPUSH
%include call
%include newRV
-%include newCONSTSUB
-
%include MY_CXT
-%include format
-
%include SvREFCNT
%include newSV_type
%include newSVpv
-%include SvPV
-
%include Sv_set
-%include sv_xpvf
-
%include shared_pv
%include HvNAME
@@ -688,8 +852,12 @@ __DATA__
%include strlfuncs
+%include utf8
+
%include pv_tools
+%include locale
+
#endif /* _P_P_PORTABILITY_H_ */
/* End of File ppport.h */
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/RealPPPort_xs.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/RealPPPort_xs.PL
new file mode 100644
index 00000000000..d929b8aa397
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/RealPPPort_xs.PL
@@ -0,0 +1,128 @@
+################################################################################
+#
+# RealPPPort_xs.PL -- generate RealPPPort.xs
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+$^W = 1;
+require "./parts/ppptools.pl";
+
+my %SECTION = (
+ xshead => { code => '', header => "/* ---- code from __FILE__ ---- */" },
+ xsinit => { code => '', header => "/* ---- code from __FILE__ ---- */" },
+ xsmisc => { code => '', header => "/* ---- code from __FILE__ ---- */" },
+ xsboot => { code => '', header => "/* ---- code from __FILE__ ---- */", indent => "\t" },
+ xsubs => { code => '', header => <<ENDHEADER },
+##----------------------------------------------------------------------
+## XSUBs for testing the implementation in __FILE__
+##----------------------------------------------------------------------
+ENDHEADER
+);
+
+if (not exists $ENV{PERL_NO_GET_CONTEXT} or $ENV{PERL_NO_GET_CONTEXT}) {
+$SECTION{xshead}{code} .= <<END;
+#define PERL_NO_GET_CONTEXT
+END
+}
+
+my $file;
+my $sec;
+
+for $file (all_files_in_dir('parts/inc')) {
+ my $spec = parse_partspec($file);
+
+ my $msg = 0;
+ for $sec (keys %SECTION) {
+ if (exists $spec->{$sec}) {
+ $msg++ or print "adding XS code from $file\n";
+ if (exists $SECTION{$sec}{header}) {
+ my $header = $SECTION{$sec}{header};
+ $header =~ s/__FILE__/$file/g;
+ $SECTION{$sec}{code} .= $header . "\n";
+ }
+ $SECTION{$sec}{code} .= $spec->{$sec} . "\n";
+ }
+ }
+}
+
+my $data = do { local $/; <DATA> };
+
+for $sec (keys %SECTION) {
+ my $code = $SECTION{$sec}{code};
+ if (exists $SECTION{$sec}{indent}) {
+ $code =~ s/^/$SECTION{$sec}{indent}/gm;
+ }
+ $code =~ s/[\r\n]+$//;
+ $data =~ s/^__\U$sec\E__$/$code/m;
+}
+
+open FH, ">RealPPPort.xs" or die "RealPPPort.xs: $!\n";
+print FH $data;
+close FH;
+
+exit 0;
+
+__DATA__
+/*******************************************************************************
+*
+* !!!!! Do NOT edit this file directly! -- Edit RealPPPort_xs.PL instead. !!!!!
+*
+* This file was automatically generated from the definition files in the
+* parts/inc/ subdirectory by PPPort_xs.PL. To learn more about how all this
+* works, please read the F<HACKERS> file that came with this distribution.
+*
+********************************************************************************
+*
+* Perl/Pollution/Portability
+*
+********************************************************************************
+*
+* Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+* Version 2.x, Copyright (C) 2001, Paul Marquess.
+* Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the same terms as Perl itself.
+*
+*******************************************************************************/
+
+/* ========== BEGIN XSHEAD ================================================== */
+
+__XSHEAD__
+
+/* =========== END XSHEAD =================================================== */
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+/* ========== BEGIN XSINIT ================================================== */
+
+__XSINIT__
+
+/* =========== END XSINIT =================================================== */
+
+#include "ppport.h"
+
+/* ========== BEGIN XSMISC ================================================== */
+
+__XSMISC__
+
+/* =========== END XSMISC =================================================== */
+
+MODULE = Devel::PPPort PACKAGE = Devel::PPPort
+
+BOOT:
+__XSBOOT__
+
+__XSUBS__
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/TODO b/gnu/usr.bin/perl/dist/Devel-PPPort/TODO
new file mode 100644
index 00000000000..2a26d013f34
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/TODO
@@ -0,0 +1,345 @@
+TODO:
+
+* > 3. In several cases, "perl ppport.h --copy=.new" output a new file in
+ > which the only change was the addition of "#include "ppport.h"". In each
+ > case, that actually wasn't necessary because the source file in question
+ > already #included another source file which #included ppport.h itself.
+ > Would it be possible for the analyzer to follow #include directives to
+ > spot cases like this?
+
+ Uh, well, I guess it would be possible. But I have some concerns:
+
+ 1. ppport.h is already too big. :-)
+
+ 2. There is code in ppport.h to actually remove an
+
+ #include "ppport.h"
+
+ if it appears not to be needed. If it's not needed in your
+ included file, it might be dropped from there and moved to
+ the other file that included the first one. This would make
+ the logic much more complicated.
+
+ 3. As ppport.h is configurable, it's not (always) a good idea
+ to put it into a file that's included from another file.
+
+ I guess I'll have to think about this a little more. Maybe I can
+ come up with a fancy solution that doesn't increase the code size
+ too much.
+
+
+* On 14/12/06, Nicholas Clark <nick@ccl4.org> wrote:
+ > On Thu, Dec 14, 2006 at 05:03:24AM +0100, Andreas J. Koenig wrote:
+ >
+ > > Params::Validate and Clone suffer from the same cold:
+ >
+ > The same patch will make both compile and pass tests.
+ > I'm wondering if it might be better to totally drop SVt_PBVM and let source
+ > code fail to compile.
+
+ I don't think so. Because :
+ 1. your redefinition of SVt_PBVM is probably what most XS modules want
+ 2. anyway, if we remove it from the core, it might appear in Devel::PPPort :)
+
+
+* maybe backport bytes_from_utf8() for 5.6.0 (or even before)?
+
+* check which of the following we need to support:
+
+ amagic_generation
+ AMG_names
+ an
+ Argv
+ argvgv
+ argvoutgv
+ basetime
+ beginav
+ block_type
+ bodytarget
+ bufend
+ bufptr
+ check
+ chopset
+ Cmd
+ compcv
+ compiling
+ comppad
+ comppad_name
+ comppad_name_fill
+ copline
+ cop_seqmax
+ cryptseen
+ cshlen
+ cshname
+ curcop
+ curinterp
+ curpad
+ curpm
+ curstash
+ curstname
+ dbargs
+ DBgv
+ DBline
+ DBsignal
+ DBsingle
+ DBsub
+ DBtrace
+ debstash
+ debug
+ defgv
+ defoutgv
+ defstash
+ delaymagic
+ diehook
+ dirty
+ doextract
+ doswitches
+ do_undump
+ dowarn
+ egid
+ encoding
+ endav
+ envgv
+ errgv
+ error_count
+ errors
+ euid
+ eval_root
+ evalseq
+ eval_start
+ expect
+ fdpid
+ filemode
+ firstgv
+ fold
+ forkprocess
+ formfeed
+ formtarget
+ freq
+ generation
+ gensym
+ gid
+ hexdigit
+ hints
+ incgv
+ in_eval
+ in_my
+ inplace
+ lastfd
+ last_in_gv
+ last_lop
+ last_lop_op
+ lastscream
+ laststatval
+ laststype
+ last_uni
+ lex_brackets
+ lex_brackstack
+ lex_casemods
+ lex_casestack
+ lex_defer
+ lex_dojoin
+ lex_expect
+ lex_formbrack
+ lex_inpat
+ lex_inwhat
+ lex_op
+ lex_repl
+ lex_starts
+ lex_state
+ lex_stuff
+ lineary
+ linestr
+ localizing
+ main_cv
+ main_root
+ mainstack
+ main_start
+ markstack
+ markstack_max
+ markstack_ptr
+ max_intro_pending
+ maxo
+ maxscream
+ maxsysfd
+ min_intro_pending
+ minus_a
+ minus_c
+ minus_F
+ minus_l
+ minus_n
+ minus_p
+ multi_close
+ multi_end
+ multi_open
+ multi_start
+ na
+ nexttoke
+ nexttype
+ nextval
+ nice_chunk
+ nice_chunk_size
+ No
+ no_aelem
+ no_dir_func
+ no_func
+ no_mem
+ nomemok
+ no_modify
+ no_myglob
+ no_security
+ no_sock_func
+ no_symref
+ no_usym
+ no_wrongref
+ nrs
+ oldbufptr
+ oldname
+ oldoldbufptr
+ op
+ opargs
+ op_desc
+ op_mask
+ op_name
+ op_seq
+ origalen
+ origargc
+ origargv
+ origenviron
+ origfilename
+ osname
+ padix
+ padix_floor
+ pad_reset_pending
+ patchlevel
+ patleave
+ perldb
+ perl_destruct_level
+ pidstatus
+ ppaddr
+ preambleav
+ preambled
+ preprocess
+ profiledata
+ regdummy
+ regendp
+ regeol
+ reginput
+ regkind
+ reglastparen
+ regsize
+ regstartp
+ restartop
+ rs
+ rsfp
+ rsfp_filters
+ runops
+ savestack
+ savestack_ix
+ savestack_max
+ sawampersand
+ scopestack
+ scopestack_ix
+ scopestack_max
+ screamfirst
+ screamnext
+ secondgv
+ signals
+ sig_name
+ sig_num
+ simple
+ sortcop
+ sortstash
+ splitstr
+ stack_base
+ stack_max
+ stack_sp
+ statbuf
+ statcache
+ statgv
+ statname
+ statusvalue
+ stdingv
+ sub_generation
+ subline
+ subname
+ Sv
+ sv_arenaroot
+ sv_count
+ sv_no
+ sv_objcount
+ sv_root
+ sv_undef
+ sv_yes
+ tainted
+ tainting
+ timesbuf
+ tmps_floor
+ tmps_ix
+ tmps_max
+ tmps_stack
+ tokenbuf
+ top_env
+ toptarget
+ uid
+ unsafe
+ varies
+ vtbl_amagic
+ vtbl_amagicelem
+ vtbl_arylen
+ vtbl_bm
+ vtbl_dbline
+ vtbl_env
+ vtbl_envelem
+ vtbl_glob
+ vtbl_isa
+ vtbl_isaelem
+ vtbl_mglob
+ vtbl_pack
+ vtbl_packelem
+ vtbl_pos
+ vtbl_sig
+ vtbl_sigelem
+ vtbl_substr
+ vtbl_sv
+ vtbl_taint
+ vtbl_uvar
+ vtbl_vec
+ warnhook
+ warn_nl
+ warn_nosemi
+ warn_reserved
+ warn_uninit
+ watchaddr
+ watchok
+ Yes
+
+* have an --env option for soak to set env variable combinations
+
+* only overwrite generated files if they actually changed
+
+* try to make parts/apicheck.pl automatically find NEED_ #defines
+
+* add support for my_vsnprintf?
+
+* try to perform some core consistency checks:
+
+ - check if 'd' flag in embed.fnc matches with
+ supplied documentation
+
+ - check if all public API is documented
+
+* check (during make regen?) if MAX_PERL in PPPort_pm.PL
+ needs to be updated
+
+* see if we can implement sv_catpvf() for < 5.004
+
+* MULTICALL ?
+
+* improve apicheck (things like utf8_mg_pos_init() are
+ not currently checked)
+
+* more documentation, more tests
+
+* Resolve dependencies in Makefile.PL and remind of
+ running 'make regen'
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL
index c9ff8a416dc..686ac57ddeb 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/apicheck_c.PL
@@ -1,6 +1,6 @@
################################################################################
#
-# apicheck_c.PL -- generate apicheck.c
+# apicheck_c.PL -- generate apicheck.c by running parts/apicheck.pl
#
################################################################################
#
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl
index 72c1929adc9..58f0f24dce3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/buildperl.pl
@@ -40,23 +40,27 @@ my %opt = (
install => 1,
oneshot => 0,
configure => 0,
+ jobs => 1,
'test-archives' => 0,
);
+my $Configure_extra = '-Dman1dir="none" -Dman3dir="none"';
+
+
my %config = (
default => {
- config_args => '-des',
+ config_args => "-des $Configure_extra" ,
},
thread => {
- config_args => '-des -Dusethreads',
+ config_args => "-des -Dusethreads $Configure_extra",
masked_versions => [ qr/^5\.00[01234]/ ],
},
thread5005 => {
- config_args => '-des -Duse5005threads',
+ config_args => "-des -Duse5005threads $Configure_extra",
masked_versions => [ qr/^5\.00[012345]|^5\.(9|\d\d)|^5\.8\.9/ ],
},
debug => {
- config_args => '-des -Doptimize=-g',
+ config_args => "-des -Doptimize=-g $Configure_extra",
},
);
@@ -161,10 +165,14 @@ GetOptions(\%opt, qw(
test-archives=i
patch!
oneshot
+ jobs=i
)) or pod2usage(2);
my %current;
+my $job_string = "";
+$job_string = "-j$opt{jobs}" if $opt{jobs} != 1;
+
if ($opt{patch} || $opt{oneshot}) {
@{$opt{perl}} == 1 or die "Exactly one --perl must be given with --patch or --oneshot\n";
my $perl = $opt{perl}[0];
@@ -359,10 +367,10 @@ sub build_and_install
if (-f "x2p/makefile") {
run_or_die("sed -i -e '/^.*<builtin>/d' -e '/^.*<built-in>/d' -e '/^.*<command line>/d' -e '/^.*<command-line>/d' makefile x2p/makefile");
}
- run_or_die("make all");
- run("make test") if $opt{test};
+ run_or_die("make $job_string all");
+ run("TEST_JOBS=$opt{jobs} make $job_string test") if $opt{test};
if ($opt{install}) {
- run_or_die("make install");
+ run("make $job_string install");
}
else {
print "\n*** NOT INSTALLING PERL ***\n\n";
@@ -540,6 +548,10 @@ buildperl.pl - build/install perl distributions
/tmp/perl/install/<config>/<perl>]
--config=configuration build this configuration [MULTI]
+ The possibilities for this parameter are:
+ 'thread', 'thread5005', 'debug';
+ and 'default',
+ which means none of the others.
[default: all possible configurations]
--perl=version build this version of perl [MULTI]
@@ -559,6 +571,9 @@ buildperl.pl - build/install perl distributions
directory (extra arguments are passed to
Configure)
+ -j N Build and test with N parallel jobs
+ [default: 1]
+
options tagged with [MULTI] can be given multiple times
options tagged with [EXPAND] expand the following items
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl
index 465c3cca255..e2437a5b232 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/devtools.pl
@@ -2,6 +2,8 @@
#
# devtools.pl -- various utility functions
#
+# NOTE: This will only be called by the overarching (modern) perl
+#
################################################################################
#
# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
@@ -13,7 +15,11 @@
#
################################################################################
+use Data::Dumper;
+$Data::Dumper::Sortkeys = 1;
use IO::File;
+use warnings; # Can't use strict because of %opt passed from caller
+require "./parts/inc/inctools";
eval "use Term::ANSIColor";
$@ and eval "sub colored { pop; @_ }";
@@ -67,7 +73,8 @@ sub run
status => $? >> 8,
stdout => [<$out>],
stderr => [<$err>],
- didnotrun => 0,
+ didnotrun => 0, # Note that currently this will always be 0
+ # This must have been used in earlier versions
);
unlink "tmp.out", "tmp.err";
@@ -75,6 +82,24 @@ sub run
$? & 128 and $rval{core} = 1;
$? & 127 and $rval{signal} = $? & 127;
+ # This is expected and isn't an error.
+ @{$rval{stderr}} = grep { $_ !~ /make.*No rule .*realclean/ } @{$rval{stderr}};
+
+ if ( exists $rval{core}
+ || exists $rval{signal}
+ || ($opt{debug} > 2 && @{$rval{stderr}} && $rval{status})
+ || ($opt{debug} > 3 && @{$rval{stderr}})
+ || ($opt{debug} > 4 && @{$rval{stdout}}))
+ {
+ print STDERR "Returning\n", Dumper \%rval;
+
+ # Under verbose, runtool already output the call string
+ unless ($opt{verbose}) {
+ print STDERR "from $prog ", join ", ", @args;
+ print STDERR "\n";
+ }
+ }
+
return \%rval;
}
@@ -93,8 +118,10 @@ sub ask($)
my $q = shift;
my $a;
local $| = 1;
- print "\n$q [y/n] ";
- do { $a = <>; } while ($a !~ /^\s*([yn])\s*$/i);
+ do {
+ print "\a\n$q [y/n] ";
+ $a = <>; }
+ while ($a !~ /^\s*([yn])\s*$/i);
return lc $1 eq 'y';
}
@@ -120,4 +147,80 @@ sub eta
return sprintf "%02d:%02d:%02d", $h, $m, $s;
}
+sub get_and_sort_perls($)
+{
+ my $opt = shift;
+
+ my $starting;
+ $starting = int_parse_version($opt->{'debug-start'})
+ if $opt->{'debug-start'};
+
+ # Uses the opt structure parameter to find the perl versions to use this
+ # run, and returns an array with a hash representing blead in the 0th
+ # element and the oldest in the final one. Each entry looks like
+ # {
+ # 'version' => '5.031002',
+ # 'file' => '5031002',
+ # 'path' => '/home/khw/devel/bin/perl5.31.2'
+ # },
+ #
+ # Get blead and all other perls
+ my @perls = $opt->{blead};
+ for my $dir (split ",", $opt->{install}) {
+ push @perls, grep !/-RC\d+/, glob "$dir/bin/perl5.*";
+ }
+
+ # Normalize version numbers into 5.xxxyyy, and convert each element
+ # describing the perl to be a hash with keys 'version' and 'path'
+ for (my $i = 0; $i < @perls; $i++) {
+ my $version = `$perls[$i] -e 'print \$]'`;
+ my $file = int_parse_version($version);
+ $version = format_version($version);
+
+ # Make this entry a hash with its version, file name, and path
+ $perls[$i] = { version => $version,
+ file => $file,
+ path => $perls[$i],
+ };
+ }
+
+ # Sort in descending order. We start processing the most recent perl
+ # first.
+ @perls = sort { $b->{file} <=> $a->{file} } @perls;
+
+ # Override blead's version if specified.
+ if (exists $opt->{'blead-version'}) {
+ $perls[0]{version} = format_version($opt->{'blead-version'});
+ }
+
+ my %seen;
+
+ # blead's todo is its version plus 1. Otherwise, each todo is the
+ # previous one's. Also get rid of duplicate versions.
+ $perls[0]{todo} = $perls[0]{file} + 1;
+ $seen{$perls[0]{file}} = 1;
+ for my $i (1 .. $#perls) {
+ last unless defined $perls[$i];
+ if ( exists $seen{$perls[$i]{file}}
+ || ($starting && $perls[$i]{file} gt $starting)
+ ) {
+ splice @perls, $i, 1;
+ redo;
+ }
+
+ $seen{$perls[$i]{file}} = 1;
+ $perls[$i]{todo} = $perls[$i-1]{file};
+ }
+
+ # The earliest perl gets a special marker key, consisting of the proper
+ # file name
+ $perls[$#perls]{final} = $perls[$#perls]{file};
+
+ if ($opt{debug}) {
+ print STDERR "The perls returned are: ", Dumper \@perls;
+ }
+
+ return \@perls;
+}
+
1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkapidoc.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkapidoc.pl
new file mode 100644
index 00000000000..b3a5946f7c7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkapidoc.pl
@@ -0,0 +1,132 @@
+################################################################################
+#
+# mkapidoc.pl -- generate apidoc.fnc from scanning the Perl source
+#
+# Should be called from the base directory for Devel::PPPort.
+# If that happens to be in the /dist directory of a perl build structure, and
+# you're doing the standard thing, no parameters are required. Otherwise
+# (again with the standard things, its single parameter is the base directory
+# of the perl source tree to be used.
+#
+################################################################################
+#
+# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+# Version 2.x, Copyright (C) 2001, Paul Marquess.
+# Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use warnings;
+use strict;
+
+my $PERLROOT = $ARGV[0];
+$PERLROOT = '../..' unless $PERLROOT;
+
+die "'$PERLROOT' is invalid, or you haven't successfully run 'make' in it"
+ unless -e "$PERLROOT/warnings.h";
+
+my $config= "$PERLROOT/config_h.SH";
+my %seen;
+
+# Find the files in MANIFEST that are core, but not embed.fnc, nor .t's
+my @files;
+open(my $m, '<', "$PERLROOT/MANIFEST") || die "MANIFEST:$!";
+while (<$m>) { # In embed.fnc,
+ chomp;
+ next if m! ^ embed \. fnc \t !x;
+ next if m! ^ ( cpan | dist | t) / !x;
+ next if m! [^\t]* \.t \t !x;
+ push @files, $_;
+}
+
+# These files are also needed. This might have to be added to in the future.
+push @files, qw(pod/perlguts.pod lib/perlxs.pod);
+
+# Find the apidoc entries in all these files
+my @entries;
+for (@files) {
+
+ s/ \t .* //x;
+ open my $f, '<', "$PERLROOT/$_" or die "Can't open $_: $!";
+
+ my $line;
+ while (defined ($line = <$f>)) {
+ chomp $line;
+ next unless $line =~ /^ =for \s+ apidoc \s+
+ ( [^|]* \| # flags
+ [^|]* \| # return type
+ ( [^|]* ) # name
+ (?: \| .* )? # optional args
+ ) /x;
+ my $meat = $1;
+ my $name = $2;
+
+ if (exists $seen{$name}) {
+ if ($seen{$name} ne $meat) {
+ print STDERR
+ "Contradictory prototypes for $name,\n$seen{$name}\n$meat\n";
+ }
+ next;
+ }
+
+ $meat =~ s/[ \t]+$//;
+ $seen{$name} = $meat;
+
+ # Many of the entries omit the "d" flag to indicate they are
+ # documented, but we wouldn't have found this unless it was documented
+ # in the source
+ $meat =~ s/\|/d|/ unless $meat =~ /^[^|]*d/;
+
+ push @entries, "$meat\n";
+ }
+}
+
+# The entries in config_h.SH are also (documented) macros that are
+# accessible to XS code, and ppport.h backports some of them. We
+# use only the unconditionally compiled parameterless ones (as
+# that"s all that"s backported so far, and we don"t have to know
+# the types of the parameters).
+open(my $c, "<", $config) or die "$config: $!";
+my $if_depth = 0; # We don"t use the ones within #if statements
+ # The #ifndef that guards the whole file is not
+ # noticed by the code below
+while (<$c>) {
+ $if_depth ++ if / ^ \# [[:blank:]]* (ifdef | if\ defined ) /x;
+ $if_depth -- if $if_depth > 0 && / ^ \# [[:blank:]]* endif /x;
+ next unless $if_depth <= 0;
+
+ # We are only interested in #defines with no parameters
+ next unless /^ \# [[:blank:]]* define [[:blank:]]+
+ ( [A-Za-z][A-Za-z0-9]* )
+ [[:blank:]]
+ /x;
+ next if $seen{$1}; # Ignore duplicates
+ push @entries, "Amnd||$1\n";
+ $seen{$1}++;
+}
+close $c or die "Close failed: $!";
+
+open my $out, ">", "parts/apidoc.fnc"
+ or die "Can't open 'parts/apidoc.fnc' for writing: $!";
+require "./parts/inc/inctools";
+print $out <<EOF;
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:
+: !!!! Do NOT edit this file directly! -- Edit devel/mkapidoc.sh instead. !!!!
+:
+: This file was automatically generated from the API documentation scattered
+: all over the Perl source code. To learn more about how all this works,
+: please read the F<HACKERS> file that came with this distribution.
+:
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+:
+: This file lists all API functions/macros that are documented in the Perl
+: source code, but are not contained in F<embed.fnc>.
+:
+EOF
+print $out sort sort_api_lines @entries;
+close $out or die "Close failed: $!";
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkppport_fnc.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkppport_fnc.pl
new file mode 100644
index 00000000000..26adfea7f2b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mkppport_fnc.pl
@@ -0,0 +1,165 @@
+use Data::Dumper;
+$Data::Dumper::Sortkeys=1;
+################################################################################
+#
+# mkppport_fnc.pl -- generate ppport.fnc
+#
+# This program should be run when regenerating the data for ppport.h
+# (devel/regenerate). It should be run after parts/embed.fnc is updated, and
+# after mkapidoc.pl has been run.
+#
+# Its purpose is to generate ppport.fnc, a file which has the same syntax as
+# embed.fnc and apidoc.fnc, but contains entries that should only be tested
+# when ppport.h is enabled during the test.
+#
+# Thus it includes items that are Devel::PPPort only, and items that it
+# figures out aren't tested by the other two functions.
+#
+# These otherwise-untested items are those:
+# 1) which D:P provides and are not found in embed.fnc nor apidoc.fnc, or
+# aren't listed as public API in those files
+# 2) and for which tests can be automatically generated that they at least
+# compile.
+#
+# The reason that an item isn't in those two files is that it is an
+# undocumented macro. (If it's not a macro, it has to be in embed.fnc, and if
+# it's documented, mkapidoc.sh would find it and place it in apidoc.fnc.)
+#
+# And, the reason we can't generate tests for undocumented macros is we don't
+# readily know the types of the parameters, which we need to get a C program
+# to compile. We could easily discover the number of parameters, but gleaning
+# their types is harder.
+#
+# Instead of expending effort to cope with undocumented items, document them
+# instead, improving the product doubly.
+#
+# However, if the macro has no parameters, there are no types to need to know.
+# And, it turns out, that it may be that many of these macros (which typically
+# just define constants) really don't need to be documented. They may be
+# something that is considered to be provided, but should actually have been
+# internal constants, not exposed to the outside world. And they're a lot of
+# them. So this function was written to handle them.
+#
+# Algorithms could be devised to read the =xsubs sections and associate code
+# found therein with the item, and to include the code as the test for the
+# item, but again, it would be better to just document them.
+#
+# Later it was discovered that ppport provides support for non-public items.
+# We can list those here too, so that tests can be generated. (An alternative
+# would be to invent a new flag that means non-public, but test and use that
+# in apidoc.fnc.)
+################################################################################
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+################################################################################
+
+use strict;
+ use Data::Dumper;
+ $Data::Dumper::Sortkeys=1;
+use warnings;
+
+my $main_dir = $0;
+
+# Up one level
+$main_dir =~ s;[^/]*$;;;
+$main_dir =~ s;/$;;;
+
+# Up a second level
+$main_dir =~ s;[^/]*$;;;
+$main_dir =~ s;/$;;;
+
+$main_dir = '.' unless $main_dir;
+require "$main_dir/parts/ppptools.pl";
+
+
+my @provided = map { /^(\w+)/ ? $1 : () } `$^X ppport.h --list-provided`;
+
+# First, we look for non-API macros that are documented and furnished by us in
+# spite of not being public
+my @non_public_provided;
+my $api_fnc = "$main_dir/parts/apidoc.fnc";
+open F, "<", $api_fnc or die "Can't open $api_fnc: $!";
+while (<F>) {
+ my $line = $_;
+ next if $line =~ / ^ [^|]* A /x; # Skip API
+ chomp $line;
+ push @non_public_provided, $line
+ # Look for the name in the third '|' separated field
+ if grep { $line =~ / ^ [^|]* \| [^|]* \| \s* $_ \s* (?: $ |\| ) /x }
+ @provided;
+}
+
+my @embeds = parse_embed('parts/embed.fnc', $api_fnc);
+
+# Look for %include lines in the ppport.h generator
+my $PPPort = "$main_dir/PPPort_pm.PL";
+open F, "<", $PPPort or die "Can't open $PPPort: $!";
+
+my @no_parameters;
+while (<F>) {
+ next unless/^%include (\w+)/;
+ my $implementation = parse_partspec("$main_dir/parts/inc/$1")->{'implementation'};
+
+ # Find no-parameter entries using __UNDEFINED__ that aren't in the other.
+ # We know these are provided.
+ while ($implementation =~ /^__UNDEFINED__\s+(\w+)\s/mg) {
+ push @no_parameters, $1 unless grep { $1 eq $_->{'name'} } @embeds;
+ }
+}
+
+# Repeat, but look for ones that are 'provided' that don't use __UNDEFINED__
+seek F, 0, 0;
+while (<F>) {
+ next unless/^%include (\w+)/;
+ my $implementation = parse_partspec("$main_dir/parts/inc/$1")->{'implementation'};
+
+ while ($implementation =~ /^#\s*define\s+(\w+)\s/mg) {
+ next if grep { $1 eq $_ } @no_parameters;
+ next if grep { $1 eq $_->{'name'} } @embeds;
+ next unless grep { $1 eq $_ } @provided;
+ push @no_parameters, $1;
+ }
+}
+
+my @out = 'Am|void|sv_magic_portable|NN SV* sv|NULLOK SV* obj|int how|NULLOK const char* name|I32 namlen';
+push @out, @non_public_provided;
+push @out, map { "Amn|void|$_" } @no_parameters;
+
+@out = sort sort_api_lines @out;
+
+my $out = "parts/ppport.fnc";
+open OUT, ">", $out or die "Could open '$out' for writing: $!";
+
+print OUT <<EOF;
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:
+: !!!! Do NOT edit this file directly! -- Edit devel/mkppport_fnc.pl instead. !!!!
+:
+: Perl/Pollution/Portability
+:
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:
+: Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+: Version 2.x, Copyright (C) 2001, Paul Marquess.
+: Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+:
+: This program is free software; you can redistribute it and/or
+: modify it under the same terms as Perl itself.
+:
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+:
+: This file lists all API functions/macros that are provided purely
+: by Devel::PPPort, or that are not public. It is in the same format as the
+: F<embed.fnc> that ships with the Perl source code.
+:
+: Since these are used only to provide the argument types, it's ok to have the
+: return value be void for some where it's an issues
+
+EOF
+
+print OUT join "\n", @out;
+print OUT "\n";
+
+close OUT;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo
index 2eb9ea30430..d3eba62ca9a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo
@@ -3,6 +3,9 @@
#
# mktodo -- generate baseline and todo files by running mktodo.pl
#
+# It calls plain 'mktodo' on each perl version it finds based on the input
+# parameters.
+#
################################################################################
#
# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
@@ -18,41 +21,58 @@ use strict;
use Getopt::Long;
require './devel/devtools.pl';
+require './parts/ppptools.pl';
our %opt = (
- base => 0,
- check => 1,
+ base => 0, # If specified, this will generate base files, not todo ones
+ check => 1, # Do extra checking
verbose => 0,
install => '/tmp/perl/install/default',
blead => 'bleadperl-debug',
+ debug => 0,
+ 'debug-start' => "", # build an incomplete output, starting with the
+ # specified perl of the form perl5.xxxyyy
);
-GetOptions(\%opt, qw( base check! verbose install=s blead=s blead-version=s )) or die;
-
-identify();
-
-my $outdir = 'parts/todo';
+# The way this works, is it expects to find perl binaries for a bunch of
+# different versions in a given directory. This defaults to the 'install' one
+# listed above, but is overriddable by the --install parameter. Comma
+# separating --install allows multiple source directories.
+# It also uses blead, again with an overridable default.
+#
+# It first verifies that the test file works properly for blead.
+#
+# Then it goes through the list of perl binaries sorted in decreasing order of
+# version number. If something works in version n, but not in version n-1,
+# that means it was introduced (or perhaps fixed) in version n, and adds that
+# thing to the version n list.
+#
+# After everything is done, we have lists of what got added when. The --base
+# parameter tells it to not use ppport.h when computing this. Thus we get
+# what the official perls added when. Without this parameter, we do use
+# ppport.h, so we get, as patched by ppport.h, what gets added when
-my @perls = sort { $b->{version} <=> $a->{version} }
- map { { version => `$_ -e 'printf "%.6f", \$]'`, path => $_ } }
- ($opt{blead}, grep !/-RC\d+/, glob "$opt{install}/*/bin/perl5.*");
+GetOptions(\%opt, qw( base check! verbose install=s blead=s blead-version=s
+ debug=i debug-start=s)) or die;
-if (exists $opt{'blead-version'}) {
- $perls[0]{version} = $opt{'blead-version'};
-}
+identify();
-for (1 .. $#perls) {
- $perls[$_]{todo} = $perls[$_-1]{version};
-}
+my $perls_ref = get_and_sort_perls(\%opt);
-shift @perls;
+# Go through all the perls, creating a todo file for it.
+for (my $i = 0; $i < @$perls_ref; $i++) {
+ my $this_perl = @{$perls_ref}[$i];
+ my @args = ('--perl', $this_perl->{path},
+ '--version', $this_perl->{version},
+ '--todo-dir', (($opt{base}) ? 'parts/base' : 'parts/todo')
+ );
-for (@perls) {
- my $todo = do { my $v = $_->{todo}; $v =~ s/\D+//g; $v };
- -e "$outdir/$todo" and next;
- my @args = ('--perl', $_->{path}, '--todo', "$outdir/$todo", '--version', "$_->{todo}");
+ push @args, '--blead' if $i == 0; # First one is blead
+ push @args, '--todo', $this_perl->{'todo'};
push @args, '--base' if $opt{base};
+ push @args, "--debug=$opt{debug}" if $opt{debug};
push @args, '--verbose' if $opt{verbose};
push @args, '--nocheck' unless $opt{check};
+ push @args, '--final', $this_perl->{'final'} if $this_perl->{'final'};
runperl('devel/mktodo.pl', @args) or die "error running mktodo.pl [$!] [$?]\n";
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl
index c479eab5d1e..53a2cad10d3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/mktodo.pl
@@ -3,6 +3,8 @@
#
# mktodo.pl -- generate baseline and todo files
#
+# It makes the todo file for the single passed in perl binary. If --base is
+# not specified it compiles with ppport.h.
################################################################################
#
# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
@@ -25,19 +27,33 @@ use Time::HiRes qw( gettimeofday tv_interval );
require './devel/devtools.pl';
our %opt = (
- debug => 0,
- base => 0,
- verbose => 0,
- check => 1,
- shlib => 'blib/arch/auto/Devel/PPPort/PPPort.so',
+ blead => 0, # ? Is this perl blead
+ debug => 0,
+ base => 0, # Don't use ppport.h when generating
+ verbose => 0,
+ check => 1,
+ final => "",
+ 'todo-dir' => "",
+ todo => "", # If no --todo, this is a blead perl
+ shlib => 'blib/arch/auto/Devel/PPPort/PPPort.so',
);
GetOptions(\%opt, qw(
- perl=s todo=s version=s shlib=s debug base verbose check!
+perl=s todo=i blead todo-dir=s version=s shlib=s debug=i base final=s verbose check!
)) or die;
identify();
+my $todo_file;
+my $todo_version;
+if ($opt{todo}) {
+ $todo_file = "$opt{'todo-dir'}/$opt{todo}";
+ $todo_version = format_version_line($opt{todo});
+}
+
+# Pass this through the Make, to apicheck.pl
+$ENV{'DPPP_ARGUMENTS'} = "--todo-dir=$opt{'todo-dir'} --todo=$todo_version";
+
print "\n", ident_str(), "\n\n";
my $fullperl = `which $opt{perl}`;
@@ -45,8 +61,10 @@ chomp $fullperl;
$ENV{SKIP_SLOW_TESTS} = 1;
-regen_all();
+# Generate the Makefile using the passed in perl
+regen_Makefile();
+# List of functions that are never considered undefined. Add to as necessary
my %stdsym = map { ($_ => 1) } qw (
strlen
snprintf
@@ -63,6 +81,8 @@ my %stdsym = map { ($_ => 1) } qw (
sprintf
);
+# Initialize %sym so that the keys are all the Text symbols for this perl,
+# output from the system's 'nm'
my %sym;
for (`$Config{nm} $fullperl`) {
chomp;
@@ -70,28 +90,77 @@ for (`$Config{nm} $fullperl`) {
}
keys %sym >= 50 or die "less than 50 symbols found in $fullperl\n";
-my %all = %{load_todo($opt{todo}, $opt{version})};
+# %todo is initialized to be the symbols in the current todo file, like so:
+# {
+# 'UTF8_SAFE_SKIP' => 'U',
+# 'newSVsv_flags' => 'U',
+# 'newSVsv_nomg' => 'U',
+# }
+#
+# The values are the outputs from nm, plus 'E' from us, for Error
+my %todo = %{load_todo($todo_file, $todo_version)} if $opt{todo};
+
my @recheck;
+# Get an exhaustive list from apicheck.i of symbols, what functions contain
+# them, and how many in each function.
+# symbol fcn count
+# ------ --- -----
+# 'UV' => {
+# 'SvUVX' => 1,
+# 'toFOLD_uvchr' => 2,
+# 'sv_uni_display' => 1,
+# ...
+# }
my $symmap = get_apicheck_symbol_map();
+# In each iteration of the loop we create an apicheck.c. This will contain a
+# generated wrapper function for each API function and macro. The wrapper
+# contains one or more calls to its API element. Then we attempt to compile
+# apicheck.c into apicheck.o. If it compiles, then every API element exists
+# in this version of perl. If not, we figure out which ones were undefined,
+# and set things up so that in the next iteration of the loop, the wrappers
+# for those elements are #ifdef'd out.
for (;;) {
my $retry = 1;
my $trynm = 1;
+
regen_apicheck();
retry:
- my(@new, @tmp, %seen);
+ my(@new, @already_in_sym, %seen);
my $r = run(qw(make));
- $r->{didnotrun} and die "couldn't run make: $!\n";
+ $r->{didnotrun} and die "couldn't run make: $!\n" .
+ join('', @{$r->{stdout}})."\n---\n".join('', @{$r->{stderr}});
+
+ # If there were warnings, we ask the user before continuing when creating
+ # the base files of blead. This leads to a potential early exit when things
+ # aren't working right.
+ if ($opt{blead} && $opt{base}) {
+ undef $opt{blead}; # Only warn once.
+ if (@{$r->{stderr}}) {
+ print STDERR "Warnings and errors from compiling blead:\n";
+ print STDERR @{$r->{stderr}};
+ ask_or_quit("\nUnexpected warnings when compiling blead can lead to"
+ . " wrong results. Please examine the above list.\n"
+ . "Shall I proceed?");
+ }
+ else {
+ print STDERR "blead compiled without warnings nor errors.\n"
+ . "Proceeding with everything else\n";
+ }
+ }
+ # Examine stderr. For each wrapper function listed in it, we create an
+ # 'E' (for error) entry. If the function (possibly prefixed by '[Pp]erl')
+ # is in %sym, it is added to @already_in_sym. Otherwise, @new.
for my $l (@{$r->{stderr}}) {
if ($l =~ /_DPPP_test_(\w+)/) {
if (!$seen{$1}++) {
my @s = grep { exists $sym{$_} } $1, "Perl_$1", "perl_$1";
if (@s) {
- push @tmp, [$1, "E (@s)"];
+ push @already_in_sym, [$1, "E (@s)"];
}
else {
push @new, [$1, "E"];
@@ -99,22 +168,33 @@ retry:
}
}
}
+ print STDERR __LINE__, ": \@new after make", Dumper \@new if $opt{debug} > 6;
if ($r->{status} == 0) {
my @u;
my @usym;
+ # Here, apicheck.o was successfully created. It likely will need
+ # functions from outside it in order to form a complete executable a.out.
+ # In the first iteration, look to see if all needed externs are available.
+ # (We don't actually try to create an a.out)
if ($trynm) {
@u = eval { find_undefined_symbols($fullperl, $opt{shlib}) };
warn "warning: $@" if $@;
$trynm = 0;
}
+ # If it didn't find any undefined symbols, everything should be working.
+ # Run the test suite.
unless (@u) {
$r = run(qw(make test));
- $r->{didnotrun} and die "couldn't run make test: $!\n";
- $r->{status} == 0 and last;
+ $r->{didnotrun} and die "couldn't run make test: $!\n" .
+ join('', @{$r->{stdout}})."\n---\n".join('', @{$r->{stderr}});
+ $r->{status} == 0 and last; # It worked!!
+
+ # Alas, something was wrong. Add any undefined symbols listed in the
+ # output to our list
for my $l (@{$r->{stderr}}) {
if ($l =~ /undefined symbol: (\w+)/) {
push @u, $1;
@@ -122,93 +202,191 @@ retry:
}
}
+ # For each undefined symbol
for my $u (@u) {
+
+ # If this is an API symbol, $symmap->{$u} will exist and be a hash of
+ # keys, being all the symbols referred to within it (with their values
+ # btw being the count of occurrences in the element).
for my $m (keys %{$symmap->{$u}}) {
+
+ # pthread_getspecific() is undefined. khw doesn't know why. But we
+ # have a bunch of things depending on it, so it doesn't work unless we
+ # ignore this apparently spurious issue.
+ next if $u eq 'pthread_getspecific';
+
if (!$seen{$m}++) {
my $pl = $m;
$pl =~ s/^[Pp]erl_//;
my @s = grep { exists $sym{$_} } $pl, "Perl_$pl", "perl_$pl";
+
+ # The comment for this entry that goes into the file that gets
+ # written includes any [Pp]erl prefix.
push @new, [$m, @s ? "U (@s)" : "U"];
}
}
}
}
+ print STDERR __LINE__, ": \@new after getting undefs", Dumper \@new
+ if $opt{debug} > 6;
- @new = grep !$all{$_->[0]}, @new;
+ # Remove from @new all the current todo symbols
+ @new = grep !$todo{$_->[0]}, @new;
+ print STDERR __LINE__, ": \@new after removing current", Dumper \@new
+ if $opt{debug} > 6;
+ # If none remain, start over with those we know about, minus the todo
+ # symbols. khw doesn't understand why this is necessary
unless (@new) {
- @new = grep !$all{$_->[0]}, @tmp;
+ @new = grep !$todo{$_->[0]}, @already_in_sym;
+ print STDERR __LINE__, ": \@new after starting over", Dumper \@new
+ if $opt{debug} > 6;
}
+ # This retries once if nothing new was found (khw guesses that is just to
+ # be sure, or maybe it's because we ran nm the first time through)
unless (@new) {
if ($retry > 0) {
$retry--;
- regen_all();
+ regen_Makefile();
goto retry;
}
print Dumper($r);
die "no new TODO symbols found...";
}
- # don't recheck undefined symbols reported by the dynamic linker
+ # recheck symbols except undefined ones reported by the dynamic linker
push @recheck, map { $_->[0] } grep { $_->[1] !~ /^U/ } @new;
+ # Display each newly found undefined symbol, and add it to the list of todo
+ # symbols
for (@new) {
- sym('new', @$_);
- $all{$_->[0]} = $_->[1];
+ display_sym('new', @$_);
+ $todo{$_->[0]} = $_->[1];
}
- write_todo($opt{todo}, $opt{version}, \%all);
-}
+ print STDERR __LINE__, ": %todo at end of iteration ", Dumper \%todo
+ if $opt{debug} > 6;
+
+ # Write the revised todo, so that apicheck.c when generated in the next
+ # iteration will have these #ifdef'd out
+ write_todo($todo_file, $todo_version, \%todo);
+} # End of loop
+# If we are to check our work, do so. This verifies that each symbol
+# identified above is really a problem in this version. (khw doesn't know
+# under what circumstances this becomes an issue)
+#
+# We go through each symbol on the @recheck list, and create an apicheck.c
+# with it enabled.
if ($opt{check}) {
+
+ # Create something like '%3d'
my $ifmt = '%' . length(scalar @recheck) . 'd';
+
my $t0 = [gettimeofday];
RECHECK: for my $i (0 .. $#recheck) {
my $sym = $recheck[$i];
- my $cur = delete $all{$sym};
- sym('chk', $sym, $cur, sprintf(" [$ifmt/$ifmt, ETA %s]",
+ # Assume it will work
+ my $cur = delete $todo{$sym};
+
+ # Give a progress report
+ display_sym('chk', $sym, $cur, sprintf(" [$ifmt/$ifmt, ETA %s]",
$i + 1, scalar @recheck, eta($t0, $i, scalar @recheck)));
- write_todo($opt{todo}, $opt{version}, \%all);
+ # Write out the todo file without this symbol, meaning it will be enabled
+ # in the generated apicheck.c file
+ write_todo($todo_file, $todo_version, \%todo);
+ # E is not an nm symbol, but was added by us to indicate 'Error'
if ($cur eq "E (Perl_$sym)") {
- # we can try a shortcut here
+
+ # We can try a shortcut here. Create an apicheck.c file for just this
+ # symbol.
regen_apicheck($sym);
my $r = run(qw(make test));
if (!$r->{didnotrun} && $r->{status} == 0) {
- sym('del', $sym, $cur);
+
+ # Shortcut indicated that this function compiles..
+ display_sym('del', $sym, $cur);
next RECHECK;
}
+
+ # Here, the api file with just this entry failed to compile. (khw
+ # doesn't know why we just don't give up on it now, but we don't.) We
+ # drop down below to generate and compile a full apicheck.c with this
+ # symbol enabled. (XXX Perhaps we could look at stderr and if it
+ # contained things about parameter mismatch, (which is a common
+ # occurrence), we could skip the steps below.)
}
- # run the full test
- regen_all();
+ # Either can't shortcut, or the shortcut indicated that the function
+ # doesn't compile in isolation. Create, compile and test with this
+ # function/symbol enabled. (Remember that this should have succeeded
+ # above to get to here when this symbol was disabled, so enabling just
+ # this one will tell us for sure that it works or doesn't work. (khw
+ # wonders if this is actually a DAG, or perhaps with cycles, so this is
+ # under it all, insufficient.)
+ regen_Makefile();
my $r = run(qw(make test));
- $r->{didnotrun} and die "couldn't run make test: $!\n";
+ # This regenerated apicheck.c
+ dump_apicheck() if $opt{debug} > 3;
+
+ $r->{didnotrun} and die "couldn't run make test: $!\n" .
+ join('', @{$r->{stdout}})."\n---\n".join('', @{$r->{stderr}});
- if ($r->{status} == 0) {
- sym('del', $sym, $cur);
+ if ($r->{status} == 0) { # This symbol compiles and tests ok, so retain
+ # in this version
+ display_sym('del', $sym, $cur);
}
- else {
- $all{$sym} = $cur;
+ else { # Revert to this symbol is bad in this version
+ print STDERR __LINE__, ": symbol '$sym' not in this version\n"
+ if $opt{debug} > 6;
+ $todo{$sym} = $cur;
+ write_todo($todo_file, $todo_version, \%todo);
}
}
+} # End of checking our work
+
+print STDERR __LINE__, ": %todo at end ", Dumper \%todo if $opt{debug} > 6;
+write_todo($todo_file, $todo_version, \%todo);
+
+# If this is the earliest perl being tested, we can extend down our values to
+# include it. (Remember, that we create files for the next higher version,
+# but this allows us to create a file for the lowest as well.) This
+# effectively writes out all the known symbols of this earliest version as if
+# they came into existence during it.
+if ($opt{final}) {
+ my $file = "$opt{'todo-dir'}/$opt{final}";
+ my $version = format_version_line($opt{final});
+
+ regen_Makefile();
+ my $r = run(qw(make));
+ $r->{didnotrun} and die "couldn't run make: $!\n" .
+ join('', @{$r->{stdout}})."\n---\n".join('', @{$r->{stderr}});
+
+ my $symbols = read_sym(file => $opt{shlib}, options => [qw( --defined-only )]);
+ my @stuff = map { /_DPPP_test_(.*)/ } keys %$symbols;
+ %todo = map { $_ => 'T' } @stuff;
+
+ print STDERR __LINE__, ": write at ", Dumper $file, $version, \%todo
+ if $opt{debug} > 5;
+ write_todo($file, $version, \%todo);
}
-write_todo($opt{todo}, $opt{version}, \%all);
-
+# Clean up after ourselves
+$opt{debug} = 0; # Don't care about failures
run(qw(make realclean));
exit 0;
-sub sym
+sub display_sym
{
my($what, $sym, $reason, $extra) = @_;
$extra ||= '';
@@ -220,28 +398,56 @@ sub sym
$what = colored("$what symbol", $col{$what});
printf "[%s] %s %-30s # %s%s\n",
- $opt{version}, $what, $sym, $reason, $extra;
+ $todo_version, $what, $sym, $reason, $extra;
}
-sub regen_all
+sub regen_Makefile
{
+ # We make sure to add rules for creating apicheck.c
my @mf_arg = ('--with-apicheck', 'OPTIMIZE=-O0 -w');
+
+ # It doesn't include ppport.h if generating the base files.
push @mf_arg, qw( DEFINE=-DDPPP_APICHECK_NO_PPPORT_H ) if $opt{base};
# just to be sure
+ my $debug = $opt{debug};
+ $opt{debug} = 0; # Don't care about failures
run(qw(make realclean));
- run($fullperl, "Makefile.PL", @mf_arg)->{status} == 0
- or die "cannot run Makefile.PL: $!\n";
+ $opt{debug} = $debug;
+
+ my $r = run($fullperl, "Makefile.PL", @mf_arg);
+ unless ($r->{status} == 0) {
+ die "cannot run Makefile.PL: $!\n" .
+ join('', @{$r->{stdout}})."\n---\n".join('', @{$r->{stderr}});
+ }
}
-sub regen_apicheck
+sub regen_apicheck # Regeneration can also occur by calling 'make'
{
unlink qw(apicheck.c apicheck.o);
runtool({ out => '/dev/null' }, $fullperl, 'apicheck_c.PL', map { "--api=$_" } @_)
or die "cannot regenerate apicheck.c\n";
+ dump_apicheck() if $opt{debug} > 3;
}
-sub load_todo
+sub dump_apicheck
+{
+ my $apicheck = "apicheck.c";
+ my $f = new IO::File $apicheck or die "cannot open $apicheck: $!\n";
+ my @lines = <$f>;
+ print STDERR __FILE__, ": ", __LINE__, ": $apicheck (",
+ scalar @lines,
+ " lines) for $fullperl";
+ print STDERR " and '" if @_;
+ print STDERR join "', '", @_;
+ print STDERR "'" if @_;
+ print STDERR ":\n";
+ my $n = 1;
+ print STDERR $n++, " ", $_ for @lines;
+}
+
+sub load_todo # Return entries from $file; skip if the first line
+ # isn't $expver (expected version)
{
my($file, $expver) = @_;
@@ -268,7 +474,8 @@ nuke_file:
return {};
}
-sub write_todo
+sub write_todo # Write out the todo file. The keys of %sym are known to not
+ # be in this version, hence are 'todo'
{
my($file, $ver, $sym) = @_;
my $f;
@@ -276,13 +483,21 @@ sub write_todo
$f = new IO::File ">$file" or die "cannot open $file: $!\n";
$f->print("$ver\n");
- for (sort keys %$sym) {
+ # Dictionary ordering, with only alphanumerics
+ for (sort dictionary_order keys %$sym) {
$f->print(sprintf "%-30s # %s\n", $_, $sym->{$_});
}
+
+ $f->close;
}
sub find_undefined_symbols
{
+ # returns a list of undefined symbols in $shlib. To be considered
+ # undefined, it must also not be defined in $perl. Symbols that begin with
+ # underscore, or contain '@', or are some libc ones are not returned.
+ # Presumably, the list of libc could be expanded if necessary.
+
my($perl, $shlib) = @_;
my $ps = read_sym(file => $perl, options => [qw( --defined-only )]);
@@ -291,13 +506,16 @@ sub find_undefined_symbols
my @undefined;
for my $sym (keys %$ls) {
+ next if $sym =~ /\@/ or $sym =~ /^_/ or exists $stdsym{$sym};
unless (exists $ps->{$sym}) {
- if ($sym !~ /\@/ and $sym !~ /^_/) {
- push @undefined, $sym unless $stdsym{$sym};
- }
+ print STDERR __LINE__, ": , Couldn't find '$sym' in $perl\n"
+ if $opt{debug} > 4;
+ push @undefined, $sym;
}
}
+ print STDERR __LINE__, ": find_undef returning ", Dumper \@undefined
+ if $opt{debug} > 4;
return @undefined;
}
@@ -308,7 +526,8 @@ sub read_sym
my $r = run($Config{nm}, @{$opt{options}}, $opt{file});
if ($r->{didnotrun} or $r->{status}) {
- die "cannot run $Config{nm}";
+ die "cannot run $Config{nm}" .
+ join('', @{$r->{stdout}})."\n---\n".join('', @{$r->{stderr}});
}
my %sym;
@@ -329,27 +548,38 @@ sub get_apicheck_symbol_map
my $r;
while (1) {
+
+ # Create apicheck.i
$r = run(qw(make apicheck.i));
+ # Quit the loop if it succeeded
last unless $r->{didnotrun} or $r->{status};
+ # Get the list of macros that had parameter issues. These are marked as
+ # A, for absolute in nm terms
my %sym = map { /error: macro "(\w+)" (?:requires|passed) \d+ argument/ ? ($1 => 'A') : () }
@{$r->{stderr}};
+ # Display these, and add them to the global %todo.
if (keys %sym) {
- for my $s (sort keys %sym) {
- sym('new', $s, $sym{$s});
- $all{$s} = $sym{$s};
+ for my $s (sort dictionary_order keys %sym) {
+ display_sym('new', $s, $sym{$s});
+ $todo{$s} = $sym{$s};
}
- write_todo($opt{todo}, $opt{version}, \%all);
+
+ # And rewrite the todo file, including these new symbols.
+ write_todo($todo_file, $todo_version, \%todo);
+
+ # Regenerate apicheck.c for the next iteration
regen_apicheck();
}
- else {
+ else { # It failed for some other reason than parameter issues: give up
die "cannot run make apicheck.i ($r->{didnotrun} / $r->{status}):\n".
join('', @{$r->{stdout}})."\n---\n".join('', @{$r->{stderr}});
}
}
+ # Here, have an apicheck.i. Read it in
my $fh = IO::File->new('apicheck.i')
or die "cannot open apicheck.i: $!";
@@ -358,17 +588,37 @@ sub get_apicheck_symbol_map
my $cur;
while (<$fh>) {
+ print STDERR __LINE__, ": apicheck.i ", $_ if $opt{debug} > 5;
next if /^#/;
- if (defined $cur) {
+
+ # We only care about lines within one of our _DPPP_test_ functions. If
+ # we're in one, $cur is set to the name of the current one.
+ if (! defined $cur) { # Not within such a function; see if this starts
+ # one
+ /_DPPP_test_(\w+)/ and $cur = $1;
+ }
+ else {
+
+ # For anything that looks like a symbol, note it as a key, and as its
+ # value, the name of the function. Actually the value is another key,
+ # whose value is the count of this symbol's occurrences, so it looks
+ # like:
+ # 'UV' => {
+ # 'SvUVX' => 1,
+ # 'toFOLD_uvchr' => 2,
+ # 'sv_uni_display' => 1,
+ # ...
+ # }
for my $sym (/\b([A-Za-z_]\w+)\b/g) {
$symmap{$sym}{$cur}++;
}
+
+ # This line marks the end of this function, as constructed by us.
undef $cur if /^}$/;
}
- else {
- /_DPPP_test_(\w+)/ and $cur = $1;
- }
}
+ print STDERR __LINE__, ": load_todo returning ", Dumper \%symmap
+ if $opt{debug} > 5;
return \%symmap;
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate
index 5ffa30ccef7..97b7cbec2b6 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/regenerate
@@ -21,13 +21,17 @@ use Getopt::Long;
use Pod::Usage;
require './devel/devtools.pl';
+require './parts/ppptools.pl';
our %opt = (
check => 1,
+ debug => 0,
verbose => 0,
+ yes => 0,
);
-GetOptions(\%opt, qw( check! verbose install=s blead=s blead-version=s )) or die pod2usage();
+GetOptions(\%opt, qw( check! verbose yes install=s blead=s blead-version=s
+ debug=i debug-start=s)) or die pod2usage();
identify();
@@ -36,7 +40,9 @@ unless (-e 'parts/embed.fnc' and -e 'parts/apidoc.fnc') {
quit_now();
}
-ask_or_quit("Are you sure you have updated parts/embed.fnc and parts/apidoc.fnc?");
+if (! $opt{'yes'}) {
+ ask_or_quit("Are you SURE you have:\n1) updated parts/embed.fnc to latest blead?\n2) run devel/mkapidoc.pl to update parts/apidoc.fnc?\n3) run devel/mkppport_fnc.pl to update parts/ppport.fnc?\n");
+}
my %files = map { ($_ => [glob "parts/$_/5*"]) } qw( base todo );
@@ -61,11 +67,54 @@ if (@notwr) {
}
}
+# Check that there is only one entry in the whole system for each item
+my @embeds = parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc));
+my %seen;
+%seen = map { $seen{$_->{name}}++; } @embeds;
+my @bads = grep { $seen{$_} > 1 } keys %seen;
+if (@bads) {
+ print "The following items have multiple entries in the parts/*.fnc files.\n",
+ " Regenerate apidoc.fnc, then ppport.fnc and try again. If this\n",
+ " doesn't work, choose the best version for each symbol and delete\n",
+ " the others: ",
+ join ", ", @bads, "\n";
+ quit_now();
+}
+
+if (-e 'ppport.h') {
+ my $blead = $opt{blead};
+ $blead = get_and_sort_perls(\%opt)->[0]->{path} unless $blead;
+
+ # Get list of things we provide
+ my %provided = map { /^(\w+)/ ? ( $1 => 1 ) : () }
+ `$blead ppport.h --list-provided`;
+
+ # Get the list of macros that are hard to test.
+ my @unorthodox = map { exists $_->{flags}{u} ? $_->{name} : () } @embeds;
+
+ # Keep on that list only the things we provide
+ @unorthodox = grep { exists $provided{$_} } @unorthodox;
+
+ # And get the list of known hard things.
+ my $hard_ref = &known_but_hard_to_test_for;
+
+ # If we provide something, it better be on the known things list
+ my @bad = grep { ! exists $hard_ref->{$_} } @unorthodox;
+ if (@bad) {
+ print "The following items need to be manually added to the list in",
+ " part/inc/ppptools: known_but_hard_to_test_for(): ",
+ join ", ", @bad, "\n";
+ quit_now();
+ }
+}
+
for my $dir (qw( base todo )) {
my $cur = "parts/$dir";
my $old = "$cur-old";
if (-e $old) {
- ask_or_quit("Do you want me to remove the old $old directory?");
+ if (! $opt{'yes'}) {
+ ask_or_quit("Do you want me to remove the old $old directory?");
+ }
rmtree($old);
}
mkdir $old;
@@ -78,15 +127,31 @@ for my $dir (qw( base todo )) {
}
my @perlargs;
-push @perlargs, "--install=$opt{install}" if exists $opt{install};
-push @perlargs, "--blead=$opt{blead}" if exists $opt{blead};
+push @perlargs, "--debug=$opt{debug}" if $opt{debug};
+push @perlargs, "--install=$opt{install}" if $opt{install};
+push @perlargs, "--blead=$opt{blead}" if $opt{blead};
+push @perlargs, "--debug-start=$opt{'debug-start'}" if $opt{'debug-start'};
my $T0 = time;
my @args = ddverbose();
push @args, '--nocheck' unless $opt{check};
-push @args, "--blead-version=$opt{'blead-version'}" if exists $opt{'blead-version'};
+push @args, "--blead-version=$opt{'blead-version'}" if $opt{'blead-version'};
push @args, @perlargs;
+# Look for all the NEED_foo macros
+my @NEED;
+for my $file (all_files_in_dir('parts/inc')) {
+ my $spec = parse_partspec($file);
+ next unless $spec->{'xsinit'};
+ while ($spec->{'xsinit'} =~ / ^ ( \# \s* define \s+ NEED_ \w+ ) \s /xmg) {
+ push @NEED, "$1";
+ }
+}
+
+# Make the list available to parts/apicheck.pl
+$ENV{'DPPP_NEED'} = join "\n", sort @NEED;
+
+# Find out what symbols were in what releases
print "\nBuilding baseline files...\n\n";
unless (runperl('devel/mktodo', '--base', @args)) {
@@ -94,22 +159,16 @@ unless (runperl('devel/mktodo', '--base', @args)) {
quit_now();
}
-print "\nMoving baseline files...\n\n";
-
-for my $src (glob 'parts/todo/5*') {
- my $dst = $src;
- $dst =~ s/todo/base/ or die "Ooops!";
- move($src, $dst) or die "Moving $src to $dst failed: $!\n";
-}
-
+# Then find out what ppport.h buys us by repeating the process above, but
+# using ppport.h
print "\nBuilding todo files...\n\n";
unless (runperl('devel/mktodo', @args)) {
- print "\nSomething went wrong while building the baseline files.\n";
+ print "\nSomething went wrong while building the todo files.\n";
quit_now();
}
-print "\nAdding remaining baseline info...\n\n";
+print "\nAdding remaining info...\n\n";
unless (runperl('Makefile.PL') and
runtool('make') and
@@ -145,6 +204,8 @@ regenerate - Automatically regenerate Devel::PPPort's API information
--nocheck don't recheck symbols that caused an error
--verbose show verbose output
+ --yes the answer to all the standard questions is 'yes',
+ can be used to nohup this.
=head1 COPYRIGHT
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov
index 804524cb4a9..b8f184d55de 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/devel/scanprov
@@ -1,7 +1,22 @@
#!/usr/bin/perl -w
################################################################################
#
-# scanprov -- scan Perl headers for provided macros
+# scanprov -- scan Perl headers for provided macros, and add known
+# exceptions, and functions we weren't able to otherwise find.
+# Thus the purpose of this file has been expanded beyond what its
+# name says.
+#
+# The lines added have a code to signify they are added by us:
+# M means it is a macro
+# X means it is a known exceptional item
+# F means it is a function in embed.fnc that the normal routines didn't find
+#
+# The regeneration routines do not know the prototypes for the macros scanned
+# for, which is gotten from documentation in the source. (If they were
+# documented, they would be put in parts/apidoc.fnc, and test cases generated
+# for them in mktodo.pl). Therefore these are all undocumented. It would be
+# best if people would add document to them in the perl source, and then this
+# portion of this function would be minimized.
#
################################################################################
#
@@ -18,61 +33,249 @@ use strict;
use Getopt::Long;
require './parts/ppptools.pl';
+require './parts/inc/inctools';
+require './devel/devtools.pl';
our %opt = (
mode => 'check',
install => '/tmp/perl/install/default',
blead => 'bleadperl',
+ debug => 0,
+ 'debug-start' => "",
);
-GetOptions(\%opt, qw( install=s mode=s blead=s )) or die;
+GetOptions(\%opt, qw( install=s mode=s blead=s debug=i debug-start=s)) or die;
my $write = $opt{mode} eq 'write';
-my %embed = map { ( $_->{name} => 1 ) }
- parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc ));
+# Get the list of known macros. Functions are calculated separately below
+my %embed = map { $_->{flags}{m} ? ( $_->{name} => 1 ) : () }
+ parse_embed(qw(parts/embed.fnc parts/apidoc.fnc));
+
+# @provided is set to everthing provided
+my @provided = map { /^(\w+)/ ? $1 : () } `$^X ppport.h --list-provided`;
+
+# There are a few exceptions that have to be dealt with specially. Add these
+# to the list of things to scan for.
+my $hard_to_test_ref = known_but_hard_to_test_for();
+push @provided, keys %$hard_to_test_ref;
+
+my $base_dir = 'parts/base';
+my $todo_dir = 'parts/todo';
+
+if ($write) {
+
+ # Get the list of files, which are returned sorted, and so the min version
+ # is in the 0th element
+ my @files = all_files_in_dir($base_dir);
+ my $file = $files[0];
+ my $min_perl = $file;
+ $min_perl =~ s,.*/,,; # The name is the integer of __MIN_PERL__
+
+ # There are a very few special cases that we may not find in scanning, but
+ # exist all the way back. Add them now to avoid throwing later things
+ # off.
+ print "-- $file --\n";
+ open F, ">>$file" or die "$file: $!\n";
+ for (qw(RETVAL CALL THIS)) { # These are also in hard_to_test_for(),
+ # so can't be in blead, as they are skipped
+ # in testing, so no real need to check that
+ # they aren't dups.
+ print "Adding $_ to $file\n";
+ print F format_output_line($_, 'X');
+ }
+ close F;
+
+ # Now we're going to add the hard to test symbols. The hash has been
+ # manually populated and commited, with the version number ppport supports
+ # them to.
+ #
+ # This is a hash ref with the keys being all symbols found in all the
+ # files in the directory, and the values being the perl versions of each
+ # symbol.
+ my $todo = parse_todo($todo_dir);
-my @provided = grep { !exists $embed{$_} }
- map { /^(\w+)/ ? $1 : () }
- `$^X ppport.h --list-provided`;
+ # The keys of $hard_to_test_ref are the symbols, and the values are
+ # subhashes, with each 'version' key being its proper perl version.
+ # Below, we invert %hard_to_test, so that the keys are the version, and
+ # the values are the symbols that go in that version
+ my %add_by_version;
+ for my $hard (keys %$hard_to_test_ref) {
-my @perls = sort { $b->{version} <=> $a->{version} }
- map { { version => `$_ -e 'printf "%.6f", \$]'`, path => $_ } }
- ($opt{blead}, glob "$opt{install}/*/bin/perl5.*");
+ # But if someone ups the min version we support, we don't want to add
+ # something less than that.
+ my $version = int_parse_version($hard_to_test_ref->{$hard});
+ $version = $min_perl if $version < $min_perl;
+ $version = format_version_line($version);
-for (1 .. $#perls) {
- $perls[$_]{todo} = $perls[$_-1]{version};
+ push @{$add_by_version{$version}}, $hard
+ unless grep { $todo->{$_}->{version} eq $hard } keys %$todo;
+ }
+
+ # Only a few files will have exceptions that apply to them. Rewrite each
+ foreach my $version (keys %add_by_version) {
+ my $file = "$todo_dir/" . int_parse_version($version);
+ print "-- Adding known exceptions to $file --\n";
+ my $need_version_line = ! -e $file;
+ open F, ">>$file" or die "$file: $!\n";
+ print F format_version_line($version) . "\n" if $need_version_line;
+ foreach my $symbol (sort dictionary_order @{$add_by_version{$version}})
+ {
+ print "adding $symbol\n";
+ print F format_output_line($symbol, 'X');
+ }
+ close F;
+ }
}
-shift @perls;
+# Now that we've added the exceptions to a few files, we can parse
+# and deal with all of them.
+my $perls_ref = get_and_sort_perls(\%opt);
+
+die "Couldn't find any perls" unless @$perls_ref > 1;
+
+find_first_mentions($perls_ref, # perls to look in
+ \@provided, # List of symbol names to look for
+ '*.h', # Look in all hdrs.
+ 1, # Strip comments
+ 'M'
+ );
+
+# Now look for functions that we didn't test in mktodo.pl, generally because
+# these were hidden behind #ifdef's.
+my $base_ref = parse_todo($base_dir);
+my @functions = parse_embed(qw(parts/embed.fnc));
+
+# We could just gather data for the publicly available ones, but having this
+# information available for everything is useful (for those who know where to
+# look)
+#@functions = grep { exists $_->{flags}{A} } @functions;
-my %v;
+# The ones we don't have info on are the ones in embed.fnc that aren't in the
+# base files. Certain of these will only be in the Perl_foo form.
+my @missing = map { exists $base_ref->{$_->{name}}
+ ? ()
+ : ((exists $_->{flags}{p} && exists $_->{flags}{o})
+ ? ((exists $base_ref->{$_->{"Perl_$_->{name}"}}
+ ? ()
+ : "Perl_$_->{name}"))
+ : $_->{name})
+ } @functions;
-for my $p (@perls) {
- print "checking perl $p->{version}...\n";
- my $archlib = `$p->{path} -MConfig -l -e 'print \$Config{archlib}'`;
- chomp $archlib;
- local @ARGV = glob "$archlib/CORE/*.h";
- my %sym;
- while (<>) { $sym{$_}++ for /(\w+)/g; }
- @provided = map { $sym{$_} or $v{$p->{todo}}{$_}++; $sym{$_} ? $_ : () } @provided;
+# These symbols will be found in the autogen'd files, and they may be
+# commented out in them.
+find_first_mentions($perls_ref,
+ \@missing,
+ [ 'embed.h', 'proto.h' ],
+ 0, # Don't strip comments
+ 'F'
+ );
+
+sub format_output_line
+{
+ my $sym = shift;
+ my $code = shift;
+
+ return sprintf "%-30s # $code added by $0\n", $sym;
}
-my $out = 'parts/base';
-my $todo = parse_todo($out);
-
-for my $v (keys %v) {
- my @new = sort grep { !exists $todo->{$_} } keys %{$v{$v}};
- @new or next;
- my $file = $v;
- $file =~ s/\.//g;
- $file = "$out/$file";
- -e $file or die "non-existent: $file\n";
- print "-- $file --\n";
- $write and (open F, ">>$file" or die "$file: $!\n");
- for (@new) {
- print "adding $_\n";
- $write and printf F "%-30s # added by $0\n", $_;
- }
- $write and close F;
+sub find_first_mentions
+{
+ my $perls_ref = shift; # List of perls to look in
+ my $look_for_ref = shift; # List of symbol names to look for
+ my $hdrs = shift; # Glob of hdrs to look in
+ my $strip_comments = shift;
+ my $code = shift; # Mark entries as having this type
+
+ $hdrs = [ $hdrs ] unless ref $hdrs;
+
+ my @remaining = @$look_for_ref;
+
+ my %v;
+
+ # We look in descending order of perl versions. Each time through the
+ # loop @remaining is narrowed.
+ for my $p (@$perls_ref) {
+ print "checking perl $p->{version}...\n";
+
+ # Get the hdr files associated with this version
+ my $archlib = `$p->{path} -MConfig -l -e 'print \$Config{archlib}'`;
+ chomp $archlib;
+ local @ARGV;
+ push @ARGV, glob "$archlib/CORE/$_" for @$hdrs;
+
+ my %sym;
+
+ # %sym's keys are every single thing that looks like an identifier
+ # (beginning with a non-digit \w, followed by \w*) that occurs in all
+ # the headers, regardless of where (outside of comments).
+ local $/ = undef;
+ while (<>) { # Read in the next file
+
+ # Strip comments, from perl faq
+ if ($strip_comments) {
+ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
+ }
+
+ $sym{$_}++ for /(\b[^\W\d]\w*)/g;
+ }
+
+ # @remaining is narrowed to include only those identifier-like things
+ # that are mentioned in one of the input hdrs in this release. (If it
+ # isn't even mentioned, it won't exist in the release.) For those not
+ # mentioned, a key is added of the identifier-like thing in %v. It is
+ # a subkey of this release's "todo" release, which is the next higher
+ # one. If we are at version n, we have already done version n+1 and
+ # the provided element was mentioned there, and now it no longer is.
+ # We take that to mean that to mean that the element became provided
+ # for in n+1.
+ @remaining = map { $sym{$_} or $v{$p->{todo}}{$_}++;
+ $sym{$_} ? $_ : ()
+ } @remaining;
+
+ }
+
+ $v{$perls_ref->[-1]{file}}{$_}++ for @remaining;
+
+ # Read in the parts/base files. The hash ref has keys being all symbols
+ # found in all the files in base/, which are all we are concerned with
+ # became defined in.
+ my $base_ref = parse_todo($base_dir);
+
+
+ # Now add the results from above. At this point, The keys of %v are the 7
+ # digit BCD version numbers, and their subkeys are the symbols provided by
+ # D:P that are first mentioned in this version, like this:
+ # '5009002' => {
+ # 'MY_CXT_CLONE' => 1,
+ # 'SV_NOSTEAL' => 1,
+ # 'UTF8_MAXBYTES' => 1
+ # },
+
+ for my $v (keys %v) {
+
+ # Things listed in blead (the most recent file) are special. They are
+ # there by default because we haven't found them anywhere, so they
+ # don't really exist as far as we can determine, so shouldn't be
+ # listed as existing.
+ next if $v > $perls_ref->[0]->{file};
+
+ # @new becomes the symbols for version $v not already in the file for
+ # $v
+ my @new = sort dictionary_order grep { !exists $base_ref->{$_} }
+ keys %{$v{$v}};
+ @new or next; # Nothing new, skip writing
+
+ my $file = $v;
+ $file =~ s/\.//g;
+ $file = "$base_dir/$file";
+ -e $file or die "non-existent: $file\n";
+ print "-- $file --\n";
+ $write and (open F, ">>$file" or die "$file: $!\n");
+ for (@new) {
+ print "adding $_\n";
+ $write and print F format_output_line($_, $code);
+ }
+ $write and close F;
+ }
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL b/gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL
index 02c91104636..217afefe7ec 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/mktests.PL
@@ -14,7 +14,7 @@
################################################################################
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
require "./parts/ppptools.pl";
my $template = do { local $/; <DATA> };
@@ -41,11 +41,14 @@ sub generate_tests
print "generating $testfile\n";
my $tmpl = $template;
- $tmpl =~ s/__SOURCE__/$file/mg;
+ my $canonfile = $file;
+ $canonfile =~ tr!\\!/!; # MSWin32 use backslashes
+ $tmpl =~ s/__SOURCE__/$canonfile/mg;
$tmpl =~ s/__PLAN__/$spec->{OPTIONS}{tests}{plan}/mg;
$tmpl =~ s/^__TESTS__$/$spec->{tests}/mg;
open FH, ">$testfile" or die "$testfile: $!\n";
+ binmode FH;
print FH $tmpl;
close FH;
@@ -69,10 +72,12 @@ __DATA__
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -80,13 +85,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (__PLAN__) {
@@ -97,7 +104,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl
index 69d85027fdb..268ada46a4f 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apicheck.pl
@@ -1,7 +1,10 @@
#!/usr/bin/perl -w
################################################################################
#
-# apicheck.pl -- generate C source for automated API check
+# apicheck.pl -- generate apicheck.c: C source for automated API check
+#
+# WARNING: This script will be run on very old perls. You need to not use
+# modern constructs. See HACKERS file for examples.
#
################################################################################
#
@@ -25,92 +28,125 @@ else {
*OUT = \*STDOUT;
}
+# Arguments passed to us in this variable are of the form
+# '--a=foo --b=bar', so split first on space, then the =, and then the hash is
+# of the form { a => foo, b => bar }
+my %script_args = map { split /=/ } split(/\s+/, $ENV{'DPPP_ARGUMENTS'});
+
+# Get list of functions/macros to test
my @f = parse_embed(qw( parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc ));
-my %todo = %{&parse_todo};
+# Read in what we've decided in previous calls should be #ifdef'd out for this
+# call. The keys are the symbols to test; each value is a subhash, like so:
+# 'utf8_hop_forward' => {
+# 'version' => '5.025007'
+# },
+# We don't care here about other subkeys
+my %todo = %{&parse_todo($script_args{'--todo-dir'})};
+# We convert these types into these other types
my %tmap = (
void => 'int',
);
+# These are for special marker argument names, as mentioned in embed.fnc
my %amap = (
SP => 'SP',
type => 'int',
cast => 'int',
+ block => '{1;}',
);
+# Certain return types are instead considered void
my %void = (
void => 1,
Free_t => 1,
Signal_t => 1,
);
+# khw doesn't know why these exist. These have an explicit (void) cast added.
+# Undef'ing this hash made no difference. Maybe it's for older compilers?
my %castvoid = (
map { ($_ => 1) } qw(
+ G_ARRAY
+ G_DISCARD
+ G_EVAL
+ G_NOARGS
+ G_SCALAR
+ G_VOID
+ HEf_SVKEY
+ MARK
Nullav
+ Nullch
Nullcv
Nullhv
- Nullch
Nullsv
- HEf_SVKEY
SP
- MARK
- SVt_PV
SVt_IV
SVt_NV
- SVt_PVMG
+ SVt_PV
SVt_PVAV
- SVt_PVHV
SVt_PVCV
+ SVt_PVHV
+ SVt_PVMG
SvUOK
- G_SCALAR
- G_ARRAY
- G_VOID
- G_DISCARD
- G_EVAL
- G_NOARGS
XS_VERSION
),
);
+# Ignore the return value of these
my %ignorerv = (
map { ($_ => 1) } qw(
newCONSTSUB
),
);
+my @simple_my_cxt_prereqs = ( 'typedef struct { int count; } my_cxt_t;', 'START_MY_CXT;' );
+my @my_cxt_prereqs = ( @simple_my_cxt_prereqs, 'MY_CXT_INIT;' );
+
+# The value of each key is a list of things that need to be declared in order
+# for the key to compile.
my %stack = (
+ MULTICALL => ['dMULTICALL;'],
ORIGMARK => ['dORIGMARK;'],
- POPpx => ['STRLEN n_a;'],
+ POP_MULTICALL => ['dMULTICALL;', 'U8 gimme;' ],
+ PUSH_MULTICALL => ['dMULTICALL;', 'U8 gimme;' ],
POPpbytex => ['STRLEN n_a;'],
- PUSHp => ['dTARG;'],
- PUSHn => ['dTARG;'],
+ POPpx => ['STRLEN n_a;'],
PUSHi => ['dTARG;'],
+ PUSHn => ['dTARG;'],
+ PUSHp => ['dTARG;'],
PUSHu => ['dTARG;'],
- XPUSHp => ['dTARG;'],
- XPUSHn => ['dTARG;'],
- XPUSHi => ['dTARG;'],
- XPUSHu => ['dTARG;'],
+ RESTORE_LC_NUMERIC => ['DECLARATION_FOR_LC_NUMERIC_MANIPULATION;'],
+ STORE_LC_NUMERIC_FORCE_TO_UNDERLYING => ['DECLARATION_FOR_LC_NUMERIC_MANIPULATION;'],
+ STORE_LC_NUMERIC_SET_TO_NEEDED => ['DECLARATION_FOR_LC_NUMERIC_MANIPULATION;'],
+ STORE_LC_NUMERIC_SET_TO_NEEDED_IN => ['DECLARATION_FOR_LC_NUMERIC_MANIPULATION;'],
UNDERBAR => ['dUNDERBAR;'],
- XCPT_TRY_START => ['dXCPT;'],
- XCPT_TRY_END => ['dXCPT;'],
XCPT_CATCH => ['dXCPT;'],
XCPT_RETHROW => ['dXCPT;'],
+ XCPT_TRY_END => ['dXCPT;'],
+ XCPT_TRY_START => ['dXCPT;'],
+ XPUSHi => ['dTARG;'],
+ XPUSHn => ['dTARG;'],
+ XPUSHp => ['dTARG;'],
+ XPUSHu => ['dTARG;'],
+ XS_APIVERSION_BOOTCHECK => ['CV * cv;'],
+ XS_VERSION_BOOTCHECK => ['CV * cv;'],
+ MY_CXT_INIT => [ @simple_my_cxt_prereqs ],
+ MY_CXT_CLONE => [ @simple_my_cxt_prereqs ],
+ dMY_CXT => [ @simple_my_cxt_prereqs ],
+ MY_CXT => [ @my_cxt_prereqs ],
+ _aMY_CXT => [ @my_cxt_prereqs ],
+ aMY_CXT => [ @my_cxt_prereqs ],
+ aMY_CXT_ => [ @my_cxt_prereqs ],
+ pMY_CXT => [ @my_cxt_prereqs ],
);
-my %ignore = (
- map { ($_ => 1) } qw(
- svtype
- items
- ix
- dXSI32
- XS
- CLASS
- THIS
- RETVAL
- StructCopy
- ),
-);
+# The entries in %ignore have two components, separated by this.
+my $sep = '~';
+
+# Things to not try to check. (The component after $sep is empty.)
+my %ignore = map { ("$_$sep" => 1) } keys %{&known_but_hard_to_test_for()};
print OUT <<HEAD;
/*
@@ -135,42 +171,7 @@ print OUT <<HEAD;
#else
-#define NEED_PL_signals
-#define NEED_PL_parser
-#define NEED_caller_cx
-#define NEED_eval_pv
-#define NEED_grok_bin
-#define NEED_grok_hex
-#define NEED_grok_number
-#define NEED_grok_numeric_radix
-#define NEED_grok_oct
-#define NEED_gv_fetchpvn_flags
-#define NEED_load_module
-#define NEED_mg_findext
-#define NEED_my_snprintf
-#define NEED_my_sprintf
-#define NEED_my_strlcat
-#define NEED_my_strlcpy
-#define NEED_newCONSTSUB
-#define NEED_newRV_noinc
-#define NEED_newSV_type
-#define NEED_newSVpvn_flags
-#define NEED_newSVpvn_share
-#define NEED_pv_display
-#define NEED_pv_escape
-#define NEED_pv_pretty
-#define NEED_sv_2pv_flags
-#define NEED_sv_2pvbyte
-#define NEED_sv_catpvf_mg
-#define NEED_sv_catpvf_mg_nocontext
-#define NEED_sv_pvn_force_flags
-#define NEED_sv_setpvf_mg
-#define NEED_sv_setpvf_mg_nocontext
-#define NEED_sv_unmagicext
-#define NEED_SvRX
-#define NEED_vload_module
-#define NEED_vnewSVpvf
-#define NEED_warner
+$ENV{'DPPP_NEED'} /* All the requisite NEED_foo #defines */
#include "ppport.h"
@@ -187,23 +188,37 @@ typedef void yy_parser;
HEAD
+# Caller can restrict what functions tests are generated for
if (@ARGV) {
my %want = map { ($_ => 0) } @ARGV;
- @f = grep { exists $want{$_->{name}} } @f;
- for (@f) { $want{$_->{name}}++ }
+ @f = grep { exists $want{$_->{'name'}} } @f;
+ for (@f) { $want{$_->{'name'}}++ }
for (keys %want) {
die "nothing found for '$_'\n" unless $want{$_};
}
}
my $f;
-for $f (@f) {
- $ignore{$f->{name}} and next;
- $f->{flags}{A} or next; # only public API members
+for $f (@f) { # Loop through all the tests to add
+
+ # Just the name isn't unique; We also need the #if or #else condition
+ my $unique = "$f->{'name'}$sep$f->{'cond'}";
+ $ignore{$unique} and next;
+
+ # only public API members, except those in ppport.fnc are there because we
+ # want them to be tested even if non-public. X,M functions are supposed to
+ # be considered to have just the macro form public.
+ $f->{'flags'}{'A'}
+ or $f->{'ppport_fnc'}
+ or ($f->{'flags'}{'X'} and $f->{'flags'}{'M'})
+ or next;
+
+ # Don't test unorthodox things that we aren't set up to do
+ $f->{'flags'}{'u'} and next;
- $ignore{$f->{name}} = 1; # ignore duplicates
+ $ignore{$unique} = 1; # ignore duplicates
- my $Perl_ = $f->{flags}{p} ? 'Perl_' : '';
+ my $Perl_ = $f->{'flags'}{'p'} ? 'Perl_' : '';
my $stack = '';
my @arg;
@@ -212,113 +227,173 @@ for $f (@f) {
my $i = 1;
my $ca;
my $varargs = 0;
- for $ca (@{$f->{args}}) {
- my $a = $ca->[0];
+
+ for $ca (@{$f->{'args'}}) { # Loop through the function's args
+ my $a = $ca->[0]; # 1th is the name, 0th is its type
if ($a eq '...') {
$varargs = 1;
push @arg, qw(VARarg1 VARarg2 VARarg3);
last;
}
- my($n, $p, $d) = $a =~ /^ (\w+(?:\s+\w+)*)\s* # type name => $n
- (\**) # pointer => $p
- (?:\s*const\s*)? # const
- ((?:\[[^\]]*\])*) # dimension => $d
+
+ # Split this type into its components
+ my($n, $p, $d) = $a =~ /^ ( (?: " [^"]* " ) # literal string type => $n
+ | (?: \w+ (?: \s+ \w+ )* ) # name of type => $n
+ )
+ \s*
+ ( \** ) # optional pointer(s) => $p
+ (?: \s* \b const \b \s* )? # opt. const
+ ( (?: \[ [^\]]* \] )* ) # opt. dimension(s)=> $d
$/x
- or die "$0 - cannot parse argument: [$a]\n";
+ or die "$0 - cannot parse argument: [$a] in $f->{'name'}\n";
+
+ # Replace a special argument name by something that will compile.
if (exists $amap{$n}) {
+ die "$f->{'name'} had type $n, which should have been the whole type"
+ if $p or $d;
push @arg, $amap{$n};
next;
}
+
+ # Certain types, like 'void', get remapped.
$n = $tmap{$n} || $n;
- if ($n eq 'const char' and $p eq '*' and !$f->{flags}{f}) {
- push @arg, '"foo"';
+
+ if ($n =~ / ^ " [^"]* " $/x) { # Use the literal string, literally
+ push @arg, $n;
}
else {
- my $v = 'arg' . $i++;
+ my $v = 'arg' . $i++; # Argument number
push @arg, $v;
- $stack .= " static $n $p$v$d;\n";
+ my $no_const_n = $n; # Get rid of any remaining 'const's
+ $no_const_n =~ s/\bconst\b// unless $p;
+
+ # Declare this argument
+ $stack .= " static $no_const_n $p$v$d;\n";
}
}
- unless ($f->{flags}{n} || $f->{flags}{'m'}) {
- $stack = " dTHX;\n$stack";
+ # Declare thread context for functions and macros that might need it.
+ # (Macros often fail to say they don't need it.)
+ unless ($f->{'flags'}{'T'}) {
+ $stack = " dTHX;\n$stack"; # Harmless to declare even if not needed
$aTHX = @arg ? 'aTHX_ ' : 'aTHX';
}
- if ($stack{$f->{name}}) {
+ # If this function is on the list of things that need declarations, add
+ # them.
+ if ($stack{$f->{'name'}}) {
my $s = '';
- for (@{$stack{$f->{name}}}) {
+ for (@{$stack{$f->{'name'}}}) {
$s .= " $_\n";
}
$stack = "$s$stack";
}
my $args = join ', ', @arg;
- my $rvt = $f->{ret} || 'void';
+ my $prefix = "";
+
+ # Failure to specify a return type in the apidoc line means void
+ my $rvt = $f->{'ret'} || 'void';
+
my $ret;
- if ($void{$rvt}) {
- $ret = $castvoid{$f->{name}} ? '(void) ' : '';
+ if ($void{$rvt}) { # Certain return types are instead considered void
+ $ret = $castvoid{$f->{'name'}} ? '(void) ' : '';
}
else {
$stack .= " $rvt rval;\n";
- $ret = $ignorerv{$f->{name}} ? '(void) ' : "rval = ";
+ $ret = $ignorerv{$f->{'name'}} ? '(void) ' : "rval = ";
}
- my $aTHX_args = "$aTHX$args";
- if (!$f->{flags}{'m'} or $f->{flags}{'b'} or @arg > 0) {
+ my $aTHX_args = "";
+ my $aTHX_prefix = "";
+
+ # Add parens to functions that take an argument list, even if empty
+ unless ($f->{'flags'}{'n'}) {
+ $aTHX_args = "($aTHX$args)";
$args = "($args)";
- $aTHX_args = "($aTHX_args)";
}
+ # Single trailing underscore in name means is a comma operator
+ if ($f->{'name'} =~ /[^_]_$/) {
+ $aTHX_args .= ' 1';
+ $args .= ' 1';
+ }
+
+ # Single leading underscore in a few names means is a comma operator
+ if ($f->{'name'} =~ /^ _[ adp] (?: THX | MY_CXT ) /x) {
+ $aTHX_prefix = '1 ';
+ $prefix = '1 ';
+ }
+
+
print OUT <<HEAD;
/******************************************************************************
*
-* $f->{name}
+
+* $f->{'name'} $script_args{'--todo-dir'} $script_args{'--todo'}
*
******************************************************************************/
HEAD
- if ($todo{$f->{name}}) {
- my($ver,$sub) = $todo{$f->{name}} =~ /^5\.(\d{3})(\d{3})$/ or die;
- for ($ver, $sub) {
- s/^0+(\d)/$1/
- }
- if ($ver < 6 && $sub > 0) {
- $sub =~ s/0$// or die;
- }
+ # #ifdef out if marked as todo (not known in) this version
+ if (exists $todo{$f->{'name'}}) {
+ my($five, $ver,$sub) = parse_version($todo{$f->{'name'}}{'version'});
print OUT "#if PERL_VERSION > $ver || (PERL_VERSION == $ver && PERL_SUBVERSION >= $sub) /* TODO */\n";
}
my $final = $varargs
- ? "$Perl_$f->{name}$aTHX_args"
- : "$f->{name}$args";
+ ? "$aTHX_prefix$Perl_$f->{'name'}$aTHX_args"
+ : "$prefix$f->{'name'}$args";
+
+ # If there is a '#if' associated with this, add that
+ $f->{'cond'} and print OUT "#if $f->{'cond'}\n";
- $f->{cond} and print OUT "#if $f->{cond}\n";
+ # If only to be tested when ppport.h is enabled
+ $f->{'ppport_fnc'} and print OUT "#ifndef DPPP_APICHECK_NO_PPPORT_H\n";
print OUT <<END;
-void _DPPP_test_$f->{name} (void)
+void _DPPP_test_$f->{'name'} (void)
{
dXSARGS;
$stack
{
-#ifdef $f->{name}
- $ret$f->{name}$args;
+END
+
+ # If M is a flag here, it means the 'Perl_' form is not for general use, but
+ # the macro (tested above) is.
+ if ($f->{'flags'}{'M'}) {
+ print OUT <<END;
+
+ $ret$prefix$f->{'name'}$args;
+ }
+}
+END
+
+ }
+ else {
+ print OUT <<END;
+
+#ifdef $f->{'name'}
+ $ret$prefix$f->{'name'}$args;
#endif
}
{
-#ifdef $f->{name}
+#ifdef $f->{'name'}
$ret$final;
#else
- $ret$Perl_$f->{name}$aTHX_args;
+ $ret$aTHX_prefix$Perl_$f->{'name'}$aTHX_args;
#endif
}
}
END
- $f->{cond} and print OUT "#endif\n";
- $todo{$f->{name}} and print OUT "#endif\n";
+ }
+
+ $f->{'ppport_fnc'} and print OUT "#endif\n";
+ $f->{'cond'} and print OUT "#endif\n";
+ exists $todo{$f->{'name'}} and print OUT "#endif\n";
print OUT "\n";
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc
index 1149c06b271..f4550383974 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/apidoc.fnc
@@ -12,501 +12,1024 @@
: This file lists all API functions/macros that are documented in the Perl
: source code, but are not contained in F<embed.fnc>.
:
-
-Ama|char*|savepvs|"literal string" s
-Ama|char*|savesharedpvs|"literal string" s
-Ama|SV*|newSVpvs_flags|"literal string" s|U32 flags
-Ama|SV*|newSVpvs|"literal string" s
-Ama|SV*|newSVpvs_share|"literal string" s
-Am|AV*|GvAV|GV* gv
-Am|bool|ckWARN2_d|U32 w1|U32 w2
-Am|bool|ckWARN2|U32 w1|U32 w2
-Am|bool|ckWARN3_d|U32 w1|U32 w2|U32 w3
-Am|bool|ckWARN3|U32 w1|U32 w2|U32 w3
-Am|bool|ckWARN4_d|U32 w1|U32 w2|U32 w3|U32 w4
-Am|bool|ckWARN4|U32 w1|U32 w2|U32 w3|U32 w4
-Am|bool|ckWARN_d|U32 w
-Am|bool|ckWARN|U32 w
-Am|bool|DO_UTF8|SV* sv
-Am|bool|isALPHA|char ch
-Am|bool|isALPHANUMERIC|char ch
-Am|bool|isASCII|char ch
-Am|bool|isBLANK|char ch
-Am|bool|isCNTRL|char ch
-Am|bool|isDIGIT|char ch
-Am|bool|isGRAPH|char ch
-Am|bool|isIDCONT|char ch
-Am|bool|isIDFIRST|char ch
-Am|bool|isLOWER|char ch
-Am|bool|isOCTAL|char ch
-Am|bool|isPRINT|char ch
-Am|bool|isPSXSPC|char ch
-Am|bool|isPUNCT|char ch
-Am|bool|isSPACE|char ch
-Am|bool|isUPPER|char ch
-Am|bool|isWORDCHAR|char ch
-Am|bool|isXDIGIT|char ch
-Am|bool|memEQ|char* s1|char* s2|STRLEN len
-Am|bool|memNE|char* s1|char* s2|STRLEN len
-Am|bool|OpHAS_SIBLING|OP *o
-Am|bool|OP_TYPE_IS|OP *o|Optype type
-Am|bool|OP_TYPE_IS_OR_WAS|OP *o|Optype type
-Am|bool|strEQ|char* s1|char* s2
-Am|bool|strGE|char* s1|char* s2
-Am|bool|strGT|char* s1|char* s2
-Am|bool|strLE|char* s1|char* s2
-Am|bool|strLT|char* s1|char* s2
-Am|bool|strNE|char* s1|char* s2
-Am|bool|strnEQ|char* s1|char* s2|STRLEN len
-Am|bool|strnNE|char* s1|char* s2|STRLEN len
-Am|bool|SvIOK_notUV|SV* sv
-Am|bool|SvIOK_UV|SV* sv
-Am|bool|SvIsCOW_shared_hash|SV* sv
-Am|bool|SvRXOK|SV* sv
-Am|bool|SvTAINTED|SV* sv
-Am|bool|SvTRUE_nomg|SV* sv
-Am|bool|SvTRUE|SV* sv
-Am|bool|SvUOK|SV* sv
-Am|bool|SvVOK|SV* sv
-Am|bool|UTF8_IS_INVARIANT|char c
-Am|bool|UTF8_IS_NONCHAR|const U8 *s|const U8 *e
-Am|bool|UTF8_IS_SUPER|const U8 *s|const U8 *e
-Am|bool|UTF8_IS_SURROGATE|const U8 *s|const U8 *e
-Am|bool|UVCHR_IS_INVARIANT|UV cp
-Am|char*|HePV|HE* he|STRLEN len
-Am|char*|HvENAME|HV* stash
-Am|char*|HvNAME|HV* stash
-Am|char*|SvEND|SV* sv
-Am|char *|SvGROW|SV* sv|STRLEN len
-Am|char*|SvPVbyte_force|SV* sv|STRLEN len
-Am|char*|SvPVbyte_nolen|SV* sv
-Am|char*|SvPVbyte|SV* sv|STRLEN len
-Am|char*|SvPVbytex_force|SV* sv|STRLEN len
-Am|char*|SvPVbytex|SV* sv|STRLEN len
-Am|char *|SvPVCLEAR|SV* sv
-Am|char*|SvPV_force_nomg|SV* sv|STRLEN len
-Am|char*|SvPV_force|SV* sv|STRLEN len
-Am|char*|SvPV_nolen|SV* sv
-Am|char*|SvPV_nomg_nolen|SV* sv
-Am|char*|SvPV_nomg|SV* sv|STRLEN len
-Am|char*|SvPV|SV* sv|STRLEN len
-Am|char*|SvPVutf8_force|SV* sv|STRLEN len
-Am|char*|SvPVutf8_nolen|SV* sv
-Am|char*|SvPVutf8|SV* sv|STRLEN len
-Am|char*|SvPVutf8x_force|SV* sv|STRLEN len
-Am|char*|SvPVutf8x|SV* sv|STRLEN len
-Am|char*|SvPVX|SV* sv
-Am|char*|SvPVx|SV* sv|STRLEN len
-Am|const char *|OP_DESC|OP *o
-Am|const char *|OP_NAME|OP *o
-Am|CV*|GvCV|GV* gv
-Am|HV *|cop_hints_2hv|const COP *cop|U32 flags
-Am|HV*|CvSTASH|CV* cv
-Am|HV*|GvHV|GV* gv
-Am|HV*|gv_stashpvs|"literal string" name|I32 create
-Am|HV*|SvSTASH|SV* sv
-Am|int|AvFILL|AV* av
-Am|IV|SvIV_nomg|SV* sv
-Am|IV|SvIV|SV* sv
-Am|IV|SvIVx|SV* sv
-Am|IV|SvIVX|SV* sv
-Amn|char*|CLASS
-Amn|char*|POPp
-Amn|char*|POPpbytex
-Amn|char*|POPpx
-Amn|HV*|PL_modglobal
-Amn|I32|ax
-Amn|I32|items
-Amn|I32|ix
-Amn|IV|POPi
-Amn|long|POPl
-Amn|long|POPul
-Amn|NV|POPn
-Amn|peep_t|PL_peepp
-Amn|peep_t|PL_rpeepp
-Amn|Perl_ophook_t|PL_opfreehook
-Amn|STRLEN|PL_na
-Amn|SV|PL_sv_no
-Amn|SV|PL_sv_undef
-Amn|SV|PL_sv_yes
-Amn|SV|PL_sv_zero
-Amn|SV*|POPs
-Amn|U32|GIMME
-Amn|U32|GIMME_V
-Amn|UV|POPu
-Amn|void|DECLARATION_FOR_LC_NUMERIC_MANIPULATION
-Am|NV|SvNV_nomg|SV* sv
-Am|NV|SvNV|SV* sv
-Am|NV|SvNVx|SV* sv
-Am|NV|SvNVX|SV* sv
-Amn|(whatever)|RETVAL
-Amn|(whatever)|THIS
-Am|OP*|LINKLIST|OP *o
-Am|OP*|OpSIBLING|OP *o
-Am|PADOFFSET|pad_add_name_pvs|"literal string" name|U32 flags|HV *typestash|HV *ourstash
-Am|PADOFFSET|pad_findmy_pvs|"literal string" name|U32 flags
-Am|REGEXP *|SvRX|SV *sv
-Ams||dAX
-Ams||dAXMARK
-Ams||dITEMS
-Ams||dMARK
-Ams||dMULTICALL
-Ams||dORIGMARK
-Ams||dSP
-Ams||dUNDERBAR
-Ams||dXCPT
-Ams||dXSARGS
-Ams||dXSI32
-Ams||ENTER
-Ams||ENTER_with_name(name)
-Ams||FREETMPS
-Ams||LEAVE
-Ams||LEAVE_with_name(name)
-Ams||MULTICALL
-Ams||POP_MULTICALL
-Ams||PUSH_MULTICALL
-Ams||PUTBACK
-Ams||SAVETMPS
-Ams||SPAGAIN
-Am|STRLEN|HeKLEN|HE* he
-Am|STRLEN|HvENAMELEN|HV *stash
-Am|STRLEN|HvNAMELEN|HV *stash
-Am|STRLEN|isUTF8_CHAR_flags|const U8 *s|const U8 *e| const U32 flags
-Am|STRLEN|SvCUR|SV* sv
-Am|STRLEN|SvLEN|SV* sv
-Am|STRLEN|UTF8_SAFE_SKIP|char* s|char* e
-Am|STRLEN|UTF8SKIP|char* s
-Am|STRLEN|UVCHR_SKIP|UV cp
-Am|SV *|boolSV|bool b
-Am|SV *|cop_hints_fetch_pv|const COP *cop|const char *key|U32 hash|U32 flags
-Am|SV *|cop_hints_fetch_pvn|const COP *cop|const char *keypv|STRLEN keylen|U32 hash|U32 flags
-Am|SV *|cop_hints_fetch_pvs|const COP *cop|"literal string" key|U32 flags
-Am|SV *|cop_hints_fetch_sv|const COP *cop|SV *key|U32 hash|U32 flags
-Am|SV*|GvSV|GV* gv
-Am|SV*|HeSVKEY_force|HE* he
-Am|SV*|HeSVKEY|HE* he
-Am|SV*|HeSVKEY_set|HE* he|SV* sv
-Am|SV*|HeVAL|HE* he
-Am|SV**|hv_fetchs|HV* tb|"literal string" key|I32 lval
-Am|SV**|hv_stores|HV* tb|"literal string" key|SV* val
-Am|SV*|newRV_inc|SV* sv
-Am|SV*|newSVpvn_utf8|const char* s|STRLEN len|U32 utf8
-Am|SV*|ST|int ix
-Am|SV*|SvREFCNT_inc_NN|SV* sv
-Am|SV*|SvREFCNT_inc_simple_NN|SV* sv
-Am|SV*|SvREFCNT_inc_simple|SV* sv
-Am|SV*|SvREFCNT_inc|SV* sv
-Am|SV*|SvRV|SV* sv
-Am|SV *|sv_setref_pvs|"literal string" s
-Am|svtype|SvTYPE|SV* sv
-Ams||XCPT_RETHROW
-Ams||XS_APIVERSION_BOOTCHECK
-Ams||XSRETURN_EMPTY
-Ams||XSRETURN_NO
-Ams||XSRETURN_UNDEF
-Ams||XSRETURN_YES
-Ams||XS_VERSION_BOOTCHECK
-Am|U32|HeHASH|HE* he
-Am|U32|HeUTF8|HE* he
-Am|U32|OP_CLASS|OP *o
-Am|U32|SvGAMAGIC|SV* sv
-Am|U32|SvIOKp|SV* sv
-Am|U32|SvIOK|SV* sv
-Am|U32|SvIsCOW|SV* sv
-Am|U32|SvNIOKp|SV* sv
-Am|U32|SvNIOK|SV* sv
-Am|U32|SvNOKp|SV* sv
-Am|U32|SvNOK|SV* sv
-Am|U32|SvOK|SV* sv
-Am|U32|SvOOK|SV* sv
-Am|U32|SvPOKp|SV* sv
-Am|U32|SvPOK|SV* sv
-Am|U32|SvREADONLY_off|SV* sv
-Am|U32|SvREADONLY_on|SV* sv
-Am|U32|SvREADONLY|SV* sv
-Am|U32|SvREFCNT|SV* sv
-Am|U32|SvROK|SV* sv
-Am|U32|SvUTF8|SV* sv
-Am|U32|XopFLAGS|XOP *xop
-Am|U8|READ_XDIGIT|char str*
-Am|U8|toFOLD|U8 ch
-Am|U8|toLOWER_L1|U8 ch
-Am|U8|toLOWER_LC|U8 ch
-Am|U8|toLOWER|U8 ch
-Am|U8|toTITLE|U8 ch
-Am|U8|toUPPER|U8 ch
-AmU||G_ARRAY
-AmU||G_DISCARD
-AmU||G_EVAL
-AmU||G_NOARGS
-AmU||G_SCALAR
-AmU||G_VOID
-AmU||HEf_SVKEY
-AmU||MARK
-AmU||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto
-Am|unsigned char|HvENAMEUTF8|HV *stash
-Am|unsigned char|HvNAMEUTF8|HV *stash
-AmU||Nullav
-AmU||Nullch
-AmU||Nullcv
-AmU||Nullhv
-AmU||Nullsv
-AmU||ORIGMARK
-AmU|Perl_check_t *|PL_check
-AmU|placeholder|BOM_UTF8
-AmU|placeholder|REPLACEMENT_CHARACTER_UTF8
-AmU||SP
-AmU||SVt_INVLIST
-AmU||SVt_IV
-AmU||SVt_NULL
-AmU||SVt_NV
-AmU||SVt_PV
-AmU||SVt_PVAV
-AmU||SVt_PVCV
-AmU||SVt_PVFM
-AmU||SVt_PVGV
-AmU||SVt_PVHV
-AmU||SVt_PVIO
-AmU||SVt_PVIV
-AmU||SVt_PVLV
-AmU||SVt_PVMG
-AmU||SVt_PVNV
-AmU||SVt_REGEXP
-AmU||svtype
-AmU||UNDERBAR
-Am|UV|SvUV_nomg|SV* sv
-Am|UV|SvUV|SV* sv
-Am|UV|SvUVx|SV* sv
-Am|UV|SvUVX|SV* sv
-Am|UV|toFOLD_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
-Am|UV|toFOLD_utf8|U8* p|U8* s|STRLEN* lenp
-Am|UV|toFOLD_uvchr|UV cp|U8* s|STRLEN* lenp
-Am|UV|toLOWER_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
-Am|UV|toLOWER_utf8|U8* p|U8* s|STRLEN* lenp
-Am|UV|toLOWER_uvchr|UV cp|U8* s|STRLEN* lenp
-Am|UV|toTITLE_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
-Am|UV|toTITLE_utf8|U8* p|U8* s|STRLEN* lenp
-Am|UV|toTITLE_uvchr|UV cp|U8* s|STRLEN* lenp
-Am|UV|toUPPER_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
-Am|UV|toUPPER_utf8|U8* p|U8* s|STRLEN* lenp
-Am|UV|toUPPER_uvchr|UV cp|U8* s|STRLEN* lenp
-AmU||XCPT_CATCH
-AmU||XCPT_TRY_END
-AmU||XCPT_TRY_START
-AmUx|Perl_keyword_plugin_t|PL_keyword_plugin
-AmU||XS
-AmU||XS_EXTERNAL
-AmU||XS_INTERNAL
-AmU||XS_VERSION
-AmU|yy_parser *|PL_parser
-Am|void *|CopyD|void* src|void* dest|int nitems|type
-Am|void|Copy|void* src|void* dest|int nitems|type
-Am|void|EXTEND|SP|SSize_t nitems
-Am|void*|HeKEY|HE* he
-Am|void *|MoveD|void* src|void* dest|int nitems|type
-Am|void|Move|void* src|void* dest|int nitems|type
-Am|void|mPUSHi|IV iv
-Am|void|mPUSHn|NV nv
-Am|void|mPUSHp|char* str|STRLEN len
-Am|void|mPUSHs|SV* sv
-Am|void|mPUSHu|UV uv
-Am|void|mXPUSHi|IV iv
-Am|void|mXPUSHn|NV nv
-Am|void|mXPUSHp|char* str|STRLEN len
-Am|void|mXPUSHs|SV* sv
-Am|void|mXPUSHu|UV uv
-Am|void|Newxc|void* ptr|int nitems|type|cast
-Am|void|Newx|void* ptr|int nitems|type
-Am|void|Newxz|void* ptr|int nitems|type
-Am|void|OpLASTSIB_set|OP *o|OP *parent
-Am|void|OpMAYBESIB_set|OP *o|OP *sib|OP *parent
-Am|void|OpMORESIB_set|OP *o|OP *sib
-Am|void|PERL_SYS_INIT3|int *argc|char*** argv|char*** env
-Am|void|PERL_SYS_INIT|int *argc|char*** argv
-Am|void|PERL_SYS_TERM|
-Am|void|PoisonFree|void* dest|int nitems|type
-Am|void|PoisonNew|void* dest|int nitems|type
-Am|void|Poison|void* dest|int nitems|type
-Am|void|PoisonWith|void* dest|int nitems|type|U8 byte
-Am|void|PUSHi|IV iv
-Am|void|PUSHMARK|SP
-Am|void|PUSHmortal
-Am|void|PUSHn|NV nv
-Am|void|PUSHp|char* str|STRLEN len
-Am|void|PUSHs|SV* sv
-Am|void|PUSHu|UV uv
-Am|void|Renewc|void* ptr|int nitems|type|cast
-Am|void|Renew|void* ptr|int nitems|type
-Am|void|RESTORE_LC_NUMERIC
-Am|void|Safefree|void* ptr
-Am|void|STORE_LC_NUMERIC_FORCE_TO_UNDERLYING
-Am|void|STORE_LC_NUMERIC_SET_TO_NEEDED
-Am|void|StructCopy|type *src|type *dest|type
-Am|void|sv_catpvn_nomg|SV* sv|const char* ptr|STRLEN len
-Am|void|sv_catpv_nomg|SV* sv|const char* ptr
-Am|void|sv_catpvs_flags|SV* sv|"literal string" s|I32 flags
-Am|void|sv_catpvs_mg|SV* sv|"literal string" s
-Am|void|sv_catpvs_nomg|SV* sv|"literal string" s
-Am|void|sv_catpvs|SV* sv|"literal string" s
-Am|void|sv_catsv_nomg|SV* dsv|SV* ssv
-Am|void|SvCUR_set|SV* sv|STRLEN len
-Am|void|SvGETMAGIC|SV* sv
-Am|void|SvIOK_off|SV* sv
-Am|void|SvIOK_only|SV* sv
-Am|void|SvIOK_only_UV|SV* sv
-Am|void|SvIOK_on|SV* sv
-Am|void|SvIV_set|SV* sv|IV val
-Am|void|SvLEN_set|SV* sv|STRLEN len
-Am|void|SvLOCK|SV* sv
-Am|void|SvMAGIC_set|SV* sv|MAGIC* val
-Am|void|SvNIOK_off|SV* sv
-Am|void|SvNOK_off|SV* sv
-Am|void|SvNOK_only|SV* sv
-Am|void|SvNOK_on|SV* sv
-Am|void|SvNV_set|SV* sv|NV val
-Am|void|SvOOK_offset|SV*sv|STRLEN len
-Am|void|SvPOK_off|SV* sv
-Am|void|SvPOK_only|SV* sv
-Am|void|SvPOK_only_UTF8|SV* sv
-Am|void|SvPOK_on|SV* sv
-Am|void|SvPV_set|SV* sv|char* val
-Am|void|SvREFCNT_dec_NN|SV* sv
-Am|void|SvREFCNT_dec|SV* sv
-Am|void|SvREFCNT_inc_simple_void_NN|SV* sv
-Am|void|SvREFCNT_inc_simple_void|SV* sv
-Am|void|SvREFCNT_inc_void_NN|SV* sv
-Am|void|SvREFCNT_inc_void|SV* sv
-Am|void|SvROK_off|SV* sv
-Am|void|SvROK_on|SV* sv
-Am|void|SvRV_set|SV* sv|SV* val
-Am|void|SvSetMagicSV_nosteal|SV* dsv|SV* ssv
-Am|void|SvSETMAGIC|SV* sv
-Am|void|SvSetMagicSV|SV* dsv|SV* ssv
-Am|void|sv_setpvs_mg|SV* sv|"literal string" s
-Am|void|sv_setpvs|SV* sv|"literal string" s
-Am|void|sv_setsv_nomg|SV* dsv|SV* ssv
-Am|void|SvSetSV_nosteal|SV* dsv|SV* ssv
-Am|void|SvSetSV|SV* dsv|SV* ssv
-Am|void|SvSHARE|SV* sv
-Am|void|SvSTASH_set|SV* sv|HV* val
-Am|void|SvTAINTED_off|SV* sv
-Am|void|SvTAINTED_on|SV* sv
-Am|void|SvTAINT|SV* sv
-Am|void|SvUNLOCK|SV* sv
-Am|void|SvUPGRADE|SV* sv|svtype type
-Am|void|SvUTF8_off|SV *sv
-Am|void|SvUTF8_on|SV *sv
-Am|void|SvUV_set|SV* sv|UV val
-Am|void|XopDISABLE|XOP *xop|which
-Am|void|XopENABLE|XOP *xop|which
-Am|void|XopENTRY_set|XOP *xop|which|value
-Am|void|XPUSHi|IV iv
-Am|void|XPUSHmortal
-Am|void|XPUSHn|NV nv
-Am|void|XPUSHp|char* str|STRLEN len
-Am|void|XPUSHs|SV* sv
-Am|void|XPUSHu|UV uv
-Am|void|XSRETURN|int nitems
-Am|void|XSRETURN_IV|IV iv
-Am|void|XSRETURN_NV|NV nv
-Am|void|XSRETURN_PV|char* str
-Am|void|XSRETURN_UV|IV uv
-Am|void|XST_mIV|int pos|IV iv
-Am|void|XST_mNO|int pos
-Am|void|XST_mNV|int pos|NV nv
-Am|void|XST_mPV|int pos|char* str
-Am|void|XST_mUNDEF|int pos
-Am|void|XST_mYES|int pos
-Am|void *|ZeroD|void* dest|int nitems|type
-Am|void|Zero|void* dest|int nitems|type
-Amx|bool|PadnameUTF8|PADNAME pn
-Amx|char *|PadnamePV|PADNAME pn
-Amx|COPHH *|cophh_copy|COPHH *cophh
-Amx|COPHH *|cophh_delete_pv|const COPHH *cophh|const char *key|U32 hash|U32 flags
-Amx|COPHH *|cophh_delete_pvn|COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|U32 flags
-Amx|COPHH *|cophh_delete_pvs|const COPHH *cophh|"literal string" key|U32 flags
-Amx|COPHH *|cophh_delete_sv|const COPHH *cophh|SV *key|U32 hash|U32 flags
-Amx|COPHH *|cophh_new_empty
-Amx|COPHH *|cophh_store_pv|const COPHH *cophh|const char *key|U32 hash|SV *value|U32 flags
-Amx|COPHH *|cophh_store_pvn|COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|SV *value|U32 flags
-Amx|COPHH *|cophh_store_pvs|const COPHH *cophh|"literal string" key|SV *value|U32 flags
-Amx|COPHH *|cophh_store_sv|const COPHH *cophh|SV *key|U32 hash|SV *value|U32 flags
-Amx|HV *|cophh_2hv|const COPHH *cophh|U32 flags
-Am||XopENTRYCUSTOM|const OP *o|which
-Am||XopENTRY|XOP *xop|which
-Amx|PADLIST *|CvPADLIST|CV *cv
-Amx|PADNAMELIST *|PadlistNAMES|PADLIST padlist
-Amx|PADNAME **|PadlistNAMESARRAY|PADLIST padlist
-Amx|PADNAME **|PadnamelistARRAY|PADNAMELIST pnl
-Amx|PAD **|PadlistARRAY|PADLIST padlist
-Amx|SSize_t|PadlistMAX|PADLIST padlist
-Amx|SSize_t|PadlistNAMESMAX|PADLIST padlist
-Amx|SSize_t|PadMAX|PAD pad
-Amx|SSize_t|PadnamelistMAX|PADNAMELIST pnl
-Amx|SSize_t|PadnamelistREFCNT|PADNAMELIST pnl
-Amx|SSize_t|PadnameREFCNT|PADNAME pn
-Amx|STRLEN|PadnameLEN|PADNAME pn
-Amx|SV *|cophh_fetch_pv|const COPHH *cophh|const char *key|U32 hash|U32 flags
-Amx|SV *|cophh_fetch_pvn|const COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|U32 flags
-Amx|SV *|cophh_fetch_pvs|const COPHH *cophh|"literal string" key|U32 flags
-Amx|SV *|cophh_fetch_sv|const COPHH *cophh|SV *key|U32 hash|U32 flags
-Amx|SV*|newSVpadname|PADNAME *pn
-Amx|SV **|PadARRAY|PAD pad
-Amx|SV *|PadnameSV|PADNAME pn
-Amx|U32|PadlistREFCNT|PADLIST padlist
-AmxU|char *|PL_parser-E<gt>bufend
-AmxU|char *|PL_parser-E<gt>bufptr
-AmxU|char *|PL_parser-E<gt>linestart
-AmxU|PADNAMELIST *|PL_comppad_name
-AmxU|PAD *|PL_comppad
-AmxU|SV **|PL_curpad
-AmxU|SV *|PL_parser-E<gt>linestr
-Amx|void|BhkDISABLE|BHK *hk|which
-Amx|void|BhkENABLE|BHK *hk|which
-Amx|void|BhkENTRY_set|BHK *hk|which|void *ptr
-Amx|void|cophh_free|COPHH *cophh
-Amx|void|lex_stuff_pvs|"literal string" pv|U32 flags
-Amx|void|PadnamelistREFCNT_dec|PADNAMELIST pnl
-Amx|void|PadnameREFCNT_dec|PADNAME pn
-m|bool|CvWEAKOUTSIDE|CV *cv
-m|bool|PadnameIsOUR|PADNAME pn
-m|bool|PadnameIsSTATE|PADNAME pn
-m|bool|PadnameOUTER|PADNAME pn
-m|char *|PAD_COMPNAME_PV|PADOFFSET po
-m|HV *|PAD_COMPNAME_OURSTASH|PADOFFSET po
-m|HV *|PAD_COMPNAME_TYPE|PADOFFSET po
-m|HV *|PadnameOURSTASH
-m|HV *|PadnameTYPE|PADNAME pn
-mn|GV *|PL_DBsub
-mn|GV*|PL_last_in_gv
-mn|GV*|PL_ofsgv
-mn|SV *|PL_DBsingle
-mn|SV *|PL_DBtrace
-mn|SV*|PL_rs
-mn|U8|PL_dowarn
-ms||djSP
-m|STRLEN|PAD_COMPNAME_GEN|PADOFFSET po
-m|STRLEN|PAD_COMPNAME_GEN_set|PADOFFSET po|int gen
-m|struct refcounted_he *|refcounted_he_new_pvs|struct refcounted_he *parent|"literal string" key|SV *value|U32 flags
-m|SV *|CX_CURPAD_SV|struct context|PADOFFSET po
-m|SV *|PAD_BASE_SV |PADLIST padlist|PADOFFSET po
-m|SV *|PAD_SETSV |PADOFFSET po|SV* sv
-m|SV *|PAD_SVl |PADOFFSET po
-m|SV *|PAD_SV |PADOFFSET po
-m|SV *|refcounted_he_fetch_pvs|const struct refcounted_he *chain|"literal string" key|U32 flags
-m|U32|PAD_COMPNAME_FLAGS|PADOFFSET po
-m|U32|SvTHINKFIRST|SV *sv
-mU||LVRET
-m|void|CX_CURPAD_SAVE|struct context
-m|void|PAD_CLONE_VARS|PerlInterpreter *proto_perl|CLONE_PARAMS* param
-m|void|PAD_RESTORE_LOCAL|PAD *opad
-m|void|PAD_SAVE_LOCAL|PAD *opad|PAD *npad
-m|void|PAD_SAVE_SETNULLPAD
-m|void|PAD_SET_CUR_NOSAVE |PADLIST padlist|I32 n
-m|void|PAD_SET_CUR |PADLIST padlist|I32 n
-m|void|SAVECLEARSV |SV **svp
-m|void|SAVECOMPPAD
-m|void|SAVEPADSV |PADOFFSET po
-mx|U32|BhkFLAGS|BHK *hk
-mx|void *|BhkENTRY|BHK *hk|which
-mx|void|CALL_BLOCK_HOOKS|which|arg
+Amnhd||_aMY_CXT
+Amnhd||aMY_CXT
+Amnhd||aMY_CXT_
+Amnd||ARCHNAME
+Amd|void|__ASSERT_|bool expr
+Amnhd||aTHX
+Amnhd||aTHX_
+Amd|int|AvFILL|AV* av
+Amnd|I32|ax
+Amxud|void|BhkDISABLE|BHK *hk|which
+Amxud|void|BhkENABLE|BHK *hk|which
+mxud|void *|BhkENTRY|BHK *hk|which
+Amxud|void|BhkENTRY_set|BHK *hk|which|void *ptr
+mxd|U32|BhkFLAGS|BHK *hk
+Amnd||BIN
+AmnUd|const char *|BOM_UTF8
+Amd|SV *|boolSV|bool b
+Amnd||BYTEORDER
+mxud|void|CALL_BLOCK_HOOKS|which|arg
+Amnhd||CALL_CHECKER_REQUIRE_GV
+Amd|void *|C_ARRAY_END|void *a
+Amd|STRLEN|C_ARRAY_LENGTH|void *a
+Amnd||CASTFLAGS
+Amd|bool|cBOOL|bool expr
+Amnd||CHARBITS
+Amd|bool|ckWARN|U32 w
+Amd|bool|ckWARN2|U32 w1|U32 w2
+Amd|bool|ckWARN2_d|U32 w1|U32 w2
+Amd|bool|ckWARN3|U32 w1|U32 w2|U32 w3
+Amd|bool|ckWARN3_d|U32 w1|U32 w2|U32 w3
+Amd|bool|ckWARN4|U32 w1|U32 w2|U32 w3|U32 w4
+Amd|bool|ckWARN4_d|U32 w1|U32 w2|U32 w3|U32 w4
+Amd|bool|ckWARN_d|U32 w
+Amnd|char*|CLASS
+Amd|void|CLEAR_ERRSV
+Amxd|HV *|cophh_2hv|const COPHH *cophh|U32 flags
+Amxd|COPHH *|cophh_copy|COPHH *cophh
+Amxd|COPHH *|cophh_delete_pv|const COPHH *cophh|const char *key|U32 hash|U32 flags
+Amxd|COPHH *|cophh_delete_pvn|COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|U32 flags
+Amxd|COPHH *|cophh_delete_pvs|const COPHH *cophh|"key"|U32 flags
+Amxd|COPHH *|cophh_delete_sv|const COPHH *cophh|SV *key|U32 hash|U32 flags
+Amxd|SV *|cophh_fetch_pv|const COPHH *cophh|const char *key|U32 hash|U32 flags
+Amxd|SV *|cophh_fetch_pvn|const COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|U32 flags
+Amxd|SV *|cophh_fetch_pvs|const COPHH *cophh|"key"|U32 flags
+Amxd|SV *|cophh_fetch_sv|const COPHH *cophh|SV *key|U32 hash|U32 flags
+Amxd|void|cophh_free|COPHH *cophh
+Amnhd||COPHH_KEY_UTF8
+Amxd|COPHH *|cophh_new_empty
+Amxd|COPHH *|cophh_store_pv|const COPHH *cophh|const char *key|U32 hash|SV *value|U32 flags
+Amxd|COPHH *|cophh_store_pvn|COPHH *cophh|const char *keypv|STRLEN keylen|U32 hash|SV *value|U32 flags
+Amxd|COPHH *|cophh_store_pvs|const COPHH *cophh|"key"|SV *value|U32 flags
+Amxd|COPHH *|cophh_store_sv|const COPHH *cophh|SV *key|U32 hash|SV *value|U32 flags
+Amd|HV *|cop_hints_2hv|const COP *cop|U32 flags
+Amd|SV *|cop_hints_fetch_pv|const COP *cop|const char *key|U32 hash|U32 flags
+Amd|SV *|cop_hints_fetch_pvn|const COP *cop|const char *keypv|STRLEN keylen|U32 hash|U32 flags
+Amd|SV *|cop_hints_fetch_pvs|const COP *cop|"key"|U32 flags
+Amd|SV *|cop_hints_fetch_sv|const COP *cop|SV *key|U32 hash|U32 flags
+Amd|const char *|CopLABEL|COP *const cop
+Amd|const char *|CopLABEL_len|COP *const cop|STRLEN *len
+Amd|const char *|CopLABEL_len_flags|COP *const cop|STRLEN *len|U32 *flags
+Amd|void|Copy|void* src|void* dest|int nitems|type
+Amd|void *|CopyD|void* src|void* dest|int nitems|type
+Amnd||CPPLAST
+Amnd||CPPMINUS
+Amnd||CPPRUN
+Amnd||CPPSTDIN
+Amnhd||CV_NAME_NOTQUAL
+Amxd|PADLIST *|CvPADLIST|CV *cv
+Amd|HV*|CvSTASH|CV* cv
+md|bool|CvWEAKOUTSIDE|CV *cv
+md|void|CX_CURPAD_SAVE|struct context
+md|SV *|CX_CURPAD_SV|struct context|PADOFFSET po
+Amnsd||dAX
+Amnsd||dAXMARK
+Amnd|void|DECLARATION_FOR_LC_NUMERIC_MANIPULATION
+Amnsd||dITEMS
+msd||djSP
+Amnsd||dMARK
+Amnsd||dMULTICALL
+Amnhd||dMY_CXT
+Amnsd||dORIGMARK
+Amnd||DOUBLEINFBYTES
+Amnd||DOUBLEKIND
+Amnd||DOUBLEMANTBITS
+Amnd||DOUBLENANBYTES
+Amnd||DOUBLESIZE
+Amd|bool|DO_UTF8|SV* sv
+mnd|void|dSAVEDERRNO
+mnd|void|dSAVE_ERRNO
+Amnsd||dSP
+Amnhd||dTHR
+Amnhd||dTHX
+Amnsd||dUNDERBAR
+Amnhd||dVAR
+Amnsd||dXCPT
+Amnsd||dXSARGS
+Amnsd||dXSI32
+Amnsd||ENTER
+Amsd||ENTER_with_name|"name"
+Amnd|SV *|ERRSV
+Amd|void|EXTEND|SP|SSize_t nitems
+Amnsd||FREETMPS
+AmnUd||G_ARRAY
+AmnUd||G_DISCARD
+AmnUd||G_EVAL
+Amnd|U32|GIMME
+Amnd|U32|GIMME_V
+Amnhd||G_METHOD
+Amnhd||G_METHOD_NAMED
+AmnUd||G_NOARGS
+Amnhd||G_RETHROW
+AmdR|bool|GROK_NUMERIC_RADIX|NN const char **sp|NN const char *send
+AmnUd||G_SCALAR
+Amnhd||GV_ADD
+Amnhd||GV_ADDMG
+Amnhd||GV_ADDMULTI
+Amd|AV*|GvAV|GV* gv
+Amd|CV*|GvCV|GV* gv
+Amd|HV*|GvHV|GV* gv
+Amnhd||GV_NOADD_NOINIT
+Amnhd||GV_NOEXPAND
+Amnhd||GV_NOINIT
+AmnUd||G_VOID
+Amd|HV*|gv_stashpvs|"name"|I32 create
+Amnhd||GV_SUPER
+Amd|SV*|GvSV|GV* gv
+AmnUd||HEf_SVKEY
+Amd|U32|HeHASH|HE* he
+Amd|void*|HeKEY|HE* he
+Amd|STRLEN|HeKLEN|HE* he
+Amd|char*|HePV|HE* he|STRLEN len
+Amd|SV*|HeSVKEY|HE* he
+Amd|SV*|HeSVKEY_force|HE* he
+Amd|SV*|HeSVKEY_set|HE* he|SV* sv
+Amd|U32|HeUTF8|HE* he
+Amd|SV*|HeVAL|HE* he
+Amd|char*|HvENAME|HV* stash
+Amd|STRLEN|HvENAMELEN|HV *stash
+Amd|unsigned char|HvENAMEUTF8|HV *stash
+Amd|SV**|hv_fetchs|HV* tb|"key"|I32 lval
+Amd|STRLEN|HvFILL|HV *const hv
+Amnhd||HV_ITERNEXT_WANTPLACEHOLDERS
+Amd|char*|HvNAME|HV* stash
+Amd|STRLEN|HvNAMELEN|HV *stash
+Amd|unsigned char|HvNAMEUTF8|HV *stash
+Amd|SV**|hv_stores|HV* tb|"key"|SV* val
+Amnd||I16SIZE
+Amnd||I16TYPE
+Amnd||I32SIZE
+Amnd||I32TYPE
+Amnd||I8SIZE
+Amnd||I8TYPE
+Amnd|bool|IN_LOCALE
+Amnd|bool|IN_LOCALE_COMPILETIME
+Amnd|bool|IN_LOCALE_RUNTIME
+Amhd|void *|INT2PTR|type|int value
+Amnd||INTSIZE
+Amhd|bool|isALNUM|int ch
+Amhd|bool|isALNUM_A|int ch
+Amhd|bool|isALNUMC|int ch
+Amhd|bool|isALNUMC_A|int ch
+Amhd|bool|isALNUMC_L1|int ch
+Amhd|bool|isALNUMC_LC|int ch
+Amhd|bool|isALNUMC_LC_uvchr|int ch
+Amhd|bool|isALNUM_LC|int ch
+Amhd|bool|isALNUM_LC_uvchr|int ch
+Amd|bool|isALPHA|int ch
+Amhd|bool|isALPHA_A|int ch
+Amhd|bool|isALPHA_L1|int ch
+Amhd|bool|isALPHA_LC|int ch
+Amhd|bool|isALPHA_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isALPHA_LC_uvchr|int ch
+Amd|bool|isALPHANUMERIC|int ch
+Amhd|bool|isALPHANUMERIC_A|int ch
+Amhd|bool|isALPHANUMERIC_L1|int ch
+Amhd|bool|isALPHANUMERIC_LC|int ch
+Amhd|bool|isALPHANUMERIC_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isALPHANUMERIC_LC_uvchr|int ch
+Amhd|bool|isALPHANUMERIC_utf8|U8 * s|U8 * end
+Amhd|bool|isALPHANUMERIC_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isALPHANUMERIC_uvchr|int ch
+Amhd|bool|isALPHA_utf8|U8 * s|U8 * end
+Amhd|bool|isALPHA_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isALPHA_uvchr|int ch
+Amd|bool|isASCII|int ch
+Amhd|bool|isASCII_A|int ch
+Amhd|bool|isASCII_L1|int ch
+Amhd|bool|isASCII_LC|int ch
+Amhd|bool|isASCII_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isASCII_LC_uvchr|int ch
+Amhd|bool|isASCII_utf8|U8 * s|U8 * end
+Amhd|bool|isASCII_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isASCII_uvchr|int ch
+Amd|bool|isBLANK|char ch
+Amhd|bool|isBLANK_A|int ch
+Amhd|bool|isBLANK_L1|int ch
+Amhd|bool|isBLANK_LC|int ch
+Amhd|bool|isBLANK_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isBLANK_LC_uvchr|int ch
+Amhd|bool|isBLANK_utf8|U8 * s|U8 * end
+Amhd|bool|isBLANK_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isBLANK_uvchr|int ch
+Amd|bool|isCNTRL|char ch
+Amhd|bool|isCNTRL_A|int ch
+Amhd|bool|isCNTRL_L1|int ch
+Amhd|bool|isCNTRL_LC|int ch
+Amhd|bool|isCNTRL_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isCNTRL_LC_uvchr|int ch
+Amhd|bool|isCNTRL_utf8|U8 * s|U8 * end
+Amhd|bool|isCNTRL_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isCNTRL_uvchr|int ch
+Amd|bool|isDIGIT|char ch
+Amhd|bool|isDIGIT_A|int ch
+Amhd|bool|isDIGIT_L1|int ch
+Amhd|bool|isDIGIT_LC|int ch
+Amhd|bool|isDIGIT_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isDIGIT_LC_uvchr|int ch
+Amhd|bool|isDIGIT_utf8|U8 * s|U8 * end
+Amhd|bool|isDIGIT_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isDIGIT_uvchr|int ch
+Amd|bool|isGRAPH|char ch
+Amhd|bool|isGRAPH_A|int ch
+Amhd|bool|isGRAPH_L1|int ch
+Amhd|bool|isGRAPH_LC|int ch
+Amhd|bool|isGRAPH_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isGRAPH_LC_uvchr|int ch
+Amhd|bool|isGRAPH_utf8|U8 * s|U8 * end
+Amhd|bool|isGRAPH_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isGRAPH_uvchr|int ch
+Amd|bool|isIDCONT|char ch
+Amhd|bool|isIDCONT_A|int ch
+Amhd|bool|isIDCONT_L1|int ch
+Amhd|bool|isIDCONT_LC|int ch
+Amhd|bool|isIDCONT_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isIDCONT_LC_uvchr|int ch
+Amhd|bool|isIDCONT_utf8|U8 * s|U8 * end
+Amhd|bool|isIDCONT_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isIDCONT_uvchr|int ch
+Amd|bool|isIDFIRST|char ch
+Amhd|bool|isIDFIRST_A|int ch
+Amhd|bool|isIDFIRST_L1|int ch
+Amhd|bool|isIDFIRST_LC|int ch
+Amhd|bool|isIDFIRST_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isIDFIRST_LC_uvchr|int ch
+Amhd|bool|isIDFIRST_utf8|U8 * s|U8 * end
+Amhd|bool|isIDFIRST_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isIDFIRST_uvchr|int ch
+Amd|bool|isLOWER|char ch
+Amhd|bool|isLOWER_A|int ch
+Amhd|bool|isLOWER_L1|int ch
+Amhd|bool|isLOWER_LC|int ch
+Amhd|bool|isLOWER_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isLOWER_LC_uvchr|int ch
+Amhd|bool|isLOWER_utf8|U8 * s|U8 * end
+Amhd|bool|isLOWER_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isLOWER_uvchr|int ch
+Amnd|bool|IS_NUMBER_GREATER_THAN_UV_MAX
+Amnd|bool|IS_NUMBER_INFINITY
+Amnd|bool|IS_NUMBER_IN_UV
+Amnd|bool|IS_NUMBER_NAN
+Amnd|bool|IS_NUMBER_NEG
+Amnd|bool|IS_NUMBER_NOT_INT
+Amd|bool|isOCTAL|char ch
+Amhd|bool|isOCTAL_A|int ch
+Amhd|bool|isOCTAL_L1|int ch
+Amd|bool|isPRINT|char ch
+Amhd|bool|isPRINT_A|int ch
+Amhd|bool|isPRINT_L1|int ch
+Amhd|bool|isPRINT_LC|int ch
+Amhd|bool|isPRINT_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isPRINT_LC_uvchr|int ch
+Amhd|bool|isPRINT_utf8|U8 * s|U8 * end
+Amhd|bool|isPRINT_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isPRINT_uvchr|int ch
+Amd|bool|isPSXSPC|char ch
+Amhd|bool|isPSXSPC_A|int ch
+Amhd|bool|isPSXSPC_L1|int ch
+Amhd|bool|isPSXSPC_LC|int ch
+Amhd|bool|isPSXSPC_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isPSXSPC_LC_uvchr|int ch
+Amhd|bool|isPSXSPC_utf8|U8 * s|U8 * end
+Amhd|bool|isPSXSPC_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isPSXSPC_uvchr|int ch
+Amd|bool|isPUNCT|char ch
+Amhd|bool|isPUNCT_A|int ch
+Amhd|bool|isPUNCT_L1|int ch
+Amhd|bool|isPUNCT_LC|int ch
+Amhd|bool|isPUNCT_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isPUNCT_LC_uvchr|int ch
+Amhd|bool|isPUNCT_utf8|U8 * s|U8 * end
+Amhd|bool|isPUNCT_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isPUNCT_uvchr|int ch
+Amd|bool|IS_SAFE_SYSCALL|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name
+Amd|bool|isSPACE|char ch
+Amhd|bool|isSPACE_A|int ch
+Amhd|bool|isSPACE_L1|int ch
+Amhd|bool|isSPACE_LC|int ch
+Amhd|bool|isSPACE_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isSPACE_LC_uvchr|int ch
+Amhd|bool|isSPACE_utf8|U8 * s|U8 * end
+Amhd|bool|isSPACE_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isSPACE_uvchr|int ch
+Amd|bool|isUPPER|char ch
+Amhd|bool|isUPPER_A|int ch
+Amhd|bool|isUPPER_L1|int ch
+Amhd|bool|isUPPER_LC|int ch
+Amhd|bool|isUPPER_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isUPPER_LC_uvchr|int ch
+Amhd|bool|isUPPER_utf8|U8 * s|U8 * end
+Amhd|bool|isUPPER_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isUPPER_uvchr|int ch
+Amd|STRLEN|isUTF8_CHAR_flags|const U8 *s|const U8 *e| const U32 flags
+Amd|bool|isWORDCHAR|char ch
+Amhd|bool|isWORDCHAR_A|int ch
+Amhd|bool|isWORDCHAR_L1|int ch
+Amhd|bool|isWORDCHAR_LC|int ch
+Amhd|bool|isWORDCHAR_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isWORDCHAR_LC_uvchr|int ch
+Amhd|bool|isWORDCHAR_utf8|U8 * s|U8 * end
+Amhd|bool|isWORDCHAR_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isWORDCHAR_uvchr|int ch
+Amd|bool|isXDIGIT|char ch
+Amhd|bool|isXDIGIT_A|int ch
+Amhd|bool|isXDIGIT_L1|int ch
+Amhd|bool|isXDIGIT_LC|int ch
+Amhd|bool|isXDIGIT_LC_utf8_safe|U8 * s| U8 *end
+Amhd|bool|isXDIGIT_LC_uvchr|int ch
+Amhd|bool|isXDIGIT_utf8|U8 * s|U8 * end
+Amhd|bool|isXDIGIT_utf8_safe|U8 * s|U8 * end
+Amhd|bool|isXDIGIT_uvchr|int ch
+Amnd|I32|items
+Amnhd||IVdf
+Amnd||IVSIZE
+Amnd||IVTYPE
+Amnd|I32|ix
+Amd|U8|LATIN1_TO_NATIVE|U8 ch
+Amnsd||LEAVE
+Amsd||LEAVE_with_name|"name"
+Amnhd||LEX_KEEP_PREVIOUS
+Amxd|void|lex_stuff_pvs|"pv"|U32 flags
+Amnhd||LEX_STUFF_UTF8
+AmUd|bool|LIKELY|const bool expr
+Amd|OP*|LINKLIST|OP *o
+Amnd||LONGDBLINFBYTES
+Amnd||LONGDBLMANTBITS
+Amnd||LONGDBLNANBYTES
+Amnd||LONGSIZE
+Amnd||LSEEKSIZE
+mnUd||LVRET
+AmnUd||MARK
+Amd|bool|memCHRs|"list"|char c
+Amd|bool|memEQ|char* s1|char* s2|STRLEN len
+Amd|bool|memEQs|char* s1|STRLEN l1|"s2"
+Amd|bool|memNE|char* s1|char* s2|STRLEN len
+Amd|bool|memNEs|char* s1|STRLEN l1|"s2"
+Amd|void|Move|void* src|void* dest|int nitems|type
+Amd|void *|MoveD|void* src|void* dest|int nitems|type
+Amd|void|mPUSHi|IV iv
+Amd|void|mPUSHn|NV nv
+Amd|void|mPUSHp|char* str|STRLEN len
+Amd|void|mPUSHs|SV* sv
+Amd|void|mPUSHu|UV uv
+Amnsd||MULTICALL
+Amd|void|mXPUSHi|IV iv
+Amd|void|mXPUSHn|NV nv
+Amd|void|mXPUSHp|char* str|STRLEN len
+Amd|void|mXPUSHs|SV* sv
+Amd|void|mXPUSHu|UV uv
+Amnhd||MY_CXT
+Amnhd||MY_CXT_CLONE
+Amnhd||MY_CXT_INIT
+ATmDd|int|my_sprintf|NN char *buffer|NN const char *pat|...
+Amd|U8|NATIVE_TO_LATIN1|U8 ch
+Amd|UV|NATIVE_TO_UNI|UV ch
+Amd|SV*|newRV_inc|SV* sv
+Amxd|SV*|newSVpadname|PADNAME *pn
+Amd|SV*|newSVpvn_utf8|const char* s|STRLEN len|U32 utf8
+Amad|SV*|newSVpvs|"literal string"
+Amad|SV*|newSVpvs_flags|"literal string"|U32 flags
+Amad|SV*|newSVpvs_share|"literal string"
+Amd|void|Newx|void* ptr|int nitems|type
+Amd|void|Newxc|void* ptr|int nitems|type|cast
+AmUd||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto
+Amd|void|Newxz|void* ptr|int nitems|type
+ADmnUd||Nullav
+AmnUd||Nullch
+ADmnUd||Nullcv
+ADmnUd||Nullhv
+AmnUd||Nullsv
+Amnhd||NVef
+Amnhd||NVff
+Amnhd||NVgf
+Amnd||NVMANTBITS
+Amnd||NVSIZE
+Amnd||NVTYPE
+Amd|U32|OP_CLASS|OP *o
+Amd|const char *|OP_DESC|OP *o
+Amnhd||OPf_KIDS
+Amd|bool|OpHAS_SIBLING|OP *o
+Amd|void|OpLASTSIB_set|OP *o|OP *parent
+Amd|void|OpMAYBESIB_set|OP *o|OP *sib|OP *parent
+Amd|void|OpMORESIB_set|OP *o|OP *sib
+Amd|const char *|OP_NAME|OP *o
+Amnhd||OPpEARLY_CV
+Amnhd||OPpENTERSUB_AMPER
+Amd|OP*|OpSIBLING|OP *o
+Amd|bool|OP_TYPE_IS|OP *o|Optype type
+Amd|bool|OP_TYPE_IS_OR_WAS|OP *o|Optype type
+AmnUd||ORIGMARK
+Amnd||OSNAME
+Amnd||OSVERS
+Amd|PADOFFSET|pad_add_name_pvs|"name"|U32 flags|HV *typestash|HV *ourstash
+Amxd|SV **|PadARRAY|PAD * pad
+md|SV *|PAD_BASE_SV |PADLIST padlist|PADOFFSET po
+md|void|PAD_CLONE_VARS|PerlInterpreter *proto_perl|CLONE_PARAMS* param
+md|U32|PAD_COMPNAME_FLAGS|PADOFFSET po
+md|STRLEN|PAD_COMPNAME_GEN|PADOFFSET po
+md|STRLEN|PAD_COMPNAME_GEN_set|PADOFFSET po|int gen
+md|HV *|PAD_COMPNAME_OURSTASH|PADOFFSET po
+md|char *|PAD_COMPNAME_PV|PADOFFSET po
+md|HV *|PAD_COMPNAME_TYPE|PADOFFSET po
+Amd|PADOFFSET|pad_findmy_pvs|"name"|U32 flags
+Amxd|PAD **|PadlistARRAY|PADLIST * padlist
+Amxd|SSize_t|PadlistMAX|PADLIST * padlist
+Amxd|PADNAMELIST *|PadlistNAMES|PADLIST * padlist
+Amxd|PADNAME **|PadlistNAMESARRAY|PADLIST * padlist
+Amxd|SSize_t|PadlistNAMESMAX|PADLIST * padlist
+Amxd|U32|PadlistREFCNT|PADLIST * padlist
+Amxd|SSize_t|PadMAX|PAD * pad
+md|bool|PadnameIsOUR|PADNAME * pn
+md|bool|PadnameIsSTATE|PADNAME * pn
+Amxd|STRLEN|PadnameLEN|PADNAME * pn
+Amxd|PADNAME **|PadnamelistARRAY|PADNAMELIST * pnl
+Amxd|SSize_t|PadnamelistMAX|PADNAMELIST * pnl
+Amxd|SSize_t|PadnamelistREFCNT|PADNAMELIST * pnl
+Amxd|void|PadnamelistREFCNT_dec|PADNAMELIST * pnl
+md|HV *|PadnameOURSTASH
+md|bool|PadnameOUTER|PADNAME * pn
+Amxd|char *|PadnamePV|PADNAME * pn
+Amxd|SSize_t|PadnameREFCNT|PADNAME * pn
+Amxd|void|PadnameREFCNT_dec|PADNAME * pn
+Amxd|SV *|PadnameSV|PADNAME * pn
+Amnhd||PADNAMEt_OUTER
+md|HV *|PadnameTYPE|PADNAME * pn
+Amxd|bool|PadnameUTF8|PADNAME * pn
+md|void|PAD_RESTORE_LOCAL|PAD *opad
+md|void|PAD_SAVE_LOCAL|PAD *opad|PAD *npad
+md|void|PAD_SAVE_SETNULLPAD
+md|void|PAD_SET_CUR |PADLIST padlist|I32 n
+md|void|PAD_SET_CUR_NOSAVE |PADLIST padlist|I32 n
+md|SV *|PAD_SETSV |PADOFFSET po|SV* sv
+md|SV *|PAD_SV |PADOFFSET po
+md|SV *|PAD_SVl |PADOFFSET po
+Amnhd||PARSE_OPTIONAL
+Amd|int|PERL_ABS|int
+Amnhd||PERL_EXIT_ABORT
+Amnhd||PERL_EXIT_DESTRUCT_END
+Amnhd||PERL_EXIT_EXPECTED
+Amnhd||PERL_EXIT_WARN
+Amhd|void|PERL_HASH|U32 hash|char *key|STRLEN klen
+AmnUd||PERL_INT_MAX
+AmnUhd||PERL_INT_MIN
+Amhd|int |PerlIO_apply_layers|PerlIO *f|const char *mode|const char *layers
+Amhd|int |PerlIO_binmode|PerlIO *f|int ptype|int imode|const char *layers
+ATmhd|int |PerlIO_canset_cnt|PerlIO *f
+Amhd|void |PerlIO_debug|const char *fmt|...
+ATmhd|FILE *|PerlIO_exportFILE|PerlIO *f|const char *mode
+ATmhd|int |PerlIO_fast_gets|PerlIO *f
+ATmhd|PerlIO*|PerlIO_fdopen|int fd|const char *mode
+ATmhd|FILE *|PerlIO_findFILE|PerlIO *f
+ATmhd|int |PerlIO_getc|PerlIO *d
+ATmhd|int |PerlIO_getpos|PerlIO *f|SV *save
+ATmhd|int |PerlIO_has_base|PerlIO *f
+ATmhd|int |PerlIO_has_cntptr|PerlIO *f
+ATmhd|PerlIO*|PerlIO_importFILE|FILE *stdio|const char *mode
+ATmhd|PerlIO*|PerlIO_open|const char *path|const char *mode
+Amhd|int |PerlIO_printf|PerlIO *f|const char *fmt|...
+ATmhd|int |PerlIO_putc|PerlIO *f|int ch
+ATmhd|int |PerlIO_puts|PerlIO *f|const char *string
+ATmhd|void |PerlIO_releaseFILE|PerlIO *f|FILE *stdio
+Amhd|PerlIO *|PerlIO_reopen|const char *path|const char *mode|PerlIO *old
+ATmhd|void |PerlIO_rewind|PerlIO *f
+ATmhd|int |PerlIO_setpos|PerlIO *f|SV *saved
+Amhd|int |PerlIO_stdoutf|const char *fmt|...
+ATmhd|int |PerlIO_ungetc|PerlIO *f|int ch
+ATmhd|int |PerlIO_vprintf|PerlIO *f|const char *fmt|va_list args
+Amnhd||PERL_LOADMOD_DENY
+Amnhd||PERL_LOADMOD_IMPORT_OPS
+Amnhd||PERL_LOADMOD_NOIMPORT
+AmnUhd||PERL_LONG_MAX
+AmnUhd||PERL_LONG_MIN
+Amnhd||PERL_MAGIC_arylen
+Amnhd||PERL_MAGIC_arylen_p
+Amnhd||PERL_MAGIC_backref
+Amnhd||PERL_MAGIC_bm
+Amnhd||PERL_MAGIC_checkcall
+Amnhd||PERL_MAGIC_collxfrm
+Amnhd||PERL_MAGIC_dbfile
+Amnhd||PERL_MAGIC_dbline
+Amnhd||PERL_MAGIC_debugvar
+Amnhd||PERL_MAGIC_defelem
+Amnhd||PERL_MAGIC_env
+Amnhd||PERL_MAGIC_envelem
+Amnhd||PERL_MAGIC_ext
+Amnhd||PERL_MAGIC_fm
+Amnhd||PERL_MAGIC_hints
+Amnhd||PERL_MAGIC_hintselem
+Amnhd||PERL_MAGIC_isa
+Amnhd||PERL_MAGIC_isaelem
+Amnhd||PERL_MAGIC_lvref
+Amnhd||PERL_MAGIC_nkeys
+Amnhd||PERL_MAGIC_nonelem
+Amnhd||PERL_MAGIC_overload_table
+Amnhd||PERL_MAGIC_pos
+Amnhd||PERL_MAGIC_qr
+Amnhd||PERL_MAGIC_regdata
+Amnhd||PERL_MAGIC_regdatum
+Amnhd||PERL_MAGIC_regex_global
+Amnhd||PERL_MAGIC_rhash
+Amnhd||PERL_MAGIC_shared
+Amnhd||PERL_MAGIC_shared_scalar
+Amnhd||PERL_MAGIC_sig
+Amnhd||PERL_MAGIC_sigelem
+Amnhd||PERL_MAGIC_substr
+Amnhd||PERL_MAGIC_sv
+Amnhd||PERL_MAGIC_symtab
+Amnhd||PERL_MAGIC_taint
+Amnhd||PERL_MAGIC_tied
+Amnhd||PERL_MAGIC_tiedelem
+Amnhd||PERL_MAGIC_tiedscalar
+Amnhd||PERL_MAGIC_utf8
+Amnhd||PERL_MAGIC_uvar
+Amnhd||PERL_MAGIC_uvar_elem
+Amnhd||PERL_MAGIC_vec
+Amnhd||PERL_MAGIC_vstring
+Amnhd||PERL_PV_ESCAPE_ALL
+Amnhd||PERL_PV_ESCAPE_FIRSTCHAR
+Amnhd||PERL_PV_ESCAPE_NOBACKSLASH
+Amnhd||PERL_PV_ESCAPE_NOCLEAR
+Amnhd||PERL_PV_ESCAPE_NONASCII
+Amnhd||PERL_PV_ESCAPE_QUOTE
+Amnhd||PERL_PV_ESCAPE_RE
+Amnhd||PERL_PV_ESCAPE_UNI
+Amnhd||PERL_PV_ESCAPE_UNI_DETECT
+Amnhd||PERL_PV_PRETTY_ELLIPSES
+Amnhd||PERL_PV_PRETTY_LTGT
+Amnhd||PERL_PV_PRETTY_QUOTE
+AmnUhd||PERL_QUAD_MAX
+AmnUhd||PERL_QUAD_MIN
+hAmnd|int|PERL_REVISION
+Amnhd||PERL_SCAN_ALLOW_UNDERSCORES
+Amnhd||PERL_SCAN_DISALLOW_PREFIX
+Amnhd||PERL_SCAN_GREATER_THAN_UV_MAX
+Amnhd||PERL_SCAN_SILENT_ILLDIGIT
+Amnhd||PERL_SCAN_TRAILING
+AmnUhd||PERL_SHORT_MAX
+AmnUhd||PERL_SHORT_MIN
+hAmnd|int|PERL_SUBVERSION
+Amd|void|PERL_SYS_INIT|int *argc|char*** argv
+Amd|void|PERL_SYS_INIT3|int *argc|char*** argv|char*** env
+Amd|void|PERL_SYS_TERM|
+AmnUhd||PERL_UCHAR_MAX
+AmnUhd||PERL_UCHAR_MIN
+AmnUhd||PERL_UINT_MAX
+AmnUhd||PERL_ULONG_MAX
+AmnUhd||PERL_ULONG_MIN
+AmnUhd||PERL_UQUAD_MAX
+AmnUhd||PERL_UQUAD_MIN
+AmnUhd||PERL_USHORT_MAX
+AmnUhd||PERL_USHORT_MIN
+hAmnd|int|PERL_VERSION
+AmnUd|Perl_check_t *|PL_check
+AmnxUd|PAD *|PL_comppad
+AmnxUd|PADNAMELIST *|PL_comppad_name
+Amnd|COP*|PL_curcop
+AmnxUd|SV **|PL_curpad
+Amnd|HV*|PL_curstash
+Amnd|GV *|PL_defgv
+Amnhd|GV *|PL_errgv
+Amnd|U8|PL_exit_flags
+AmnUxd|Perl_keyword_plugin_t|PL_keyword_plugin
+mnd|GV*|PL_last_in_gv
+Amnd|HV*|PL_modglobal
+Amnd|STRLEN|PL_na
+mnd|GV*|PL_ofsgv
+Amnd|Perl_ophook_t|PL_opfreehook
+AmnUd|yy_parser *|PL_parser
+AmnxUNd|SV *|PL_parser-E<gt>linestr
+AmnxUNd|char *|PL_parser-E<gt>bufend
+AmnxUNd|char *|PL_parser-E<gt>bufptr
+AmnxUNd|char *|PL_parser-E<gt>linestart
+Amnd|peep_t|PL_peepp
+Amnd|signed char|PL_perl_destruct_level
+Amnd|enum perl_phase|PL_phase
+Amnd|peep_t|PL_rpeepp
+mnd|SV*|PL_rs
+Amnd|runops_proc_t|PL_runops
+Amnd|SV|PL_sv_no
+Amnd|SV|PL_sv_undef
+Amnd|SV|PL_sv_yes
+Amnd|SV|PL_sv_zero
+Amnhd||_pMY_CXT
+Amnhd||pMY_CXT
+Amnhd||pMY_CXT_
+Amd|void|Poison|void* dest|int nitems|type
+Amd|void|PoisonFree|void* dest|int nitems|type
+Amd|void|PoisonNew|void* dest|int nitems|type
+Amd|void|PoisonWith|void* dest|int nitems|type|U8 byte
+Amnd|IV|POPi
+Amnd|long|POPl
+Amnsd||POP_MULTICALL
+Amnd|NV|POPn
+Amnd|char*|POPp
+Amnd|char*|POPpbytex
+Amnd|char*|POPpx
+Amnd|SV*|POPs
+Amnd|UV|POPu
+Amnd|long|POPul
+Amnd||PRIVLIB
+Amnhd||pTHX
+Amnhd||pTHX_
+Amhd|IV|PTR2IV|void *
+Amhd|NV|PTR2NV|void *
+Amhd|UV|PTR2UV|void *
+Amnd||PTRSIZE
+Amd|void|PUSHi|IV iv
+Amd|void|PUSHMARK|SP
+Amnd|void|PUSHmortal
+Amsd||PUSH_MULTICALL|CV* the_cv
+Amd|void|PUSHn|NV nv
+Amd|void|PUSHp|char* str|STRLEN len
+Amd|void|PUSHs|SV* sv
+Amd|void|PUSHu|UV uv
+Amnsd||PUTBACK
+Amnd||RANDBITS
+Amd|U8|READ_XDIGIT|char str*
+md|SV *|refcounted_he_fetch_pvs|const struct refcounted_he *chain|"key"|U32 flags
+md|struct refcounted_he *|refcounted_he_new_pvs|struct refcounted_he *parent|"key"|SV *value|U32 flags
+Amd|void|Renew|void* ptr|int nitems|type
+Amd|void|Renewc|void* ptr|int nitems|type|cast
+AmnUd|const char *|REPLACEMENT_CHARACTER_UTF8
+mnd|void|RESTORE_ERRNO
+Amd|void|RESTORE_LC_NUMERIC
+Amnd|(whatever)|RETVAL
+Amnhd||RV2CVOPCV_MARK_EARLY
+Amnhd||RV2CVOPCV_RETURN_NAME_GV
+Amd|void|Safefree|void* ptr
+Amd|void|SANE_ERRSV
+md|void|SAVECLEARSV |SV **svp
+md|void|SAVECOMPPAD
+mnd|void|SAVE_ERRNO
+md|void|SAVEPADSV |PADOFFSET po
+Amad|char*|savepvs|"literal string"
+Amad|char*|savesharedpvs|"literal string"
+Amnsd||SAVETMPS
+md|void|SETERRNO|int errcode|int vmserrcode
+Amnd||SHORTSIZE
+Amnd||SITELIB
+AmnUd||SP
+Amnsd||SPAGAIN
+Amd|SV*|ST|int ix
+Amnhd||START_MY_CXT
+Amnd||STARTPERL
+Amnd||STDCHAR
+AmnUhud|void|STMT_END
+AmnUud|void|STMT_START
+Amd|void|STORE_LC_NUMERIC_FORCE_TO_UNDERLYING
+Amd|void|STORE_LC_NUMERIC_SET_TO_NEEDED
+Amd|void|STORE_LC_NUMERIC_SET_TO_NEEDED_IN|bool in_lc_numeric
+Amd|bool|strEQ|char* s1|char* s2
+Amd|bool|strGE|char* s1|char* s2
+Amd|bool|strGT|char* s1|char* s2
+Amd|bool|strLE|char* s1|char* s2
+Amd|bool|strLT|char* s1|char* s2
+Amd|bool|strNE|char* s1|char* s2
+Amd|bool|strnEQ|char* s1|char* s2|STRLEN len
+Amd|bool|strnNE|char* s1|char* s2|STRLEN len
+AmTRd|NV|Strtod|NN const char * const s|NULLOK char ** e
+AmTRd|NV|Strtol|NN const char * const s|NULLOK char ** e|int base
+AmTRd|NV|Strtoul|NN const char * const s|NULLOK char ** e|int base
+Amd|void|StructCopy|type *src|type *dest|type
+Amud|pair|STR_WITH_LEN|"literal string"
+Amnhd||SV_CATBYTES
+Amd|void|sv_catpvn_nomg|SV* sv|const char* ptr|STRLEN len
+Amd|void|sv_catpv_nomg|SV* sv|const char* ptr
+Amd|void|sv_catpvs|SV* sv|"literal string"
+Amd|void|sv_catpvs_flags|SV* sv|"literal string"|I32 flags
+Amd|void|sv_catpvs_mg|SV* sv|"literal string"
+Amd|void|sv_catpvs_nomg|SV* sv|"literal string"
+Amd|void|sv_catsv_nomg|SV* dsv|SV* ssv
+Amnhd||SV_CATUTF8
+Amnhd||SV_COW_DROP_PV
+Amd|STRLEN|SvCUR|SV* sv
+Amd|void|SvCUR_set|SV* sv|STRLEN len
+Amd|char*|SvEND|SV* sv
+Amnhd||SVf
+Amhd||SVfARG|SV *sv
+Amnhd||SVf_UTF8
+Amd|U32|SvGAMAGIC|SV* sv
+Amd|void|SvGETMAGIC|SV* sv
+Amnhd||SV_GMAGIC
+Amd|char *|SvGROW|SV* sv|STRLEN len
+Amnhd||SV_HAS_TRAILING_NUL
+Amnhd||SV_IMMEDIATE_UNREF
+Amd|U32|SvIOK|SV* sv
+Amd|bool|SvIOK_notUV|SV* sv
+Amd|void|SvIOK_off|SV* sv
+Amd|void|SvIOK_on|SV* sv
+Amd|void|SvIOK_only|SV* sv
+Amd|void|SvIOK_only_UV|SV* sv
+Amd|U32|SvIOKp|SV* sv
+Amd|bool|SvIOK_UV|SV* sv
+Amd|U32|SvIsCOW|SV* sv
+Amd|bool|SvIsCOW_shared_hash|SV* sv
+Amd|IV|SvIV|SV* sv
+Amd|IV|SvIV_nomg|SV* sv
+Amd|void|SvIV_set|SV* sv|IV val
+Amd|IV|SvIVX|SV* sv
+Amd|IV|SvIVx|SV* sv
+Amd|STRLEN|SvLEN|SV* sv
+Amd|void|SvLEN_set|SV* sv|STRLEN len
+Amd|void|SvLOCK|SV* sv
+Amd|void|SvMAGIC_set|SV* sv|MAGIC* val
+Amd|U32|SvNIOK|SV* sv
+Amd|void|SvNIOK_off|SV* sv
+Amd|U32|SvNIOKp|SV* sv
+Amd|U32|SvNOK|SV* sv
+Amd|void|SvNOK_off|SV* sv
+Amd|void|SvNOK_on|SV* sv
+Amd|void|SvNOK_only|SV* sv
+Amd|U32|SvNOKp|SV* sv
+Amnhd||SV_NOSTEAL
+Amd|NV|SvNV|SV* sv
+Amd|NV|SvNV_nomg|SV* sv
+Amd|void|SvNV_set|SV* sv|NV val
+Amd|NV|SvNVX|SV* sv
+Amd|NV|SvNVx|SV* sv
+Amd|U32|SvOK|SV* sv
+Amd|U32|SvOOK|SV* sv
+Amd|void|SvOOK_offset|SV*sv|STRLEN len
+Amd|U32|SvPOK|SV* sv
+Amd|void|SvPOK_off|SV* sv
+Amd|void|SvPOK_on|SV* sv
+Amd|void|SvPOK_only|SV* sv
+Amd|void|SvPOK_only_UTF8|SV* sv
+Amd|U32|SvPOKp|SV* sv
+Amd|char*|SvPV|SV* sv|STRLEN len
+Amd|char*|SvPVbyte|SV* sv|STRLEN len
+Amd|char*|SvPVbyte_force|SV* sv|STRLEN len
+Amd|char*|SvPVbyte_nolen|SV* sv
+Amd|char*|SvPVbyte_nomg|SV* sv|STRLEN len
+Amd|char*|SvPVbyte_or_null|SV* sv|STRLEN len
+Amd|char*|SvPVbyte_or_null_nomg|SV* sv|STRLEN len
+Amd|char*|SvPVbytex|SV* sv|STRLEN len
+Amd|char*|SvPVbytex_force|SV* sv|STRLEN len
+Amd|char *|SvPVCLEAR|SV* sv
+Amd|char*|SvPV_force|SV* sv|STRLEN len
+Amd|char*|SvPV_force_nomg|SV* sv|STRLEN len
+Amd|char*|SvPV_nolen|SV* sv
+Amd|char*|SvPV_nomg|SV* sv|STRLEN len
+Amd|char*|SvPV_nomg_nolen|SV* sv
+Amd|void|SvPV_set|SV* sv|char* val
+Amd|char*|SvPVutf8|SV* sv|STRLEN len
+Amd|char*|SvPVutf8_force|SV* sv|STRLEN len
+Amd|char*|SvPVutf8_nolen|SV* sv
+Amd|char*|SvPVutf8_nomg|SV* sv|STRLEN len
+Amd|char*|SvPVutf8_or_null|SV* sv|STRLEN len
+Amd|char*|SvPVutf8_or_null_nomg|SV* sv|STRLEN len
+Amd|char*|SvPVutf8x|SV* sv|STRLEN len
+Amd|char*|SvPVutf8x_force|SV* sv|STRLEN len
+Amd|char*|SvPVX|SV* sv
+Amd|char*|SvPVx|SV* sv|STRLEN len
+Amd|U32|SvREADONLY|SV* sv
+Amd|U32|SvREADONLY_off|SV* sv
+Amd|U32|SvREADONLY_on|SV* sv
+Amd|U32|SvREFCNT|SV* sv
+Amd|SV*|SvREFCNT_inc_simple|SV* sv
+Amd|SV*|SvREFCNT_inc_simple_NN|SV* sv
+Amd|void|SvREFCNT_inc_simple_void|SV* sv
+Amd|void|SvREFCNT_inc_simple_void_NN|SV* sv
+Amd|void|SvREFCNT_inc_void_NN|SV* sv
+Amd|U32|SvROK|SV* sv
+Amd|void|SvROK_off|SV* sv
+Amd|void|SvROK_on|SV* sv
+Amd|SV*|SvRV|SV* sv
+Amd|void|SvRV_set|SV* sv|SV* val
+Amd|REGEXP *|SvRX|SV *sv
+Amd|bool|SvRXOK|SV* sv
+Amd|void|SvSETMAGIC|SV* sv
+Amd|void|SvSetMagicSV|SV* dsv|SV* ssv
+Amd|void|SvSetMagicSV_nosteal|SV* dsv|SV* ssv
+Amd|void|sv_setpvs|SV* sv|"literal string"
+Amd|void|sv_setpvs_mg|SV* sv|"literal string"
+Amd|SV *|sv_setref_pvs|SV *const rv|const char *const classname|"literal string"
+Amd|void|SvSetSV|SV* dsv|SV* ssv
+Amd|void|sv_setsv_nomg|SV* dsv|SV* ssv
+Amd|void|SvSetSV_nosteal|SV* dsv|SV* ssv
+Amd|void|SvSHARE|SV* sv
+Amnhd||SV_SMAGIC
+Amnhd||SVs_PADSTALE
+Amd|HV*|SvSTASH|SV* sv
+Amd|void|SvSTASH_set|SV* sv|HV* val
+Amnhd||SVs_TEMP
+Amd|void|SvTAINT|SV* sv
+Amd|bool|SvTAINTED|SV* sv
+Amd|void|SvTAINTED_off|SV* sv
+Amd|void|SvTAINTED_on|SV* sv
+md|U32|SvTHINKFIRST|SV *sv
+CmnUd||SVt_INVLIST
+AmnUd||SVt_IV
+AmnUd||SVt_NULL
+AmnUd||SVt_NV
+AmnUd||SVt_PV
+AmnUd||SVt_PVAV
+AmnUd||SVt_PVCV
+AmnUd||SVt_PVFM
+AmnUd||SVt_PVGV
+AmnUd||SVt_PVHV
+AmnUd||SVt_PVIO
+AmnUd||SVt_PVIV
+AmnUd||SVt_PVLV
+AmnUd||SVt_PVMG
+AmnUd||SVt_PVNV
+AmnUd||SVt_REGEXP
+Amd|bool|SvTRUE|SV* sv
+Amd|bool|SvTRUE_nomg|SV* sv
+Amd|bool|SvTRUEx|SV* sv
+Amd|svtype|SvTYPE|SV* sv
+AmnUd||svtype
+Amd|void|SvUNLOCK|SV* sv
+Amd|bool|SvUOK|SV* sv
+Amd|void|SvUPGRADE|SV* sv|svtype type
+Amd|U32|SvUTF8|SV* sv
+Amd|void|SvUTF8_off|SV *sv
+Amd|void|SvUTF8_on|SV *sv
+Amd|UV|SvUV|SV* sv
+Amd|UV|SvUV_nomg|SV* sv
+Amd|void|SvUV_set|SV* sv|UV val
+Amd|UV|SvUVX|SV* sv
+Amd|UV|SvUVx|SV* sv
+AmDd|UV|SvUVXx|SV* sv
+Amd|bool|SvVOK|SV* sv
+Amnd|(whatever)|THIS
+Amd|U8|toFOLD|U8 ch
+Amd|UV|toFOLD_utf8|U8* p|U8* e|U8* s|STRLEN* lenp
+Amd|UV|toFOLD_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
+Amd|UV|toFOLD_uvchr|UV cp|U8* s|STRLEN* lenp
+Amd|U8|toLOWER|U8 ch
+Amd|U8|toLOWER_L1|U8 ch
+Amd|U8|toLOWER_LC|U8 ch
+Amd|UV|toLOWER_utf8|U8* p|U8* e|U8* s|STRLEN* lenp
+Amd|UV|toLOWER_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
+Amd|UV|toLOWER_uvchr|UV cp|U8* s|STRLEN* lenp
+Amd|U8|toTITLE|U8 ch
+Amd|UV|toTITLE_utf8|U8* p|U8* e|U8* s|STRLEN* lenp
+Amd|UV|toTITLE_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
+Amd|UV|toTITLE_uvchr|UV cp|U8* s|STRLEN* lenp
+Amd|U8|toUPPER|int ch
+Amd|UV|toUPPER_utf8|U8* p|U8* e|U8* s|STRLEN* lenp
+Amd|UV|toUPPER_utf8_safe|U8* p|U8* e|U8* s|STRLEN* lenp
+Amd|UV|toUPPER_uvchr|UV cp|U8* s|STRLEN* lenp
+Amnd||U16SIZE
+Amnd||U16TYPE
+Amnd||U32SIZE
+Amnd||U32TYPE
+Amnd||U8SIZE
+Amnd||U8TYPE
+AmnUd||UNDERBAR
+AmnUd|UV|UNICODE_REPLACEMENT
+Amd|UV|UNI_TO_NATIVE|UV ch
+AmUd|bool|UNLIKELY|const bool expr
+Amnhd||UTF8_CHECK_ONLY
+Amd|STRLEN|UTF8_CHK_SKIP|char* s
+Amnhd||UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE
+Amnhd||UTF8_DISALLOW_ILLEGAL_INTERCHANGE
+Amnhd||UTF8_DISALLOW_NONCHAR
+Amnhd||UTF8_DISALLOW_PERL_EXTENDED
+Amnhd||UTF8_DISALLOW_SUPER
+Amnhd||UTF8_DISALLOW_SURROGATE
+Amnhd||UTF8f
+Amhd||UTF8fARG|bool is_utf8|Size_t byte_len|char *str
+Amd|bool|UTF8_IS_INVARIANT|char c
+Amd|bool|UTF8_IS_NONCHAR|const U8 *s|const U8 *e
+Amd|bool|UTF8_IS_SUPER|const U8 *s|const U8 *e
+Amd|bool|UTF8_IS_SURROGATE|const U8 *s|const U8 *e
+AmnUd|STRLEN|UTF8_MAXBYTES
+AmnUd|STRLEN|UTF8_MAXBYTES_CASE
+Amd|STRLEN|UTF8_SAFE_SKIP|char* s|char* e
+Amd|STRLEN|UTF8_SKIP|char* s
+Amd|STRLEN|UTF8SKIP|char* s
+Amnhd||UTF8_WARN_ILLEGAL_C9_INTERCHANGE
+Amnhd||UTF8_WARN_ILLEGAL_INTERCHANGE
+Amnhd||UTF8_WARN_NONCHAR
+Amnhd||UTF8_WARN_PERL_EXTENDED
+Amnhd||UTF8_WARN_SUPER
+Amnhd||UTF8_WARN_SURROGATE
+Amd|bool|UVCHR_IS_INVARIANT|UV cp
+Amd|STRLEN|UVCHR_SKIP|UV cp
+Amnhd||UVof
+Amnd||UVSIZE
+Amnd||UVTYPE
+Amnhd||UVuf
+Amnd||UVXf
+Amnhd||UVxf
+Amnhd||WARN_ALL
+Amnhd||WARN_AMBIGUOUS
+Amnhd||WARN_BAREWORD
+Amnhd||WARN_CLOSED
+Amnhd||WARN_CLOSURE
+Amnhd||WARN_DEBUGGING
+Amnhd||WARN_DEPRECATED
+Amnhd||WARN_DIGIT
+Amnhd||WARN_EXEC
+Amnhd||WARN_EXITING
+Amnhd||WARN_EXPERIMENTAL
+Amnhd||WARN_EXPERIMENTAL__ALPHA_ASSERTIONS
+Amnhd||WARN_EXPERIMENTAL__BITWISE
+Amnhd||WARN_EXPERIMENTAL__CONST_ATTR
+Amnhd||WARN_EXPERIMENTAL__DECLARED_REFS
+Amnhd||WARN_EXPERIMENTAL__ISA
+Amnhd||WARN_EXPERIMENTAL__LEXICAL_SUBS
+Amnhd||WARN_EXPERIMENTAL__POSTDEREF
+Amnhd||WARN_EXPERIMENTAL__PRIVATE_USE
+Amnhd||WARN_EXPERIMENTAL__REFALIASING
+Amnhd||WARN_EXPERIMENTAL__REGEX_SETS
+Amnhd||WARN_EXPERIMENTAL__RE_STRICT
+Amnhd||WARN_EXPERIMENTAL__SCRIPT_RUN
+Amnhd||WARN_EXPERIMENTAL__SIGNATURES
+Amnhd||WARN_EXPERIMENTAL__SMARTMATCH
+Amnhd||WARN_EXPERIMENTAL__UNIPROP_WILDCARDS
+Amnhd||WARN_EXPERIMENTAL__VLB
+Amnhd||WARN_EXPERIMENTAL__WIN32_PERLIO
+Amnhd||WARN_GLOB
+Amnhd||WARN_ILLEGALPROTO
+Amnhd||WARN_IMPRECISION
+Amnhd||WARN_INPLACE
+Amnhd||WARN_INTERNAL
+Amnhd||WARN_IO
+Amnhd||WARN_LAYER
+Amnhd||WARN_LOCALE
+Amnhd||WARN_MALLOC
+Amnhd||WARN_MISC
+Amnhd||WARN_MISSING
+Amnhd||WARN_NEWLINE
+Amnhd||WARN_NONCHAR
+Amnhd||WARN_NON_UNICODE
+Amnhd||WARN_NUMERIC
+Amnhd||WARN_ONCE
+Amnhd||WARN_OVERFLOW
+Amnhd||WARN_PACK
+Amnhd||WARN_PARENTHESIS
+Amnhd||WARN_PIPE
+Amnhd||WARN_PORTABLE
+Amnhd||WARN_PRECEDENCE
+Amnhd||WARN_PRINTF
+Amnhd||WARN_PROTOTYPE
+Amnhd||WARN_QW
+Amnhd||WARN_RECURSION
+Amnhd||WARN_REDEFINE
+Amnhd||WARN_REDUNDANT
+Amnhd||WARN_REGEXP
+Amnhd||WARN_RESERVED
+Amnhd||WARN_SEMICOLON
+Amnhd||WARN_SEVERE
+Amnhd||WARN_SHADOW
+Amnhd||WARN_SIGNAL
+Amnhd||WARN_SUBSTR
+Amnhd||WARN_SURROGATE
+Amnhd||WARN_SYNTAX
+Amnhd||WARN_SYSCALLS
+Amnhd||WARN_TAINT
+Amnhd||WARN_THREADS
+Amnhd||WARN_UNINITIALIZED
+Amnhd||WARN_UNOPENED
+Amnhd||WARN_UNPACK
+Amnhd||WARN_UNTIE
+Amnhd||WARN_UTF8
+Amnhd||WARN_VOID
+AmnUd|void|WIDEST_UTYPE
+Amd|void|WITH_LC_NUMERIC_SET_TO_NEEDED|block
+Amd|void|WITH_LC_NUMERIC_SET_TO_NEEDED_IN|bool in_lc_numeric|block
+AmnUd||XCPT_CATCH
+Amnsd||XCPT_RETHROW
+AmnUd||XCPT_TRY_END
+AmnUd||XCPT_TRY_START
+Amd|void|XopDISABLE|XOP *xop|which
+Amd|void|XopENABLE|XOP *xop|which
+Amd||XopENTRY|XOP *xop|which
+Amd||XopENTRYCUSTOM|const OP *o|which
+Amd|void|XopENTRY_set|XOP *xop|which|value
+Amd|U32|XopFLAGS|XOP *xop
+Amd|void|XPUSHi|IV iv
+Amnd|void|XPUSHmortal
+Amd|void|XPUSHn|NV nv
+Amd|void|XPUSHp|char* str|STRLEN len
+Amd|void|XPUSHs|SV* sv
+Amd|void|XPUSHu|UV uv
+AmnUd||XS
+Amnsd||XS_APIVERSION_BOOTCHECK
+AmnUd||XS_EXTERNAL
+AmUd||XS_INTERNAL
+Amd|void|XSRETURN|int nitems
+Amnsd||XSRETURN_EMPTY
+Amd|void|XSRETURN_IV|IV iv
+Amnsd||XSRETURN_NO
+Amd|void|XSRETURN_NV|NV nv
+Amd|void|XSRETURN_PV|char* str
+Amnsd||XSRETURN_UNDEF
+Amd|void|XSRETURN_UV|IV uv
+Amnsd||XSRETURN_YES
+Amd|void|XST_mIV|int pos|IV iv
+Amd|void|XST_mNO|int pos
+Amd|void|XST_mNV|int pos|NV nv
+Amd|void|XST_mPV|int pos|char* str
+Amd|void|XST_mUNDEF|int pos
+Amd|void|XST_mUV|int pos|UV uv
+Amd|void|XST_mYES|int pos
+AmnUd||XS_VERSION
+Amnsd||XS_VERSION_BOOTCHECK
+Amd|void|Zero|void* dest|int nitems|type
+Amd|void *|ZeroD|void* dest|int nitems|type
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5003007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5003007
new file mode 100644
index 00000000000..11fdae8f644
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5003007
@@ -0,0 +1,549 @@
+5.003007
+amagic_call # T
+av_clear # T
+av_extend # T
+av_fetch # T
+av_fill # T
+AvFILL # T
+av_len # T
+av_make # T
+av_pop # T
+av_push # T
+av_shift # T
+av_store # T
+av_undef # T
+av_unshift # T
+ax # T
+BIN # T
+BYTEORDER # T
+CASTFLAGS # T
+Copy # T
+CPPMINUS # T
+CPPSTDIN # T
+cv_clone # T
+cv_const_sv # T
+CvDEPTH # T
+CvGV # T
+CvSTASH # T
+cv_undef # T
+cxinc # T
+dMARK # T
+do_close # T
+do_join # T
+do_open # T
+dORIGMARK # T
+do_sprintf # T
+dounwind # T
+dowantarray # T
+dSP # T
+dTHX # T
+dXSARGS # T
+ENTER # T
+EXTEND # T
+filter_add # T
+filter_del # T
+filter_read # T
+free_tmps # T
+FREETMPS # T
+G_ARRAY # T
+G_DISCARD # T
+G_EVAL # T
+GIMME # T
+G_NOARGS # T
+gp_free # T
+gp_ref # T
+G_SCALAR # T
+GV_ADD # T
+GV_ADDMULTI # T
+GvAV # T
+gv_AVadd # T
+gv_check # T
+GvCV # T
+gv_efullname # T
+gv_efullname3 # T
+gv_fetchfile # T
+gv_fetchmeth # T
+gv_fetchmethod # T
+gv_fetchpv # T
+gv_fullname # T
+gv_fullname3 # T
+GvHV # T
+gv_HVadd # T
+gv_init # T
+gv_IOadd # T
+gv_stashpv # T
+gv_stashpvn # T
+gv_stashsv # T
+GvSV # T
+HEf_SVKEY # T
+HeHASH # T
+HeKEY # T
+HeKLEN # T
+HeSVKEY # T
+HeSVKEY_force # T
+HeVAL # T
+hv_clear # T
+hv_delete # T
+hv_delete_ent # T
+hv_exists # T
+hv_exists_ent # T
+hv_fetch # T
+hv_fetch_ent # T
+HvFILL # T
+hv_iterinit # T
+hv_iterkey # T
+hv_iterkeysv # T
+hv_iternext # T
+hv_iternextsv # T
+hv_iterval # T
+hv_ksplit # T
+hv_magic # T
+HvNAME # T
+hv_store # T
+hv_store_ent # T
+hv_undef # T
+ibcmp # T
+instr # T
+INTSIZE # T
+isALNUM # T
+isALPHA # T
+isDIGIT # T
+isIDFIRST # T
+isLOWER # T
+isSPACE # T
+isUPPER # T
+LEAVE # T
+leave_scope # T
+looks_like_number # T
+MARK # T
+mg_clear # T
+mg_copy # T
+mg_find # T
+mg_free # T
+mg_get # T
+mg_magical # T
+mg_set # T
+moreswitches # T
+Move # T
+my_exit # T
+my_pclose # T
+my_popen # T
+my_setenv # T
+newANONHASH # T
+newANONLIST # T
+newANONSUB # T
+newASSIGNOP # T
+newAV # T
+newAVREF # T
+newBINOP # T
+newCONDOP # T
+newCVREF # T
+newFORM # T
+newGVgen # T
+newGVOP # T
+newGVREF # T
+newHV # T
+newHVREF # T
+newIO # T
+newLISTOP # T
+newLOGOP # T
+newLOOPEX # T
+newLOOPOP # T
+newNULLLIST # T
+newOP # T
+newPMOP # T
+newPROG # T
+newPVOP # T
+newRANGE # T
+newRV # T
+newSLICEOP # T
+newSTATEOP # T
+newSUB # T
+newSV # T
+newSViv # T
+newSVOP # T
+newSVpv # T
+newSVREF # T
+newSVrv # T
+newSVsv # T
+newUNOP # T
+ninstr # T
+Nullav # T
+Nullch # T
+Nullcv # T
+Nullhv # T
+Nullsv # T
+OPf_KIDS # T
+op_free # T
+OPpENTERSUB_AMPER # T
+ORIGMARK # T
+OSNAME # T
+pad_alloc # T
+perl_alloc # T
+perl_construct # T
+perl_free # T
+PERL_HASH # T
+PERL_INT_MAX # T
+PERL_INT_MIN # T
+PerlIO_canset_cnt # T
+PerlIO_exportFILE # T
+PerlIO_fast_gets # T
+PerlIO_fdopen # T
+PerlIO_findFILE # T
+PerlIO_getc # T
+PerlIO_getpos # T
+PerlIO_has_base # T
+PerlIO_has_cntptr # T
+PerlIO_importFILE # T
+PerlIO_open # T
+PerlIO_putc # T
+PerlIO_puts # T
+PerlIO_releaseFILE # T
+PerlIO_reopen # T
+PerlIO_rewind # T
+PerlIO_setpos # T
+PerlIO_ungetc # T
+PerlIO_vprintf # T
+PERL_LONG_MAX # T
+PERL_LONG_MIN # T
+PERL_QUAD_MAX # T
+PERL_QUAD_MIN # T
+perl_run # T
+PERL_SHORT_MAX # T
+PERL_SHORT_MIN # T
+PERL_SYS_INIT # T
+PERL_SYS_TERM # T
+PERL_UCHAR_MAX # T
+PERL_UCHAR_MIN # T
+PERL_UINT_MAX # T
+PERL_ULONG_MAX # T
+PERL_ULONG_MIN # T
+PERL_UQUAD_MAX # T
+PERL_UQUAD_MIN # T
+PERL_USHORT_MAX # T
+PERL_USHORT_MIN # T
+POPi # T
+POPl # T
+POPp # T
+POPs # T
+pop_scope # T
+pregexec # T
+pregfree # T
+PRIVLIB # T
+PUSHi # T
+PUSHMARK # T
+PUSHp # T
+PUSHs # T
+push_scope # T
+PUTBACK # T
+RANDBITS # T
+Renew # T
+Renewc # T
+repeatcpy # T
+rninstr # T
+Safefree # T
+save_aptr # T
+save_ary # T
+save_clearsv # T
+save_delete # T
+save_freepv # T
+save_freesv # T
+save_hash # T
+save_hptr # T
+save_I32 # T
+save_int # T
+save_item # T
+save_list # T
+save_long # T
+save_nogv # T
+save_pptr # T
+savepv # T
+savepvn # T
+save_scalar # T
+save_sptr # T
+savestack_grow # T
+save_svref # T
+SAVETMPS # T
+setdefout # T
+SITELIB # T
+SP # T
+SPAGAIN # T
+ST # T
+stack_grow # T
+STARTPERL # T
+STDCHAR # T
+strEQ # T
+strGE # T
+strGT # T
+strLE # T
+strLT # T
+strNE # T
+strnEQ # T
+strnNE # T
+sv_2bool # T
+sv_2cv # T
+sv_2io # T
+sv_2iv # T
+sv_2mortal # T
+sv_2pv # T
+sv_backoff # T
+sv_bless # T
+sv_catpv # T
+sv_catpvn # T
+sv_catsv # T
+sv_chop # T
+sv_clear # T
+sv_cmp # T
+SvCUR # T
+SvCUR_set # T
+sv_dec # T
+sv_dump # T
+SvEND # T
+sv_eq # T
+sv_free # T
+sv_gets # T
+sv_grow # T
+SvGROW # T
+sv_inc # T
+sv_insert # T
+SvIOK # T
+SvIOK_off # T
+SvIOK_on # T
+SvIOK_only # T
+SvIOKp # T
+sv_isa # T
+sv_isobject # T
+SvIV # T
+SvIV_set # T
+SvIVX # T
+SvIVx # T
+sv_len # T
+SvLEN # T
+SvLEN_set # T
+sv_magic # T
+sv_mortalcopy # T
+sv_newmortal # T
+sv_newref # T
+SvNIOK # T
+SvNIOK_off # T
+SvNIOKp # T
+SvNOK # T
+SvNOK_off # T
+SvNOK_on # T
+SvNOK_only # T
+SvNOKp # T
+SvOK # T
+SvOOK # T
+SvPOK # T
+SvPOK_off # T
+SvPOK_on # T
+SvPOK_only # T
+SvPOKp # T
+SvPV # T
+SvPV_force # T
+sv_pvn_force # T
+SvPV_set # T
+SvPVX # T
+SvPVx # T
+SvREADONLY # T
+SvREADONLY_off # T
+SvREADONLY_on # T
+SvREFCNT # T
+SvREFCNT_dec # T
+SvREFCNT_inc # T
+sv_reftype # T
+sv_replace # T
+sv_report_used # T
+sv_reset # T
+SvROK # T
+SvROK_off # T
+SvROK_on # T
+SvRV # T
+sv_setiv # T
+SvSETMAGIC # T
+sv_setpv # T
+sv_setpvn # T
+sv_setref_iv # T
+sv_setref_pv # T
+sv_setref_pvn # T
+sv_setsv # T
+SvSetSV # T
+SvSTASH # T
+SVs_TEMP # T
+SvTAINT # T
+SVt_IV # T
+SVt_NULL # T
+SVt_NV # T
+SVt_PV # T
+SVt_PVAV # T
+SVt_PVCV # T
+SVt_PVFM # T
+SVt_PVGV # T
+SVt_PVHV # T
+SVt_PVIO # T
+SVt_PVIV # T
+SVt_PVLV # T
+SVt_PVMG # T
+SVt_PVNV # T
+SvTRUE # T
+SvTRUEx # T
+SvTYPE # T
+sv_unmagic # T
+sv_unref # T
+sv_upgrade # T
+SvUPGRADE # T
+sv_usepvn # T
+taint_env # T
+taint_proper # T
+toLOWER # T
+toUPPER # T
+unsharepvn # T
+whichsig # T
+XPUSHi # T
+XPUSHp # T
+XPUSHs # T
+XSRETURN # T
+XSRETURN_EMPTY # T
+XSRETURN_IV # T
+XSRETURN_NO # T
+XSRETURN_PV # T
+XSRETURN_UNDEF # T
+XSRETURN_YES # T
+XST_mIV # T
+XST_mNO # T
+XST_mPV # T
+XST_mUNDEF # T
+XST_mYES # T
+XS_VERSION # T
+XS_VERSION_BOOTCHECK # T
+Zero # T
+RETVAL # X added by devel/scanprov
+CALL # X added by devel/scanprov
+THIS # X added by devel/scanprov
+dXSI32 # M added by devel/scanprov
+items # M added by devel/scanprov
+ix # M added by devel/scanprov
+PERL_UINT_MIN # M added by devel/scanprov
+STMT_END # M added by devel/scanprov
+STMT_START # M added by devel/scanprov
+StructCopy # M added by devel/scanprov
+svtype # M added by devel/scanprov
+XS # M added by devel/scanprov
+apply # F added by devel/scanprov
+bind_match # F added by devel/scanprov
+boot_core_UNIVERSAL # F added by devel/scanprov
+cando # F added by devel/scanprov
+checkcomma # F added by devel/scanprov
+check_uni # F added by devel/scanprov
+do_chomp # F added by devel/scanprov
+do_eof # F added by devel/scanprov
+do_exec # F added by devel/scanprov
+dofindlabel # F added by devel/scanprov
+do_ipcctl # F added by devel/scanprov
+do_ipcget # F added by devel/scanprov
+do_msgrcv # F added by devel/scanprov
+do_msgsnd # F added by devel/scanprov
+dopoptoeval # F added by devel/scanprov
+do_print # F added by devel/scanprov
+do_readline # F added by devel/scanprov
+do_seek # F added by devel/scanprov
+do_semop # F added by devel/scanprov
+do_shmio # F added by devel/scanprov
+do_tell # F added by devel/scanprov
+do_trans # F added by devel/scanprov
+do_vecset # F added by devel/scanprov
+do_vop # F added by devel/scanprov
+dump_mstats # F added by devel/scanprov
+fold_constants # F added by devel/scanprov
+force_ident # F added by devel/scanprov
+force_list # F added by devel/scanprov
+force_next # F added by devel/scanprov
+force_word # F added by devel/scanprov
+gen_constant_list # F added by devel/scanprov
+ingroup # F added by devel/scanprov
+intuit_more # F added by devel/scanprov
+invert # F added by devel/scanprov
+io_close # F added by devel/scanprov
+jmaybe # F added by devel/scanprov
+keyword # F added by devel/scanprov
+list # F added by devel/scanprov
+listkids # F added by devel/scanprov
+localize # F added by devel/scanprov
+magic_clearenv # F added by devel/scanprov
+magic_clearpack # F added by devel/scanprov
+magic_clearsig # F added by devel/scanprov
+magic_existspack # F added by devel/scanprov
+magic_get # F added by devel/scanprov
+magic_getarylen # F added by devel/scanprov
+magic_getpack # F added by devel/scanprov
+magic_getpos # F added by devel/scanprov
+magic_getsig # F added by devel/scanprov
+magic_gettaint # F added by devel/scanprov
+magic_getuvar # F added by devel/scanprov
+magic_nextpack # F added by devel/scanprov
+magic_set # F added by devel/scanprov
+magic_setarylen # F added by devel/scanprov
+magic_setdbline # F added by devel/scanprov
+magic_setenv # F added by devel/scanprov
+magic_setisa # F added by devel/scanprov
+magic_setmglob # F added by devel/scanprov
+magic_setnkeys # F added by devel/scanprov
+magic_setpack # F added by devel/scanprov
+magic_setpos # F added by devel/scanprov
+magic_setsig # F added by devel/scanprov
+magic_setsubstr # F added by devel/scanprov
+magic_settaint # F added by devel/scanprov
+magic_setuvar # F added by devel/scanprov
+magic_setvec # F added by devel/scanprov
+magic_wipepack # F added by devel/scanprov
+mem_collxfrm # F added by devel/scanprov
+modkids # F added by devel/scanprov
+my_chsize # F added by devel/scanprov
+my_unexec # F added by devel/scanprov
+nextargv # F added by devel/scanprov
+no_fh_allowed # F added by devel/scanprov
+no_op # F added by devel/scanprov
+oopsAV # F added by devel/scanprov
+oopsHV # F added by devel/scanprov
+package # F added by devel/scanprov
+pad_free # F added by devel/scanprov
+pad_leavemy # F added by devel/scanprov
+pad_reset # F added by devel/scanprov
+pad_sv # F added by devel/scanprov
+pad_swipe # F added by devel/scanprov
+peep # F added by devel/scanprov
+pidgone # F added by devel/scanprov
+pmruntime # F added by devel/scanprov
+pmtrans # F added by devel/scanprov
+ref # F added by devel/scanprov
+refkids # F added by devel/scanprov
+regprop # F added by devel/scanprov
+same_dirent # F added by devel/scanprov
+sawparens # F added by devel/scanprov
+scalar # F added by devel/scanprov
+scalarkids # F added by devel/scanprov
+scalarseq # F added by devel/scanprov
+scalarvoid # F added by devel/scanprov
+scan_const # F added by devel/scanprov
+scan_formline # F added by devel/scanprov
+scan_heredoc # F added by devel/scanprov
+scan_ident # F added by devel/scanprov
+scan_inputsymbol # F added by devel/scanprov
+scan_pat # F added by devel/scanprov
+scan_str # F added by devel/scanprov
+scan_subst # F added by devel/scanprov
+scan_trans # F added by devel/scanprov
+scan_word # F added by devel/scanprov
+sighandler # F added by devel/scanprov
+sv_add_arena # F added by devel/scanprov
+sv_clean_all # F added by devel/scanprov
+sv_clean_objs # F added by devel/scanprov
+sv_free_arenas # F added by devel/scanprov
+unlnk # F added by devel/scanprov
+utilize # F added by devel/scanprov
+wait4pid # F added by devel/scanprov
+watch # F added by devel/scanprov
+yyerror # F added by devel/scanprov
+yylex # F added by devel/scanprov
+yyparse # F added by devel/scanprov
+yywarn # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004000
index 38b77a15309..7d77ab13ea3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004000
@@ -1,52 +1,76 @@
5.004000
-GIMME_V # E
-G_VOID # E
-HePV # A
-HeSVKEY_set # U
-POPu # E
-PUSHu # U
-SvSetMagicSV # U
-SvSetMagicSV_nosteal # U
-SvSetSV_nosteal # U
-SvTAINTED # U
-SvTAINTED_off # U
-SvTAINTED_on # U
-SvUV # U
-SvUVX # U
-SvUVx # U
-XPUSHu # U
+ARCHNAME # E
block_end # E (Perl_block_end)
block_gimme # E
block_start # E (Perl_block_start)
-boolSV # U
+boolSV # E
call_list # E
delimcpy # U
-gv_autoload4 # U
+GIMME_V # E
+gv_autoload4 # E
gv_fetchmethod_autoload # E
+G_VOID # E
+HePV # A
+HeSVKEY_set # E
hv_delayfree_ent # E
hv_free_ent # E
-ibcmp_locale # U
+ibcmp_locale # E
intro_my # E
-isPRINT # U
-memEQ # U
-memNE # U
+isALNUM_LC # E
+isALPHA_LC # E
+isDIGIT_LC # E
+isIDFIRST_LC # E
+isLOWER_LC # E
+isPRINT # E
+isPRINT_LC # E
+isSPACE_LC # E
+isUPPER_LC # E
+LONGSIZE # E
+memEQ # E
+memNE # E
my_failure_exit # E
-newRV_inc # U
+newRV_inc # E
newRV_noinc # E
+POPu # E
+PUSHu # E
rsignal # E
rsignal_state # E
-save_I16 # E
save_gp # E
+save_I16 # E
share_hek # E
+SHORTSIZE # E
start_subparse # E (Perl_start_subparse)
sv_2uv # U
-sv_cmp_locale # E
+sv_cmp_locale # U
sv_derived_from # E
+SvSetMagicSV # E
+SvSetMagicSV_nosteal # E
+SvSetSV_nosteal # E
sv_setuv # E
sv_taint # U
sv_tainted # E
+SvTAINTED # E
+SvTAINTED_off # E
+SvTAINTED_on # E
sv_untaint # E
+SvUV # E
+SvUVX # E
+SvUVx # E
+SvUVXx # E
sv_vcatpvfn # E
sv_vsetpvfn # E
-toLOWER_LC # U
-SvUVXx # added by devel/scanprov
+toLOWER_LC # E
+XPUSHu # E
+do_sysseek # F added by devel/scanprov
+magic_getdefelem # F added by devel/scanprov
+magic_setcollxfrm # F added by devel/scanprov
+magic_setdefelem # F added by devel/scanprov
+rsignal_restore # F added by devel/scanprov
+rsignal_save # F added by devel/scanprov
+rxres_free # F added by devel/scanprov
+rxres_restore # F added by devel/scanprov
+rxres_save # F added by devel/scanprov
+sub_crush_depth # F added by devel/scanprov
+unshare_hek # F added by devel/scanprov
+vivify_defelem # F added by devel/scanprov
+vivify_ref # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004001
new file mode 100644
index 00000000000..1a7f0b71cfb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004001
@@ -0,0 +1,2 @@
+5.004001
+magic_clear_all_env # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004002
new file mode 100644
index 00000000000..88ea4015a04
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004002
@@ -0,0 +1 @@
+5.004002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004003
new file mode 100644
index 00000000000..42ff9a82896
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004003
@@ -0,0 +1 @@
+5.004003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004004
new file mode 100644
index 00000000000..6437c3e9be1
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004004
@@ -0,0 +1,3 @@
+5.004004
+av_reify # F added by devel/scanprov
+magic_set_all_env # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004005
new file mode 100644
index 00000000000..5abbf160cd9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5004005
@@ -0,0 +1,49 @@
+5.004005
+do_binmode # E
+dTHR # E
+ERRSV # E
+GV_NOINIT # E
+newCONSTSUB # E
+newSVpvn # E
+PL_curcop # E
+PL_curstash # E
+PL_defgv # E
+PL_errgv # E
+PL_na # E
+PL_perl_destruct_level # E
+PL_sv_no # E
+PL_sv_undef # E
+PL_sv_yes # E
+save_aelem # E
+save_helem # E
+sv_catpv_mg # E
+sv_catpvn_mg # U
+sv_catsv_mg # U
+SvGETMAGIC # E
+sv_setiv_mg # E
+sv_setpv_mg # E
+sv_setpvn_mg # E
+sv_setsv_mg # E
+sv_setuv_mg # E
+sv_usepvn_mg # U
+AvFILLp # M added by devel/scanprov
+DEFSV # M added by devel/scanprov
+PL_compiling # M added by devel/scanprov
+PL_DBsingle # M added by devel/scanprov
+PL_DBsub # M added by devel/scanprov
+PL_debstash # M added by devel/scanprov
+PL_diehook # M added by devel/scanprov
+PL_dirty # M added by devel/scanprov
+PL_dowarn # M added by devel/scanprov
+PL_perldb # M added by devel/scanprov
+PL_stack_base # M added by devel/scanprov
+PL_stack_sp # M added by devel/scanprov
+PL_stdingv # M added by devel/scanprov
+PL_sv_arenaroot # M added by devel/scanprov
+PL_tainted # M added by devel/scanprov
+PL_tainting # M added by devel/scanprov
+SAVE_DEFSV # M added by devel/scanprov
+find_script # F added by devel/scanprov
+magic_getnkeys # F added by devel/scanprov
+magic_getsubstr # F added by devel/scanprov
+magic_getvec # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005000
index d3ba84c5304..a9d989f6e7e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005000
@@ -1,37 +1,116 @@
5.005000
-PL_curpad # E
-PL_modglobal # E
cx_dump # U
debop # U
debprofdump # U
+DOUBLESIZE # E
fbm_compile # E (Perl_fbm_compile)
fbm_instr # E (Perl_fbm_instr)
get_op_descs # E
get_op_names # E
init_stacks # E
+mg_length # E
mg_size # E
newHVhv # E
new_stackinfo # E
+PL_curpad # E
+PL_modglobal # E
+PTRSIZE # E
regdump # U
regexec_flags # E
regnext # E (Perl_regnext)
runops_debug # E
runops_standard # E
save_iv # E (save_iv)
-save_op # U
sv_iv # E
sv_peek # U
sv_pvn # E
sv_true # E
sv_uv # E
-CPERLscope # added by devel/scanprov
-END_EXTERN_C # added by devel/scanprov
-EXTERN_C # added by devel/scanprov
-NOOP # added by devel/scanprov
-PL_DBsignal # added by devel/scanprov
-PL_Sv # added by devel/scanprov
-PL_hexdigit # added by devel/scanprov
-PL_hints # added by devel/scanprov
-PL_laststatval # added by devel/scanprov
-PL_statcache # added by devel/scanprov
-START_EXTERN_C # added by devel/scanprov
+CPERLscope # M added by devel/scanprov
+END_EXTERN_C # M added by devel/scanprov
+EXTERN_C # M added by devel/scanprov
+NOOP # M added by devel/scanprov
+PL_DBsignal # M added by devel/scanprov
+PL_DBtrace # M added by devel/scanprov
+PL_hexdigit # M added by devel/scanprov
+PL_hints # M added by devel/scanprov
+PL_laststatval # M added by devel/scanprov
+PL_mess_sv # M added by devel/scanprov
+PL_statcache # M added by devel/scanprov
+PL_Sv # M added by devel/scanprov
+PL_Xpv # M added by devel/scanprov
+START_EXTERN_C # M added by devel/scanprov
+add_data # F added by devel/scanprov
+ao # F added by devel/scanprov
+debprof # F added by devel/scanprov
+del_sv # F added by devel/scanprov
+div128 # F added by devel/scanprov
+docatch # F added by devel/scanprov
+doform # F added by devel/scanprov
+doparseform # F added by devel/scanprov
+dopoptolabel # F added by devel/scanprov
+dopoptoloop # F added by devel/scanprov
+dopoptosub_at # F added by devel/scanprov
+dumpuntil # F added by devel/scanprov
+filter_gets # F added by devel/scanprov
+find_beginning # F added by devel/scanprov
+forbid_setid # F added by devel/scanprov
+force_version # F added by devel/scanprov
+get_no_modify # F added by devel/scanprov
+get_opargs # F added by devel/scanprov
+hsplit # F added by devel/scanprov
+incline # F added by devel/scanprov
+incpush # F added by devel/scanprov
+init_debugger # F added by devel/scanprov
+init_ids # F added by devel/scanprov
+init_interp # F added by devel/scanprov
+init_main_stash # F added by devel/scanprov
+init_perllib # F added by devel/scanprov
+init_postdump_symbols # F added by devel/scanprov
+init_predump_symbols # F added by devel/scanprov
+intuit_method # F added by devel/scanprov
+isa_lookup # F added by devel/scanprov
+is_an_int # F added by devel/scanprov
+lop # F added by devel/scanprov
+magic_methpack # F added by devel/scanprov
+magic_sizepack # F added by devel/scanprov
+malloced_size # F added by devel/scanprov
+mess_alloc # F added by devel/scanprov
+missingterm # F added by devel/scanprov
+mul128 # F added by devel/scanprov
+my_exit_jump # F added by devel/scanprov
+new_he # F added by devel/scanprov
+new_logop # F added by devel/scanprov
+nextchar # F added by devel/scanprov
+not_a_number # F added by devel/scanprov
+nuke_stacks # F added by devel/scanprov
+open_script # F added by devel/scanprov
+pad_findlex # F added by devel/scanprov
+refto # F added by devel/scanprov
+reg # F added by devel/scanprov
+reganode # F added by devel/scanprov
+regatom # F added by devel/scanprov
+regbranch # F added by devel/scanprov
+regclass # F added by devel/scanprov
+regcppop # F added by devel/scanprov
+regcppush # F added by devel/scanprov
+reginclass # F added by devel/scanprov
+reginsert # F added by devel/scanprov
+regmatch # F added by devel/scanprov
+reg_node # F added by devel/scanprov
+regpiece # F added by devel/scanprov
+regrepeat # F added by devel/scanprov
+regtail # F added by devel/scanprov
+regtry # F added by devel/scanprov
+save_lines # F added by devel/scanprov
+save_scalar_at # F added by devel/scanprov
+scalarboolean # F added by devel/scanprov
+scan_commit # F added by devel/scanprov
+study_chunk # F added by devel/scanprov
+sublex_done # F added by devel/scanprov
+sublex_push # F added by devel/scanprov
+sublex_start # F added by devel/scanprov
+sv_unglob # F added by devel/scanprov
+tokeq # F added by devel/scanprov
+usage # F added by devel/scanprov
+visit # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005001
new file mode 100644
index 00000000000..9eb326efe7e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005001
@@ -0,0 +1 @@
+5.005001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005002
new file mode 100644
index 00000000000..35d08b22f88
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005002
@@ -0,0 +1 @@
+5.005002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005003
new file mode 100644
index 00000000000..354427dd4e6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005003
@@ -0,0 +1,5 @@
+5.005003
+get_vtbl # E
+POPpx # E
+save_generic_svref # E
+dofile # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005004
new file mode 100644
index 00000000000..a63720a4023
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5005004
@@ -0,0 +1,2 @@
+5.005004
+no_bareword_allowed # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000
index 34b750a8639..268579a25de 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006000
@@ -1,34 +1,6 @@
5.006000
-DO_UTF8 # U
-PERL_SYS_INIT3 # U
-POPn # E
-POPul # E
-PUSHn # E
-SvIOK_UV # U
-SvIOK_notUV # U
-SvIOK_only_UV # U
-SvNV # E
-SvNVX # E
-SvNV_set # E
-SvNVx # E
-SvPOK_only_UTF8 # U
-SvPV_nolen # U
-SvPVbyte # U
-SvPVbyte_nolen # U
-SvPVbytex # U
-SvPVbytex_force # U
-SvPVutf8 # U
-SvPVutf8_force # U
-SvPVutf8_nolen # U
-SvPVutf8x # U
-SvPVutf8x_force # U
-SvUTF8 # U
-SvUTF8_off # U
-SvUTF8_on # U
-UTF8SKIP # U
-XPUSHn # E
-XSRETURN_NV # E
-XST_mNV # E
+aTHX # E
+aTHX_ # E
av_delete # E
av_exists # E
call_argv # E (perl_call_argv)
@@ -40,6 +12,12 @@ cast_i32 # E (cast_i32)
cast_iv # E (cast_iv)
cast_ulong # E
cast_uv # E (cast_uv)
+ckWARN # E
+ckWARN2 # E
+ckWARN2_d # E
+ckWARN_d # E
+CPPLAST # E
+CPPRUN # E
croak # E (Perl_croak)
die # E (Perl_die)
do_gv_dump # E
@@ -50,6 +28,7 @@ do_op_dump # E
do_open9 # E
do_pmop_dump # E
do_sv_dump # E
+DO_UTF8 # E
dump_all # U
dump_eval # U
dump_form # U
@@ -67,80 +46,153 @@ get_hv # E (perl_get_hv)
get_ppaddr # E
get_sv # E (perl_get_sv)
gv_dump # E
-isASCII # U
-isCNTRL # U
-isGRAPH # U
-isPUNCT # U
-isXDIGIT # U
+I16SIZE # E
+I16TYPE # E
+I32SIZE # E
+I32TYPE # E
+I8SIZE # E
+I8TYPE # E
+INT2PTR # E
+isALNUMC # E
+isALNUMC_LC # E
+isASCII # E
+isCNTRL # E
+isCNTRL_LC # E
+isGRAPH # E
+isGRAPH_LC # E
+isPUNCT # E
+isPUNCT_LC # E
+is_utf8_char # U
+isXDIGIT # E
+IVdf # E
+IVSIZE # E
+IVTYPE # E
load_module # E
+LSEEKSIZE # E
magic_dump # E
mess # E (Perl_mess)
my_atof # E
my_fflush_all # E
newANONATTRSUB # E
-newATTRSUB # U
+newATTRSUB # E
newSVnv # E (Perl_newSVnv)
newSVpvf # E (Perl_newSVpvf)
newSVuv # E
newXS # E (Perl_newXS)
newXSproto # E
+NVTYPE # E
op_dump # E
+OPpEARLY_CV # E
+PERL_EXIT_EXPECTED # E
+PerlIO_printf # E
+PerlIO_stdoutf # E
+PERL_LOADMOD_DENY # E
+PERL_LOADMOD_IMPORT_OPS # E
+PERL_LOADMOD_NOIMPORT # E
perl_parse # E (perl_parse)
+PERL_REVISION # E
+PERL_SUBVERSION # E
+PERL_SYS_INIT3 # E
+PERL_VERSION # E
+PL_exit_flags # E
+PL_runops # E
pmop_dump # E
+POPn # E
+POPul # E
+pTHX # E
+PTR2IV # E
+PTR2NV # E
+PTR2UV # E
+PUSHn # E
pv_display # E
-re_intuit_string # E
reginitcolors # E
require_pv # E (perl_require_pv)
safesyscalloc # U
safesysfree # U
safesysmalloc # U
safesysrealloc # U
-save_I8 # E
save_alloc # E
save_destructor # E (Perl_save_destructor)
save_destructor_x # E
+save_I8 # E
save_re_context # E
save_vptr # E
scan_bin # E
scan_hex # E (Perl_scan_hex)
scan_oct # E (Perl_scan_oct)
set_context # U
-set_numeric_local # E (perl_set_numeric_local)
-set_numeric_radix # E
-set_numeric_standard # E (perl_set_numeric_standard)
+Strtol # E
+Strtoul # E
str_to_version # E
-sv_2pv_nolen # U
-sv_2pvbyte # E
+sv_2pvbyte # U
sv_2pvbyte_nolen # U
-sv_2pvutf8 # E
+sv_2pv_nolen # U
+sv_2pvutf8 # U
sv_2pvutf8_nolen # U
sv_catpvf # E (Perl_sv_catpvf)
sv_catpvf_mg # E (Perl_sv_catpvf_mg)
+SVf # E
sv_force_normal # U
+SVf_UTF8 # E
+SvIOK_notUV # E
+SvIOK_only_UV # E
+SvIOK_UV # E
sv_len_utf8 # E
sv_nv # E (Perl_sv_nv)
+SvNV # E
+SvNV_set # E
+SvNVX # E
+SvNVx # E
+SvPOK_only_UTF8 # E
sv_pos_b2u # E
sv_pos_u2b # E
sv_pv # U
sv_pvbyte # U
+SvPVbyte # E
sv_pvbyten # E
sv_pvbyten_force # E
+SvPVbyte_nolen # E
+SvPVbytex # E
+SvPVbytex_force # E
+SvPV_nolen # E
sv_pvutf8 # U
+SvPVutf8 # E
+SvPVutf8_force # E
sv_pvutf8n # E
sv_pvutf8n_force # E
+SvPVutf8_nolen # E
+SvPVutf8x # E
+SvPVutf8x_force # E
sv_rvweaken # E
sv_setnv # E (Perl_sv_setnv)
sv_setnv_mg # E (Perl_sv_setnv_mg)
sv_setpvf # E (Perl_sv_setpvf)
sv_setpvf_mg # E (Perl_sv_setpvf_mg)
sv_setref_nv # E (Perl_sv_setref_nv)
+SvUTF8 # E
+sv_utf8_decode # E
+sv_utf8_downgrade # U
sv_utf8_encode # E
+SvUTF8_off # E
+SvUTF8_on # E
sv_vcatpvf # E
sv_vcatpvf_mg # E
sv_vsetpvf # E
sv_vsetpvf_mg # E
+U16SIZE # E
+U16TYPE # E
+U32SIZE # E
+U32TYPE # E
+U8SIZE # E
+U8TYPE # E
utf8_distance # E
utf8_hop # U
+UTF8SKIP # E
+UVof # E
+UVSIZE # E
+UVTYPE # E
+UVuf # E
+UVxf # E
vcroak # E
vform # E
vload_module # E
@@ -149,93 +201,136 @@ vnewSVpvf # E
vwarn # E
vwarner # E
warn # E (Perl_warn)
+WARN_ALL # E
+WARN_AMBIGUOUS # E
+WARN_BAREWORD # E
+WARN_CLOSED # E
+WARN_CLOSURE # E
+WARN_DEBUGGING # E
+WARN_DEPRECATED # E
+WARN_DIGIT # E
warner # E
-CopFILE # added by devel/scanprov
-CopFILEAV # added by devel/scanprov
-CopFILEGV # added by devel/scanprov
-CopFILEGV_set # added by devel/scanprov
-CopFILESV # added by devel/scanprov
-CopFILE_set # added by devel/scanprov
-CopSTASH # added by devel/scanprov
-CopSTASHPV # added by devel/scanprov
-CopSTASHPV_set # added by devel/scanprov
-CopSTASH_eq # added by devel/scanprov
-CopSTASH_set # added by devel/scanprov
-INT2PTR # added by devel/scanprov
-IVSIZE # added by devel/scanprov
-IVTYPE # added by devel/scanprov
-IVdf # added by devel/scanprov
-NUM2PTR # added by devel/scanprov
-NVTYPE # added by devel/scanprov
-PERL_REVISION # added by devel/scanprov
-PERL_SUBVERSION # added by devel/scanprov
-PERL_VERSION # added by devel/scanprov
-PL_no_modify # added by devel/scanprov
-PL_ppaddr # added by devel/scanprov
-PTR2IV # added by devel/scanprov
-PTR2NV # added by devel/scanprov
-PTR2UV # added by devel/scanprov
-PTRV # added by devel/scanprov
-SVf # added by devel/scanprov
-SVf_UTF8 # added by devel/scanprov
-UVSIZE # added by devel/scanprov
-UVTYPE # added by devel/scanprov
-UVof # added by devel/scanprov
-UVuf # added by devel/scanprov
-UVxf # added by devel/scanprov
-WARN_ALL # added by devel/scanprov
-WARN_AMBIGUOUS # added by devel/scanprov
-WARN_BAREWORD # added by devel/scanprov
-WARN_CLOSED # added by devel/scanprov
-WARN_CLOSURE # added by devel/scanprov
-WARN_DEBUGGING # added by devel/scanprov
-WARN_DEPRECATED # added by devel/scanprov
-WARN_DIGIT # added by devel/scanprov
-WARN_EXEC # added by devel/scanprov
-WARN_EXITING # added by devel/scanprov
-WARN_GLOB # added by devel/scanprov
-WARN_INPLACE # added by devel/scanprov
-WARN_INTERNAL # added by devel/scanprov
-WARN_IO # added by devel/scanprov
-WARN_MALLOC # added by devel/scanprov
-WARN_MISC # added by devel/scanprov
-WARN_NEWLINE # added by devel/scanprov
-WARN_NUMERIC # added by devel/scanprov
-WARN_ONCE # added by devel/scanprov
-WARN_OVERFLOW # added by devel/scanprov
-WARN_PACK # added by devel/scanprov
-WARN_PARENTHESIS # added by devel/scanprov
-WARN_PIPE # added by devel/scanprov
-WARN_PORTABLE # added by devel/scanprov
-WARN_PRECEDENCE # added by devel/scanprov
-WARN_PRINTF # added by devel/scanprov
-WARN_PROTOTYPE # added by devel/scanprov
-WARN_QW # added by devel/scanprov
-WARN_RECURSION # added by devel/scanprov
-WARN_REDEFINE # added by devel/scanprov
-WARN_REGEXP # added by devel/scanprov
-WARN_RESERVED # added by devel/scanprov
-WARN_SEMICOLON # added by devel/scanprov
-WARN_SEVERE # added by devel/scanprov
-WARN_SIGNAL # added by devel/scanprov
-WARN_SUBSTR # added by devel/scanprov
-WARN_SYNTAX # added by devel/scanprov
-WARN_TAINT # added by devel/scanprov
-WARN_UNINITIALIZED # added by devel/scanprov
-WARN_UNOPENED # added by devel/scanprov
-WARN_UNPACK # added by devel/scanprov
-WARN_UNTIE # added by devel/scanprov
-WARN_UTF8 # added by devel/scanprov
-WARN_VOID # added by devel/scanprov
-XSprePUSH # added by devel/scanprov
-aTHX # added by devel/scanprov
-aTHX_ # added by devel/scanprov
-ckWARN # added by devel/scanprov
-dNOOP # added by devel/scanprov
-dTHX # added by devel/scanprov
-dTHXa # added by devel/scanprov
-dTHXoa # added by devel/scanprov
-dXSTARG # added by devel/scanprov
-isALNUMC # added by devel/scanprov
-pTHX # added by devel/scanprov
-pTHX_ # added by devel/scanprov
+WARN_EXEC # E
+WARN_EXITING # E
+WARN_GLOB # E
+WARN_INPLACE # E
+WARN_INTERNAL # E
+WARN_IO # E
+WARN_MALLOC # E
+WARN_MISC # E
+WARN_NEWLINE # E
+WARN_NUMERIC # E
+WARN_ONCE # E
+WARN_OVERFLOW # E
+WARN_PACK # E
+WARN_PARENTHESIS # E
+WARN_PIPE # E
+WARN_PORTABLE # E
+WARN_PRECEDENCE # E
+WARN_PRINTF # E
+WARN_PROTOTYPE # E
+WARN_QW # E
+WARN_RECURSION # E
+WARN_REDEFINE # E
+WARN_REGEXP # E
+WARN_RESERVED # E
+WARN_SEMICOLON # E
+WARN_SEVERE # E
+WARN_SIGNAL # E
+WARN_SUBSTR # E
+WARN_SYNTAX # E
+WARN_TAINT # E
+WARN_UNINITIALIZED # E
+WARN_UNOPENED # E
+WARN_UNPACK # E
+WARN_UNTIE # E
+WARN_UTF8 # E
+WARN_VOID # E
+XPUSHn # E
+XSRETURN_NV # E
+XST_mNV # E
+CopFILE # M added by devel/scanprov
+CopFILEAV # M added by devel/scanprov
+CopFILEGV # M added by devel/scanprov
+CopFILEGV_set # M added by devel/scanprov
+CopFILE_set # M added by devel/scanprov
+CopFILESV # M added by devel/scanprov
+CopSTASH # M added by devel/scanprov
+CopSTASH_eq # M added by devel/scanprov
+CopSTASHPV # M added by devel/scanprov
+CopSTASHPV_set # M added by devel/scanprov
+CopSTASH_set # M added by devel/scanprov
+croak_nocontext # M added by devel/scanprov
+dNOOP # M added by devel/scanprov
+dTHXa # M added by devel/scanprov
+dTHXoa # M added by devel/scanprov
+dXSTARG # M added by devel/scanprov
+mess_nocontext # M added by devel/scanprov
+NUM2PTR # M added by devel/scanprov
+PL_no_modify # M added by devel/scanprov
+PL_ppaddr # M added by devel/scanprov
+pTHX_ # M added by devel/scanprov
+PTRV # M added by devel/scanprov
+sv_catpvf_mg_nocontext # M added by devel/scanprov
+sv_setpvf_mg_nocontext # M added by devel/scanprov
+warn_nocontext # M added by devel/scanprov
+XSprePUSH # M added by devel/scanprov
+any_dup # F added by devel/scanprov
+apply_attrs # F added by devel/scanprov
+cop_free # F added by devel/scanprov
+cr_textfilter # F added by devel/scanprov
+cv_dump # F added by devel/scanprov
+die_nocontext # F added by devel/scanprov
+do_aexec5 # F added by devel/scanprov
+do_exec3 # F added by devel/scanprov
+do_oddball # F added by devel/scanprov
+dooneliner # F added by devel/scanprov
+do_vecget # F added by devel/scanprov
+dup_attrlist # F added by devel/scanprov
+find_byclass # F added by devel/scanprov
+form_nocontext # F added by devel/scanprov
+fprintf_nocontext # F added by devel/scanprov
+getenv_len # F added by devel/scanprov
+get_mstats # F added by devel/scanprov
+GetVars # F added by devel/scanprov
+hv_magic_check # F added by devel/scanprov
+init_i18nl10n # F added by devel/scanprov
+init_i18nl14n # F added by devel/scanprov
+is_handle_constructor # F added by devel/scanprov
+load_module_nocontext # F added by devel/scanprov
+magic_killbackrefs # F added by devel/scanprov
+magic_regdata_cnt # F added by devel/scanprov
+magic_regdatum_get # F added by devel/scanprov
+mode_from_discipline # F added by devel/scanprov
+my_attrs # F added by devel/scanprov
+my_kid # F added by devel/scanprov
+new_collate # F added by devel/scanprov
+new_ctype # F added by devel/scanprov
+new_numeric # F added by devel/scanprov
+newPADOP # F added by devel/scanprov
+newSVpvf_nocontext # F added by devel/scanprov
+op_clear # F added by devel/scanprov
+parse_body # F added by devel/scanprov
+perl_alloc_using # F added by devel/scanprov
+perl_clone # F added by devel/scanprov
+perl_clone_using # F added by devel/scanprov
+qerror # F added by devel/scanprov
+re_intuit_start # F added by devel/scanprov
+re_intuit_string # F added by devel/scanprov
+report_uninit # F added by devel/scanprov
+run_body # F added by devel/scanprov
+scalar_mod_type # F added by devel/scanprov
+set_numeric_radix # F added by devel/scanprov
+set_numeric_standard # F added by devel/scanprov
+simplify_sort # F added by devel/scanprov
+Slab_Alloc # F added by devel/scanprov
+sv_catpvf_nocontext # F added by devel/scanprov
+sv_del_backref # F added by devel/scanprov
+sv_setpvf_nocontext # F added by devel/scanprov
+sys_intern_dup # F added by devel/scanprov
+to_uni_lower # F added by devel/scanprov
+to_uni_title # F added by devel/scanprov
+to_uni_upper # F added by devel/scanprov
+utf16_to_utf8 # F added by devel/scanprov
+utf16_to_utf8_reversed # F added by devel/scanprov
+warner_nocontext # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006001
index 7eab86a55bd..6205d50e02c 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5006001
@@ -1,14 +1,27 @@
5.006001
-SvGAMAGIC # U
+apply_attrs_string # U
+bytes_to_utf8 # U
+G_METHOD # E
gv_efullname4 # U
gv_fullname4 # U
isBLANK # U
+isBLANK_LC # U
isPSXSPC # U
+isPSXSPC_LC # U
is_utf8_string # U
+NVef # E
+NVff # E
+NVgf # E
+NVSIZE # E
save_generic_pvref # U
-utf16_to_utf8 # E (Perl_utf16_to_utf8)
-utf16_to_utf8_reversed # E (Perl_utf16_to_utf8_reversed)
-G_METHOD # added by devel/scanprov
-NVef # added by devel/scanprov
-NVff # added by devel/scanprov
-NVgf # added by devel/scanprov
+SvGAMAGIC # U
+utf8_to_bytes # U
+do_trans_complex # F added by devel/scanprov
+do_trans_count # F added by devel/scanprov
+do_trans_simple # F added by devel/scanprov
+find_in_my_stash # F added by devel/scanprov
+magic_regdatum_set # F added by devel/scanprov
+report_evil_fh # F added by devel/scanprov
+swallow_bom # F added by devel/scanprov
+sys_intern_clear # F added by devel/scanprov
+sys_intern_init # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007001
index 716a9099b79..14a9a2763fe 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007001
@@ -1,23 +1,53 @@
5.007001
-POPpbytex # E
-SvUOK # U
+bytes_from_utf8 # U
despatch_signals # U
do_openn # U
gv_handler # U
+isALNUM_LC_uvchr # U
+isALPHA_LC_uvchr # U
+isCNTRL_LC_uvchr # U
+isDIGIT_LC_uvchr # U
+isGRAPH_LC_uvchr # U
+isIDFIRST_LC_uvchr # U
+isLOWER_LC_uvchr # U
is_lvalue_sub # U
+isPRINT_LC_uvchr # U
+isPUNCT_LC_uvchr # U
+isSPACE_LC_uvchr # U
+isUPPER_LC_uvchr # U
my_popen_list # U
+NATIVE_TO_UNI # U
newSVpvn_share # U
+PerlIO_apply_layers # U
+PerlIO_binmode # U
+PerlIO_debug # U
+POPpbytex # E
+printf_nocontext # U
save_mortalizesv # U
-scan_num # E (Perl_scan_num)
+scan_num # A
sv_force_normal_flags # U
+SV_IMMEDIATE_UNREF # E
sv_setref_uv # U
sv_unref_flags # U
+SvUOK # U
sv_utf8_upgrade # E (Perl_sv_utf8_upgrade)
+UNICODE_REPLACEMENT # E
+UNI_TO_NATIVE # U
+UTF8_CHECK_ONLY # E
+UTF8_IS_INVARIANT # U
utf8_length # U
utf8n_to_uvchr # U
-utf8n_to_uvuni # U
+utf8_to_uvchr # U
uvchr_to_utf8 # U
-uvuni_to_utf8 # U
-PTR2ul # added by devel/scanprov
-SV_IMMEDIATE_UNREF # added by devel/scanprov
-UVXf # added by devel/scanprov
+UVXf # E
+PTR2ul # M added by devel/scanprov
+expect_number # F added by devel/scanprov
+magic_freeovrld # F added by devel/scanprov
+Perl_start_glob # F added by devel/scanprov
+reghop3 # F added by devel/scanprov
+reghopmaybe3 # F added by devel/scanprov
+stdize_locale # F added by devel/scanprov
+sv_2iuv_non_preserve # F added by devel/scanprov
+tokereport # F added by devel/scanprov
+utf8n_to_uvuni # F added by devel/scanprov
+utf8_to_uvuni # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007002
index 40792a32c05..fafecdff3f6 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007002
@@ -1,71 +1,77 @@
5.007002
-SvPV_force_nomg # U
-SvPV_nomg # U
+atfork_lock # U
+atfork_unlock # U
calloc # U
dAX # E
dITEMS # E
getcwd_sv # U
grok_number # U
+GROK_NUMERIC_RADIX # U
grok_numeric_radix # U
init_tm # U
+IN_LOCALE # E
+IN_LOCALE_COMPILETIME # E
+IN_LOCALE_RUNTIME # E
+IS_NUMBER_GREATER_THAN_UV_MAX # E
+IS_NUMBER_INFINITY # E
+IS_NUMBER_IN_UV # E
+IS_NUMBER_NEG # E
+IS_NUMBER_NOT_INT # E
malloc # U
mfree # U
mini_mktime # U
-my_atof2 # U
my_strftime # U
op_null # U
+OSVERS # E
+PERL_MAGIC_arylen # E
+PERL_MAGIC_backref # E
+PERL_MAGIC_bm # E
+PERL_MAGIC_collxfrm # E
+PERL_MAGIC_dbfile # E
+PERL_MAGIC_dbline # E
+PERL_MAGIC_defelem # E
+PERL_MAGIC_env # E
+PERL_MAGIC_envelem # E
+PERL_MAGIC_ext # E
+PERL_MAGIC_fm # E
+PERL_MAGIC_isa # E
+PERL_MAGIC_isaelem # E
+PERL_MAGIC_nkeys # E
+PERL_MAGIC_overload_table # E
+PERL_MAGIC_pos # E
+PERL_MAGIC_qr # E
+PERL_MAGIC_regdata # E
+PERL_MAGIC_regdatum # E
+PERL_MAGIC_regex_global # E
+PERL_MAGIC_sig # E
+PERL_MAGIC_sigelem # E
+PERL_MAGIC_substr # E
+PERL_MAGIC_sv # E
+PERL_MAGIC_taint # E
+PERL_MAGIC_tied # E
+PERL_MAGIC_tiedelem # E
+PERL_MAGIC_tiedscalar # E
+PERL_MAGIC_uvar # E
+PERL_MAGIC_vec # E
realloc # U
sv_2pv_flags # U
sv_catpvn_flags # U
sv_catpvn_nomg # U
sv_catsv_flags # U
sv_catsv_nomg # U
+SV_GMAGIC # E
+SvPV_force_nomg # U
sv_pvn_force_flags # U
+SvPV_nomg # U
sv_setsv_flags # U
sv_setsv_nomg # U
sv_utf8_upgrade_flags # U
sv_utf8_upgrade_nomg # U
-GROK_NUMERIC_RADIX # added by devel/scanprov
-IN_LOCALE # added by devel/scanprov
-IN_LOCALE_COMPILETIME # added by devel/scanprov
-IN_LOCALE_RUNTIME # added by devel/scanprov
-IS_NUMBER_GREATER_THAN_UV_MAX # added by devel/scanprov
-IS_NUMBER_INFINITY # added by devel/scanprov
-IS_NUMBER_IN_UV # added by devel/scanprov
-IS_NUMBER_NEG # added by devel/scanprov
-IS_NUMBER_NOT_INT # added by devel/scanprov
-PERL_MAGIC_arylen # added by devel/scanprov
-PERL_MAGIC_backref # added by devel/scanprov
-PERL_MAGIC_bm # added by devel/scanprov
-PERL_MAGIC_collxfrm # added by devel/scanprov
-PERL_MAGIC_dbfile # added by devel/scanprov
-PERL_MAGIC_dbline # added by devel/scanprov
-PERL_MAGIC_defelem # added by devel/scanprov
-PERL_MAGIC_env # added by devel/scanprov
-PERL_MAGIC_envelem # added by devel/scanprov
-PERL_MAGIC_ext # added by devel/scanprov
-PERL_MAGIC_fm # added by devel/scanprov
-PERL_MAGIC_isa # added by devel/scanprov
-PERL_MAGIC_isaelem # added by devel/scanprov
-PERL_MAGIC_nkeys # added by devel/scanprov
-PERL_MAGIC_overload_table # added by devel/scanprov
-PERL_MAGIC_pos # added by devel/scanprov
-PERL_MAGIC_qr # added by devel/scanprov
-PERL_MAGIC_regdata # added by devel/scanprov
-PERL_MAGIC_regdatum # added by devel/scanprov
-PERL_MAGIC_regex_global # added by devel/scanprov
-PERL_MAGIC_sig # added by devel/scanprov
-PERL_MAGIC_sigelem # added by devel/scanprov
-PERL_MAGIC_substr # added by devel/scanprov
-PERL_MAGIC_sv # added by devel/scanprov
-PERL_MAGIC_taint # added by devel/scanprov
-PERL_MAGIC_tied # added by devel/scanprov
-PERL_MAGIC_tiedelem # added by devel/scanprov
-PERL_MAGIC_tiedscalar # added by devel/scanprov
-PERL_MAGIC_uvar # added by devel/scanprov
-PERL_MAGIC_vec # added by devel/scanprov
-PERL_UNUSED_DECL # added by devel/scanprov
-PERL_UNUSED_VAR # added by devel/scanprov
-SV_GMAGIC # added by devel/scanprov
-SvPV_flags # added by devel/scanprov
-SvPV_force_flags # added by devel/scanprov
+PERL_UNUSED_DECL # M added by devel/scanprov
+PERL_UNUSED_VAR # M added by devel/scanprov
+SvPV_flags # M added by devel/scanprov
+SvPV_force_flags # M added by devel/scanprov
+boot_core_PerlIO # F added by devel/scanprov
+closest_cop # F added by devel/scanprov
+deb_curcv # F added by devel/scanprov
+Perl_my_atof2 # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007003
index fc0a15d3496..6360b28a088 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5007003
@@ -1,7 +1,31 @@
5.007003
+ckWARN3 # U
+ckWARN3_d # U
+ckWARN4 # U
+ckWARN4_d # U
+custom_op_desc # U
+custom_op_name # U
+cx_dup # E (Perl_cx_dup)
+deb # U
+deb_nocontext # U
+debstack # U
+debstackptrs # U
+fp_dup # A
+gp_dup # E (Perl_gp_dup)
+grok_bin # U
+grok_hex # U
+grok_oct # U
+gv_fetchmeth_autoload # U
+he_dup # E (Perl_he_dup)
+ibcmp_utf8 # U
+IS_NUMBER_NAN # E
+mg_dup # E (Perl_mg_dup)
+my_fork # U
+my_socketpair # U
OP_DESC # U
OP_NAME # U
-PL_peepp # E
+perl_destruct # E (perl_destruct)
+PERL_EXIT_DESTRUCT_END # E
PerlIO_clearerr # U (PerlIO_clearerr)
PerlIO_close # U (PerlIO_close)
PerlIO_eof # U (PerlIO_eof)
@@ -16,63 +40,51 @@ PerlIO_get_ptr # U (PerlIO_get_ptr)
PerlIO_read # U (PerlIO_read)
PerlIO_seek # U (PerlIO_seek)
PerlIO_set_cnt # U (PerlIO_set_cnt)
-PerlIO_set_ptrcnt # U (PerlIO_set_ptrcnt)
PerlIO_setlinebuf # U (PerlIO_setlinebuf)
+PerlIO_set_ptrcnt # U (PerlIO_set_ptrcnt)
PerlIO_stderr # U (PerlIO_stderr)
PerlIO_stdin # U (PerlIO_stdin)
PerlIO_stdout # U (PerlIO_stdout)
PerlIO_tell # U (PerlIO_tell)
PerlIO_unread # U (PerlIO_unread)
PerlIO_write # U (PerlIO_write)
-SvLOCK # U
-SvSHARE # U
-SvUNLOCK # U
-atfork_lock # U
-atfork_unlock # U
-custom_op_desc # U
-custom_op_name # U
-deb # U
-debstack # U
-debstackptrs # U
-grok_bin # U
-grok_hex # U
-grok_oct # U
-gv_fetchmeth_autoload # U
-ibcmp_utf8 # U
-my_fork # U
-my_socketpair # U
-pack_cat # U
-perl_destruct # E (perl_destruct)
+PERL_MAGIC_shared # E
+PERL_MAGIC_shared_scalar # E
+PERL_MAGIC_uvar_elem # E
+PERL_SCAN_ALLOW_UNDERSCORES # E
+PERL_SCAN_DISALLOW_PREFIX # E
+PERL_SCAN_GREATER_THAN_UV_MAX # E
+PL_peepp # E
pv_uni_display # U
-save_shared_pvref # U
+rvpv_dup # E
savesharedpv # U
+save_shared_pvref # U
+si_dup # E (Perl_si_dup)
sortsv # U
+ss_dup # E (Perl_ss_dup)
+sv_copypv # U
+sv_dup # E (Perl_sv_dup)
+SvLOCK # U
sv_magicext # U
sv_nolocking # U
sv_nosharing # U
+sv_nounlocking # U
sv_pvn_nomg # U
sv_recode_to_utf8 # U
+SvSHARE # U
sv_uni_display # U
+SvUNLOCK # U
unpack_str # U
uvchr_to_utf8_flags # U
-uvuni_to_utf8_flags # U
vdeb # U
-IS_NUMBER_NAN # added by devel/scanprov
-MY_CXT # added by devel/scanprov
-MY_CXT_INIT # added by devel/scanprov
-PERL_MAGIC_shared # added by devel/scanprov
-PERL_MAGIC_shared_scalar # added by devel/scanprov
-PERL_MAGIC_uvar_elem # added by devel/scanprov
-PERL_SCAN_ALLOW_UNDERSCORES # added by devel/scanprov
-PERL_SCAN_DISALLOW_PREFIX # added by devel/scanprov
-PERL_SCAN_GREATER_THAN_UV_MAX # added by devel/scanprov
-START_MY_CXT # added by devel/scanprov
-_aMY_CXT # added by devel/scanprov
-_pMY_CXT # added by devel/scanprov
-aMY_CXT # added by devel/scanprov
-aMY_CXT_ # added by devel/scanprov
-dMY_CXT # added by devel/scanprov
-dMY_CXT_SV # added by devel/scanprov
-pMY_CXT # added by devel/scanprov
-pMY_CXT_ # added by devel/scanprov
-packWARN # added by devel/scanprov
+dMY_CXT_SV # M added by devel/scanprov
+packWARN # M added by devel/scanprov
+_pMY_CXT # M added by devel/scanprov
+pMY_CXT_ # M added by devel/scanprov
+apply_attrs_my # F added by devel/scanprov
+group_end # F added by devel/scanprov
+init_argv_symbols # F added by devel/scanprov
+measure_struct # F added by devel/scanprov
+next_symbol # F added by devel/scanprov
+Slab_Free # F added by devel/scanprov
+uvuni_to_utf8_flags # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008000
index e5a6dfc6161..53b76869c14 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008000
@@ -1,5 +1,17 @@
5.008000
-Poison # E
+hv_iternext_flags # U
+HV_ITERNEXT_WANTPLACEHOLDERS # E
+hv_store_flags # U
nothreadhook # U
-WARN_LAYER # added by devel/scanprov
-WARN_THREADS # added by devel/scanprov
+Poison # E
+WARN_LAYER # E
+WARN_THREADS # E
+do_aspawn # F added by devel/scanprov
+do_spawn # F added by devel/scanprov
+do_spawn_nowait # F added by devel/scanprov
+hv_notallowed # F added by devel/scanprov
+save_hek_flags # F added by devel/scanprov
+share_hek_flags # F added by devel/scanprov
+to_byte_substr # F added by devel/scanprov
+to_utf8_substr # F added by devel/scanprov
+unshare_hek_or_pvn # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008001
index 97039b5aa85..6dfa718ab2e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008001
@@ -1,30 +1,50 @@
5.008001
+C_ARRAY_LENGTH # U
CvPADLIST # E
-PL_comppad # E
-SvVOK # U
-XSRETURN_UV # U
doing_taint # U
find_runcv # U
is_utf8_string_loc # U
packlist # U
pad_add_anon # U
pad_new # E
+pad_setsv # U
+pad_tidy # E
+PERL_ABS # U
+PERL_MAGIC_utf8 # E
+PERL_MAGIC_vstring # E
+PERL_SCAN_SILENT_ILLDIGIT # E
+PL_comppad # E
save_bool # U
savestack_grow_cnt # U
seed # U
sv_cat_decode # U
+SV_COW_DROP_PV # E
sv_setpviv # U
sv_setpviv_mg # U
+SvVOK # U
unpackstring # U
-C_ARRAY_LENGTH # added by devel/scanprov
-IN_PERL_COMPILETIME # added by devel/scanprov
-PERL_ABS # added by devel/scanprov
-PERL_GCC_BRACE_GROUPS_FORBIDDEN # added by devel/scanprov
-PERL_MAGIC_utf8 # added by devel/scanprov
-PERL_MAGIC_vstring # added by devel/scanprov
-PERL_SCAN_SILENT_ILLDIGIT # added by devel/scanprov
-PERL_SIGNALS_UNSAFE_FLAG # added by devel/scanprov
-PL_signals # added by devel/scanprov
-SV_COW_DROP_PV # added by devel/scanprov
-SV_UTF8_NO_ENCODING # added by devel/scanprov
-XST_mUV # added by devel/scanprov
+XSRETURN_UV # U
+XST_mUV # U
+IN_PERL_COMPILETIME # M added by devel/scanprov
+PERL_SIGNALS_UNSAFE_FLAG # M added by devel/scanprov
+PL_signals # M added by devel/scanprov
+SV_UTF8_NO_ENCODING # M added by devel/scanprov
+allocmy # F added by devel/scanprov
+deb_stack_all # F added by devel/scanprov
+deb_stack_n # F added by devel/scanprov
+do_dump_pad # F added by devel/scanprov
+doopen_pm # F added by devel/scanprov
+free_tied_hv_pool # F added by devel/scanprov
+get_debug_opts # F added by devel/scanprov
+get_hash_seed # F added by devel/scanprov
+get_num # F added by devel/scanprov
+magic_setregexp # F added by devel/scanprov
+magic_setutf8 # F added by devel/scanprov
+pack_rec # F added by devel/scanprov
+pad_block_start # F added by devel/scanprov
+pad_check_dup # F added by devel/scanprov
+pad_fixup_inner_anons # F added by devel/scanprov
+pad_push # F added by devel/scanprov
+parse_unicode_opts # F added by devel/scanprov
+unpack_rec # F added by devel/scanprov
+write_to_stderr # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008009
index 129e018f45f..65bf569c152 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5008009
@@ -1 +1,2 @@
5.008009
+hv_assert # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009000
index 28bc85958ec..e33d67e48d5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009000
@@ -1,6 +1,20 @@
5.009000
+_aMY_CXT # E
+aMY_CXT # E
+aMY_CXT_ # E
+dMY_CXT # E
+hek_dup # U
+MY_CXT # E
+MY_CXT_INIT # E
+my_cxt_init # U
new_version # U
+parser_dup # E
+pMY_CXT # E
+regdupe_internal # U
save_set_svflags # U
+SVs_PADSTALE # E
vcmp # U
vnumify # U
vstringify # U
+Perl_sv_free2 # F added by devel/scanprov
+sv_setsv_cow # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009001
index 0666184e1df..90ab5a1efa5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009001
@@ -1,8 +1,11 @@
5.009001
-SvIV_nomg # U
-SvUV_nomg # U
hv_clear_placeholders # U
hv_scalar # U
scan_version # E (Perl_scan_version)
sv_2iv_flags # U
sv_2uv_flags # U
+SvIV_nomg # U
+SvUV_nomg # U
+hv_delete_common # F added by devel/scanprov
+magic_scalarpack # F added by devel/scanprov
+num_overflow # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009002
index 86fee4d7351..2409a8a20da 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009002
@@ -1,19 +1,11 @@
5.009002
CopyD # E
-MoveD # E
-PUSHmortal # E
-SvPVbyte_force # U
-UNDERBAR # E
-XCPT_CATCH # E
-XCPT_RETHROW # E
-XCPT_TRY_END # E
-XCPT_TRY_START # E
-XPUSHmortal # E
-ZeroD # E
dUNDERBAR # E
dXCPT # E
+find_rundefsvoffset # U
gv_fetchpvn_flags # U
gv_fetchsv # U
+MoveD # E
mPUSHi # U
mPUSHn # U
mPUSHp # U
@@ -22,10 +14,22 @@ mXPUSHi # U
mXPUSHn # U
mXPUSHp # U
mXPUSHu # U
+MY_CXT_CLONE # E
op_refcnt_lock # U
op_refcnt_unlock # U
+PUSHmortal # E
savesvpv # U
+SV_NOSTEAL # E
+SvPVbyte_force # U
+UNDERBAR # E
+UTF8_MAXBYTES # E
+UTF8_MAXBYTES_CASE # E
vnormal # U
-MY_CXT_CLONE # added by devel/scanprov
-SV_NOSTEAL # added by devel/scanprov
-UTF8_MAXBYTES # added by devel/scanprov
+XCPT_CATCH # E
+XCPT_RETHROW # E
+XCPT_TRY_END # E
+XCPT_TRY_START # E
+XPUSHmortal # E
+ZeroD # E
+find_uninit_var # F added by devel/scanprov
+make_trie # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009003
index 8b69a99fdd9..69b81a2ffbb 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009003
@@ -1,20 +1,14 @@
5.009003
-Newx # E
-Newxc # E
-Newxz # E
-PL_check # E
-SvMAGIC_set # U
-SvRV_set # U
-SvSTASH_set # U
-SvUV_set # U
av_arylen_p # U
ckwarn # U
ckwarn_d # U
-csighandler # E (Perl_csighandler)
dAXMARK # E
dMULTICALL # E
doref # U
+dVAR # E
gv_const_sv # U
+GV_NOADD_NOINIT # E
+GV_NOEXPAND # E
gv_stashpvs # U
hv_eiter_p # U
hv_eiter_set # U
@@ -25,42 +19,88 @@ hv_placeholders_set # U
hv_riter_p # U
hv_riter_set # U
is_utf8_string_loclen # U
+MULTICALL # E
my_sprintf # U
newGIVENOP # U
newSVhek # U
newSVpvs # U
newSVpvs_share # U
-newWHENOP # U
-pad_compname_type # U
+Newx # E
+Newxc # E
+Newxz # E
+PERL_MAGIC_arylen_p # E
+PERL_MAGIC_rhash # E
+PERL_MAGIC_symtab # E
+PL_check # E
+POP_MULTICALL # E
savepvs # U
sortsv_flags # U
sv_catpvs # U
+SvMAGIC_set # U
+SvRV_set # U
+SV_SMAGIC # E
+SvSTASH_set # U
+SvUV_set # U
vverify # U
-HvNAMELEN_get # added by devel/scanprov
-HvNAME_get # added by devel/scanprov
-PERLIO_FUNCS_CAST # added by devel/scanprov
-PERLIO_FUNCS_DECL # added by devel/scanprov
-PERL_UNUSED_ARG # added by devel/scanprov
-PTR2nat # added by devel/scanprov
-STR_WITH_LEN # added by devel/scanprov
-SV_CONST_RETURN # added by devel/scanprov
-SV_MUTABLE_RETURN # added by devel/scanprov
-SV_SMAGIC # added by devel/scanprov
-SvPVX_const # added by devel/scanprov
-SvPVX_mutable # added by devel/scanprov
-SvPV_const # added by devel/scanprov
-SvPV_flags_const # added by devel/scanprov
-SvPV_flags_const_nolen # added by devel/scanprov
-SvPV_flags_mutable # added by devel/scanprov
-SvPV_force_flags_mutable # added by devel/scanprov
-SvPV_force_flags_nolen # added by devel/scanprov
-SvPV_force_mutable # added by devel/scanprov
-SvPV_force_nolen # added by devel/scanprov
-SvPV_force_nomg_nolen # added by devel/scanprov
-SvPV_mutable # added by devel/scanprov
-SvPV_nolen_const # added by devel/scanprov
-SvPV_nomg_const # added by devel/scanprov
-SvPV_nomg_const_nolen # added by devel/scanprov
-SvPV_renew # added by devel/scanprov
-SvSHARED_HASH # added by devel/scanprov
-dVAR # added by devel/scanprov
+GvSVn # M added by devel/scanprov
+HvNAME_get # M added by devel/scanprov
+HvNAMELEN_get # M added by devel/scanprov
+PERLIO_FUNCS_CAST # M added by devel/scanprov
+PERLIO_FUNCS_DECL # M added by devel/scanprov
+PERL_UNUSED_ARG # M added by devel/scanprov
+PTR2nat # M added by devel/scanprov
+STR_WITH_LEN # M added by devel/scanprov
+SV_CONST_RETURN # M added by devel/scanprov
+SV_MUTABLE_RETURN # M added by devel/scanprov
+SvPV_const # M added by devel/scanprov
+SvPV_flags_const # M added by devel/scanprov
+SvPV_flags_const_nolen # M added by devel/scanprov
+SvPV_flags_mutable # M added by devel/scanprov
+SvPV_force_flags_mutable # M added by devel/scanprov
+SvPV_force_flags_nolen # M added by devel/scanprov
+SvPV_force_mutable # M added by devel/scanprov
+SvPV_force_nolen # M added by devel/scanprov
+SvPV_force_nomg_nolen # M added by devel/scanprov
+SvPV_mutable # M added by devel/scanprov
+SvPV_nolen_const # M added by devel/scanprov
+SvPV_nomg_const # M added by devel/scanprov
+SvPV_nomg_const_nolen # M added by devel/scanprov
+SvPV_renew # M added by devel/scanprov
+SvPVX_const # M added by devel/scanprov
+SvPVX_mutable # M added by devel/scanprov
+SvSHARED_HASH # M added by devel/scanprov
+amagic_cmp # F added by devel/scanprov
+amagic_cmp_locale # F added by devel/scanprov
+amagic_i_ncmp # F added by devel/scanprov
+amagic_ncmp # F added by devel/scanprov
+check_type_and_open # F added by devel/scanprov
+dump_sv_child # F added by devel/scanprov
+F0convert # F added by devel/scanprov
+first_symbol # F added by devel/scanprov
+free_global_struct # F added by devel/scanprov
+hv_auxinit # F added by devel/scanprov
+incpush_if_exists # F added by devel/scanprov
+init_global_struct # F added by devel/scanprov
+is_utf8_common # F added by devel/scanprov
+magic_freearylen_p # F added by devel/scanprov
+mg_localize # F added by devel/scanprov
+my_clearenv # F added by devel/scanprov
+need_utf8 # F added by devel/scanprov
+Perl_hv_backreferences_p # F added by devel/scanprov
+Perl_hv_placeholders_p # F added by devel/scanprov
+Perl_sv_add_backref # F added by devel/scanprov
+Perl_sv_kill_backrefs # F added by devel/scanprov
+restore_magic # F added by devel/scanprov
+run_user_filter # F added by devel/scanprov
+sequence_num # F added by devel/scanprov
+sortcv # F added by devel/scanprov
+sortcv_stacked # F added by devel/scanprov
+sortcv_xsub # F added by devel/scanprov
+strip_return # F added by devel/scanprov
+sv_exp_grow # F added by devel/scanprov
+sv_i_ncmp # F added by devel/scanprov
+sv_ncmp # F added by devel/scanprov
+tokenize_use # F added by devel/scanprov
+uiv_2buf # F added by devel/scanprov
+unwind_handler_stack # F added by devel/scanprov
+varname # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009004
index 03e22e5c0f2..c4e52c874ae 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009004
@@ -1,8 +1,32 @@
5.009004
+gv_name_set # U
+hv_copy_hints_hv # U
+hv_stores # U
+LIKELY # U
+my_snprintf # U
+my_strlcat # U
+my_strlcpy # U
+my_vsnprintf # U
+newXS_flags # U
PerlIO_context_layers # U
+PERL_MAGIC_hints # E
+PERL_MAGIC_hintselem # E
+PERL_PV_ESCAPE_ALL # E
+PERL_PV_ESCAPE_FIRSTCHAR # E
+PERL_PV_ESCAPE_NOBACKSLASH # E
+PERL_PV_ESCAPE_NOCLEAR # E
+PERL_PV_ESCAPE_QUOTE # E
+PERL_PV_ESCAPE_UNI # E
+PERL_PV_ESCAPE_UNI_DETECT # E
+PERL_PV_PRETTY_LTGT # E
+PERL_PV_PRETTY_QUOTE # E
PoisonFree # E
PoisonNew # E
PoisonWith # E
+pv_escape # U
+pv_pretty # U
+sv_does # U
+SV_HAS_TRAILING_NUL # E
SvREFCNT_inc_NN # U
SvREFCNT_inc_simple # U
SvREFCNT_inc_simple_NN # U
@@ -10,31 +34,44 @@ SvREFCNT_inc_simple_void # U
SvREFCNT_inc_simple_void_NN # U
SvREFCNT_inc_void # U
SvREFCNT_inc_void_NN # U
-gv_name_set # U
-hv_copy_hints_hv # U
-hv_stores # U
-my_snprintf # U
-my_strlcat # U
-my_strlcpy # U
-my_vsnprintf # U
-pv_escape # U
-pv_pretty # U
-sv_does # U
sv_setpvs # U
sv_usepvn_flags # U
-PERL_PV_ESCAPE_ALL # added by devel/scanprov
-PERL_PV_ESCAPE_FIRSTCHAR # added by devel/scanprov
-PERL_PV_ESCAPE_NOBACKSLASH # added by devel/scanprov
-PERL_PV_ESCAPE_NOCLEAR # added by devel/scanprov
-PERL_PV_ESCAPE_QUOTE # added by devel/scanprov
-PERL_PV_ESCAPE_UNI # added by devel/scanprov
-PERL_PV_ESCAPE_UNI_DETECT # added by devel/scanprov
-PERL_PV_PRETTY_DUMP # added by devel/scanprov
-PERL_PV_PRETTY_LTGT # added by devel/scanprov
-PERL_PV_PRETTY_QUOTE # added by devel/scanprov
-PERL_PV_PRETTY_REGPROP # added by devel/scanprov
-PERL_UNUSED_CONTEXT # added by devel/scanprov
-PERL_USE_GCC_BRACE_GROUPS # added by devel/scanprov
-SV_HAS_TRAILING_NUL # added by devel/scanprov
-SvVSTRING_mg # added by devel/scanprov
-gv_fetchpvs # added by devel/scanprov
+UNLIKELY # U
+gv_fetchpvs # M added by devel/scanprov
+isGV_with_GP # M added by devel/scanprov
+PERL_PV_PRETTY_DUMP # M added by devel/scanprov
+PERL_PV_PRETTY_REGPROP # M added by devel/scanprov
+PERL_UNUSED_CONTEXT # M added by devel/scanprov
+PERL_USE_GCC_BRACE_GROUPS # M added by devel/scanprov
+SvVSTRING_mg # M added by devel/scanprov
+clear_placeholders # F added by devel/scanprov
+create_eval_scope # F added by devel/scanprov
+debug_start_match # F added by devel/scanprov
+delete_eval_scope # F added by devel/scanprov
+dump_exec_pos # F added by devel/scanprov
+dump_trie # F added by devel/scanprov
+dump_trie_interim_list # F added by devel/scanprov
+dump_trie_interim_table # F added by devel/scanprov
+exec_failed # F added by devel/scanprov
+find_array_subscript # F added by devel/scanprov
+find_hash_subscript # F added by devel/scanprov
+glob_2number # F added by devel/scanprov
+glob_assign_glob # F added by devel/scanprov
+join_exact # F added by devel/scanprov
+magic_clearhint # F added by devel/scanprov
+magic_sethint # F added by devel/scanprov
+more_sv # F added by devel/scanprov
+Perl_newGP # F added by devel/scanprov
+Perl_new_warnings_bitfield # F added by devel/scanprov
+pm_description # F added by devel/scanprov
+printbuf # F added by devel/scanprov
+ptr_table_find # F added by devel/scanprov
+refcounted_he_value # F added by devel/scanprov
+regtail_study # F added by devel/scanprov
+space_join_names_mortal # F added by devel/scanprov
+sv_2iuv_common # F added by devel/scanprov
+sv_pos_b2u_midway # F added by devel/scanprov
+sv_pos_u2b_cached # F added by devel/scanprov
+sv_pos_u2b_forwards # F added by devel/scanprov
+sv_pos_u2b_midway # F added by devel/scanprov
+utf8_mg_pos_cache_update # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009005
index 0959f923cf4..17ce3d58c78 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5009005
@@ -1,32 +1,69 @@
5.009005
-PL_parser # E
-SvRX # U
-SvRXOK # U
+av_create_and_push # U
+av_create_and_unshift_one # U
+CopLABEL # U
get_cvn_flags # U
gv_fetchfile_flags # U
+lex_start # E (Perl_lex_start)
+memEQs # U
+memNEs # U
mro_get_linear_isa # U
mro_method_changed_in # U
my_dirfd # U
newSV_type # U
+PERL_PV_ESCAPE_RE # E
+Perl_signbit # U
+PL_parser # E
pregcomp # E (Perl_pregcomp)
+ptr_table_clear # U
ptr_table_fetch # U
ptr_table_free # U
ptr_table_new # U
ptr_table_split # U
ptr_table_store # U
re_compile # U
+regfree_internal # U
reg_named_buff_all # U
reg_named_buff_exists # U
reg_named_buff_fetch # U
reg_named_buff_firstkey # U
reg_named_buff_nextkey # U
reg_named_buff_scalar # U
-regfree_internal # U
savesharedpvn # U
scan_vstring # E (Perl_scan_vstring)
+SVfARG # U
+SvRX # U
+SvRXOK # U
upg_version # E (Perl_upg_version)
-PERL_PV_ESCAPE_RE # added by devel/scanprov
-SV_COW_SHARED_HASH_KEYS # added by devel/scanprov
-SVfARG # added by devel/scanprov
-memEQs # added by devel/scanprov
-memNEs # added by devel/scanprov
+GV_NOADD_MASK # M added by devel/scanprov
+SV_COW_SHARED_HASH_KEYS # M added by devel/scanprov
+boot_core_mro # F added by devel/scanprov
+find_and_forget_pmops # F added by devel/scanprov
+mro_get_linear_isa_dfs # F added by devel/scanprov
+mro_isa_changed_in # F added by devel/scanprov
+mro_meta_dup # F added by devel/scanprov
+parser_free # F added by devel/scanprov
+Perl_emulate_cop_io # F added by devel/scanprov
+Perl_get_db_sub # F added by devel/scanprov
+Perl_get_re_arg # F added by devel/scanprov
+Perl_mro_meta_init # F added by devel/scanprov
+Perl_my_cxt_index # F added by devel/scanprov
+Perl_op_refcnt_dec # F added by devel/scanprov
+Perl_op_refcnt_inc # F added by devel/scanprov
+Perl_softref2xv # F added by devel/scanprov
+process_special_blocks # F added by devel/scanprov
+reg_check_named_buff_matched # F added by devel/scanprov
+regdump_extflags # F added by devel/scanprov
+reghop4 # F added by devel/scanprov
+reg_named_buff # F added by devel/scanprov
+reg_named_buff_iter # F added by devel/scanprov
+reg_numbered_buff_fetch # F added by devel/scanprov
+reg_numbered_buff_length # F added by devel/scanprov
+reg_numbered_buff_store # F added by devel/scanprov
+reg_qr_package # F added by devel/scanprov
+reg_scan_name # F added by devel/scanprov
+reg_skipcomment # F added by devel/scanprov
+reg_temp_copy # F added by devel/scanprov
+require_tie_mod # F added by devel/scanprov
+Slab_to_rw # F added by devel/scanprov
+update_debugger_info # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010000
index 922e6141592..43b63ecc1a4 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010000
@@ -1,10 +1,16 @@
5.010000
hv_common # U
hv_common_key_len # U
+PERL_PV_PRETTY_ELLIPSES # E
+reentrant_free # U
+reentrant_init # U
+reentrant_retry # U
+reentrant_size # U
+START_MY_CXT # E
sv_destroyable # U
sys_init # U
sys_init3 # U
sys_term # U
-PERL_PV_PRETTY_ELLIPSES # added by devel/scanprov
-PERL_PV_PRETTY_NOCLEAR # added by devel/scanprov
-XSPROTO # added by devel/scanprov
+PERL_PV_PRETTY_NOCLEAR # M added by devel/scanprov
+XSPROTO # M added by devel/scanprov
+sv_2num # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010001
index 61012f7d588..04b614a9249 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5010001
@@ -1,22 +1,29 @@
5.010001
-HeUTF8 # U
croak_xs_usage # U
+HeUTF8 # U
mPUSHs # U
-mXPUSHs # U
mro_get_from_name # U
mro_get_private_data # U
mro_register # U
mro_set_mro # U
mro_set_private_data # U
+mXPUSHs # U
newSVpvn_flags # U
newSVpvn_utf8 # U
newSVpvs_flags # U
+save_freeop # U (Perl_save_freeop)
save_hints # U
+save_op # U (Perl_save_op)
save_padsv_and_mortalize # U
save_pushi32ptr # U
save_pushptr # U
save_pushptrptr # U
sv_insert_flags # U
-DEFSV_set # added by devel/scanprov
-MUTABLE_PTR # added by devel/scanprov
-MUTABLE_SV # added by devel/scanprov
+DEFSV_set # M added by devel/scanprov
+MUTABLE_PTR # M added by devel/scanprov
+MUTABLE_SV # M added by devel/scanprov
+magic_clearisa # F added by devel/scanprov
+malloc_good_size # F added by devel/scanprov
+mem_log_common # F added by devel/scanprov
+save_pushptri32ptr # F added by devel/scanprov
+search_const # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011000
index 1f499d99e07..b908c461f78 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011000
@@ -1,15 +1,26 @@
5.011000
-Gv_AMupdate # E (Perl_Gv_AMupdate)
-PL_opfreehook # E
-SVt_REGEXP # E
-SvOOK_offset # U
av_iter_p # U
gv_add_by_type # U
+Gv_AMupdate # A
is_ascii_string # U
+PL_opfreehook # E
pregfree2 # U
+PUSH_MULTICALL # U
+re_dup_guts # U
save_adelete # U
save_aelem_flags # U
save_hdelete # U
save_helem_flags # U
+SvOOK_offset # U
+SVt_REGEXP # E
sv_utf8_upgrade_flags_grow # U
-get_cvs # added by devel/scanprov
+WARN_IMPRECISION # E
+get_cvs # M added by devel/scanprov
+do_delete_local # F added by devel/scanprov
+dump_all_perl # F added by devel/scanprov
+dump_packsubs_perl # F added by devel/scanprov
+dump_sub_perl # F added by devel/scanprov
+get_aux_mg # F added by devel/scanprov
+incpush_use_sep # F added by devel/scanprov
+magic_clearhints # F added by devel/scanprov
+sv_dup_inc_multiple # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011001
index 28a8d5b15ae..48651c57f80 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011001
@@ -1,3 +1,7 @@
5.011001
ck_warner # U
ck_warner_d # U
+add_utf16_textfilter # F added by devel/scanprov
+ckwarn_common # F added by devel/scanprov
+package_version # F added by devel/scanprov
+utf16_textfilter # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011002
index 910a552fe4f..651df59250e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011002
@@ -1,2 +1,20 @@
5.011002
+CHARBITS # E
+ENTER_with_name # U
+LEAVE_with_name # U
+lex_bufutf8 # U
+lex_discard_to # U
+lex_grow_linestr # U
+LEX_KEEP_PREVIOUS # E
+lex_next_chunk # U
+lex_peek_unichar # U
+lex_read_space # U
+lex_read_to # U
+lex_read_unichar # U
+lex_stuff_pvn # U
+lex_stuff_sv # U
+LEX_STUFF_UTF8 # E
+lex_unstuff # U
PL_keyword_plugin # E
+gv_try_downgrade # F added by devel/scanprov
+Perl_keyword_plugin_standard # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011004
index 86c1fce4f2a..2679a3f7fb2 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5011004
@@ -1,2 +1,4 @@
5.011004
prescan_version # U
+WARN_ILLEGALPROTO # E
+force_strict_version # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013000
index 8a31cc7f3e8..84da3dea1be 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013000
@@ -1,2 +1,2 @@
5.013000
-cBOOL # added by devel/scanprov
+cBOOL # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013001
index 679bf3c35e5..02c65cd8c98 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013001
@@ -4,3 +4,9 @@ die_sv # U
mess_sv # U
sv_2nv_flags # U
warn_sv # U
+die_unwind # F added by devel/scanprov
+grok_bslash_c # F added by devel/scanprov
+invoke_exception_hook # F added by devel/scanprov
+magic_methcall1 # F added by devel/scanprov
+Perl_magic_methcall # F added by devel/scanprov
+with_queued_errors # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013002
index 5058d1e4041..bfd1764dcc5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013002
@@ -1,10 +1,18 @@
5.013002
-SvNV_nomg # U
+C_ARRAY_END # U
+clone_params_del # U
+clone_params_new # U
find_rundefsv # U
foldEQ # U
foldEQ_locale # U
foldEQ_utf8 # U
hv_fill # U
sv_dec_nomg # U
+sv_dup_inc # U
sv_inc_nomg # U
-C_ARRAY_END # added by devel/scanprov
+SvNV_nomg # U
+padlist_dup # F added by devel/scanprov
+Perl_try_amagic_bin # F added by devel/scanprov
+Perl_try_amagic_un # F added by devel/scanprov
+sv_dup_common # F added by devel/scanprov
+unreferenced_to_tmp_stack # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013003
index 5e04f03c8a5..2284558dd13 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013003
@@ -1,3 +1,10 @@
5.013003
blockhook_register # E
croak_no_modify # U
+anonymise_cv_maybe # F added by devel/scanprov
+assert_uft8_cache_coherent # F added by devel/scanprov
+cvgv_set # F added by devel/scanprov
+grok_bslash_o # F added by devel/scanprov
+my_lstat_flags # F added by devel/scanprov
+my_stat_flags # F added by devel/scanprov
+utf8_mg_len_cache_update # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013004
index 8aac89eb8d4..6d5bd06511d 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013004
@@ -1 +1,4 @@
5.013004
+XS_APIVERSION_BOOTCHECK # E
+Perl_hv_kill_backrefs # F added by devel/scanprov
+Perl_init_dbargs # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013005
index 825d1ad12fc..53130ca1073 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013005
@@ -1,5 +1,10 @@
5.013005
-PL_rpeepp # E
caller_cx # U
isOCTAL # U
lex_stuff_pvs # U
+parse_fullstmt # U
+PL_rpeepp # E
+gv_magicalize_isa # F added by devel/scanprov
+Perl_more_bodies # F added by devel/scanprov
+rpeep # F added by devel/scanprov
+yyunlex # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013006
index 596c1ade2dc..0ee7d59b9e1 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013006
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013006
@@ -1,12 +1,45 @@
5.013006
-LINKLIST # U
-SvTRUE_nomg # U
ck_entersub_args_list # U
ck_entersub_args_proto # U
ck_entersub_args_proto_or_list # U
cv_get_call_checker # E
cv_set_call_checker # E
+isALNUMC_A # U
+isALNUMC_L1 # U
+isALPHA_A # U
+isALPHA_L1 # U
+isASCII_A # U
+isBLANK_A # U
+isBLANK_L1 # U
+isCNTRL_A # U
+isCNTRL_L1 # U
+isDIGIT_A # U
+isDIGIT_L1 # U
+isGRAPH_A # U
+isGRAPH_L1 # U
+isIDFIRST_A # U
+isIDFIRST_L1 # U
+isLOWER_A # U
+isLOWER_L1 # U
+isOCTAL_A # U
+isOCTAL_L1 # U
+isPRINT_A # U
+isPRINT_L1 # U
+isPSXSPC_A # U
+isPSXSPC_L1 # U
+isPUNCT_A # U
+isPUNCT_L1 # U
+isSPACE_A # U
+isSPACE_L1 # U
+isUPPER_A # U
+isUPPER_L1 # U
isWORDCHAR # U
+isWORDCHAR_A # U
+isWORDCHAR_L1 # U
+isXDIGIT_A # U
+isXDIGIT_L1 # U
+lex_stuff_pv # U
+LINKLIST # U
mg_free_type # U
newSVpv_share # U
op_append_elem # U
@@ -14,7 +47,11 @@ op_append_list # U
op_contextualize # U
op_linklist # U
op_prepend_elem # U
+parse_stmtseq # U
+PERL_MAGIC_checkcall # E
rv2cv_op_cv # U
+RV2CVOPCV_MARK_EARLY # E
+RV2CVOPCV_RETURN_NAME_GV # E
savesharedpvs # U
savesharedsvpv # U
sv_2bool_flags # U
@@ -28,3 +65,7 @@ sv_cmp_locale_flags # U
sv_collxfrm_flags # U
sv_eq_flags # U
sv_setpvs_mg # U
+sv_setref_pvs # U
+SvTRUE_nomg # U
+mro_package_moved # F added by devel/scanprov
+Perl_populate_isa # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013007
index 795fd1c0760..50f21faf625 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013007
@@ -1,15 +1,6 @@
5.013007
-HvENAME # U
-OP_CLASS # U
-SvPV_nomg_nolen # U
-XopFLAGS # E
amagic_deref_call # U
bytes_cmp_utf8 # U
-cop_hints_2hv # A
-cop_hints_fetch_pv # U
-cop_hints_fetch_pvn # U
-cop_hints_fetch_pvs # U
-cop_hints_fetch_sv # U
cophh_2hv # E
cophh_copy # E
cophh_delete_pv # E
@@ -21,11 +12,48 @@ cophh_fetch_pvn # E
cophh_fetch_pvs # E
cophh_fetch_sv # E
cophh_free # E
+COPHH_KEY_UTF8 # E
+cophh_new_empty # E
cophh_store_pv # E
cophh_store_pvn # E
cophh_store_pvs # E
cophh_store_sv # E
+cop_hints_2hv # A
+cop_hints_fetch_pv # U
+cop_hints_fetch_pvn # U
+cop_hints_fetch_pvs # U
+cop_hints_fetch_sv # U
custom_op_register # E
-custom_op_xop # E
+dirp_dup # A
+HvENAME # U
newFOROP # A
newWHILEOP # A
+OP_CLASS # U
+op_lvalue # U
+op_scope # U
+parse_barestmt # U
+parse_block # U
+parse_label # U
+PARSE_OPTIONAL # E
+PL_phase # E
+SvPV_nomg_nolen # U
+XopFLAGS # E
+XopDISABLE # M added by devel/scanprov
+XopENABLE # M added by devel/scanprov
+XopENTRY # M added by devel/scanprov
+XopENTRY_set # M added by devel/scanprov
+cvstash_set # F added by devel/scanprov
+hv_ename_add # F added by devel/scanprov
+hv_ename_delete # F added by devel/scanprov
+mro_clean_isarev # F added by devel/scanprov
+mro_gather_and_rename # F added by devel/scanprov
+Perl_custom_op_xop # F added by devel/scanprov
+refcounted_he_chain_2hv # F added by devel/scanprov
+refcounted_he_fetch_pv # F added by devel/scanprov
+refcounted_he_fetch_pvn # F added by devel/scanprov
+refcounted_he_fetch_sv # F added by devel/scanprov
+refcounted_he_free # F added by devel/scanprov
+refcounted_he_inc # F added by devel/scanprov
+refcounted_he_new_pv # F added by devel/scanprov
+refcounted_he_new_pvn # F added by devel/scanprov
+refcounted_he_new_sv # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013008
index e4c882b8d8b..25fbf7ae172 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013008
@@ -1,4 +1,9 @@
5.013008
foldEQ_latin1 # U
mg_findext # U
+parse_arithexpr # U
+parse_fullexpr # U
+parse_listexpr # U
+parse_termexpr # U
sv_unmagicext # U
+Perl_hv_undef_flags # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013009
index 51160ae344d..c969c702a96 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013009
@@ -1 +1,14 @@
5.013009
+PERL_PV_ESCAPE_NONASCII # E
+UTF8_DISALLOW_ILLEGAL_INTERCHANGE # E
+UTF8_DISALLOW_NONCHAR # E
+UTF8_DISALLOW_SUPER # E
+UTF8_DISALLOW_SURROGATE # E
+UTF8_WARN_ILLEGAL_INTERCHANGE # E
+UTF8_WARN_NONCHAR # E
+UTF8_WARN_SUPER # E
+UTF8_WARN_SURROGATE # E
+check_utf8_print # F added by devel/scanprov
+curse # F added by devel/scanprov
+report_wrongway_fh # F added by devel/scanprov
+tied_method # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013010
index 467ea464b50..071409b2560 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013010
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013010
@@ -1 +1,13 @@
5.013010
+WARN_NONCHAR # E
+WARN_NON_UNICODE # E
+WARN_SURROGATE # E
+_append_range_to_invlist # F added by devel/scanprov
+foldEQ_utf8_flags # F added by devel/scanprov
+invlist_array # F added by devel/scanprov
+invlist_extend # F added by devel/scanprov
+invlist_max # F added by devel/scanprov
+invlist_set_len # F added by devel/scanprov
+invlist_trim # F added by devel/scanprov
+_new_invlist # F added by devel/scanprov
+regcurly # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013011
index a33715f749e..91269f0e7a0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013011
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5013011
@@ -1 +1,2 @@
5.013011
+add_cp_to_invlist # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014000
index cfe78226fea..89a626a2e1f 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5014000
@@ -1 +1,3 @@
5.014000
+_to_uni_fold_flags # F added by devel/scanprov
+_to_utf8_fold_flags # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015000
index d8c6546d720..5970cd45699 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015000
@@ -1 +1,3 @@
5.015000
+hv_free_ent_ret # F added by devel/scanprov
+Perl_hfree_next_entry # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015001
index c886418516e..75f98a09ded 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015001
@@ -1,4 +1,6 @@
5.015001
+cop_fetch_label # U
+cop_store_label # U
pad_add_name_pv # U
pad_add_name_pvn # U
pad_add_name_pvs # U
@@ -7,3 +9,16 @@ pad_findmy_pv # U
pad_findmy_pvn # U
pad_findmy_pvs # U
pad_findmy_sv # U
+do_ncmp # F added by devel/scanprov
+get_invlist_iter_addr # F added by devel/scanprov
+_invlist_array_init # F added by devel/scanprov
+invlist_clone # F added by devel/scanprov
+_invlist_intersection # F added by devel/scanprov
+_invlist_invert # F added by devel/scanprov
+invlist_iterinit # F added by devel/scanprov
+invlist_iternext # F added by devel/scanprov
+_invlist_subtract # F added by devel/scanprov
+_invlist_union # F added by devel/scanprov
+pad_alloc_name # F added by devel/scanprov
+Perl_op_lvalue_flags # F added by devel/scanprov
+Perl_was_lvalue_sub # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015002
index 06741283d1d..07dae390b38 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015002
@@ -1 +1,7 @@
5.015002
+XS_EXTERNAL # M added by devel/scanprov
+XS_INTERNAL # M added by devel/scanprov
+core_prototype # F added by devel/scanprov
+finalize_op # F added by devel/scanprov
+finalize_optree # F added by devel/scanprov
+Perl_ck_entersub_args_core # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015003
index 7f33df71289..c10cb56bdda 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015003
@@ -1 +1,6 @@
5.015003
+GV_ADDMG # E
+coresub_op # F added by devel/scanprov
+inplace_aassign # F added by devel/scanprov
+op_integerize # F added by devel/scanprov
+op_std_init # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015004
index d6801037c58..a8853a39430 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015004
@@ -1,11 +1,10 @@
5.015004
-HvENAMELEN # U
-HvENAMEUTF8 # U
-HvNAMELEN # U
-HvNAMEUTF8 # U
gv_autoload_pv # U
gv_autoload_pvn # U
gv_autoload_sv # U
+gv_fetchmethod_pv_flags # U
+gv_fetchmethod_pvn_flags # U
+gv_fetchmethod_sv_flags # U
gv_fetchmeth_pv # U
gv_fetchmeth_pv_autoload # U
gv_fetchmeth_pvn # U
@@ -15,6 +14,11 @@ gv_fetchmeth_sv_autoload # U
gv_init_pv # U
gv_init_pvn # U
gv_init_sv # U
+HvENAMELEN # U
+HvENAMEUTF8 # U
+HvNAMELEN # U
+HvNAMEUTF8 # U
+isASCII_L1 # U
newGVgen_flags # U
sv_derived_from_pv # U
sv_derived_from_pvn # U
@@ -26,4 +30,7 @@ sv_ref # U
whichsig_pv # U
whichsig_pvn # U
whichsig_sv # U
-WIDEST_UTYPE # added by devel/scanprov
+WIDEST_UTYPE # E
+cv_ckproto_len_flags # F added by devel/scanprov
+gv_init_svtype # F added by devel/scanprov
+sv_sethek # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015005
index 1908a935e3d..2c52f9b9ded 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015005
@@ -1 +1,4 @@
5.015005
+_to_fold_latin1 # F added by devel/scanprov
+to_lower_latin1 # F added by devel/scanprov
+_to_upper_title_latin1 # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015006
index 4fb3c7c5901..81b92849902 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015006
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015006
@@ -1,2 +1,11 @@
5.015006
newCONSTSUB_flags # A
+check_locale_boundary_crossing # F added by devel/scanprov
+mayberelocate # F added by devel/scanprov
+minus_v # F added by devel/scanprov
+newXS_len_flags # F added by devel/scanprov
+report_redefined_cv # F added by devel/scanprov
+_to_utf8_lower_flags # F added by devel/scanprov
+_to_utf8_title_flags # F added by devel/scanprov
+_to_utf8_upper_flags # F added by devel/scanprov
+translate_substr_offsets # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015007
index ce9078968a1..b02b431f32e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015007
@@ -1,8 +1 @@
5.015007
-toLOWER_utf8 # U
-toTITLE_utf8 # U
-toUPPER_utf8 # U
-to_utf8_fold # U
-to_utf8_lower # U
-to_utf8_title # U
-to_utf8_upper # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015008
index 14c640388c7..56870466ae3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015008
@@ -1,3 +1,8 @@
5.015008
+isASCII_LC # U
is_utf8_char_buf # U
wrap_op_checker # U
+amagic_is_enabled # F added by devel/scanprov
+_invlist_intersection_maybe_complement_2nd # F added by devel/scanprov
+_invlist_union_maybe_complement_2nd # F added by devel/scanprov
+_new_invlist_C_array # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015009
index 12e4d6de751..26adad079ff 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5015009
@@ -1,2 +1,5 @@
5.015009
utf8_to_uvchr_buf # U
+utf8_to_uvuni_buf # F added by devel/scanprov
+valid_utf8_to_uvchr # F added by devel/scanprov
+valid_utf8_to_uvuni # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016000
index 3bd46b73620..01207b01e1f 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5016000
@@ -1 +1,9 @@
5.016000
+CopLABEL_len # U
+CopLABEL_len_flags # U
+_add_range_to_invlist # F added by devel/scanprov
+bad_type_pv # F added by devel/scanprov
+too_few_arguments_pv # F added by devel/scanprov
+too_many_arguments_pv # F added by devel/scanprov
+yyerror_pv # F added by devel/scanprov
+yyerror_pvn # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017000
index bf56b9a68af..eee006bec23 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017000
@@ -1 +1,2 @@
5.017000
+magic_copycallchecker # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017001
index 6c9994352af..133644456ec 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017001
@@ -1 +1,5 @@
5.017001
+alloccopstash # U
+current_re_engine # F added by devel/scanprov
+newSTUB # F added by devel/scanprov
+re_op_compile # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017002
index e8638dce32f..960991e1ec9 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017002
@@ -2,3 +2,12 @@
sv_copypv_flags # U
sv_copypv_nomg # U
sv_vcatpvfn_flags # U
+cv_forget_slab # F added by devel/scanprov
+find_runcv_where # F added by devel/scanprov
+grok_bslash_x # F added by devel/scanprov
+invlist_highest # F added by devel/scanprov
+magic_cleararylen_p # F added by devel/scanprov
+opslab_force_free # F added by devel/scanprov
+opslab_free # F added by devel/scanprov
+opslab_free_nopad # F added by devel/scanprov
+Slab_to_ro # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017003
index 50227645479..81e507731d0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017003
@@ -1 +1,7 @@
5.017003
+compute_EXACTish # F added by devel/scanprov
+grok_bslash_N # F added by devel/scanprov
+init_constants # F added by devel/scanprov
+_invlist_contains_cp # F added by devel/scanprov
+_invlist_search # F added by devel/scanprov
+op_unscope # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017004
index 02021258887..be63ed358d5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017004
@@ -1,5 +1,30 @@
5.017004
-PL_comppad_name # E
-PadlistREFCNT # U
+GV_SUPER # E
newMYSUB # E (Perl_newMYSUB)
newSVpadname # E
+PadARRAY # U
+PadlistARRAY # U
+PadlistMAX # U
+PadlistNAMES # E
+PadlistNAMESARRAY # E
+PadlistNAMESMAX # U
+PadlistREFCNT # U
+PadMAX # U
+PadnameLEN # E
+PadnamelistARRAY # E
+PadnamelistMAX # E
+PadnamePV # E
+PadnameSV # E
+PadnameUTF8 # E
+PL_comppad_name # E
+WARN_EXPERIMENTAL # E
+sv_len_utf8_nomg # M added by devel/scanprov
+av_extend_guts # F added by devel/scanprov
+cv_clone_into # F added by devel/scanprov
+force_ident_maybe_lex # F added by devel/scanprov
+get_invlist_previous_index_addr # F added by devel/scanprov
+_invlist_len # F added by devel/scanprov
+invlist_previous_index # F added by devel/scanprov
+invlist_set_previous_index # F added by devel/scanprov
+padlist_store # F added by devel/scanprov
+pending_ident # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017005
index 31dfb1c3838..17b0d1f48a9 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017005
@@ -1 +1,4 @@
5.017005
+sv_mortalcopy_flags # U
+WARN_EXPERIMENTAL__LEXICAL_SUBS # E
+sv_resetpvn # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017006
index 0bb24862396..896dabc9746 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017006
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017006
@@ -1,2 +1,7 @@
5.017006
+croak_memory_wrap # U
READ_XDIGIT # U
+croak_no_mem # F added by devel/scanprov
+get_and_check_backslash_N_name # F added by devel/scanprov
+parser_free_nexttoke_ops # F added by devel/scanprov
+win32_croak_not_implemented # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017007
index 6d97dffafdd..1e458349d43 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017007
@@ -1,2 +1,13 @@
5.017007
+isALNUMC_LC_uvchr # U
+isASCII_LC_uvchr # U
+isBLANK_LC_uvchr # U
+isPSXSPC_LC_uvchr # U
+isWORDCHAR_LC # U
+isWORDCHAR_LC_uvchr # U
+isXDIGIT_LC # U
+isXDIGIT_LC_uvchr # U
SvREFCNT_dec_NN # U
+forget_pmop # F added by devel/scanprov
+isFOO_lc # F added by devel/scanprov
+_is_uni_perl_idstart # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017008
index de67457e79e..1f573e92eaf 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017008
@@ -1,3 +1,18 @@
5.017008
isALPHANUMERIC # U
+isALPHANUMERIC_A # U
+isALPHANUMERIC_L1 # U
+isALPHANUMERIC_LC # U
+isALPHANUMERIC_LC_uvchr # U
isIDCONT # U
+isIDCONT_A # U
+isIDCONT_L1 # U
+isIDCONT_LC # U
+isIDCONT_LC_uvchr # U
+WARN_EXPERIMENTAL__REGEX_SETS # E
+croak_popstack # F added by devel/scanprov
+invlist_is_iterating # F added by devel/scanprov
+invlist_iterfinish # F added by devel/scanprov
+isFOO_utf8_lc # F added by devel/scanprov
+_is_uni_FOO # F added by devel/scanprov
+_is_uni_perl_idcont # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017009
index fd728270400..8af1a5f3833 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017009
@@ -1,3 +1,5 @@
5.017009
av_tindex # U
av_top_index # U
+handle_regex_sets # F added by devel/scanprov
+parse_lparen_question_flags # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017010
index fed2762e9b6..5b3585c0fb0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017010
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017010
@@ -1 +1,3 @@
5.017010
+parse_ident # F added by devel/scanprov
+ptr_hash # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017011
index 5fcf0516810..478877f2b56 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017011
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5017011
@@ -1 +1,2 @@
5.017011
+WARN_EXPERIMENTAL__SMARTMATCH # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019001
index 803ad9abffb..0894b3f5e48 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019001
@@ -1,6 +1,7 @@
5.019001
-re_intuit_start # A
toFOLD # U
-toFOLD_utf8 # U
toLOWER_L1 # U
toTITLE # U
+UTF8f # E
+find_lexical_cv # F added by devel/scanprov
+path_is_searchable # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019002
index 5af71fbeae6..63829e9b851 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019002
@@ -1,2 +1,12 @@
5.019002
-SVt_INVLIST # E
+G_METHOD_NAMED # E
+UTF8fARG # U
+bad_type_gv # F added by devel/scanprov
+defelem_target # F added by devel/scanprov
+get_invlist_offset_addr # F added by devel/scanprov
+mg_find_mglob # F added by devel/scanprov
+regdump_intflags # F added by devel/scanprov
+save_magic_flags # F added by devel/scanprov
+skipspace_flags # F added by devel/scanprov
+sv_magicext_mglob # F added by devel/scanprov
+validate_proto # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019003
index 488ef60b2f2..5bcd299ae56 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019003
@@ -1,3 +1,7 @@
5.019003
-croak_memory_wrap # U (Perl_croak_memory_wrap)
+PERL_EXIT_ABORT # E
+PERL_EXIT_WARN # E
sv_pos_b2u_flags # U
+adjust_size_and_find_bucket # F added by devel/scanprov
+cv_const_sv_or_av # F added by devel/scanprov
+_invlist_dump # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019004
index a24caa7e92b..378be8ec7b1 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019004
@@ -1,3 +1,21 @@
5.019004
+IS_SAFE_SYSCALL # U
is_safe_syscall # U
-uvoffuni_to_utf8_flags # U
+LATIN1_TO_NATIVE # U
+NATIVE_TO_LATIN1 # U
+UVCHR_IS_INVARIANT # U
+WARN_SYSCALLS # E
+append_utf8_from_native_byte # F added by devel/scanprov
+ASCII_TO_NEED # F added by devel/scanprov
+find_default_stash # F added by devel/scanprov
+gv_is_in_main # F added by devel/scanprov
+gv_magicalize # F added by devel/scanprov
+maybe_multimagic_gv # F added by devel/scanprov
+NATIVE_TO_NEED # F added by devel/scanprov
+newSVavdefelem # F added by devel/scanprov
+parse_gv_stash_name # F added by devel/scanprov
+Perl_drand48_init_r # F added by devel/scanprov
+Perl_drand48_r # F added by devel/scanprov
+save_strlen # F added by devel/scanprov
+sv_or_pv_pos_u2b # F added by devel/scanprov
+uvuni_to_utf8 # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019005
index 69dcd69aefb..f9b4194d647 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019005
@@ -1 +1,18 @@
5.019005
+WARN_EXPERIMENTAL__POSTDEREF # E
+get_ANYOF_cp_list_for_ssc # F added by devel/scanprov
+move_proto_attr # F added by devel/scanprov
+populate_ANYOF_from_invlist # F added by devel/scanprov
+set_ANYOF_arg # F added by devel/scanprov
+ssc_add_range # F added by devel/scanprov
+ssc_and # F added by devel/scanprov
+ssc_anything # F added by devel/scanprov
+ssc_clear_locale # F added by devel/scanprov
+ssc_cp_and # F added by devel/scanprov
+ssc_finalize # F added by devel/scanprov
+ssc_init # F added by devel/scanprov
+ssc_intersection # F added by devel/scanprov
+ssc_is_anything # F added by devel/scanprov
+ssc_is_cp_posixl_init # F added by devel/scanprov
+ssc_or # F added by devel/scanprov
+ssc_union # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019006
index f14fb0c0c4b..176400dc10f 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019006
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019006
@@ -1 +1,5 @@
5.019006
+XopENTRYCUSTOM # M added by devel/scanprov
+custom_op_get_field # F added by devel/scanprov
+gv_override # F added by devel/scanprov
+set_caret_X # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019007
index c34055ea2af..af1c95d2787 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019007
@@ -1,2 +1,4 @@
5.019007
+__ASSERT_ # E
OP_TYPE_IS # U
+fixup_errno_string # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019008
index 8fe2e2f1ded..8da5697b657 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019008
@@ -1 +1,5 @@
5.019008
+newATTRSUB_x # F added by devel/scanprov
+_setup_canned_invlist # F added by devel/scanprov
+sv_buf_to_ro # F added by devel/scanprov
+sv_buf_to_rw # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019009
index d6ccc505670..6789972a0ce 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019009
@@ -1 +1,4 @@
5.019009
+WARN_EXPERIMENTAL__SIGNATURES # E
+_get_regclass_nonbitmap_data # F added by devel/scanprov
+put_range # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019010
index 8bdae66ddbe..02e91730cc7 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019010
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5019010
@@ -1,2 +1,7 @@
5.019010
OP_TYPE_IS_OR_WAS # U
+do_open6 # F added by devel/scanprov
+do_open_raw # F added by devel/scanprov
+hv_auxinit_internal # F added by devel/scanprov
+openn_cleanup # F added by devel/scanprov
+openn_setup # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021001
index 89e38496d09..af9800541ab 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021001
@@ -1,4 +1,15 @@
5.021001
isUTF8_CHAR # U
markstack_grow # E (Perl_markstack_grow)
-PERL_UNUSED_RESULT # added by devel/scanprov
+WARN_EXPERIMENTAL__WIN32_PERLIO # E
+PERL_UNUSED_RESULT # M added by devel/scanprov
+add_above_Latin1_folds # F added by devel/scanprov
+construct_ahocorasick_from_trie # F added by devel/scanprov
+dump_c_backtrace # F added by devel/scanprov
+free_c_backtrace # F added by devel/scanprov
+get_c_backtrace # F added by devel/scanprov
+get_c_backtrace_dump # F added by devel/scanprov
+_is_cur_LC_category_utf8 # F added by devel/scanprov
+_is_in_locale_category # F added by devel/scanprov
+my_strerror # F added by devel/scanprov
+should_warn_nl # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021002
index abe5ac12465..ec97b0f529d 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021002
@@ -1,3 +1,8 @@
5.021002
grok_number_flags # U
op_sibling_splice # U
+PERL_SCAN_TRAILING # E
+WARN_MISSING # E
+WARN_REDUNDANT # E
+not_incrementable # F added by devel/scanprov
+sv_display # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021003
new file mode 100644
index 00000000000..a0f459f7f39
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021003
@@ -0,0 +1,2 @@
+5.021003
+clear_special_blocks # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021004
index 3a62526e13b..05a1b650a6a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021004
@@ -1,5 +1,14 @@
5.021004
+CALL_CHECKER_REQUIRE_GV # E
cv_set_call_checker_flags # U
grok_infnan # U
isinfnan # U
-sync_locale # U
+add_multi_match # F added by devel/scanprov
+cntrl_to_mnemonic # F added by devel/scanprov
+cv_undef_flags # F added by devel/scanprov
+gv_stashpvn_internal # F added by devel/scanprov
+gv_stashsvpvn_cached # F added by devel/scanprov
+Perl_cvgv_from_hek # F added by devel/scanprov
+put_charclass_bitmap_innards # F added by devel/scanprov
+put_code_point # F added by devel/scanprov
+quadmath_format_needed # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021005
index 2a02ad28b68..a4270833c20 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021005
@@ -1,4 +1,22 @@
5.021005
cv_name # A
+CV_NAME_NOTQUAL # E
newMETHOP # U
newMETHOP_named # U
+PERL_MAGIC_debugvar # E
+PERL_MAGIC_lvref # E
+SV_CATBYTES # E
+SV_CATUTF8 # E
+WARN_EXPERIMENTAL__REFALIASING # E
+assignment_type # F added by devel/scanprov
+gv_setref # F added by devel/scanprov
+isinfnansv # F added by devel/scanprov
+is_ssc_worth_it # F added by devel/scanprov
+magic_getdebugvar # F added by devel/scanprov
+magic_setdebugvar # F added by devel/scanprov
+magic_setlvref # F added by devel/scanprov
+newMETHOP_internal # F added by devel/scanprov
+op_relocate_sv # F added by devel/scanprov
+reg2Lanode # F added by devel/scanprov
+regnode_guts # F added by devel/scanprov
+tmps_grow_p # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021006
index fbefd16d47b..04ff79e9393 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021006
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021006
@@ -1,3 +1,12 @@
5.021006
+DOUBLEKIND # E
newDEFSVOP # U
op_convert_list # U
+WARN_LOCALE # E
+newXS_deffile # F added by devel/scanprov
+noperl_die # F added by devel/scanprov
+PerlIO_restore_errno # F added by devel/scanprov
+PerlIO_save_errno # F added by devel/scanprov
+Perl_xs_handshake # F added by devel/scanprov
+set_padlist # F added by devel/scanprov
+xs_boot_epilog # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021007
index 43aef21250b..4a3d4d0bbc1 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021007
@@ -1,6 +1,22 @@
5.021007
-OpHAS_SIBLING # U
-OpSIBLING # U
-PadnameUTF8 # E
is_invariant_string # U
+newPADNAMELIST # U
+newPADNAMEouter # U
+newPADNAMEpvn # U
newUNOP_AUX # E
+OpHAS_SIBLING # U
+OpSIBLING # U
+padnamelist_fetch # U
+PadnamelistREFCNT # U
+PadnamelistREFCNT_dec # U
+padnamelist_store # U
+PadnameREFCNT # U
+PadnameREFCNT_dec # U
+PADNAMEt_OUTER # E
+gv_fetchmeth_internal # F added by devel/scanprov
+opmethod_stash # F added by devel/scanprov
+pad_add_weakref # F added by devel/scanprov
+padname_dup # F added by devel/scanprov
+padnamelist_dup # F added by devel/scanprov
+Perl_padname_free # F added by devel/scanprov
+Perl_padnamelist_free # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021008
index 06633eebc67..61387edaec0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021008
@@ -1 +1,5 @@
5.021008
+sv_get_backrefs # U
+WARN_EXPERIMENTAL__CONST_ATTR # E
+WARN_EXPERIMENTAL__RE_STRICT # E
+_warn_problematic_locale # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021009
index 7397722a252..979825e0192 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021009
@@ -1 +1,11 @@
5.021009
+WARN_EXPERIMENTAL__BITWISE # E
+advance_one_SB # F added by devel/scanprov
+advance_one_WB # F added by devel/scanprov
+backup_one_SB # F added by devel/scanprov
+backup_one_WB # F added by devel/scanprov
+isGCB # F added by devel/scanprov
+isSB # F added by devel/scanprov
+isWB # F added by devel/scanprov
+multideref_stringify # F added by devel/scanprov
+my_bytes_to_utf8 # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021010
index 821a8fb6294..b86937f987a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021010
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5021010
@@ -1,2 +1,8 @@
5.021010
DECLARATION_FOR_LC_NUMERIC_MANIPULATION # E
+RESTORE_LC_NUMERIC # E
+STORE_LC_NUMERIC_FORCE_TO_UNDERLYING # E
+STORE_LC_NUMERIC_SET_TO_NEEDED # E
+grok_atoUV # F added by devel/scanprov
+regex_set_precedence # F added by devel/scanprov
+sv_only_taint_gmagic # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022002
new file mode 100644
index 00000000000..5a429a18c13
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022002
@@ -0,0 +1 @@
+5.022002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022003
new file mode 100644
index 00000000000..ad46f70f43e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022003
@@ -0,0 +1 @@
+5.022003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022004
new file mode 100644
index 00000000000..3974ff3e079
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5022004
@@ -0,0 +1 @@
+5.022004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023000
index e461a326691..50ed05a7db8 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023000
@@ -1 +1,8 @@
5.023000
+DOUBLEINFBYTES # E
+DOUBLEMANTBITS # E
+DOUBLENANBYTES # E
+LONGDBLINFBYTES # E
+LONGDBLMANTBITS # E
+LONGDBLNANBYTES # E
+NVMANTBITS # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023002
index 2060466c2ad..9d73a7f5533 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023002
@@ -1 +1,5 @@
5.023002
+UTF8_IS_NONCHAR # U
+UTF8_IS_SUPER # A
+UTF8_IS_SURROGATE # A
+UTF8_SKIP # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023004
index ce60a67e7aa..b38531392dd 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023004
@@ -1 +1,2 @@
5.023004
+skip_to_be_ignored_text # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023006
index f6c59949af8..2945414005c 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023006
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023006
@@ -1 +1,3 @@
5.023006
+_invlistEQ # F added by devel/scanprov
+_to_utf8_case # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023007
index fb7c55335da..08b692258a5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023007
@@ -1 +1,4 @@
5.023007
+advance_one_LB # F added by devel/scanprov
+backup_one_LB # F added by devel/scanprov
+isLB # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023008
index 91f61649612..a5480fcb0c0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023008
@@ -1,2 +1,25 @@
5.023008
clear_defarray # U
+cx_popblock # U
+cx_popeval # U
+cx_popformat # U
+cx_poploop # U
+cx_popsub # U
+cx_popsub_args # U
+cx_popsub_common # U
+cx_pushblock # U
+cx_pusheval # U
+cx_pushformat # U
+cx_pushloop_for # U
+cx_pushloop_plain # U
+cx_pushsub # U
+cx_topblock # U
+leave_adjust_stacks # U
+savetmps # U
+doeval_compile # F added by devel/scanprov
+edit_distance # F added by devel/scanprov
+handle_named_backref # F added by devel/scanprov
+handle_possible_posix # F added by devel/scanprov
+invlist_contents # F added by devel/scanprov
+put_charclass_bitmap_innards_common # F added by devel/scanprov
+put_charclass_bitmap_innards_invlist # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023009
index 336b09a3eea..cceca1d1a6e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5023009
@@ -1,5 +1,31 @@
5.023009
+isALPHANUMERIC_uvchr # U
+isALPHA_uvchr # U
+isASCII_uvchr # U
+isBLANK_uvchr # U
+isCNTRL_uvchr # U
+isDIGIT_uvchr # U
+isGRAPH_uvchr # U
+isIDCONT_uvchr # U
+isIDFIRST_uvchr # U
+isLOWER_uvchr # U
+isPRINT_uvchr # U
+isPSXSPC_uvchr # U
+isPUNCT_uvchr # U
+isSPACE_uvchr # U
+isUPPER_uvchr # U
+isWORDCHAR_uvchr # U
+isXDIGIT_uvchr # U
toFOLD_uvchr # U
toLOWER_uvchr # U
toTITLE_uvchr # U
toUPPER_uvchr # U
+invlist_clear # F added by devel/scanprov
+invlist_replace_list_destroys_src # F added by devel/scanprov
+Perl_dtrace_probe_call # F added by devel/scanprov
+Perl_dtrace_probe_load # F added by devel/scanprov
+Perl_dtrace_probe_op # F added by devel/scanprov
+Perl_dtrace_probe_phase # F added by devel/scanprov
+re_exec_indentf # F added by devel/scanprov
+re_indentf # F added by devel/scanprov
+re_printf # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024000
index 32870f99cef..2445a65cd81 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024000
@@ -1,68 +1,4 @@
5.024000
-BhkDISABLE # E
-BhkENABLE # E
-BhkENTRY_set # E
-MULTICALL # E
-PERL_SYS_TERM # E
-POP_MULTICALL # E
-PUSH_MULTICALL # E
-PadARRAY # E
-PadMAX # E
-PadlistARRAY # E
-PadlistMAX # E
-PadlistNAMES # E
-PadlistNAMESARRAY # E
-PadlistNAMESMAX # E
-PadnameLEN # E
-PadnamePV # E
-PadnameREFCNT # E
-PadnameREFCNT_dec # E
-PadnameSV # E
-PadnamelistARRAY # E
-PadnamelistMAX # E
-PadnamelistREFCNT # E
-PadnamelistREFCNT_dec # E
-RESTORE_LC_NUMERIC # E
-STORE_LC_NUMERIC_FORCE_TO_UNDERLYING # E
-STORE_LC_NUMERIC_SET_TO_NEEDED # E
-XS_APIVERSION_BOOTCHECK # E
-XS_EXTERNAL # E
-XS_INTERNAL # E
-XS_VERSION_BOOTCHECK # E
-XopDISABLE # E
-XopENABLE # E
-XopENTRY # E
-XopENTRYCUSTOM # E
-XopENTRY_set # E
-cophh_new_empty # E
-my_lstat # U (Perl_my_lstat)
-my_stat # U (Perl_my_stat)
-reentrant_free # U
-reentrant_init # U
-reentrant_retry # U
-reentrant_size # U
-ref # U (Perl_ref)
-sv_magic_portable # U
-sv_setref_pvs # A
-PERL_BCDVERSION # added by devel/scanprov
-PERL_MAGIC_glob # added by devel/scanprov
-PERL_MAGIC_mutex # added by devel/scanprov
-PERL_MAGIC_overload # added by devel/scanprov
-PERL_MAGIC_overload_elem # added by devel/scanprov
-PL_bufend # added by devel/scanprov
-PL_bufptr # added by devel/scanprov
-PL_copline # added by devel/scanprov
-PL_error_count # added by devel/scanprov
-PL_expect # added by devel/scanprov
-PL_in_my # added by devel/scanprov
-PL_in_my_stash # added by devel/scanprov
-PL_lex_state # added by devel/scanprov
-PL_lex_stuff # added by devel/scanprov
-PL_linestr # added by devel/scanprov
-PL_rsfp # added by devel/scanprov
-PL_rsfp_filters # added by devel/scanprov
-PL_tokenbuf # added by devel/scanprov
-WARN_ASSERTIONS # added by devel/scanprov
-aTHXR # added by devel/scanprov
-aTHXR_ # added by devel/scanprov
-dTHXR # added by devel/scanprov
+mem_log_alloc # F added by devel/scanprov
+mem_log_free # F added by devel/scanprov
+mem_log_realloc # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024001
new file mode 100644
index 00000000000..e5a806c61e7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024001
@@ -0,0 +1 @@
+5.024001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024002
new file mode 100644
index 00000000000..21641ad4695
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024002
@@ -0,0 +1 @@
+5.024002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024003
new file mode 100644
index 00000000000..e7ab7b66240
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024003
@@ -0,0 +1 @@
+5.024003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024004
new file mode 100644
index 00000000000..590396c4b5c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5024004
@@ -0,0 +1 @@
+5.024004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025000
new file mode 100644
index 00000000000..da02bb4f408
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025000
@@ -0,0 +1 @@
+5.025000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025001
new file mode 100644
index 00000000000..398001ba7ac
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025001
@@ -0,0 +1,2 @@
+5.025001
+op_parent # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025002
new file mode 100644
index 00000000000..03f1ade9795
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025002
@@ -0,0 +1,2 @@
+5.025002
+_mem_collxfrm # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025003
new file mode 100644
index 00000000000..583bf3e7325
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025003
@@ -0,0 +1,4 @@
+5.025003
+hv_bucket_ratio # U
+WARN_EXPERIMENTAL__DECLARED_REFS # E
+backup_one_GCB # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025004
new file mode 100644
index 00000000000..c1165b8c823
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025004
@@ -0,0 +1,4 @@
+5.025004
+alloc_LOGOP # F added by devel/scanprov
+croak_caller # F added by devel/scanprov
+print_collxfrm_input_and_return # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025005
new file mode 100644
index 00000000000..7b018cecff6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025005
@@ -0,0 +1,13 @@
+5.025005
+BOM_UTF8 # E
+isC9_STRICT_UTF8_CHAR # U
+isSTRICT_UTF8_CHAR # U
+isUTF8_CHAR_flags # U
+is_utf8_invariant_string # U
+is_utf8_valid_partial_char # U
+is_utf8_valid_partial_char_flags # U
+REPLACEMENT_CHARACTER_UTF8 # E
+UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE # E
+UTF8_WARN_ILLEGAL_C9_INTERCHANGE # E
+delimcpy_no_escape # F added by devel/scanprov
+is_utf8_cp_above_31_bits # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025006
new file mode 100644
index 00000000000..08c2bed7171
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025006
@@ -0,0 +1,22 @@
+5.025006
+is_c9strict_utf8_string # U
+is_c9strict_utf8_string_loc # U
+is_c9strict_utf8_string_loclen # U
+is_strict_utf8_string # U
+is_strict_utf8_string_loc # U
+is_strict_utf8_string_loclen # U
+is_utf8_fixed_width_buf_flags # U
+is_utf8_fixed_width_buf_loc_flags # U
+is_utf8_fixed_width_buf_loclen_flags # U
+is_utf8_string_flags # U
+is_utf8_string_loc_flags # U
+is_utf8_string_loclen_flags # U
+SvPVCLEAR # U
+sv_setpv_bufsize # U
+utf8n_to_uvchr_error # U
+_byte_dump_string # F added by devel/scanprov
+does_utf8_overflow # F added by devel/scanprov
+dump_regex_sets_structures # F added by devel/scanprov
+is_utf8_overlong_given_start_byte_ok # F added by devel/scanprov
+regcp_restore # F added by devel/scanprov
+unexpected_non_continuation_text # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025007
new file mode 100644
index 00000000000..2176720912f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025007
@@ -0,0 +1,6 @@
+5.025007
+CLEAR_ERRSV # E
+utf8_hop_back # U
+utf8_hop_forward # U
+utf8_hop_safe # U
+isFF_OVERLONG # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025008
new file mode 100644
index 00000000000..4ca9b583d71
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025008
@@ -0,0 +1,2 @@
+5.025008
+sv_set_undef # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025009
new file mode 100644
index 00000000000..71d2ac4a625
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025009
@@ -0,0 +1,41 @@
+5.025009
+isALPHA_LC_utf8_safe # U
+isALPHANUMERIC_LC_utf8_safe # U
+isALPHANUMERIC_utf8_safe # U
+isALPHA_utf8_safe # U
+isASCII_LC_utf8_safe # U
+isASCII_utf8_safe # U
+isBLANK_LC_utf8_safe # U
+isBLANK_utf8_safe # U
+isCNTRL_LC_utf8_safe # U
+isCNTRL_utf8_safe # U
+isDIGIT_LC_utf8_safe # U
+isDIGIT_utf8_safe # U
+isGRAPH_LC_utf8_safe # U
+isGRAPH_utf8_safe # U
+isIDCONT_LC_utf8_safe # U
+isIDCONT_utf8_safe # U
+isIDFIRST_LC_utf8_safe # U
+isIDFIRST_utf8_safe # U
+isLOWER_LC_utf8_safe # U
+isLOWER_utf8_safe # U
+isPRINT_LC_utf8_safe # U
+isPRINT_utf8_safe # U
+isPSXSPC_LC_utf8_safe # U
+isPSXSPC_utf8_safe # U
+isPUNCT_LC_utf8_safe # U
+isPUNCT_utf8_safe # U
+isSPACE_LC_utf8_safe # U
+isSPACE_utf8_safe # U
+isUPPER_LC_utf8_safe # U
+isUPPER_utf8_safe # U
+isWORDCHAR_LC_utf8_safe # U
+isWORDCHAR_utf8_safe # U
+isXDIGIT_LC_utf8_safe # U
+isXDIGIT_utf8_safe # U
+toFOLD_utf8_safe # U
+toLOWER_utf8_safe # U
+toTITLE_utf8_safe # U
+toUPPER_utf8_safe # U
+_force_out_malformed_utf8_message # F added by devel/scanprov
+warn_on_first_deprecated_use # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025010
new file mode 100644
index 00000000000..5f2b61556be
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025010
@@ -0,0 +1,5 @@
+5.025010
+op_class # E
+abort_execution # F added by devel/scanprov
+notify_parser_that_changed_to_utf8 # F added by devel/scanprov
+yyquit # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025011
new file mode 100644
index 00000000000..ebbab42d3dd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025011
@@ -0,0 +1 @@
+5.025011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025012 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025012
new file mode 100644
index 00000000000..c1d9e6324a2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5025012
@@ -0,0 +1 @@
+5.025012
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026000
new file mode 100644
index 00000000000..00a1a0d1e01
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026000
@@ -0,0 +1 @@
+5.026000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026001
new file mode 100644
index 00000000000..f6e8b9ffdcb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026001
@@ -0,0 +1 @@
+5.026001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026002
new file mode 100644
index 00000000000..b3537a4f489
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026002
@@ -0,0 +1 @@
+5.026002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026003
new file mode 100644
index 00000000000..6b87dfd09f9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5026003
@@ -0,0 +1 @@
+5.026003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027000
new file mode 100644
index 00000000000..fc48745eb82
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027000
@@ -0,0 +1 @@
+5.027000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027001
new file mode 100644
index 00000000000..a952cd14acf
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027001
@@ -0,0 +1,4 @@
+5.027001
+bytes_from_utf8_loc # U
+is_utf8_invariant_string_loc # U
+new_regcurly # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027002
new file mode 100644
index 00000000000..2ba94f4bbcf
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027002
@@ -0,0 +1,7 @@
+5.027002
+Perl_setlocale # U
+UTF8_DISALLOW_PERL_EXTENDED # E
+UTF8_WARN_PERL_EXTENDED # E
+hv_free_entries # F added by devel/scanprov
+print_bytes_for_locale # F added by devel/scanprov
+setlocale_debug_string # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027003
new file mode 100644
index 00000000000..b74f1c2e1a9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027003
@@ -0,0 +1,5 @@
+5.027003
+cv_get_call_checker_flags # U
+PL_sv_zero # E
+sv_string_from_errnum # U
+hv_pushkv # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027004
new file mode 100644
index 00000000000..e04e1f76421
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027004
@@ -0,0 +1,6 @@
+5.027004
+mg_freeext # U
+Perl_langinfo # U
+sv_rvunweaken # U
+Perl_my_mkstemp # F added by devel/scanprov
+save_to_buffer # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027005
new file mode 100644
index 00000000000..e36214c4c88
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027005
@@ -0,0 +1 @@
+5.027005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027006
new file mode 100644
index 00000000000..74a7516539d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027006
@@ -0,0 +1,10 @@
+5.027006
+my_strnlen # U
+wrap_keyword_plugin # U
+multiconcat_stringify # F added by devel/scanprov
+my_memrchr # F added by devel/scanprov
+my_nl_langinfo # F added by devel/scanprov
+optimize_op # F added by devel/scanprov
+optimize_optree # F added by devel/scanprov
+set_numeric_underlying # F added by devel/scanprov
+win32_setlocale # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027007
new file mode 100644
index 00000000000..b194b056e37
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027007
@@ -0,0 +1,4 @@
+5.027007
+WARN_SHADOW # E
+is_utf8_non_invariant_string # F added by devel/scanprov
+variant_under_utf8_count # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027008
new file mode 100644
index 00000000000..e4cea51f89a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027008
@@ -0,0 +1,33 @@
+5.027008
+cx_popgiven # U
+cx_popwhen # U
+cx_pushgiven # U
+cx_pushwhen # U
+newWHENOP # U
+WARN_EXPERIMENTAL__SCRIPT_RUN # E
+category_name # F added by devel/scanprov
+destroy_matcher # F added by devel/scanprov
+dopoptogivenfor # F added by devel/scanprov
+dopoptowhen # F added by devel/scanprov
+do_smartmatch # F added by devel/scanprov
+isSCRIPT_RUN # F added by devel/scanprov
+looks_like_bool # F added by devel/scanprov
+make_matcher # F added by devel/scanprov
+matcher_matches_sv # F added by devel/scanprov
+newGIVWHENOP # F added by devel/scanprov
+PerlLIO_dup2_cloexec # F added by devel/scanprov
+PerlLIO_dup_cloexec # F added by devel/scanprov
+PerlLIO_open3_cloexec # F added by devel/scanprov
+PerlLIO_open_cloexec # F added by devel/scanprov
+Perl_my_mkostemp # F added by devel/scanprov
+Perl_my_mkstemp_cloexec # F added by devel/scanprov
+PerlProc_pipe_cloexec # F added by devel/scanprov
+PerlSock_accept_cloexec # F added by devel/scanprov
+PerlSock_socket_cloexec # F added by devel/scanprov
+PerlSock_socketpair_cloexec # F added by devel/scanprov
+ref_array_or_hash # F added by devel/scanprov
+setfd_cloexec # F added by devel/scanprov
+setfd_cloexec_for_nonsysfd # F added by devel/scanprov
+setfd_cloexec_or_inhexec_by_sysfdness # F added by devel/scanprov
+setfd_inhexec # F added by devel/scanprov
+setfd_inhexec_for_sysfd # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027009
new file mode 100644
index 00000000000..a321803f388
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027009
@@ -0,0 +1,20 @@
+5.027009
+PERL_MAGIC_nonelem # E
+switch_to_global_locale # U
+sync_locale # E (Perl_sync_locale)
+thread_locale_init # U
+thread_locale_term # U
+utf8n_to_uvchr_msgs # U
+uvchr_to_utf8_flags_msgs # U
+WARN_EXPERIMENTAL__ALPHA_ASSERTIONS # E
+av_nonelem # F added by devel/scanprov
+emulate_setlocale # F added by devel/scanprov
+find_next_masked # F added by devel/scanprov
+find_span_end # F added by devel/scanprov
+find_span_end_mask # F added by devel/scanprov
+get_ANYOFM_contents # F added by devel/scanprov
+magic_setnonelem # F added by devel/scanprov
+new_msg_hv # F added by devel/scanprov
+restore_switched_locale # F added by devel/scanprov
+switch_category_locale_to_template # F added by devel/scanprov
+uvoffuni_to_utf8_flags_msgs # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027010
new file mode 100644
index 00000000000..8f82fa2a930
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027010
@@ -0,0 +1,2 @@
+5.027010
+init_named_cv # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027011
new file mode 100644
index 00000000000..bc2d22a3f20
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5027011
@@ -0,0 +1,4 @@
+5.027011
+init_uniprops # F added by devel/scanprov
+_inverse_folds # F added by devel/scanprov
+parse_uniprop_string # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5028000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5028000
new file mode 100644
index 00000000000..83f8de536ed
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5028000
@@ -0,0 +1 @@
+5.028000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5028001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5028001
new file mode 100644
index 00000000000..3a0bfa31909
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5028001
@@ -0,0 +1 @@
+5.028001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029000
new file mode 100644
index 00000000000..4b504bb9e24
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029000
@@ -0,0 +1,2 @@
+5.029000
+my_atof3 # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029001
new file mode 100644
index 00000000000..5beea241f7e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029001
@@ -0,0 +1,2 @@
+5.029001
+_utf8n_to_uvchr_msgs_helper # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029002
new file mode 100644
index 00000000000..53a13957626
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029002
@@ -0,0 +1,3 @@
+5.029002
+initialize_invlist_guts # F added by devel/scanprov
+is_invlist # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029003
new file mode 100644
index 00000000000..f426ffcd783
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029003
@@ -0,0 +1 @@
+5.029003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029004
new file mode 100644
index 00000000000..d1fa1e8c76d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029004
@@ -0,0 +1,3 @@
+5.029004
+change_engine_size # F added by devel/scanprov
+set_regex_pv # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029005
new file mode 100644
index 00000000000..5b26fa5f566
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029005
@@ -0,0 +1,2 @@
+5.029005
+output_posix_warnings # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029006
new file mode 100644
index 00000000000..7b374ce0c70
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029006
@@ -0,0 +1,2 @@
+5.029006
+argvout_final # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029007
new file mode 100644
index 00000000000..c5f295a41da
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029007
@@ -0,0 +1,2 @@
+5.029007
+foldEQ_latin1_s2_folded # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029008
new file mode 100644
index 00000000000..997168c68eb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029008
@@ -0,0 +1,6 @@
+5.029008
+handle_user_defined_property # F added by devel/scanprov
+traverse_op_tree # F added by devel/scanprov
+turkic_fc # F added by devel/scanprov
+turkic_lc # F added by devel/scanprov
+turkic_uc # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029009
new file mode 100644
index 00000000000..71e1ea4b6b7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029009
@@ -0,0 +1,9 @@
+5.029009
+newSVsv_flags # U
+newSVsv_nomg # U
+UTF8_SAFE_SKIP # U
+WARN_EXPERIMENTAL__PRIVATE_USE # E
+WARN_EXPERIMENTAL__UNIPROP_WILDCARDS # E
+WARN_EXPERIMENTAL__VLB # E
+get_and_check_backslash_N_name_wrapper # F added by devel/scanprov
+Perl_dup_warnings # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029010
new file mode 100644
index 00000000000..0c029797562
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5029010
@@ -0,0 +1,3 @@
+5.029010
+my_strtod # U
+Strtod # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5030000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5030000
new file mode 100644
index 00000000000..2860a428511
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5030000
@@ -0,0 +1 @@
+5.030000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031001
new file mode 100644
index 00000000000..4d4fe303f5b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031001
@@ -0,0 +1,2 @@
+5.031001
+lossless_NV_to_IV # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031002
new file mode 100644
index 00000000000..7a563709732
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031002
@@ -0,0 +1,3 @@
+5.031002
+G_RETHROW # E
+Perl_my_mkostemp_cloexec # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031003
new file mode 100644
index 00000000000..8f19afac58e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031003
@@ -0,0 +1,7 @@
+5.031003
+isALNUM_A # U
+parse_subsignature # U
+SANE_ERRSV # U
+STORE_LC_NUMERIC_SET_TO_NEEDED_IN # U
+WITH_LC_NUMERIC_SET_TO_NEEDED # E
+WITH_LC_NUMERIC_SET_TO_NEEDED_IN # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031004
new file mode 100644
index 00000000000..cd1085d9e86
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031004
@@ -0,0 +1,22 @@
+5.031004
+sv_2pvbyte_flags # U
+sv_2pvutf8_flags # U
+SvAMAGIC_off # U
+SvAMAGIC_on # U
+SvPVbyte_nomg # U
+SvPVbyte_or_null # U
+SvPVbyte_or_null_nomg # U
+SvPVutf8_nomg # U
+SvPVutf8_or_null # U
+SvPVutf8_or_null_nomg # U
+sv_utf8_downgrade_flags # U
+sv_utf8_downgrade_nomg # U
+get_regex_charset_name # F added by devel/scanprov
+is_utf8_char_helper # F added by devel/scanprov
+PadnameIN_SCOPE # F added by devel/scanprov
+Perl_POPMARK # F added by devel/scanprov
+Perl_ReANY # F added by devel/scanprov
+Perl_TOPMARK # F added by devel/scanprov
+to_uni_fold # F added by devel/scanprov
+utf8_to_uvchr_buf_helper # F added by devel/scanprov
+variant_byte_number # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031005
new file mode 100644
index 00000000000..fc93346e681
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031005
@@ -0,0 +1,23 @@
+5.031005
+gimme_V # U
+isALPHANUMERIC_utf8 # A
+isALPHA_utf8 # A
+isASCII_utf8 # A
+isBLANK_utf8 # A
+isCNTRL_utf8 # A
+isDIGIT_utf8 # A
+isGRAPH_utf8 # A
+isIDCONT_utf8 # A
+isIDFIRST_utf8 # A
+isLOWER_utf8 # A
+isPRINT_utf8 # A
+isPSXSPC_utf8 # A
+isPUNCT_utf8 # A
+isSPACE_utf8 # A
+isUPPER_utf8 # A
+isWORDCHAR_utf8 # A
+isXDIGIT_utf8 # A
+toFOLD_utf8 # A
+toLOWER_utf8 # A
+toTITLE_utf8 # A
+toUPPER_utf8 # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031006
new file mode 100644
index 00000000000..231cc5ccc49
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031006
@@ -0,0 +1,10 @@
+5.031006
+UTF8_CHK_SKIP # U
+do_trans_count_invmap # F added by devel/scanprov
+do_trans_invmap # F added by devel/scanprov
+invmap_dump # F added by devel/scanprov
+_is_utf8_FOO # F added by devel/scanprov
+_is_utf8_perl_idcont # F added by devel/scanprov
+_is_utf8_perl_idstart # F added by devel/scanprov
+make_exactf_invlist # F added by devel/scanprov
+sv_derived_from_svpvn # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031007
new file mode 100644
index 00000000000..b0206dce348
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031007
@@ -0,0 +1,13 @@
+5.031007
+csighandler # E (Perl_csighandler)
+csighandler1 # U
+csighandler3 # E
+perly_sighandler # E
+sv_isa_sv # U
+WARN_EXPERIMENTAL__ISA # E
+find_first_differing_byte_pos # F added by devel/scanprov
+invlist_lowest # F added by devel/scanprov
+is_grapheme # F added by devel/scanprov
+quadmath_format_valid # F added by devel/scanprov
+sighandler1 # F added by devel/scanprov
+sighandler3 # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031008
new file mode 100644
index 00000000000..7424595b838
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/base/5031008
@@ -0,0 +1,4 @@
+5.031008
+memCHRs # U
+grok_bin_oct_hex # F added by devel/scanprov
+output_non_portable # F added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc
index 40c8069d619..4bb864f1221 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/embed.fnc
@@ -1,43 +1,179 @@
: BEGIN{die "You meant to run regen/embed.pl"} # Stop early if fed to perl.
:
-: This file is processed by regen/embed.pl and autodoc.pl
-: It is used to declare the interfaces to the functions defined by perl. All
-: non-static functions must have entries here. Static functions need not, but
-: there is benefit to declaring them here, as it generally handles the thread
-: context parameter invisibly, as well as making sure a PERL_ARGS_ASSERT_foo
-: macro is defined, which can save you debugging time.
+: WARNING: The meanings of some flags have been changed as of v5.31.0
:
-: Lines are of the form:
-: flags|return_type|function_name|arg1|arg2|...|argN
+: This file is known to be processed by regen/embed.pl, autodoc.pl,
+: makedef.pl, Devel::PPPort, and porting/diag.t.
:
-: A line may be continued on another by ending it with a backslash.
+: This file contains entries for various functions and macros defined by perl.
+: Each entry includes the name, parameters, and various attributes about it.
+: In most functions listed here, the name is a short name, and the function's
+: real name is the short one, prefixed by either 'Perl_' (for publicly visible
+: functions) or 'S_' (for internal-to-a-file static ones). In many instances a
+: macro is defined that is the name in this file, and which expands to call the
+: real (full) name, with any appropriate thread context paramaters, thus hiding
+: that detail from the typical code.
+:
+: Most macros listed here are the complete full name.
+:
+: All non-static functions defined by perl need to be listed in this file.
+: embed.pl uses the entries here to construct:
+: 1) proto.h to declare to the compiler the function interfaces; and
+: 2) embed.h to create short name macros
+:
+: Static functions internal to a file need not appear here, but there is
+: benefit to declaring them here, as it generally handles the thread context
+: parameter invisibly, as well as making sure a PERL_ARGS_ASSERT_foo macro is
+: defined, which can save you debugging time.
+:
+: Lines in this file are of the form:
+: flags|return_type|name|arg1|arg2|...|argN
+:
+: 'flags' is a string of single letters. Most of the flags are meaningful only
+: to embed.pl; some only to autodoc.pl, and others only to makedef.pl. The
+: comments here mostly don't include how Devel::PPPort or diag.t use them:
+:
+: A function taking no parameters will have no 'arg' elements.
+: A line may be continued onto the next by ending it with a backslash.
: Leading and trailing whitespace will be ignored in each component.
:
+: Most entries here have a macro created with the entry name. This presents
+: name space collision potentials which haven't been well thought out, but are
+: now documented here. In practice this has rarely been an issue. At least,
+: with a macro, the XS author can #undef it, unlike a function.
+:
: The default without flags is to declare a function for internal perl-core use
-: only, not visible to XS code nor to Perl extensions. Use the A and E flags to
-: modify this. Most non-static functions should have the 'p' flag to avoid
-: namespace clashes with programs that embed perl.
+: only. The short name is visible only when the PERL_CORE symbol is defined.
+: On some platforms, such as Linux and Darwin, all non-static functions
+: are currently externally visible. Because of this, and also for programs
+: that embed perl, most non-static functions should have the 'p' flag to avoid
+: namespace clashes.
+:
+: There are several advantages to using a macro instead of the full Perl_foo or
+: S_foo form: it hides the need to know if the called function requires a
+: thread context parameter or not, and the code using it is more readable
+: because of fewer parameters being visible. And if there is some bug in it
+: that gets fixed in a later release, ppport.h can be changed to automatically
+: backport the fixed version to modules. The only disadvantage khw can think
+: of is the namespace pollution one.
+:
+: Since we don't require a C compiler to support variadic macros (C99), the
+: macros can't be generated in such situations.
+:
+: WARNING: Any macro created in a header file is visible to XS code, unless
+: care is taken to wrap it within something like #ifdef PERL_CORE..#endif.
+: This has had to be done with things like MAX and MIN, but nearly everything
+: else has been created without regard to the namespace pollution problem.
+:
+: Here's what else you need to know about using this file with regards to name
+: space pollution:
+:
+: The A flag is used to make a function and its short name visible everywhere
+: on all platforms. This should be used to make it part of Perl's
+: API contract with XS developers. The documentation for these is
+: usually placed in perlapi. If no documentation exists, that fact
+: is also noted in perlapi.
+:
+: The C flag is used instead for functions and their short names that need to
+: be accessible everywhere, typically because they are called from a
+: publicly available macro or inline function, but they are not for
+: public use by themselves. The documentation for these is placed
+: in perlintern. If no documentation exists, that fact is also
+: noted in perlintern.
+:
+: These really need the 'p' flag to avoid name space collisions.
+:
+: Some of these have been constructed so that the wrapper macro
+: names begin with an underscore to lessen the chances of a name
+: collision. However, this is contrary to the C standard, and those
+: should be changed.
+:
+: The E flag is used instead for a function and its short name that is supposed
+: to be used only in the core, and in extensions compiled with the
+: PERL_EXT symbol defined. Again, on some platforms, the function
+: will be visible everywhere, so the 'p' flag is generally needed.
+: Also note that an XS writer can always cheat and pretend to be an
+: extension by #defining PERL_EXT.
+:
+: The X flag is similar to the C flag in that the function (whose entry better
+: have the 'p' flag) is accessible everywhere on all platforms.
+: However the short name macro that normally gets generated is
+: suppressed outside the core. (Except it is also visible in
+: PERL_EXT extensions if the E flag is also specified.) This flag
+: is used for functions that are called from a public macro, the
+: name of which isn't derived from the function name. You'll have
+: to write the macro yourself, and from within it, refer to the
+: function in its full 'Perl_' form with any necessary thread
+: context parameter.
+:
+: Scattered around the perl source are lines of the form:
+:
+: =for apidoc name
+:
+: followed by pod for that function. The purpose of these is to tell
+: autodoc.pl where the documentation is for a function listed in this file. It
+: uses the prototype from here and the pod from there in generating the
+: documentation in perlapi or perlintern. The entries in this file that have
+: corresponding '=for apidoc' entries should have the 'd' flag set in this
+: file.
+:
+: There are also lines of this form scattered around:
:
-: flags are single letters with following meanings:
+: =for apidoc flags|return_type|name|arg1|arg2|...|argN
:
-: A Available fully everywhere (usually part of the public API):
+: and with the same meanings as the lines in this file. These are for
+: documenting macros. The 'name' in any such line must not be the same as any
+: in this file (i.e., no redundant definitions), and one of the flags must be
+: 'm', indicating it is a macro. The lines following these are pod for the
+: respective macro. Since these are macros, the arguments need not be legal C
+: parameters. To indicate this to downstream software that inspects these
+: lines, there are a few conventions:
+: type should be the entire argument name if it names a type
+: cast should be the entire argument name if it is a cast
+: SP should be the entire argument name if it is the stack pointer SP
+: block should be the entire argument name if it is a C brace-enclosed block
:
-: add entry to the list of exported symbols (unless x or m);
-: any doc entry goes in perlapi.pod rather than perlintern.pod. If no
-: documentation is furnished for this function, and M is also
-: specified, the function is not listed as part of the public API.
-: If M isn't specified, and no documentation is furnished, the
-: function is listed in perlapi as existing and being undocumented
-: makes '#define foo Perl_foo' scope not just for PERL_CORE/PERL_EXT
+: The letters above are exact. For example, you have to have 't', 'y', 'p',
+: and 'e' literally. Here is an example:
+: =for apidoc Am|void|Newxc|void* ptr|int nitems|type|cast
:
-: If the function is only exported for use in a public
-: macro, see X.
+: Additionally, an argument can be some word(s) enclosed in double quotes to
+: indicate that it has to be a string, instead of a const char * const, like this
+: =for apidoc Ama|SV*|newSVpvs|"string"
:
-: a Allocates memory a la malloc/calloc. Also implies "R".
-: This should only be on functions which returns 'empty' memory
-: which has no other pointers to it, and which does not contain
-: any pointers to other things. So for example realloc() can't be
-: 'a'.
+: If any argument or return value is not one of the above, and isn't a legal C
+: language one, the 'u' flag should be specified.
+:
+: Again, autodoc uses these lines to construct perlapi. 'return_type' in these
+: lines can be empty, unlike in this file.
+:
+: Devel::PPPort also looks at both this file and the '=for apidoc' lines. In
+: part it is to construct lists of functions that are or are not backported.
+:
+: makedef.pl uses this file for constructing the export list which lists the
+: symbols that should be available on all platforms.
+:
+: porting/diag.t checks some things for consistency based on this file.
+:
+: The remainder of these introductory comments detail all the possible flags:
+:
+: A Both long and short names are accessible fully everywhere (usually part
+: of the public API). If the function is not part of the public API,
+: instead use C, E, or X.
+:
+: add entry to the list of symbols available on all platforms
+: unless e or m are also specified;
+: any doc entry goes in perlapi.pod rather than perlintern.pod. If
+: there isn't a doc entry, autodoc.pl lists this in perlapi as
+: existing and being undocumented; unless x is also specified, in
+: which case it simply isn't listed.
+: makes the short name defined for everywhere, not just for
+: PERL_CORE/PERL_EXT
+:
+: a Allocates memory a la malloc/calloc. Also implies "R". This flag
+: should only be on a function which returns 'empty' memory which has no
+: other pointers to it, and which does not contain any pointers to other
+: things. So for example realloc() can't be 'a'.
:
: proto.h: add __attribute__malloc__
:
@@ -45,93 +181,167 @@
: kept only to not have to change legacy applications that call them. If
: there are no such legacy applications in a Perl installation for all
: functions flagged with this, the installation can run Configure with the
-: -Accflags='-DNO_MATHOMS' parameter to not even compile them. If there
-: is a macro form of this function that provides equivalent functionality
-: (using a different implementation), also specify the 'm' flag. The 'b'
-: functions are normally moved to mathoms.c, but if circumstances dictate
-: otherwise, they can be anywhere, provided the whole function is wrapped
-: with
-: #ifndef NO_MATHOMS
-: ...
-: #endif
+: -Accflags='-DNO_MATHOMS' parameter to not even compile them.
+:
+: Sometimes the function has been subsumed by a more general one (say, by
+: adding a flags parameter), and a macro exists with the original short
+: name API, and it calls the new function, bypassing this one, and the
+: original 'Perl_' form is being deprecated. In this case also specify
+: the 'M' flag.
+:
+: Without the M flag, these functions should be deprecated, and it is an
+: error to not also specify the 'D' flag.
+:
+: The 'b' functions are normally moved to mathoms.c, but if circumstances
+: dictate otherwise, they can be anywhere, provided the whole function is
+: wrapped with
+: #ifndef NO_MATHOMS
+: ...
+: #endif
:
: Note that this flag no longer automatically adds a 'Perl_' prefix to the
: name. Additionally specify 'p' to do that.
:
-: For functions, like wrappers, whose macro shortcut doesn't call the
-: function, but which, for whatever reason, aren't considered legacy-only,
-: use the 'o' flag
-:
: This flag effectively causes nothing to happen if the perl interpreter
-: is compiled with -DNO_MATHOMS; otherwise these happen:
-: add entry to the list of exported symbols;
+: is compiled with -DNO_MATHOMS (which causes any functions with this flag
+: to not be compiled); otherwise these happen:
+: add entry to the list of symbols available on all platforms;
: create PERL_ARGS_ASSERT_foo;
-: add embed.h entry (unless overridden by the 'm' flag)
+: add embed.h entry (unless overridden by the 'M' or 'o' flags)
+:
+: C Intended for core use only. This indicates to XS writers that they
+: shouldn't be using this function. Devel::PPPort informs them of this,
+: for example. Some functions have to be accessible everywhere even if
+: they are not intended for public use. An example is helper functions
+: that are called from inline ones that are publicly available.
+:
+: add entry to the list of symbols available on all platforms
+: unless e or m are also specified;
+: any doc entry goes in perlintern.pod rather than perlapi.pod. If
+: there isn't a doc entry, autodoc.pl lists this in perlintern as
+: existing and being undocumented
+: makes the short name defined for everywhere, not just for
+: PERL_CORE/PERL_EXT
:
: D Function is deprecated:
:
: proto.h: add __attribute__deprecated__
+: autodoc.pl adds a note to this effect in the doc entry
:
: d Function has documentation (somewhere) in the source:
:
-: enables 'no docs for foo" warning in autodoc.pl
+: enables 'no docs for foo" warning in autodoc.pl if the documentation
+: isn't found.
:
: E Visible to extensions included in the Perl core:
:
: in embed.h, change "#ifdef PERL_CORE"
: into "#if defined(PERL_CORE) || defined(PERL_EXT)"
:
-: To be usable from dynamically loaded extensions, either:
-: 1) must be static to its containing file ("i" or "s" flag); or
+: To be usable from dynamically loaded extensions, either:
+: 1) it must be static to its containing file ("i" or "s" flag); or
: 2) be combined with the "X" flag.
:
+: e Not exported
+:
+: suppress entry in the list of symbols available on all platforms
+:
: f Function takes a format string. If the function name =~ qr/strftime/
-: then its assumed to take a strftime-style format string as 1st arg;
-: otherwise it's assumed to be a printf style format string, varargs
+: then it is assumed to take a strftime-style format string as the 1st
+: arg; otherwise it's assumed to be a printf style format string, varargs
: (hence any entry that would otherwise go in embed.h is suppressed):
:
: proto.h: add __attribute__format__ (or ...null_ok__)
:
-: i Static inline: function in source code has a S_ prefix:
+: G Suppress empty PERL_ARGS_ASSERT_foo macro. Normally such a macro is
+: generated for all entries for functions 'foo' in this file. If there is
+: a pointer argument to 'foo', it needs to be declared in this file as
+: either NN or NULLOK, and the function definition must call its
+: corresponding PERL_ARGS_ASSERT_foo macro (a porting test ensures this)
+: which asserts at runtime (under DEBUGGING builds) that NN arguments are
+: not NULL. If there aren't NN arguments, use of this macro is optional.
+: Rarely, a function will define its own PERL_ARGS_ASSERT_foo macro, and
+: in those cases, adding this flag to its entry in this file will suppress
+: the normal one. It is not possible to suppress the generated macro if
+: it isn't optional, that is, if there is at least one NN argument.
:
-: proto.h: function is declared as S_foo rather than foo unless the 'p'
-: flag is also given in which case 'Perl_foo' is used,
-: PERL_STATIC_INLINE is added to declaration;
-: embed.h: "#define foo S_foo" or Perl_foo entries added
+: proto.h: PERL_ARGS_ASSERT macro is not defined unless the function
+: has NN arguments
:
-: M May change:
+: h Hide any documentation. This is used when the documentation is atypical
+: of the rest of perlapi and perlintern. In other words the item is
+: documented, but just not the standard way. One reason would be if there
+: are a bunch of macros which follow a common paradigm in their naming, so
+: rather than having an entry for each slight variation, there is an
+: overarchinge one. It is also used when the documentation is in another
+: pod, such as perlguts or warnings.h. This flag is useful for downstream
+: programs, such as Devel::PPPort.
:
-: any doc entry is marked that function may change. Also used to
-: suppress making a doc entry if it would just be a placeholder.
+: i inline static. This is used for functions that the compiler is being
+: requested to inline. If the function is in a header file its
+: definition will be visible (unless guarded by #if..#endif) to all
+: XS code. (A typical guard will be that it is being included in a
+: particular C file(s) or in the perl core.) Therefore, all
+: non-guarded function should also have the 'p' flag specified to avoid
+: polluting the XS code name space. Otherwise an error is generated if
+: the 'S' flag is not also specified.
:
-: m Implemented as a macro:
+: proto.h: function is declared as PERL_STATIC_INLINE
:
-: suppress proto.h entry unless 'b' also specified (actually, not
-: suppressed, but commented out)
-: suppress entry in the list of exported symbols
-: suppress embed.h entry
+: m Implemented as a macro; there is no function associated with this name,
+: and hence no long Perl_ or S_ name. However, if the macro name itself
+: begins with 'Perl_', autodoc.pl will show a thread context parameter
+: unless the 'T' flag is specified.
:
-: n Has no implicit interpreter/thread context argument:
+: suppress proto.h entry (actually, not suppressed, but commented out)
+: suppress entry in the list of exported symbols available on all platforms
+: suppress embed.h entry, as the implementation should furnish the macro
:
-: suppress the pTHX part of "foo(pTHX...)" in proto.h;
-: In the PERL_IMPLICIT_SYS branch of embed.h, generates
-: "#define foo Perl_foo", rather than
-: "#define foo(a,b,c) Perl_foo(aTHX_ a,b,c)
+: M The implementation is furnishing its own macro instead of relying on the
+: default short name macro that simply expands to call the real name
+: function. This is used if the parameters need to be cast from what the
+: caller has, or if there is a macro that bypasses this function (whose
+: long name is being retained for backward compatibility for those who
+: call it with that name). An example is when a new function is created
+: with an extra parameter and a wrapper macro is added that has the old
+: API, but calls the new one with the exta parameter set to a default.
+:
+: This flag requires the 'p' flag to be specified, as there would be no
+: need to do this if the function weren't publicly accessible before.
+:
+: The entry is processed based on the other flags, but the:
+: embed.h entry is suppressed
+:
+: N The name in the entry isn't strictly a name
+:
+: Normally, the name of the function or macro must contain all \w
+: characters, and a warning is raised otherwise. This flag suppresses
+: that warning, so that weird things can be documented
+:
+: n Has no arguments (used only in =for apidoc entries)
+:
+: The macro (it can't be a function) is used without any parameters nor
+: empty parentheses.
:
: O Has a perl_ compatibility macro.
:
-: The really OLD name for API funcs
+: The really OLD name for API funcs.
+:
+: autodoc.pl adds a note that the perl_ form of this function is
+: deprecated.
:
: o Has no Perl_foo or S_foo compatibility macro:
:
-: This can be used when you define a macro with this entry's name that
-: doesn't call the function specified by this entry. This is typically
-: done for a function that effectively just wraps another one, and where
-: the macro form calls the underlying function directly. For these, also
-: specify the 'm' flag. Legacy-only functions should instead use 'b'.
+: This is used for whatever reason to force the function to be called
+: with the long name. Perhaps there is a varargs issue. Use the 'M'
+: flag instead for wrapper macros, and legacy-only functions should
+: also use 'b'.
:
: embed.h: suppress "#define foo Perl_foo"
:
+: autodoc.pl adds a note that this function must be explicitly called as
+: Perl_$name with an aTHX_ parameter.
+:
: P Pure function:
:
: A pure function has no effects except the return value, and the return
@@ -158,21 +368,44 @@
:
: R Return value must not be ignored (also implied by 'a' and 'P' flags):
:
+: gcc has a bug (which they claim is a feature) in which casting the
+: result of one of these to (void) doesn't silence the warning that the
+: result is ignored.
+:
: proto.h: add __attribute__warn_unused_result__
:
: r Function never returns:
:
: proto.h: add __attribute__noreturn__
:
-: s Static function: function in source code has a S_ prefix:
+: S Static function: function in source code has a S_ prefix:
:
: proto.h: function is declared as S_foo rather than foo,
: STATIC is added to declaration;
: embed.h: "#define foo S_foo" entries added
:
-: U Suppress usage example in autogenerated documentation
+: s autodoc.pl adds a terminating semi-colon to the usage example in the
+: documentation.
:
-: (currently no effect)
+: T Has no implicit interpreter/thread context argument:
+:
+: suppress the pTHX part of "foo(pTHX...)" in proto.h;
+: In the PERL_IMPLICIT_SYS branch of embed.h, generates
+: "#define foo Perl_foo", rather than
+: "#define foo(a,b,c) Perl_foo(aTHX_ a,b,c)
+:
+: u The macro's (it has to be a macro) return value or parameters are
+: unorthodox, and aren't in the list above of recognized weird ones. For
+: example, they aren't C parameters, or the macro expands to something
+: that isn't a symbol.
+:
+: For example, the expansion of STR_WITH_LEN is a comma separated pair of
+: values, so would have this flag; or some macros take preprocessor
+: tokens, so would have this flag. This flag is an indication to
+: downstream tools, such as Devel::PPPort, that this requires special
+: handling.
+:
+: U autodoc.pl will not output a usage example
:
: W Add a _pDEPTH argument to function prototypes, and an _aDEPTH
: argument to the function calls. This means that under DEBUGGING
@@ -183,29 +416,30 @@
:
: X Explicitly exported:
:
-: add entry to the list of exported symbols, unless x or m
+: add entry to the list of symbols available on all platforms, unless e
+: or m
:
: This is often used for private functions that are used by public
: macros. In those cases the macros must use the long form of the
: name (Perl_blah(aTHX_ ...)).
:
-: x Not exported
+: x Experimental, may change:
:
-: suppress entry in the list of exported symbols
+: any doc entry is marked that it may change. Also used to suppress
+: making a perlapi doc entry if it would just be a placeholder.
:
-: (see also L<perlguts/Internal Functions> for those flags.)
+: In this file, pointer parameters that must not be passed NULLs should be
+: prefixed with NN.
:
-: Pointer parameters that must not be passed NULLs should be prefixed with NN.
+: And, pointer parameters that may be NULL should be prefixed with NULLOK.
+: This has no effect on output yet. It's a notation for the maintainers to
+: know "I have defined whether NULL is OK or not" rather than having neither
+: NULL or NULLOK, which is ambiguous.
:
-: Pointer parameters that may be NULL should be prefixed with NULLOK. This has
-: no effect on output yet. It's a notation for the maintainers to know "I have
-: defined whether NULL is OK or not" rather than having neither NULL or NULLOK,
-: which is ambiguous.
-:
-: Individual flags may be separated by whitespace.
+: Individual flags may be separated by non-tab whitespace.
#if defined(PERL_IMPLICIT_SYS)
-Ano |PerlInterpreter*|perl_alloc_using \
+ATo |PerlInterpreter*|perl_alloc_using \
|NN struct IPerlMem *ipM \
|NN struct IPerlMem *ipMS \
|NN struct IPerlMem *ipMP \
@@ -216,18 +450,18 @@ Ano |PerlInterpreter*|perl_alloc_using \
|NN struct IPerlSock *ipS \
|NN struct IPerlProc *ipP
#endif
-Anod |PerlInterpreter* |perl_alloc
-Anod |void |perl_construct |NN PerlInterpreter *my_perl
-Anod |int |perl_destruct |NN PerlInterpreter *my_perl
-Anod |void |perl_free |NN PerlInterpreter *my_perl
-Anod |int |perl_run |NN PerlInterpreter *my_perl
-Anod |int |perl_parse |NN PerlInterpreter *my_perl|XSINIT_t xsinit \
+ATod |PerlInterpreter* |perl_alloc
+ATod |void |perl_construct |NN PerlInterpreter *my_perl
+ATod |int |perl_destruct |NN PerlInterpreter *my_perl
+ATod |void |perl_free |NN PerlInterpreter *my_perl
+ATod |int |perl_run |NN PerlInterpreter *my_perl
+ATod |int |perl_parse |NN PerlInterpreter *my_perl|XSINIT_t xsinit \
|int argc|NULLOK char** argv|NULLOK char** env
-AnpR |bool |doing_taint |int argc|NULLOK char** argv|NULLOK char** env
+ATpR |bool |doing_taint |int argc|NULLOK char** argv|NULLOK char** env
#if defined(USE_ITHREADS)
-Anod |PerlInterpreter*|perl_clone|NN PerlInterpreter *proto_perl|UV flags
+ATod |PerlInterpreter*|perl_clone|NN PerlInterpreter *proto_perl|UV flags
# if defined(PERL_IMPLICIT_SYS)
-Ano |PerlInterpreter*|perl_clone_using \
+ATo |PerlInterpreter*|perl_clone_using \
|NN PerlInterpreter *proto_perl \
|UV flags \
|NN struct IPerlMem* ipM \
@@ -242,20 +476,20 @@ Ano |PerlInterpreter*|perl_clone_using \
# endif
#endif
-Aanop |Malloc_t|malloc |MEM_SIZE nbytes
-Aanop |Malloc_t|calloc |MEM_SIZE elements|MEM_SIZE size
-ARnop |Malloc_t|realloc |Malloc_t where|MEM_SIZE nbytes
-Anop |Free_t |mfree |Malloc_t where
+AaTophd |Malloc_t|malloc |MEM_SIZE nbytes
+AaTophd |Malloc_t|calloc |MEM_SIZE elements|MEM_SIZE size
+ARTophd |Malloc_t|realloc |Malloc_t where|MEM_SIZE nbytes
+ATop |Free_t |mfree |Malloc_t where
#if defined(MYMALLOC)
-npR |MEM_SIZE|malloced_size |NN void *p
-npR |MEM_SIZE|malloc_good_size |size_t nbytes
+TpR |MEM_SIZE|malloced_size |NN void *p
+TpR |MEM_SIZE|malloc_good_size |size_t nbytes
#endif
#if defined(PERL_IN_MALLOC_C)
-sn |int |adjust_size_and_find_bucket |NN size_t *nbytes_p
+ST |int |adjust_size_and_find_bucket |NN size_t *nbytes_p
#endif
-AnpR |void* |get_context
-Anp |void |set_context |NN void *t
+ATpR |void* |get_context
+ATp |void |set_context |NN void *t
XEop |bool |try_amagic_bin |int method|int flags
XEop |bool |try_amagic_un |int method|int flags
@@ -270,7 +504,7 @@ Apd |OP* |op_linklist |NN OP *o
Apd |OP* |op_prepend_elem|I32 optype|NULLOK OP* first|NULLOK OP* last
: FIXME - this is only called by pp_chown. They should be merged.
p |I32 |apply |I32 type|NN SV** mark|NN SV** sp
-ApM |void |apply_attrs_string|NN const char *stashpv|NN CV *cv|NN const char *attrstr|STRLEN len
+Apx |void |apply_attrs_string|NN const char *stashpv|NN CV *cv|NN const char *attrstr|STRLEN len
Apd |void |av_clear |NN AV *av
Apd |SV* |av_delete |NN AV *av|SSize_t key|I32 flags
ApdR |bool |av_exists |NN AV *av|SSize_t key
@@ -284,21 +518,21 @@ ApdR |SSize_t|av_len |NN AV *av
ApdR |AV* |av_make |SSize_t size|NN SV **strp
p |SV* |av_nonelem |NN AV *av|SSize_t ix
Apd |SV* |av_pop |NN AV *av
-ApdoxM |void |av_create_and_push|NN AV **const avp|NN SV *const val
+Apdoex |void |av_create_and_push|NN AV **const avp|NN SV *const val
Apd |void |av_push |NN AV *av|NN SV *val
: Used in scope.c, and by Data::Alias
EXp |void |av_reify |NN AV *av
ApdR |SV* |av_shift |NN AV *av
Apd |SV** |av_store |NN AV *av|SSize_t key|NULLOK SV *val
-AidR |SSize_t|av_top_index |NN AV *av
-AmpdR |SSize_t|av_tindex |NN AV *av
+AidRp |SSize_t|av_top_index |NN AV *av
+AmdR |SSize_t|av_tindex |NN AV *av
Apd |void |av_undef |NN AV *av
-ApdoxM |SV** |av_create_and_unshift_one|NN AV **const avp|NN SV *const val
+Apdoex |SV** |av_create_and_unshift_one|NN AV **const avp|NN SV *const val
Apd |void |av_unshift |NN AV *av|SSize_t num
Apo |SV** |av_arylen_p |NN AV *av
Apo |IV* |av_iter_p |NN AV *av
#if defined(PERL_IN_AV_C)
-s |MAGIC* |get_aux_mg |NN AV *av
+S |MAGIC* |get_aux_mg |NN AV *av
#endif
: Used in perly.y
pR |OP* |bind_match |I32 type|NN OP *left|NN OP *right
@@ -307,7 +541,7 @@ ApdR |OP* |block_end |I32 floor|NULLOK OP* seq
ApR |U8 |block_gimme
: Used in perly.y
ApdR |int |block_start |int full
-Aodp |void |blockhook_register |NN BHK *hk
+Aodxp |void |blockhook_register |NN BHK *hk
: Used in perl.c
p |void |boot_core_UNIVERSAL
: Used in perl.c
@@ -317,10 +551,10 @@ Apd |const PERL_CONTEXT * |caller_cx|I32 level \
|NULLOK const PERL_CONTEXT **dbcxp
: Used in several source files
pR |bool |cando |Mode_t mode|bool effective|NN const Stat_t* statbufp
-ApRn |U32 |cast_ulong |NV f
-ApRn |I32 |cast_i32 |NV f
-ApRn |IV |cast_iv |NV f
-ApRn |UV |cast_uv |NV f
+ApRT |U32 |cast_ulong |NV f
+ApRT |I32 |cast_i32 |NV f
+ApRT |IV |cast_iv |NV f
+ApRT |UV |cast_uv |NV f
#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
ApR |I32 |my_chsize |int fd|Off_t length
#endif
@@ -329,60 +563,62 @@ p |const COP*|closest_cop |NN const COP *cop|NULLOK const OP *o \
: Used in perly.y
ApdR |OP* |op_convert_list |I32 optype|I32 flags|NULLOK OP* o
: Used in op.c and perl.c
-pM |void |create_eval_scope|NULLOK OP *retop|U32 flags
+px |void |create_eval_scope|NULLOK OP *retop|U32 flags
Aprd |void |croak_sv |NN SV *baseex
: croak()'s first parm can be NULL. Otherwise, mod_perl breaks.
Afprd |void |croak |NULLOK const char* pat|...
Aprd |void |vcroak |NULLOK const char* pat|NULLOK va_list* args
-Anprd |void |croak_no_modify
-Anprd |void |croak_xs_usage |NN const CV *const cv \
+ATprd |void |croak_no_modify
+ATprd |void |croak_xs_usage |NN const CV *const cv \
|NN const char *const params
-npr |void |croak_no_mem
-nprX |void |croak_popstack
-fnrp |void |croak_caller|NULLOK const char* pat|...
-fnprx |void |noperl_die|NN const char* pat|...
+Tpr |void |croak_no_mem
+TprX |void |croak_popstack
+fTrp |void |croak_caller|NULLOK const char* pat|...
+fTpre |void |noperl_die|NN const char* pat|...
#if defined(WIN32)
-norx |void |win32_croak_not_implemented|NN const char * fname
+Tore |void |win32_croak_not_implemented|NN const char * fname
#endif
#if defined(PERL_IMPLICIT_CONTEXT)
-Afnrp |void |croak_nocontext|NULLOK const char* pat|...
-Afnrp |OP* |die_nocontext |NULLOK const char* pat|...
-Afnp |void |deb_nocontext |NN const char* pat|...
-Afnp |char* |form_nocontext |NN const char* pat|...
-Anp |void |load_module_nocontext|U32 flags|NN SV* name|NULLOK SV* ver|...
-Afnp |SV* |mess_nocontext |NN const char* pat|...
-Afnp |void |warn_nocontext |NN const char* pat|...
-Afnp |void |warner_nocontext|U32 err|NN const char* pat|...
-Afnp |SV* |newSVpvf_nocontext|NN const char *const pat|...
-Afnp |void |sv_catpvf_nocontext|NN SV *const sv|NN const char *const pat|...
-Afnp |void |sv_setpvf_nocontext|NN SV *const sv|NN const char *const pat|...
-Afnp |void |sv_catpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
-Afnp |void |sv_setpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
-Abfnp |int |fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
-Abfnp |int |printf_nocontext|NN const char *format|...
+AfTrp |void |croak_nocontext|NULLOK const char* pat|...
+AfTrp |OP* |die_nocontext |NULLOK const char* pat|...
+AfTp |void |deb_nocontext |NN const char* pat|...
+AfTp |char* |form_nocontext |NN const char* pat|...
+ATp |void |load_module_nocontext|U32 flags|NN SV* name|NULLOK SV* ver|...
+AfTp |SV* |mess_nocontext |NN const char* pat|...
+AfTp |void |warn_nocontext |NN const char* pat|...
+AfTp |void |warner_nocontext|U32 err|NN const char* pat|...
+AfTp |SV* |newSVpvf_nocontext|NN const char *const pat|...
+AfTp |void |sv_catpvf_nocontext|NN SV *const sv|NN const char *const pat|...
+AfTp |void |sv_setpvf_nocontext|NN SV *const sv|NN const char *const pat|...
+AfTp |void |sv_catpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
+AfTp |void |sv_setpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
+AbfTpD |int |fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
+AbfTpD |int |printf_nocontext|NN const char *format|...
#endif
: Used in pp.c
-p |SV * |core_prototype |NULLOK SV *sv|NN const char *name \
+pd |SV * |core_prototype |NULLOK SV *sv|NN const char *name \
|const int code|NULLOK int * const opnum
: Used in gv.c
p |OP * |coresub_op |NN SV *const coreargssv|const int code \
|const int opnum
: Used in sv.c
-EMXp |void |cv_ckproto_len_flags |NN const CV* cv|NULLOK const GV* gv\
+ExXp |void |cv_ckproto_len_flags |NN const CV* cv|NULLOK const GV* gv\
|NULLOK const char* p|const STRLEN len \
|const U32 flags
: Used in pp.c and pp_sys.c
ApdR |SV* |gv_const_sv |NN GV* gv
-ApdRn |SV* |cv_const_sv |NULLOK const CV *const cv
-pRn |SV* |cv_const_sv_or_av|NULLOK const CV *const cv
+ApdRT |SV* |cv_const_sv |NULLOK const CV *const cv
+pRT |SV* |cv_const_sv_or_av|NULLOK const CV *const cv
Apd |SV * |cv_name |NN CV *cv|NULLOK SV *sv|U32 flags
Apd |void |cv_undef |NN CV* cv
p |void |cv_undef_flags |NN CV* cv|U32 flags
-p |void |cv_forget_slab |NULLOK CV *cv
+pd |void |cv_forget_slab |NULLOK CV *cv
Ap |void |cx_dump |NN PERL_CONTEXT* cx
-Ap |SV* |filter_add |NULLOK filter_t funcp|NULLOK SV* datasv
+AiMp |GV * |CvGV |NN CV *sv
+AiMTp |I32 * |CvDEPTH |NN const CV * const sv
+Aphd |SV* |filter_add |NULLOK filter_t funcp|NULLOK SV* datasv
Ap |void |filter_del |NN filter_t funcp
-ApR |I32 |filter_read |int idx|NN SV *buf_sv|int maxlen
+ApRhd |I32 |filter_read |int idx|NN SV *buf_sv|int maxlen
ApPR |char** |get_op_descs
ApPR |char** |get_op_names
: FIXME discussion on p5p
@@ -401,31 +637,31 @@ Ap |I32 |debop |NN const OP* o
Ap |I32 |debstack
Ap |I32 |debstackptrs
pR |SV * |defelem_target |NN SV *sv|NULLOK MAGIC *mg
-Anp |char* |delimcpy |NN char* to|NN const char* toend|NN const char* from \
+ATp |char* |delimcpy |NN char* to|NN const char* toend|NN const char* from \
|NN const char* fromend|int delim|NN I32* retlen
-np |char* |delimcpy_no_escape|NN char* to|NN const char* toend \
+Tp |char* |delimcpy_no_escape|NN char* to|NN const char* toend \
|NN const char* from \
|NN const char* fromend|int delim \
|NN I32* retlen
: Used in op.c, perl.c
-pM |void |delete_eval_scope
+px |void |delete_eval_scope
Aprd |OP* |die_sv |NN SV *baseex
Afrpd |OP* |die |NULLOK const char* pat|...
: Used in util.c
pr |void |die_unwind |NN SV* msv
Ap |void |dounwind |I32 cxix
: FIXME
-pmb |bool|do_aexec |NULLOK SV* really|NN SV** mark|NN SV** sp
+pMb |bool|do_aexec |NULLOK SV* really|NN SV** mark|NN SV** sp
: Used in pp_sys.c
p |bool|do_aexec5 |NULLOK SV* really|NN SV** mark|NN SV** sp|int fd|int do_report
-Abp |int |do_binmode |NN PerlIO *fp|int iotype|int mode
+AbpD |int |do_binmode |NN PerlIO *fp|int iotype|int mode
: Used in pp.c
Ap |bool |do_close |NULLOK GV* gv|bool not_implicit
: Defined in doio.c, used only in pp_sys.c
p |bool |do_eof |NN GV* gv
#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
-pm |bool|do_exec |NN const char* cmd
+pM |bool|do_exec |NN const char* cmd
#else
p |bool|do_exec |NN const char* cmd
#endif
@@ -439,8 +675,8 @@ Ap |int |do_spawn_nowait|NN char* cmd
p |bool|do_exec3 |NN const char *incmd|int fd|int do_report
#endif
#if defined(PERL_IN_DOIO_C)
-s |void |exec_failed |NN const char *cmd|int fd|int do_report
-s |bool |argvout_final |NN MAGIC *mg|NN IO *io|bool not_implicit
+S |void |exec_failed |NN const char *cmd|int fd|int do_report
+S |bool |argvout_final |NN MAGIC *mg|NN IO *io|bool not_implicit
#endif
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
: Defined in doio.c, used only in pp_sys.c
@@ -461,13 +697,13 @@ Ap |void |do_join |NN SV *sv|NN SV *delim|NN SV **mark|NN SV **sp
: p |OP* |do_kv
: used in pp.c, pp_hot.c
pR |I32 |do_ncmp |NN SV *const left|NN SV *const right
-Apmb |bool |do_open |NN GV* gv|NN const char* name|I32 len|int as_raw \
+ApMb |bool |do_open |NN GV* gv|NN const char* name|I32 len|int as_raw \
|int rawmode|int rawperm|NULLOK PerlIO* supplied_fp
-Abp |bool |do_open9 |NN GV *gv|NN const char *name|I32 len|int as_raw \
+AbpD |bool |do_open9 |NN GV *gv|NN const char *name|I32 len|int as_raw \
|int rawmode|int rawperm|NULLOK PerlIO *supplied_fp \
|NN SV *svs|I32 num
-pn |void |setfd_cloexec|int fd
-pn |void |setfd_inhexec|int fd
+pT |void |setfd_cloexec|int fd
+pT |void |setfd_inhexec|int fd
p |void |setfd_cloexec_for_nonsysfd|int fd
p |void |setfd_inhexec_for_sysfd|int fd
p |void |setfd_cloexec_or_inhexec_by_sysfdness|int fd
@@ -475,7 +711,8 @@ pR |int |PerlLIO_dup_cloexec|int oldfd
p |int |PerlLIO_dup2_cloexec|int oldfd|int newfd
pR |int |PerlLIO_open_cloexec|NN const char *file|int flag
pR |int |PerlLIO_open3_cloexec|NN const char *file|int flag|int perm
-pnoR |int |my_mkstemp_cloexec|NN char *templte
+pToR |int |my_mkstemp_cloexec|NN char *templte
+pToR |int |my_mkostemp_cloexec|NN char *templte|int flags
#ifdef HAS_PIPE
pR |int |PerlProc_pipe_cloexec|NN int *pipefd
#endif
@@ -492,10 +729,10 @@ pR |int |PerlSock_socketpair_cloexec|int domain|int type|int protocol \
|NN int *pairfd
#endif
#if defined(PERL_IN_DOIO_C)
-s |IO * |openn_setup |NN GV *gv|NN char *mode|NN PerlIO **saveifp \
+S |IO * |openn_setup |NN GV *gv|NN char *mode|NN PerlIO **saveifp \
|NN PerlIO **saveofp|NN int *savefd \
|NN char *savetype
-s |bool |openn_cleanup |NN GV *gv|NN IO *io|NULLOK PerlIO *fp \
+S |bool |openn_cleanup |NN GV *gv|NN IO *io|NULLOK PerlIO *fp \
|NN char *mode|NN const char *oname \
|NULLOK PerlIO *saveifp|NULLOK PerlIO *saveofp \
|int savefd|char savetype|int writing \
@@ -506,9 +743,9 @@ Ap |bool |do_openn |NN GV *gv|NN const char *oname|I32 len \
|int as_raw|int rawmode|int rawperm \
|NULLOK PerlIO *supplied_fp|NULLOK SV **svp \
|I32 num
-Mp |bool |do_open_raw |NN GV *gv|NN const char *oname|STRLEN len \
+xp |bool |do_open_raw |NN GV *gv|NN const char *oname|STRLEN len \
|int rawmode|int rawperm|NULLOK Stat_t *statbufp
-Mp |bool |do_open6 |NN GV *gv|NN const char *oname|STRLEN len \
+xp |bool |do_open6 |NN GV *gv|NN const char *oname|STRLEN len \
|NULLOK PerlIO *supplied_fp|NULLOK SV **svp \
|U32 num
: Used in pp_hot.c and pp_sys.c
@@ -533,27 +770,28 @@ p |void |do_vop |I32 optype|NN SV* sv|NN SV* left|NN SV* right
: Used in perly.y
p |OP* |dofile |NN OP* term|I32 force_builtin
ApR |U8 |dowantarray
-Ap |void |dump_all
+Adp |void |dump_all
p |void |dump_all_perl |bool justperl
Ap |void |dump_eval
Ap |void |dump_form |NN const GV* gv
Ap |void |gv_dump |NULLOK GV* gv
Apd |OPclass|op_class |NULLOK const OP *o
-Ap |void |op_dump |NN const OP *o
+Apd |void |op_dump |NN const OP *o
Ap |void |pmop_dump |NULLOK PMOP* pm
-Ap |void |dump_packsubs |NN const HV* stash
+Apd |void |dump_packsubs |NN const HV* stash
p |void |dump_packsubs_perl |NN const HV* stash|bool justperl
Ap |void |dump_sub |NN const GV* gv
p |void |dump_sub_perl |NN const GV* gv|bool justperl
Apd |void |fbm_compile |NN SV* sv|U32 flags
ApdR |char* |fbm_instr |NN unsigned char* big|NN unsigned char* bigend \
|NN SV* littlestr|U32 flags
+pEXTR |const char *|cntrl_to_mnemonic|const U8 c
p |CV * |find_lexical_cv|PADOFFSET off
: Defined in util.c, used only in perl.c
p |char* |find_script |NN const char *scriptname|bool dosearch \
|NULLOK const char *const *const search_ext|I32 flags
#if defined(PERL_IN_OP_C)
-s |OP* |force_list |NULLOK OP* arg|bool nullit
+S |OP* |force_list |NULLOK OP* arg|bool nullit
i |OP* |op_integerize |NN OP *o
i |OP* |op_std_init |NN OP *o
#if defined(USE_ITHREADS)
@@ -562,27 +800,27 @@ i |void |op_relocate_sv |NN SV** svp|NN PADOFFSET* targp
i |OP* |newMETHOP_internal |I32 type|I32 flags|NULLOK OP* dynamic_meth \
|NULLOK SV* const_meth
: FIXME
-s |OP* |fold_constants |NN OP * const o
-s |OP* |traverse_op_tree|NN OP* top|NN OP* o
+S |OP* |fold_constants |NN OP * const o
+Sd |OP* |traverse_op_tree|NN OP* top|NN OP* o
#endif
Afpd |char* |form |NN const char* pat|...
Ap |char* |vform |NN const char* pat|NULLOK va_list* args
Ap |void |free_tmps
#if defined(PERL_IN_OP_C)
-s |OP* |gen_constant_list|NULLOK OP* o
+S |void |gen_constant_list|NULLOK OP* o
#endif
#if !defined(HAS_GETENV_LEN)
: Used in hv.c
p |char* |getenv_len |NN const char *env_elem|NN unsigned long *len
#endif
: Used in pp_ctl.c and pp_hot.c
-pox |void |get_db_sub |NULLOK SV **svp|NN CV *cv
+poe |void |get_db_sub |NULLOK SV **svp|NN CV *cv
Ap |void |gp_free |NULLOK GV* gv
Ap |GP* |gp_ref |NULLOK GP* gp
Ap |GV* |gv_add_by_type |NULLOK GV *gv|svtype type
-Apmb |GV* |gv_AVadd |NULLOK GV *gv
-Apmb |GV* |gv_HVadd |NULLOK GV *gv
-Apmb |GV* |gv_IOadd |NULLOK GV* gv
+ApMb |GV* |gv_AVadd |NULLOK GV *gv
+ApMb |GV* |gv_HVadd |NULLOK GV *gv
+ApMb |GV* |gv_IOadd |NULLOK GV* gv
AmR |GV* |gv_autoload4 |NULLOK HV* stash|NN const char* name \
|STRLEN len|I32 method
ApR |GV* |gv_autoload_sv |NULLOK HV* stash|NN SV* namesv|U32 flags
@@ -591,8 +829,8 @@ ApR |GV* |gv_autoload_pv |NULLOK HV* stash|NN const char* namepv \
ApR |GV* |gv_autoload_pvn |NULLOK HV* stash|NN const char* name \
|STRLEN len|U32 flags
Ap |void |gv_check |NN HV* stash
-Abp |void |gv_efullname |NN SV* sv|NN const GV* gv
-Apmb |void |gv_efullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
+AbpD |void |gv_efullname |NN SV* sv|NN const GV* gv
+ApMb |void |gv_efullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
Ap |void |gv_efullname4 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
Ap |GV* |gv_fetchfile |NN const char* name
Ap |GV* |gv_fetchfile_flags|NN const char *const name|const STRLEN len\
@@ -612,40 +850,42 @@ Apd |GV* |gv_fetchmeth_pv_autoload |NULLOK HV* stash|NN const char* name \
|I32 level|U32 flags
Apd |GV* |gv_fetchmeth_pvn_autoload |NULLOK HV* stash|NN const char* name \
|STRLEN len|I32 level|U32 flags
-Apdmb |GV* |gv_fetchmethod |NN HV* stash|NN const char* name
+ApdMb |GV* |gv_fetchmethod |NN HV* stash|NN const char* name
Apd |GV* |gv_fetchmethod_autoload|NN HV* stash|NN const char* name \
|I32 autoload
-ApM |GV* |gv_fetchmethod_sv_flags|NN HV* stash|NN SV* namesv|U32 flags
-ApM |GV* |gv_fetchmethod_pv_flags|NN HV* stash|NN const char* name \
+Apx |GV* |gv_fetchmethod_sv_flags|NN HV* stash|NN SV* namesv|U32 flags
+Apx |GV* |gv_fetchmethod_pv_flags|NN HV* stash|NN const char* name \
|U32 flags
-ApM |GV* |gv_fetchmethod_pvn_flags|NN HV* stash|NN const char* name \
+Apx |GV* |gv_fetchmethod_pvn_flags|NN HV* stash|NN const char* name \
|const STRLEN len|U32 flags
Ap |GV* |gv_fetchpv |NN const char *nambeg|I32 add|const svtype sv_type
-Abp |void |gv_fullname |NN SV* sv|NN const GV* gv
-Apmb |void |gv_fullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
+AbpD |void |gv_fullname |NN SV* sv|NN const GV* gv
+ApMb |void |gv_fullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
Ap |void |gv_fullname4 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
: Used in scope.c
-pMox |GP * |newGP |NN GV *const gv
+pxoe |GP * |newGP |NN GV *const gv
pX |void |cvgv_set |NN CV* cv|NULLOK GV* gv
poX |GV * |cvgv_from_hek |NN CV* cv
pX |void |cvstash_set |NN CV* cv|NULLOK HV* stash
Amd |void |gv_init |NN GV* gv|NULLOK HV* stash \
|NN const char* name|STRLEN len|int multi
-Ap |void |gv_init_sv |NN GV* gv|NULLOK HV* stash|NN SV* namesv|U32 flags
-Ap |void |gv_init_pv |NN GV* gv|NULLOK HV* stash|NN const char* name \
+Apd |void |gv_init_sv |NN GV* gv|NULLOK HV* stash|NN SV* namesv|U32 flags
+Apd |void |gv_init_pv |NN GV* gv|NULLOK HV* stash|NN const char* name \
|U32 flags
-Ap |void |gv_init_pvn |NN GV* gv|NULLOK HV* stash|NN const char* name \
+Apd |void |gv_init_pvn |NN GV* gv|NULLOK HV* stash|NN const char* name \
|STRLEN len|U32 flags
Ap |void |gv_name_set |NN GV* gv|NN const char *name|U32 len|U32 flags
-px |GV * |gv_override |NN const char * const name \
+pe |GV * |gv_override |NN const char * const name \
|const STRLEN len
-XMpd |void |gv_try_downgrade|NN GV* gv
+Xxpd |void |gv_try_downgrade|NN GV* gv
p |void |gv_setref |NN SV *const dstr|NN SV *const sstr
Apd |HV* |gv_stashpv |NN const char* name|I32 flags
Apd |HV* |gv_stashpvn |NN const char* name|U32 namelen|I32 flags
+#if defined(PERL_IN_GV_C) || defined(PERL_IN_UNIVERSAL_C)
+EpG |HV* |gv_stashsvpvn_cached |NULLOK SV *namesv|NULLOK const char* name|U32 namelen|I32 flags
+#endif
#if defined(PERL_IN_GV_C)
i |HV* |gv_stashpvn_internal |NN const char* name|U32 namelen|I32 flags
-i |HV* |gv_stashsvpvn_cached |NULLOK SV *namesv|NULLOK const char* name|U32 namelen|I32 flags
i |GV* |gv_fetchmeth_internal |NULLOK HV* stash|NULLOK SV* meth|NULLOK const char* name \
|STRLEN len|I32 level|U32 flags
#endif
@@ -654,14 +894,14 @@ Apd |void |hv_clear |NULLOK HV *hv
: used in SAVEHINTS() and op.c
ApdR |HV * |hv_copy_hints_hv|NULLOK HV *const ohv
Ap |void |hv_delayfree_ent|NN HV *hv|NULLOK HE *entry
-Abmdp |SV* |hv_delete |NULLOK HV *hv|NN const char *key|I32 klen \
+AbMdp |SV* |hv_delete |NULLOK HV *hv|NN const char *key|I32 klen \
|I32 flags
-Abmdp |SV* |hv_delete_ent |NULLOK HV *hv|NN SV *keysv|I32 flags|U32 hash
-AbmdRp |bool |hv_exists |NULLOK HV *hv|NN const char *key|I32 klen
-AbmdRp |bool |hv_exists_ent |NULLOK HV *hv|NN SV *keysv|U32 hash
-Abmdp |SV** |hv_fetch |NULLOK HV *hv|NN const char *key|I32 klen \
+AbMdp |SV* |hv_delete_ent |NULLOK HV *hv|NN SV *keysv|I32 flags|U32 hash
+AbMdRp |bool |hv_exists |NULLOK HV *hv|NN const char *key|I32 klen
+AbMdRp |bool |hv_exists_ent |NULLOK HV *hv|NN SV *keysv|U32 hash
+AbMdp |SV** |hv_fetch |NULLOK HV *hv|NN const char *key|I32 klen \
|I32 lval
-Abmdp |HE* |hv_fetch_ent |NULLOK HV *hv|NN SV *keysv|I32 lval|U32 hash
+AbMdp |HE* |hv_fetch_ent |NULLOK HV *hv|NN SV *keysv|I32 lval|U32 hash
Ap |void* |hv_common |NULLOK HV *hv|NULLOK SV *keysv \
|NULLOK const char* key|STRLEN klen|int flags \
|int action|NULLOK SV *val|U32 hash
@@ -673,14 +913,14 @@ Ap |void |hv_free_ent |NN HV *hv|NULLOK HE *entry
Apd |I32 |hv_iterinit |NN HV *hv
ApdR |char* |hv_iterkey |NN HE* entry|NN I32* retlen
ApdR |SV* |hv_iterkeysv |NN HE* entry
-ApdRbm |HE* |hv_iternext |NN HV *hv
+ApdRbM |HE* |hv_iternext |NN HV *hv
ApdR |SV* |hv_iternextsv |NN HV *hv|NN char **key|NN I32 *retlen
-ApMdR |HE* |hv_iternext_flags|NN HV *hv|I32 flags
+ApxdR |HE* |hv_iternext_flags|NN HV *hv|I32 flags
ApdR |SV* |hv_iterval |NN HV *hv|NN HE *entry
Ap |void |hv_ksplit |NN HV *hv|IV newmax
-Apdbm |void |hv_magic |NN HV *hv|NULLOK GV *gv|int how
+ApdbM |void |hv_magic |NN HV *hv|NULLOK GV *gv|int how
#if defined(PERL_IN_HV_C)
-s |SV * |refcounted_he_value |NN const struct refcounted_he *he
+S |SV * |refcounted_he_value |NN const struct refcounted_he *he
#endif
Xpd |HV * |refcounted_he_chain_2hv|NULLOK const struct refcounted_he *c|U32 flags
Xpd |SV * |refcounted_he_fetch_pvn|NULLOK const struct refcounted_he *chain \
@@ -703,30 +943,30 @@ Xpd |struct refcounted_he *|refcounted_he_new_sv \
|U32 hash|NULLOK SV *value|U32 flags
Xpd |void |refcounted_he_free|NULLOK struct refcounted_he *he
Xpd |struct refcounted_he *|refcounted_he_inc|NULLOK struct refcounted_he *he
-Apbmd |SV** |hv_store |NULLOK HV *hv|NULLOK const char *key \
+ApbMd |SV** |hv_store |NULLOK HV *hv|NULLOK const char *key \
|I32 klen|NULLOK SV *val|U32 hash
-Apbmd |HE* |hv_store_ent |NULLOK HV *hv|NULLOK SV *key|NULLOK SV *val\
+ApbMd |HE* |hv_store_ent |NULLOK HV *hv|NULLOK SV *key|NULLOK SV *val\
|U32 hash
-ApbmM |SV** |hv_store_flags |NULLOK HV *hv|NULLOK const char *key \
+ApbMx |SV** |hv_store_flags |NULLOK HV *hv|NULLOK const char *key \
|I32 klen|NULLOK SV *val|U32 hash|int flags
Amd |void |hv_undef |NULLOK HV *hv
poX |void |hv_undef_flags |NULLOK HV *hv|U32 flags
-AmP |I32 |ibcmp |NN const char* a|NN const char* b|I32 len
-Ainp |I32 |foldEQ |NN const char* a|NN const char* b|I32 len
-AmP |I32 |ibcmp_locale |NN const char* a|NN const char* b|I32 len
-Ainp |I32 |foldEQ_locale |NN const char* a|NN const char* b|I32 len
+AdmP |I32 |ibcmp |NN const char* a|NN const char* b|I32 len
+AdiTp |I32 |foldEQ |NN const char* a|NN const char* b|I32 len
+AdmP |I32 |ibcmp_locale |NN const char* a|NN const char* b|I32 len
+AiTpd |I32 |foldEQ_locale |NN const char* a|NN const char* b|I32 len
Am |I32 |ibcmp_utf8 |NN const char *s1|NULLOK char **pe1|UV l1 \
|bool u1|NN const char *s2|NULLOK char **pe2 \
|UV l2|bool u2
Amd |I32 |foldEQ_utf8 |NN const char *s1|NULLOK char **pe1|UV l1 \
|bool u1|NN const char *s2|NULLOK char **pe2 \
|UV l2|bool u2
-AMp |I32 |foldEQ_utf8_flags |NN const char *s1|NULLOK char **pe1|UV l1 \
+Cp |I32 |foldEQ_utf8_flags |NN const char *s1|NULLOK char **pe1|UV l1 \
|bool u1|NN const char *s2|NULLOK char **pe2 \
|UV l2|bool u2|U32 flags
-Ainp |I32 |foldEQ_latin1 |NN const char* a|NN const char* b|I32 len
+AiTp |I32 |foldEQ_latin1 |NN const char* a|NN const char* b|I32 len
#if defined(PERL_IN_DOIO_C)
-sR |bool |ingroup |Gid_t testgid|bool effective
+SR |bool |ingroup |Gid_t testgid|bool effective
#endif
: Used in toke.c
p |void |init_argv_symbols|int argc|NN char **argv
@@ -737,7 +977,7 @@ p |void |init_debugger
Ap |void |init_stacks
Ap |void |init_tm |NN struct tm *ptm
: Used in perly.y
-AbmnpPR |char* |instr |NN const char* big|NN const char* little
+AbMTpPRd|char* |instr |NN const char* big|NN const char* little
: Used in sv.c
p |bool |io_close |NN IO* io|NULLOK GV *gv \
|bool not_implicit|bool warn_on_fail
@@ -746,168 +986,100 @@ pR |OP* |invert |NULLOK OP* cmd
ApR |I32 |is_lvalue_sub
: Used in cop.h
XopR |I32 |was_lvalue_sub
-ApMRnP |STRLEN |_is_utf8_char_helper|NN const U8 * const s|NN const U8 * e|const U32 flags
-AbDMpR |U32 |to_uni_upper_lc|U32 c
-AbDMpR |U32 |to_uni_title_lc|U32 c
-AbDMpR |U32 |to_uni_lower_lc|U32 c
-AbDMpR |bool |is_uni_alnum |UV c
-AbDMpR |bool |is_uni_alnumc |UV c
-AbDMpR |bool |is_uni_idfirst |UV c
-AbDMpR |bool |is_uni_alpha |UV c
-AbDMpPR |bool |is_uni_ascii |UV c
-AbDMpPR |bool |is_uni_blank |UV c
-AbDMpPR |bool |is_uni_space |UV c
-AbDMpPR |bool |is_uni_cntrl |UV c
-AbDMpR |bool |is_uni_graph |UV c
-AbDMpR |bool |is_uni_digit |UV c
-AbDMpR |bool |is_uni_upper |UV c
-AbDMpR |bool |is_uni_lower |UV c
-AbDMpR |bool |is_uni_print |UV c
-AbDMpR |bool |is_uni_punct |UV c
-AbDMpPR |bool |is_uni_xdigit |UV c
-AMp |UV |to_uni_upper |UV c|NN U8 *p|NN STRLEN *lenp
-AMp |UV |to_uni_title |UV c|NN U8 *p|NN STRLEN *lenp
-AbDMpR |bool |isIDFIRST_lazy |NN const char* p
-AbDMpR |bool |isALNUM_lazy |NN const char* p
+CpRTP |STRLEN |is_utf8_char_helper|NN const U8 * const s|NN const U8 * e|const U32 flags
+Cp |UV |to_uni_upper |UV c|NN U8 *p|NN STRLEN *lenp
+Cp |UV |to_uni_title |UV c|NN U8 *p|NN STRLEN *lenp
p |void |init_uniprops
#ifdef PERL_IN_UTF8_C
-snR |U8 |to_lower_latin1|const U8 c|NULLOK U8 *p|NULLOK STRLEN *lenp \
+STR |U8 |to_lower_latin1|const U8 c|NULLOK U8 *p|NULLOK STRLEN *lenp \
|const char dummy
# ifndef UV_IS_QUAD
-snR |int |is_utf8_cp_above_31_bits|NN const U8 * const s \
+STR |int |is_utf8_cp_above_31_bits|NN const U8 * const s \
|NN const U8 * const e \
|const bool consider_overlongs
# endif
#endif
#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-EXnp |UV |_to_fold_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const unsigned int flags
+EXTp |UV |_to_fold_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const unsigned int flags
#endif
#if defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C)
p |UV |_to_upper_title_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const char S_or_s
#endif
-AMp |UV |to_uni_lower |UV c|NN U8 *p|NN STRLEN *lenp
-AMmp |UV |to_uni_fold |UV c|NN U8 *p|NN STRLEN *lenp
-AMp |UV |_to_uni_fold_flags|UV c|NN U8 *p|NN STRLEN *lenp|U8 flags
-AbDMpR |bool |is_uni_alnum_lc|UV c
-AbDMpR |bool |is_uni_alnumc_lc|UV c
-AbDMpR |bool |is_uni_idfirst_lc|UV c
-AMpR |bool |_is_uni_perl_idcont|UV c
-AMpR |bool |_is_uni_perl_idstart|UV c
-AbDMpR |bool |is_uni_alpha_lc|UV c
-AbDMpPR |bool |is_uni_ascii_lc|UV c
-AbDMpPR |bool |is_uni_space_lc|UV c
-AbDMpPR |bool |is_uni_blank_lc|UV c
-AbDMpPR |bool |is_uni_cntrl_lc|UV c
-AbDMpR |bool |is_uni_graph_lc|UV c
-AbDMpR |bool |is_uni_digit_lc|UV c
-AbDMpR |bool |is_uni_upper_lc|UV c
-AbDMpR |bool |is_uni_lower_lc|UV c
-AbDMpR |bool |is_uni_print_lc|UV c
-AbDMpR |bool |is_uni_punct_lc|UV c
-AbDMpPR |bool |is_uni_xdigit_lc|UV c
-AndmoR |bool |is_utf8_invariant_string|NN const U8* const s \
+Cp |UV |to_uni_lower |UV c|NN U8 *p|NN STRLEN *lenp
+Cm |UV |to_uni_fold |UV c|NN U8 *p|NN STRLEN *lenp
+Cp |UV |_to_uni_fold_flags|UV c|NN U8 *p|NN STRLEN *lenp|U8 flags
+CpR |bool |_is_uni_perl_idcont|UV c
+CpR |bool |_is_uni_perl_idstart|UV c
+ATdmoR |bool |is_utf8_invariant_string|NN const U8* const s \
|STRLEN len
-AnidR |bool |is_utf8_invariant_string_loc|NN const U8* const s \
+ATidRp |bool |is_utf8_invariant_string_loc|NN const U8* const s \
|STRLEN len \
|NULLOK const U8 ** ep
#ifndef EBCDIC
-AniR |unsigned int|_variant_byte_number|PERL_UINTMAX_T word
+CTiRp |unsigned int|variant_byte_number|PERL_UINTMAX_T word
#endif
#if defined(PERL_CORE) || defined(PERL_EXT)
-EinR |Size_t |variant_under_utf8_count|NN const U8* const s \
+EiTRd |Size_t |variant_under_utf8_count|NN const U8* const s \
|NN const U8* const e
#endif
-AmnpdRP |bool |is_ascii_string|NN const U8* const s|STRLEN len
-AmnpdRP |bool |is_invariant_string|NN const U8* const s|STRLEN len
+AmTdRP |bool |is_ascii_string|NN const U8* const s|STRLEN len
+AmTdRP |bool |is_invariant_string|NN const U8* const s|STRLEN len
#if defined(PERL_CORE) || defined (PERL_EXT)
-EXnidR |bool |is_utf8_non_invariant_string|NN const U8* const s \
+EXTidRp |bool |is_utf8_non_invariant_string|NN const U8* const s \
|STRLEN len
#endif
-AbnpdD |STRLEN |is_utf8_char |NN const U8 *s
-Abmnpd |STRLEN |is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end
-AnidR |Size_t |isUTF8_CHAR|NN const U8 * const s0 \
+AbTpdD |STRLEN |is_utf8_char |NN const U8 *s
+AbMTpd |STRLEN |is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end
+ATidRp |Size_t |isUTF8_CHAR|NN const U8 * const s0 \
|NN const U8 * const e
-AnidR |Size_t |isSTRICT_UTF8_CHAR |NN const U8 * const s0 \
+ATidRp |Size_t |isSTRICT_UTF8_CHAR |NN const U8 * const s0 \
|NN const U8 * const e
-AnidR |Size_t |isC9_STRICT_UTF8_CHAR |NN const U8 * const s0 \
+ATidRp |Size_t |isC9_STRICT_UTF8_CHAR |NN const U8 * const s0 \
|NN const U8 * const e
-AnmdpR |bool |is_utf8_string |NN const U8 *s|STRLEN len
-AnidR |bool |is_utf8_string_flags \
+ATmdR |bool |is_utf8_string |NN const U8 *s|STRLEN len
+ATidRp |bool |is_utf8_string_flags \
|NN const U8 *s|STRLEN len|const U32 flags
-AnmdpR |bool |is_strict_utf8_string|NN const U8 *s|STRLEN len
-AnmdpR |bool |is_c9strict_utf8_string|NN const U8 *s|STRLEN len
-Anpdmb |bool |is_utf8_string_loc \
+ATmdR |bool |is_strict_utf8_string|NN const U8 *s|STRLEN len
+ATmdR |bool |is_c9strict_utf8_string|NN const U8 *s|STRLEN len
+ATpdMb |bool |is_utf8_string_loc \
|NN const U8 *s|const STRLEN len|NN const U8 **ep
-Andm |bool |is_utf8_string_loc_flags \
+ATdm |bool |is_utf8_string_loc_flags \
|NN const U8 *s|STRLEN len|NN const U8 **ep \
|const U32 flags
-Andm |bool |is_strict_utf8_string_loc \
+ATdm |bool |is_strict_utf8_string_loc \
|NN const U8 *s|STRLEN len|NN const U8 **ep
-Andm |bool |is_c9strict_utf8_string_loc \
+ATdm |bool |is_c9strict_utf8_string_loc \
|NN const U8 *s|STRLEN len|NN const U8 **ep
-Anipd |bool |is_utf8_string_loclen \
+ATipd |bool |is_utf8_string_loclen \
|NN const U8 *s|STRLEN len|NULLOK const U8 **ep \
|NULLOK STRLEN *el
-Anid |bool |is_utf8_string_loclen_flags \
+ATidp |bool |is_utf8_string_loclen_flags \
|NN const U8 *s|STRLEN len|NULLOK const U8 **ep \
|NULLOK STRLEN *el|const U32 flags
-Anid |bool |is_strict_utf8_string_loclen \
+ATidp |bool |is_strict_utf8_string_loclen \
|NN const U8 *s|STRLEN len|NULLOK const U8 **ep \
|NULLOK STRLEN *el
-Anid |bool |is_c9strict_utf8_string_loclen \
+ATidp |bool |is_c9strict_utf8_string_loclen \
|NN const U8 *s|STRLEN len|NULLOK const U8 **ep \
|NULLOK STRLEN *el
-Amnd |bool |is_utf8_fixed_width_buf_flags \
+AmTd |bool |is_utf8_fixed_width_buf_flags \
|NN const U8 * const s|STRLEN len|const U32 flags
-Amnd |bool |is_utf8_fixed_width_buf_loc_flags \
+AmTd |bool |is_utf8_fixed_width_buf_loc_flags \
|NN const U8 * const s|STRLEN len \
|NULLOK const U8 **ep|const U32 flags
-Anid |bool |is_utf8_fixed_width_buf_loclen_flags \
+ATidp |bool |is_utf8_fixed_width_buf_loclen_flags \
|NN const U8 * const s|STRLEN len \
|NULLOK const U8 **ep|NULLOK STRLEN *el|const U32 flags
-AmndP |bool |is_utf8_valid_partial_char \
+AmTdP |bool |is_utf8_valid_partial_char \
|NN const U8 * const s|NN const U8 * const e
-AnidR |bool |is_utf8_valid_partial_char_flags \
+ATidRp |bool |is_utf8_valid_partial_char_flags \
|NN const U8 * const s|NN const U8 * const e|const U32 flags
-AMpR |bool |_is_uni_FOO|const U8 classnum|const UV c
-AMpR |bool |_is_utf8_FOO|U8 classnum|NN const U8 * const p \
- |NN const char * const name \
- |NN const char * const alternative \
- |const bool use_utf8|const bool use_locale \
- |NN const char * const file|const unsigned line
-AMpR |bool |_is_utf8_FOO_with_len|const U8 classnum|NN const U8 *p \
- |NN const U8 * const e
-AbDMpR |bool |is_utf8_alnum |NN const U8 *p
-AbDMpR |bool |is_utf8_alnumc |NN const U8 *p
-AbDMpR |bool |is_utf8_idfirst|NN const U8 *p
-AbDMpR |bool |is_utf8_xidfirst|NN const U8 *p
-AMpR |bool |_is_utf8_idcont|NN const U8 *p
-AMpR |bool |_is_utf8_idstart|NN const U8 *p
-AMpR |bool |_is_utf8_xidcont|NN const U8 *p
-AMpR |bool |_is_utf8_xidstart|NN const U8 *p
-AMpR |bool |_is_utf8_perl_idcont_with_len|NN const U8 *p \
+CpR |bool |_is_uni_FOO|const U8 classnum|const UV c
+CpR |bool |_is_utf8_FOO|const U8 classnum|NN const U8 *p \
|NN const U8 * const e
-AMpR |bool |_is_utf8_perl_idstart_with_len|NN const U8 *p \
- |NN const U8 * const e
-AbDMpR |bool |is_utf8_idcont |NN const U8 *p
-AbDMpR |bool |is_utf8_xidcont |NN const U8 *p
-AbDMpR |bool |is_utf8_alpha |NN const U8 *p
-AbDMpR |bool |is_utf8_ascii |NN const U8 *p
-AbDMpR |bool |is_utf8_blank |NN const U8 *p
-AbDMpR |bool |is_utf8_space |NN const U8 *p
-AbDMpR |bool |is_utf8_perl_space |NN const U8 *p
-AbDMpR |bool |is_utf8_perl_word |NN const U8 *p
-AbDMpR |bool |is_utf8_cntrl |NN const U8 *p
-AbDMpR |bool |is_utf8_digit |NN const U8 *p
-AbDMpR |bool |is_utf8_posix_digit |NN const U8 *p
-AbDMpR |bool |is_utf8_graph |NN const U8 *p
-AbDMpR |bool |is_utf8_upper |NN const U8 *p
-AbDMpR |bool |is_utf8_lower |NN const U8 *p
-AbDMpR |bool |is_utf8_print |NN const U8 *p
-AbDMpR |bool |is_utf8_punct |NN const U8 *p
-AbDMpR |bool |is_utf8_xdigit |NN const U8 *p
-AMpR |bool |_is_utf8_mark |NN const U8 *p
-AbDMpR |bool |is_utf8_mark |NN const U8 *p
+CpR |bool |_is_utf8_perl_idcont|NN const U8 *p|NN const U8 * const e
+CpR |bool |_is_utf8_perl_idstart|NN const U8 *p|NN const U8 * const e
+
#if defined(PERL_CORE) || defined(PERL_EXT)
EXdpR |bool |isSCRIPT_RUN |NN const U8 *s|NN const U8 *send \
|const bool utf8_target
@@ -917,45 +1089,46 @@ p |OP* |jmaybe |NN OP *o
: Used in pp.c
pP |I32 |keyword |NN const char *name|I32 len|bool all_keywords
#if defined(PERL_IN_OP_C)
-s |void |inplace_aassign |NN OP* o
+S |void |inplace_aassign |NN OP* o
#endif
Ap |void |leave_scope |I32 base
p |void |notify_parser_that_changed_to_utf8
: Public lexer API
-AMpd |void |lex_start |NULLOK SV* line|NULLOK PerlIO *rsfp|U32 flags
-AMpd |bool |lex_bufutf8
-AMpd |char* |lex_grow_linestr|STRLEN len
-AMpd |void |lex_stuff_pvn |NN const char* pv|STRLEN len|U32 flags
-AMpd |void |lex_stuff_pv |NN const char* pv|U32 flags
-AMpd |void |lex_stuff_sv |NN SV* sv|U32 flags
-AMpd |void |lex_unstuff |NN char* ptr
-AMpd |void |lex_read_to |NN char* ptr
-AMpd |void |lex_discard_to |NN char* ptr
-AMpd |bool |lex_next_chunk |U32 flags
-AMpd |I32 |lex_peek_unichar|U32 flags
-AMpd |I32 |lex_read_unichar|U32 flags
-AMpd |void |lex_read_space |U32 flags
+Axpd |void |lex_start |NULLOK SV* line|NULLOK PerlIO *rsfp|U32 flags
+Axpd |bool |lex_bufutf8
+Axpd |char* |lex_grow_linestr|STRLEN len
+Axpd |void |lex_stuff_pvn |NN const char* pv|STRLEN len|U32 flags
+Axpd |void |lex_stuff_pv |NN const char* pv|U32 flags
+Axpd |void |lex_stuff_sv |NN SV* sv|U32 flags
+Axpd |void |lex_unstuff |NN char* ptr
+Axpd |void |lex_read_to |NN char* ptr
+Axpd |void |lex_discard_to |NN char* ptr
+Axpd |bool |lex_next_chunk |U32 flags
+Axpd |I32 |lex_peek_unichar|U32 flags
+Axpd |I32 |lex_read_unichar|U32 flags
+Axpd |void |lex_read_space |U32 flags
: Public parser API
-AMpd |OP* |parse_arithexpr|U32 flags
-AMpd |OP* |parse_termexpr |U32 flags
-AMpd |OP* |parse_listexpr |U32 flags
-AMpd |OP* |parse_fullexpr |U32 flags
-AMpd |OP* |parse_block |U32 flags
-AMpd |OP* |parse_barestmt |U32 flags
-AMpd |SV* |parse_label |U32 flags
-AMpd |OP* |parse_fullstmt |U32 flags
-AMpd |OP* |parse_stmtseq |U32 flags
+Axpd |OP* |parse_arithexpr|U32 flags
+Axpd |OP* |parse_termexpr |U32 flags
+Axpd |OP* |parse_listexpr |U32 flags
+Axpd |OP* |parse_fullexpr |U32 flags
+Axpd |OP* |parse_block |U32 flags
+Axpd |OP* |parse_barestmt |U32 flags
+Axpd |SV* |parse_label |U32 flags
+Axpd |OP* |parse_fullstmt |U32 flags
+Axpd |OP* |parse_stmtseq |U32 flags
+Axpd |OP* |parse_subsignature|U32 flags
: Used in various files
Apd |void |op_null |NN OP* o
: FIXME. Used by Data::Alias
EXp |void |op_clear |NN OP* o
Ap |void |op_refcnt_lock
Ap |void |op_refcnt_unlock
-Apdn |OP* |op_sibling_splice|NULLOK OP *parent|NULLOK OP *start \
+ApdT |OP* |op_sibling_splice|NULLOK OP *parent|NULLOK OP *start \
|int del_count|NULLOK OP* insert
-Apdn |OP* |op_parent|NN OP *o
+ApdT |OP* |op_parent|NN OP *o
#if defined(PERL_IN_OP_C)
-s |OP* |listkids |NULLOK OP* o
+S |OP* |listkids |NULLOK OP* o
#endif
p |OP* |list |NULLOK OP* o
Apd |void |load_module|U32 flags|NN SV* name|NULLOK SV* ver|...
@@ -963,36 +1136,61 @@ Ap |void |vload_module|U32 flags|NN SV* name|NULLOK SV* ver|NULLOK va_list* args
: Used in perly.y
p |OP* |localize |NN OP *o|I32 lex
ApdR |I32 |looks_like_number|NN SV *const sv
-Apd |UV |grok_bin |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_DQUOTE_C)
-EMpRX |bool |grok_bslash_x |NN char** s \
- |NN const char* const send \
- |NN UV* uv \
- |NN const char** error_msg \
- |const bool output_warning \
- |const bool strict \
- |const bool silence_non_portable \
+EpRX |bool |grok_bslash_x |NN char** s \
+ |NN const char* const send \
+ |NN UV* uv \
+ |NN const char** message \
+ |NULLOK U32 * packed_warn \
+ |const bool strict \
+ |const bool allow_UV_MAX \
|const bool utf8
-EMpRX |char |grok_bslash_c |const char source|const bool output_warning
-EMpRX |bool |grok_bslash_o |NN char** s \
- |NN const char* const send \
- |NN UV* uv \
- |NN const char** error_msg \
- |const bool output_warning \
- |const bool strict \
- |const bool silence_non_portable \
+EpRX |bool |grok_bslash_c |const char source \
+ |NN U8 * result \
+ |NN const char** message \
+ |NULLOK U32 * packed_warn
+EpRX |bool |grok_bslash_o |NN char** s \
+ |NN const char* const send \
+ |NN UV* uv \
+ |NN const char** message \
+ |NULLOK U32 * packed_warn \
+ |const bool strict \
+ |const bool allow_UV_MAX \
|const bool utf8
-EMiR |char*|form_short_octal_warning|NN const char * const s \
- |const STRLEN len
-EiRn |I32 |regcurly |NN const char *s
-#endif
-Apd |UV |grok_hex |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
+EpRX |const char *|form_alien_digit_msg|const U8 which \
+ |const STRLEN valids_len \
+ |NN const char * const first_bad\
+ |NN const char * const send \
+ |const bool UTF \
+ |const bool braced
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C)
+EiRT |bool |regcurly |NN const char *s
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_DQUOTE_C) || defined(PERL_IN_UTF8_C)
+EpRX |const char *|form_cp_too_large_msg|const U8 which \
+ |NULLOK const char * string \
+ |const Size_t len \
+ |const UV cp
+#endif
+AMpd |UV |grok_hex |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
Apd |int |grok_infnan |NN const char** sp|NN const char *send
Apd |int |grok_number |NN const char *pv|STRLEN len|NULLOK UV *valuep
Apd |int |grok_number_flags|NN const char *pv|STRLEN len|NULLOK UV *valuep|U32 flags
ApdR |bool |grok_numeric_radix|NN const char **sp|NN const char *send
-Apd |UV |grok_oct |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
-EXpn |bool |grok_atoUV |NN const char* pv|NN UV* valptr|NULLOK const char** endptr
+ApMd |UV |grok_oct |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
+ApMd |UV |grok_bin |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
+Cp |UV |grok_bin_oct_hex|NN const char* start \
+ |NN STRLEN* len_p \
+ |NN I32* flags \
+ |NULLOK NV *result \
+ |const unsigned shift \
+ |const U8 lookup_bit \
+ |const char prefix
+#ifdef PERL_IN_NUMERIC_C
+S |void |output_non_portable|const U8 shift
+#endif
+EXpdT |bool |grok_atoUV |NN const char* pv|NN UV* valptr|NULLOK const char** endptr
: These are all indirectly referenced by globals.c. This is somewhat annoying.
p |int |magic_clearenv |NN SV* sv|NN MAGIC* mg
p |int |magic_clear_all_env|NN SV* sv|NN MAGIC* mg
@@ -1060,10 +1258,10 @@ pod |SV* |magic_methcall |NN SV *sv|NN const MAGIC *mg \
Ap |I32 * |markstack_grow
#if defined(USE_LOCALE_COLLATE)
p |int |magic_setcollxfrm|NN SV* sv|NN MAGIC* mg
-pb |char* |mem_collxfrm |NN const char* input_string|STRLEN len|NN STRLEN* xlen
+pbD |char* |mem_collxfrm |NN const char* input_string|STRLEN len|NN STRLEN* xlen
: Defined in locale.c, used only in sv.c
# if defined(PERL_IN_LOCALE_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_MATHOMS_C)
-pM |char* |_mem_collxfrm |NN const char* input_string \
+p |char* |_mem_collxfrm |NN const char* input_string \
|STRLEN len \
|NN STRLEN* xlen \
|bool utf8
@@ -1083,8 +1281,8 @@ Apd |int |mg_copy |NN SV *sv|NN SV *nsv|NULLOK const char *key \
: Defined in mg.c, used only in scope.c
pd |void |mg_localize |NN SV* sv|NN SV* nsv|bool setmagic
Apd |SV* |sv_string_from_errnum|int errnum|NULLOK SV* tgtsv
-ApdRn |MAGIC* |mg_find |NULLOK const SV* sv|int type
-ApdRn |MAGIC* |mg_findext |NULLOK const SV* sv|int type|NULLOK const MGVTBL *vtbl
+ApdRT |MAGIC* |mg_find |NULLOK const SV* sv|int type
+ApdRT |MAGIC* |mg_findext |NULLOK const SV* sv|int type|NULLOK const MGVTBL *vtbl
: exported for re.pm
EXpR |MAGIC* |mg_find_mglob |NN SV* sv
Apd |int |mg_free |NN SV* sv
@@ -1092,49 +1290,49 @@ Apd |void |mg_free_type |NN SV* sv|int how
Apd |void |mg_freeext |NN SV* sv|int how|NULLOK const MGVTBL *vtbl
Apd |int |mg_get |NN SV* sv
ApdD |U32 |mg_length |NN SV* sv
-Apdn |void |mg_magical |NN SV* sv
+ApdT |void |mg_magical |NN SV* sv
Apd |int |mg_set |NN SV* sv
Ap |I32 |mg_size |NN SV* sv
-Apn |void |mini_mktime |NN struct tm *ptm
-AMmd |OP* |op_lvalue |NULLOK OP* o|I32 type
+ApT |void |mini_mktime |NN struct tm *ptm
+Axmd |OP* |op_lvalue |NULLOK OP* o|I32 type
poX |OP* |op_lvalue_flags|NULLOK OP* o|I32 type|U32 flags
-p |void |finalize_optree |NN OP* o
-p |void |optimize_optree|NN OP* o
+pd |void |finalize_optree |NN OP* o
+pd |void |optimize_optree|NN OP* o
#if defined(PERL_IN_OP_C)
-s |void |optimize_op |NN OP* o
-s |void |finalize_op |NN OP* o
-s |void |move_proto_attr|NN OP **proto|NN OP **attrs \
+S |void |optimize_op |NN OP* o
+S |void |finalize_op |NN OP* o
+S |void |move_proto_attr|NN OP **proto|NN OP **attrs \
|NN const GV *name|bool curstash
#endif
: Used in op.c and pp_sys.c
p |int |mode_from_discipline|NULLOK const char* s|STRLEN len
Ap |const char* |moreswitches |NN const char* s
Ap |NV |my_atof |NN const char *s
-AnpR |NV |my_strtod |NN const char * const s|NULLOK char ** e
-Apr |void |my_exit |U32 status
+ATdpR |NV |my_strtod |NN const char * const s|NULLOK char ** e
+Aprd |void |my_exit |U32 status
Apr |void |my_failure_exit
Ap |I32 |my_fflush_all
-Anp |Pid_t |my_fork
-Anp |void |atfork_lock
-Anp |void |atfork_unlock
-Apmb |I32 |my_lstat
+ATp |Pid_t |my_fork
+ATp |void |atfork_lock
+ATp |void |atfork_unlock
+ApMb |I32 |my_lstat
pX |I32 |my_lstat_flags |NULLOK const U32 flags
#if ! defined(HAS_MEMRCHR) && (defined(PERL_CORE) || defined(PERL_EXT))
-Exin |void * |my_memrchr |NN const char * s|const char c|const STRLEN len
+EeiT |void * |my_memrchr |NN const char * s|const char c|const STRLEN len
#endif
#if !defined(PERL_IMPLICIT_SYS)
Ap |I32 |my_pclose |NULLOK PerlIO* ptr
Ap |PerlIO*|my_popen |NN const char* cmd|NN const char* mode
#endif
Ap |PerlIO*|my_popen_list |NN const char* mode|int n|NN SV ** args
-Ap |void |my_setenv |NULLOK const char* nam|NULLOK const char* val
-Apmb |I32 |my_stat
+Apd |void |my_setenv |NULLOK const char* nam|NULLOK const char* val
+ApMb |I32 |my_stat
pX |I32 |my_stat_flags |NULLOK const U32 flags
Afp |char * |my_strftime |NN const char *fmt|int sec|int min|int hour|int mday|int mon|int year|int wday|int yday|int isdst
: Used in pp_ctl.c
p |void |my_unexec
-AbDMnPR |UV |NATIVE_TO_NEED |const UV enc|const UV ch
-AbDMnPR |UV |ASCII_TO_NEED |const UV enc|const UV ch
+CbDTPR |UV |NATIVE_TO_NEED |const UV enc|const UV ch
+CbDTPR |UV |ASCII_TO_NEED |const UV enc|const UV ch
ApR |OP* |newANONLIST |NULLOK OP* o
ApR |OP* |newANONHASH |NULLOK OP* o
Ap |OP* |newANONSUB |I32 floor|NULLOK OP* proto|NULLOK OP* block
@@ -1148,7 +1346,7 @@ Ap |void |newFORM |I32 floor|NULLOK OP* o|NULLOK OP* block
ApdR |OP* |newFOROP |I32 flags|NULLOK OP* sv|NN OP* expr|NULLOK OP* block|NULLOK OP* cont
ApdR |OP* |newGIVENOP |NN OP* cond|NN OP* block|PADOFFSET defsv_off
ApdR |OP* |newLOGOP |I32 optype|I32 flags|NN OP *first|NN OP *other
-pM |LOGOP* |alloc_LOGOP |I32 type|NULLOK OP *first|NULLOK OP *other
+px |LOGOP* |alloc_LOGOP |I32 type|NULLOK OP *first|NULLOK OP *other
ApdR |OP* |newLOOPEX |I32 type|NN OP* label
ApdR |OP* |newLOOPOP |I32 flags|I32 debuggable|NULLOK OP* expr|NULLOK OP* block
ApdR |OP* |newNULLLIST
@@ -1157,7 +1355,7 @@ Ap |void |newPROG |NN OP* o
ApdR |OP* |newRANGE |I32 flags|NN OP* left|NN OP* right
ApdR |OP* |newSLICEOP |I32 flags|NULLOK OP* subscript|NULLOK OP* listop
ApdR |OP* |newSTATEOP |I32 flags|NULLOK char* label|NULLOK OP* o
-Apbm |CV* |newSUB |I32 floor|NULLOK OP* o|NULLOK OP* proto \
+ApbM |CV* |newSUB |I32 floor|NULLOK OP* o|NULLOK OP* proto \
|NULLOK OP* block
pd |CV * |newXS_len_flags|NULLOK const char *name|STRLEN len \
|NN XSUBADDR_t subaddr\
@@ -1165,12 +1363,12 @@ pd |CV * |newXS_len_flags|NULLOK const char *name|STRLEN len \
|NULLOK const char *const proto \
|NULLOK SV **const_svp|U32 flags
pX |CV * |newXS_deffile |NN const char *name|NN XSUBADDR_t subaddr
-ApM |CV * |newXS_flags |NULLOK const char *name|NN XSUBADDR_t subaddr\
+Apx |CV * |newXS_flags |NULLOK const char *name|NN XSUBADDR_t subaddr\
|NN const char *const filename \
|NULLOK const char *const proto|U32 flags
-Apd |CV* |newXS |NULLOK const char *name|NN XSUBADDR_t subaddr\
+ApdU |CV* |newXS |NULLOK const char *name|NN XSUBADDR_t subaddr\
|NN const char *filename
-ApmdbR |AV* |newAV
+ApMdbR |AV* |newAV
ApR |OP* |newAVREF |NN OP* o
ApdR |OP* |newBINOP |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
ApR |OP* |newCVREF |I32 flags|NULLOK OP* o
@@ -1179,13 +1377,13 @@ Am |GV* |newGVgen |NN const char* pack
ApR |GV* |newGVgen_flags |NN const char* pack|U32 flags
ApR |OP* |newGVREF |I32 type|NULLOK OP* o
ApR |OP* |newHVREF |NN OP* o
-ApmdbR |HV* |newHV
+ApMdbR |HV* |newHV
ApR |HV* |newHVhv |NULLOK HV *hv
-ApRbm |IO* |newIO
+ApRbM |IO* |newIO
ApdR |OP* |newLISTOP |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
-AMpdRn |PADNAME *|newPADNAMEouter|NN PADNAME *outer
-AMpdRn |PADNAME *|newPADNAMEpvn|NN const char *s|STRLEN len
-AMpdRn |PADNAMELIST *|newPADNAMELIST|size_t max
+AxpdRT |PADNAME *|newPADNAMEouter|NN PADNAME *outer
+AxpdRT |PADNAME *|newPADNAMEpvn|NN const char *s|STRLEN len
+AxpdRT |PADNAMELIST *|newPADNAMELIST|size_t max
#ifdef USE_ITHREADS
ApdR |OP* |newPADOP |I32 type|I32 flags|NN SV* sv
#endif
@@ -1210,8 +1408,8 @@ ApdR |SV* |newSVpv_share |NULLOK const char* s|U32 hash
AfpdR |SV* |newSVpvf |NN const char *const pat|...
ApR |SV* |vnewSVpvf |NN const char *const pat|NULLOK va_list *const args
Apd |SV* |newSVrv |NN SV *const rv|NULLOK const char *const classname
-ApmbdR |SV* |newSVsv |NULLOK SV *const old
-ApmdR |SV* |newSVsv_nomg |NULLOK SV *const old
+ApMbdR |SV* |newSVsv |NULLOK SV *const old
+AmdR |SV* |newSVsv_nomg |NULLOK SV *const old
ApR |SV* |newSVsv_flags |NULLOK SV *const old|I32 flags
ApdR |SV* |newSV_type |const svtype type
ApdR |OP* |newUNOP |I32 type|I32 flags|NULLOK OP* first
@@ -1236,7 +1434,7 @@ Apd |void |cv_set_call_checker_flags|NN CV *cv \
|NN Perl_call_checker ckfun \
|NN SV *ckobj|U32 ckflags
Apd |void |wrap_op_checker|Optype opcode|NN Perl_check_t new_checker|NN Perl_check_t *old_checker_p
-AMpd |void |wrap_keyword_plugin|NN Perl_keyword_plugin_t new_plugin|NN Perl_keyword_plugin_t *old_plugin_p
+Axpd |void |wrap_keyword_plugin|NN Perl_keyword_plugin_t new_plugin|NN Perl_keyword_plugin_t *old_plugin_p
ApR |PERL_SI*|new_stackinfo|I32 stitems|I32 cxitems
Ap |char* |scan_vstring |NN const char *s|NN const char *const e \
|NN SV *sv
@@ -1253,15 +1451,10 @@ Apd |SV* |vstringify |NN SV *vs
Apd |int |vcmp |NN SV *lhv|NN SV *rhv
: Used in pp_hot.c and pp_sys.c
p |PerlIO*|nextargv |NN GV* gv|bool nomagicopen
-#ifdef HAS_MEMMEM
-AdnopP |char* |ninstr |NN const char* big|NN const char* bigend \
- |NN const char* little|NN const char* lend
-#else
-AdnpP |char* |ninstr |NN const char* big|NN const char* bigend \
+AdMTpP |char* |ninstr |NN const char* big|NN const char* bigend \
|NN const char* little|NN const char* lend
-#endif
Apd |void |op_free |NULLOK OP* arg
-Mp |OP* |op_unscope |NULLOK OP* o
+xp |OP* |op_unscope |NULLOK OP* o
#ifdef PERL_CORE
p |void |opslab_free |NN OPSLAB *slab
p |void |opslab_free_nopad|NN OPSLAB *slab
@@ -1275,7 +1468,7 @@ p |void |package_version|NN OP* v
p |PADOFFSET|allocmy |NN const char *const name|const STRLEN len\
|const U32 flags
#ifdef USE_ITHREADS
-AMp |PADOFFSET|alloccopstash|NN HV *hv
+Adxp |PADOFFSET|alloccopstash|NN HV *hv
#endif
: Used in perly.y
pR |OP* |oopsAV |NN OP* o
@@ -1286,12 +1479,12 @@ pR |OP* |oopsHV |NN OP* o
p |void |peep |NULLOK OP* o
p |void |rpeep |NULLOK OP* o
: Defined in doio.c, used only in pp_hot.c
-dopM |PerlIO*|start_glob |NN SV *tmpglob|NN IO *io
+dopx |PerlIO*|start_glob |NN SV *tmpglob|NN IO *io
Ap |void |reentrant_size
Ap |void |reentrant_init
Ap |void |reentrant_free
-Anp |void* |reentrant_retry|NN const char *f|...
+ATp |void* |reentrant_retry|NN const char *f|...
: "Very" special - can't use the O flag for this one:
: (The rename from perl_atexit to Perl_call_atexit was in 864dbfa3ca8032ef)
@@ -1309,46 +1502,50 @@ ApdO |AV* |get_av |NN const char *name|I32 flags
ApdO |HV* |get_hv |NN const char *name|I32 flags
ApdO |CV* |get_cv |NN const char* name|I32 flags
Apd |CV* |get_cvn_flags |NN const char* name|STRLEN len|I32 flags
-Ando |const char*|Perl_setlocale|const int category|NULLOK const char* locale
+ATdo |const char*|Perl_setlocale|const int category|NULLOK const char* locale
#if defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H)
-Ando |const char*|Perl_langinfo|const nl_item item
+ATdo |const char*|Perl_langinfo|const nl_item item
#else
-Ando |const char*|Perl_langinfo|const int item
+ATdo |const char*|Perl_langinfo|const int item
#endif
-ApOM |int |init_i18nl10n |int printwarn
-AbpOM |int |init_i18nl14n |int printwarn
+CpO |int |init_i18nl10n |int printwarn
+CbpOD |int |init_i18nl14n |int printwarn
p |char* |my_strerror |const int errnum
-Xpn |void |_warn_problematic_locale
+XpT |void |_warn_problematic_locale
Xp |void |set_numeric_underlying
Xp |void |set_numeric_standard
Xp |bool |_is_in_locale_category|const bool compiling|const int category
-Apdn |void |switch_to_global_locale
-Apdn |bool |sync_locale
-ApMn |void |thread_locale_init
-ApMn |void |thread_locale_term
+ApdT |void |switch_to_global_locale
+ApdT |bool |sync_locale
+ApxT |void |thread_locale_init
+ApxT |void |thread_locale_term
ApdO |void |require_pv |NN const char* pv
-Abpd |void |pack_cat |NN SV *cat|NN const char *pat|NN const char *patend \
+AbpdM |void |pack_cat |NN SV *cat|NN const char *pat|NN const char *patend \
|NN SV **beglist|NN SV **endlist|NN SV ***next_in_list|U32 flags
Apd |void |packlist |NN SV *cat|NN const char *pat|NN const char *patend|NN SV **beglist|NN SV **endlist
#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
-s |void |pidgone |Pid_t pid|int status
+S |void |pidgone |Pid_t pid|int status
#endif
: Used in perly.y
p |OP* |pmruntime |NN OP *o|NN OP *expr|NULLOK OP *repl \
|UV flags|I32 floor
#if defined(PERL_IN_OP_C)
-s |OP* |pmtrans |NN OP* o|NN OP* expr|NN OP* repl
+S |OP* |pmtrans |NN OP* o|NN OP* expr|NN OP* repl
#endif
+p |void |invmap_dump |NN SV* invlist|NN UV * map
Ap |void |pop_scope
Ap |void |push_scope
-Apmb |OP* |ref |NULLOK OP* o|I32 type
+#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C)
+ApMb |OP* |ref |NULLOK OP* o|I32 type
+#endif
#if defined(PERL_IN_OP_C)
-s |OP* |refkids |NULLOK OP* o|I32 type
+S |OP* |refkids |NULLOK OP* o|I32 type
#endif
Ap |void |regdump |NN const regexp* r
+CiTop |struct regexp *|ReANY |NN const REGEXP * const re
#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_PERL_C) || defined(PERL_IN_UTF8_C)
EXpR |SV* |_new_invlist_C_array|NN const UV* const list
-EXMp |bool |_invlistEQ |NN SV* const a|NN SV* const b|const bool complement_b
+EXp |bool |_invlistEQ |NN SV* const a|NN SV* const b|const bool complement_b
#endif
Ap |I32 |pregexec |NN REGEXP * const prog|NN char* stringarg \
|NN char* strend|NN char* strbeg \
@@ -1370,14 +1567,14 @@ p |REGEXP*|re_op_compile |NULLOK SV ** const patternp \
|NULLOK bool *is_bare_re \
|const U32 rx_flags|const U32 pm_flags
Ap |REGEXP*|re_compile |NN SV * const pattern|U32 orig_rx_flags
-Ap |char* |re_intuit_start|NN REGEXP * const rx \
+Cp |char* |re_intuit_start|NN REGEXP * const rx \
|NULLOK SV* sv \
|NN const char* const strbeg \
|NN char* strpos \
|NN char* strend \
|const U32 flags \
|NULLOK re_scream_pos_data *data
-Ap |SV* |re_intuit_string|NN REGEXP *const r
+Cp |SV* |re_intuit_string|NN REGEXP *const r
Ap |I32 |regexec_flags |NN REGEXP *const rx|NN char *stringarg \
|NN char *strend|NN char *strbeg \
|SSize_t minend|NN SV *sv \
@@ -1404,18 +1601,18 @@ EXp |I32|reg_numbered_buff_length|NN REGEXP * const rx|NN const SV * const sv|co
: FIXME - is anything in re using this now?
EXp |SV*|reg_qr_package|NN REGEXP * const rx
-Anp |void |repeatcpy |NN char* to|NN const char* from|I32 len|IV count
-AdnpP |char* |rninstr |NN const char* big|NN const char* bigend \
+ATp |void |repeatcpy |NN char* to|NN const char* from|I32 len|IV count
+AdTpP |char* |rninstr |NN const char* big|NN const char* bigend \
|NN const char* little|NN const char* lend
-Ap |Sighandler_t|rsignal |int i|Sighandler_t t
+Apd |Sighandler_t|rsignal |int i|Sighandler_t t
: Used in pp_sys.c
p |int |rsignal_restore|int i|NULLOK Sigsave_t* t
: Used in pp_sys.c
p |int |rsignal_save |int i|Sighandler_t t1|NN Sigsave_t* save
Ap |Sighandler_t|rsignal_state|int i
#if defined(PERL_IN_PP_CTL_C)
-s |void |rxres_free |NN void** rsp
-s |void |rxres_restore |NN void **rsp|NN REGEXP *rx
+S |void |rxres_free |NN void** rsp
+S |void |rxres_restore |NN void **rsp|NN REGEXP *rx
#endif
: Used in pp_hot.c
p |void |rxres_save |NN void **rsp|NN REGEXP *rx
@@ -1424,7 +1621,7 @@ p |void |rxres_save |NN void **rsp|NN REGEXP *rx
p |I32 |same_dirent |NN const char* a|NN const char* b
#endif
Apda |char* |savepv |NULLOK const char* pv
-Apda |char* |savepvn |NULLOK const char* pv|I32 len
+Apda |char* |savepvn |NULLOK const char* pv|Size_t len
Apda |char* |savesharedpv |NULLOK const char* pv
: NULLOK only to suppress a compiler warning
@@ -1434,12 +1631,12 @@ Apda |char* |savesharedsvpv |NN SV *sv
Apda |char* |savesvpv |NN SV* sv
Ap |void |savestack_grow
Ap |void |savestack_grow_cnt |I32 need
-Amp |void |save_aelem |NN AV* av|SSize_t idx|NN SV **sptr
+Am |void |save_aelem |NN AV* av|SSize_t idx|NN SV **sptr
Ap |void |save_aelem_flags|NN AV* av|SSize_t idx|NN SV **sptr \
|const U32 flags
Ap |I32 |save_alloc |I32 size|I32 pad
-Ap |void |save_aptr |NN AV** aptr
-Ap |AV* |save_ary |NN GV* gv
+Apdh |void |save_aptr |NN AV** aptr
+Apdh |AV* |save_ary |NN GV* gv
Ap |void |save_bool |NN bool* boolp
Ap |void |save_clearsv |NN SV** svp
Ap |void |save_delete |NN HV *hv|NN char *key|I32 klen
@@ -1447,57 +1644,59 @@ Ap |void |save_hdelete |NN HV *hv|NN SV *keysv
Ap |void |save_adelete |NN AV *av|SSize_t key
Ap |void |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f|NN void* p
Ap |void |save_destructor_x|DESTRUCTORFUNC_t f|NULLOK void* p
-Apmb |void |save_freesv |NULLOK SV* sv
+ApMb |void |save_freesv |NULLOK SV* sv
: Used in SAVEFREOP(), used in op.c, pp_ctl.c
-Apmb |void |save_freeop |NULLOK OP* o
-Apmb |void |save_freepv |NULLOK char* pv
+ApMb |void |save_freeop |NULLOK OP* o
+ApMb |void |save_freepv |NULLOK char* pv
Ap |void |save_generic_svref|NN SV** sptr
Ap |void |save_generic_pvref|NN char** str
Ap |void |save_shared_pvref|NN char** str
Adp |void |save_gp |NN GV* gv|I32 empty
-Ap |HV* |save_hash |NN GV* gv
+Apdh |HV* |save_hash |NN GV* gv
Ap |void |save_hints
-Amp |void |save_helem |NN HV *hv|NN SV *key|NN SV **sptr
+Am |void |save_helem |NN HV *hv|NN SV *key|NN SV **sptr
Ap |void |save_helem_flags|NN HV *hv|NN SV *key|NN SV **sptr|const U32 flags
-Ap |void |save_hptr |NN HV** hptr
+Apdh |void |save_hptr |NN HV** hptr
Ap |void |save_I16 |NN I16* intp
Ap |void |save_I32 |NN I32* intp
Ap |void |save_I8 |NN I8* bytep
Ap |void |save_int |NN int* intp
-Ap |void |save_item |NN SV* item
+Apdh |void |save_item |NN SV* item
Ap |void |save_iv |NN IV *ivp
-Abp |void |save_list |NN SV** sarg|I32 maxsarg
-Abp |void |save_long |NN long* longp
-Apmb |void |save_mortalizesv|NN SV* sv
-Abp |void |save_nogv |NN GV* gv
+AbpDdh |void |save_list |NN SV** sarg|I32 maxsarg
+AbpD |void |save_long |NN long* longp
+ApMb |void |save_mortalizesv|NN SV* sv
+AbpD |void |save_nogv |NN GV* gv
: Used in SAVEFREOP(), used in gv.c, op.c, perl.c, pp_ctl.c, pp_sort.c
-Apmb |void |save_op
-Ap |SV* |save_scalar |NN GV* gv
+ApMb |void |save_op
+Apdh |SV* |save_scalar |NN GV* gv
Ap |void |save_pptr |NN char** pptr
Ap |void |save_vptr |NN void *ptr
Ap |void |save_re_context
Ap |void |save_padsv_and_mortalize|PADOFFSET off
Ap |void |save_sptr |NN SV** sptr
Xp |void |save_strlen |NN STRLEN* ptr
-Ap |SV* |save_svref |NN SV** sptr
-AMpo |void |savetmps
+Apdh |SV* |save_svref |NN SV** sptr
+Axpo |void |savetmps
Ap |void |save_pushptr |NULLOK void *const ptr|const int type
Ap |void |save_pushi32ptr|const I32 i|NULLOK void *const ptr|const int type
: Used by SAVESWITCHSTACK() in pp.c
Ap |void |save_pushptrptr|NULLOK void *const ptr1 \
|NULLOK void *const ptr2|const int type
#if defined(PERL_IN_SCOPE_C)
-s |void |save_pushptri32ptr|NULLOK void *const ptr1|const I32 i \
+S |void |save_pushptri32ptr|NULLOK void *const ptr1|const I32 i \
|NULLOK void *const ptr2|const int type
#endif
+Xiop |I32 |TOPMARK
+Xiop |I32 |POPMARK
: Used in perly.y
p |OP* |sawparens |NULLOK OP* o
Apd |OP* |op_contextualize|NN OP* o|I32 context
: Used in perly.y
p |OP* |scalar |NULLOK OP* o
#if defined(PERL_IN_OP_C)
-s |OP* |scalarkids |NULLOK OP* o
-s |OP* |scalarseq |NULLOK OP* o
+S |OP* |scalarkids |NULLOK OP* o
+S |OP* |scalarseq |NULLOK OP* o
#endif
: Used in pp_ctl.c
p |OP* |scalarvoid |NN OP* o
@@ -1505,70 +1704,77 @@ Apd |NV |scan_bin |NN const char* start|STRLEN len|NN STRLEN* retlen
Apd |NV |scan_hex |NN const char* start|STRLEN len|NN STRLEN* retlen
Ap |char* |scan_num |NN const char* s|NN YYSTYPE *lvalp
Apd |NV |scan_oct |NN const char* start|STRLEN len|NN STRLEN* retlen
-AMpd |OP* |op_scope |NULLOK OP* o
+Axpd |OP* |op_scope |NULLOK OP* o
: Only used by perl.c/miniperl.c, but defined in caretx.c
-px |void |set_caret_X
+pe |void |set_caret_X
Apd |void |setdefout |NN GV* gv
Ap |HEK* |share_hek |NN const char* str|SSize_t len|U32 hash
-#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_USE_3ARG_SIGHANDLER
: Used in perl.c
-np |Signal_t |sighandler |int sig|NULLOK siginfo_t *info|NULLOK void *uap
-Anp |Signal_t |csighandler |int sig|NULLOK siginfo_t *info|NULLOK void *uap
+Tp |Signal_t |sighandler |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
+ATp |Signal_t |csighandler |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
#else
-np |Signal_t |sighandler |int sig
-Anp |Signal_t |csighandler |int sig
-#endif
+Tp |Signal_t |sighandler |int sig
+ATp |Signal_t |csighandler |int sig
+#endif
+Tp |Signal_t |sighandler1 |int sig
+ATp |Signal_t |csighandler1 |int sig
+Tp |Signal_t |sighandler3 |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
+ATp |Signal_t |csighandler3 |int sig|NULLOK Siginfo_t *info|NULLOK void *uap
+ATp |Signal_t |perly_sighandler |int sig|NULLOK Siginfo_t *info|NULLOK void *uap|bool safe
Ap |SV** |stack_grow |NN SV** sp|NN SV** p|SSize_t n
Ap |I32 |start_subparse |I32 is_format|U32 flags
Xp |void |init_named_cv |NN CV *cv|NN OP *nameop
: Used in pp_ctl.c
p |void |sub_crush_depth|NN CV* cv
-Apbmd |bool |sv_2bool |NN SV *const sv
+ApbMd |bool |sv_2bool |NN SV *const sv
Apd |bool |sv_2bool_flags |NN SV *sv|I32 flags
Apd |CV* |sv_2cv |NULLOK SV* sv|NN HV **const st|NN GV **const gvp \
|const I32 lref
Apd |IO* |sv_2io |NN SV *const sv
#if defined(PERL_IN_SV_C)
-s |bool |glob_2number |NN GV* const gv
+S |bool |glob_2number |NN GV* const gv
#endif
-Apmb |IV |sv_2iv |NN SV *sv
+ApMb |IV |sv_2iv |NN SV *sv
Apd |IV |sv_2iv_flags |NN SV *const sv|const I32 flags
Apd |SV* |sv_2mortal |NULLOK SV *const sv
Apd |NV |sv_2nv_flags |NN SV *const sv|const I32 flags
: Used in pp.c, pp_hot.c, sv.c
-pMd |SV* |sv_2num |NN SV *const sv
-Apmb |char* |sv_2pv |NN SV *sv|NULLOK STRLEN *lp
+pxd |SV* |sv_2num |NN SV *const sv
+ApMb |char* |sv_2pv |NN SV *sv|NULLOK STRLEN *lp
Apd |char* |sv_2pv_flags |NN SV *const sv|NULLOK STRLEN *const lp|const I32 flags
-Apd |char* |sv_2pvutf8 |NN SV *sv|NULLOK STRLEN *const lp
-Apd |char* |sv_2pvbyte |NN SV *sv|NULLOK STRLEN *const lp
-Abp |char* |sv_pvn_nomg |NN SV* sv|NULLOK STRLEN* lp
-Apmb |UV |sv_2uv |NN SV *sv
+ApdMb |char* |sv_2pvutf8 |NN SV *sv|NULLOK STRLEN *const lp
+Ap |char* |sv_2pvutf8_flags |NN SV *sv|NULLOK STRLEN *const lp|const U32 flags
+ApdMb |char* |sv_2pvbyte |NN SV *sv|NULLOK STRLEN *const lp
+Ap |char* |sv_2pvbyte_flags |NN SV *sv|NULLOK STRLEN *const lp|const U32 flags
+AbpD |char* |sv_pvn_nomg |NN SV* sv|NULLOK STRLEN* lp
+ApMb |UV |sv_2uv |NN SV *sv
Apd |UV |sv_2uv_flags |NN SV *const sv|const I32 flags
-Abpd |IV |sv_iv |NN SV* sv
-Abpd |UV |sv_uv |NN SV* sv
-Abpd |NV |sv_nv |NN SV* sv
-Abpd |char* |sv_pvn |NN SV *sv|NN STRLEN *lp
-Abpd |char* |sv_pvutf8n |NN SV *sv|NN STRLEN *lp
-Abpd |char* |sv_pvbyten |NN SV *sv|NN STRLEN *lp
+AbpdD |IV |sv_iv |NN SV* sv
+AbpdD |UV |sv_uv |NN SV* sv
+AbpdD |NV |sv_nv |NN SV* sv
+AbpdD |char* |sv_pvn |NN SV *sv|NN STRLEN *lp
+AbpdD |char* |sv_pvutf8n |NN SV *sv|NN STRLEN *lp
+AbpdD |char* |sv_pvbyten |NN SV *sv|NN STRLEN *lp
Apd |I32 |sv_true |NULLOK SV *const sv
#if defined(PERL_IN_SV_C)
-sd |void |sv_add_arena |NN char *const ptr|const U32 size \
+Sd |void |sv_add_arena |NN char *const ptr|const U32 size \
|const U32 flags
#endif
-Apdn |void |sv_backoff |NN SV *const sv
+ApdT |void |sv_backoff |NN SV *const sv
Apd |SV* |sv_bless |NN SV *const sv|NN HV *const stash
#if defined(PERL_DEBUG_READONLY_COW)
p |void |sv_buf_to_ro |NN SV *sv
# if defined(PERL_IN_SV_C)
-s |void |sv_buf_to_rw |NN SV *sv
+S |void |sv_buf_to_rw |NN SV *sv
# endif
#endif
Afpd |void |sv_catpvf |NN SV *const sv|NN const char *const pat|...
Apd |void |sv_vcatpvf |NN SV *const sv|NN const char *const pat \
|NULLOK va_list *const args
Apd |void |sv_catpv |NN SV *const sv|NULLOK const char* ptr
-Apmdb |void |sv_catpvn |NN SV *dsv|NN const char *sstr|STRLEN len
-Apmdb |void |sv_catsv |NN SV *dstr|NULLOK SV *sstr
+ApMdb |void |sv_catpvn |NN SV *dsv|NN const char *sstr|STRLEN len
+ApMdb |void |sv_catsv |NN SV *dstr|NULLOK SV *sstr
Apd |void |sv_chop |NN SV *const sv|NULLOK const char *const ptr
: Used only in perl.c
pd |I32 |sv_clean_all
@@ -1576,43 +1782,44 @@ pd |I32 |sv_clean_all
pd |void |sv_clean_objs
Apd |void |sv_clear |NN SV *const orig_sv
#if defined(PERL_IN_SV_C)
-s |bool |curse |NN SV * const sv|const bool check_refcnt
+S |bool |curse |NN SV * const sv|const bool check_refcnt
#endif
-Aopd |I32 |sv_cmp |NULLOK SV *const sv1|NULLOK SV *const sv2
+AMpd |I32 |sv_cmp |NULLOK SV *const sv1|NULLOK SV *const sv2
Apd |I32 |sv_cmp_flags |NULLOK SV *const sv1|NULLOK SV *const sv2 \
|const U32 flags
-Aopd |I32 |sv_cmp_locale |NULLOK SV *const sv1|NULLOK SV *const sv2
+AMpd |I32 |sv_cmp_locale |NULLOK SV *const sv1|NULLOK SV *const sv2
Apd |I32 |sv_cmp_locale_flags |NULLOK SV *const sv1 \
|NULLOK SV *const sv2|const U32 flags
#if defined(USE_LOCALE_COLLATE)
-Apbmd |char* |sv_collxfrm |NN SV *const sv|NN STRLEN *const nxp
+ApbMd |char* |sv_collxfrm |NN SV *const sv|NN STRLEN *const nxp
Apd |char* |sv_collxfrm_flags |NN SV *const sv|NN STRLEN *const nxp|I32 const flags
#endif
Apd |int |getcwd_sv |NN SV* sv
Apd |void |sv_dec |NULLOK SV *const sv
Apd |void |sv_dec_nomg |NULLOK SV *const sv
-Ap |void |sv_dump |NULLOK SV* sv
+Apd |void |sv_dump |NULLOK SV* sv
ApdR |bool |sv_derived_from|NN SV* sv|NN const char *const name
ApdR |bool |sv_derived_from_sv|NN SV* sv|NN SV *namesv|U32 flags
ApdR |bool |sv_derived_from_pv|NN SV* sv|NN const char *const name|U32 flags
ApdR |bool |sv_derived_from_pvn|NN SV* sv|NN const char *const name \
|const STRLEN len|U32 flags
+ApdRx |bool |sv_isa_sv |NN SV* sv|NN SV* namesv
ApdR |bool |sv_does |NN SV* sv|NN const char *const name
ApdR |bool |sv_does_sv |NN SV* sv|NN SV* namesv|U32 flags
ApdR |bool |sv_does_pv |NN SV* sv|NN const char *const name|U32 flags
ApdR |bool |sv_does_pvn |NN SV* sv|NN const char *const name|const STRLEN len \
|U32 flags
-Apbmd |I32 |sv_eq |NULLOK SV* sv1|NULLOK SV* sv2
+ApbMd |I32 |sv_eq |NULLOK SV* sv1|NULLOK SV* sv2
Apd |I32 |sv_eq_flags |NULLOK SV* sv1|NULLOK SV* sv2|const U32 flags
Apd |void |sv_free |NULLOK SV *const sv
-poMX |void |sv_free2 |NN SV *const sv|const U32 refcnt
+poxX |void |sv_free2 |NN SV *const sv|const U32 refcnt
: Used only in perl.c
pd |void |sv_free_arenas
Apd |char* |sv_gets |NN SV *const sv|NN PerlIO *const fp|I32 append
Apd |char* |sv_grow |NN SV *const sv|STRLEN newlen
Apd |void |sv_inc |NULLOK SV *const sv
Apd |void |sv_inc_nomg |NULLOK SV *const sv
-Apmdb |void |sv_insert |NN SV *const bigstr|const STRLEN offset \
+ApMdb |void |sv_insert |NN SV *const bigstr|const STRLEN offset \
|const STRLEN len|NN const char *const little \
|const STRLEN littlelen
Apd |void |sv_insert_flags|NN SV *const bigstr|const STRLEN offset|const STRLEN len \
@@ -1627,11 +1834,11 @@ Apd |void |sv_magic |NN SV *const sv|NULLOK SV *const obj|const int how \
Apd |MAGIC *|sv_magicext |NN SV *const sv|NULLOK SV *const obj|const int how \
|NULLOK const MGVTBL *const vtbl|NULLOK const char *const name \
|const I32 namlen
-Ein |bool |sv_only_taint_gmagic|NN SV *sv
+EiTp |bool |sv_only_taint_gmagic|NN SV *sv
: exported for re.pm
EXp |MAGIC *|sv_magicext_mglob|NN SV *sv
-ApdbmR |SV* |sv_mortalcopy |NULLOK SV *const oldsv
-XpR |SV* |sv_mortalcopy_flags|NULLOK SV *const oldsv|U32 flags
+ApdbMR |SV* |sv_mortalcopy |NULLOK SV *const oldsv
+ApdR |SV* |sv_mortalcopy_flags|NULLOK SV *const oldsv|U32 flags
ApdR |SV* |sv_newmortal
Apd |SV* |sv_newref |NULLOK SV *const sv
Ap |char* |sv_peek |NULLOK SV* sv
@@ -1641,7 +1848,7 @@ Apd |STRLEN |sv_pos_u2b_flags|NN SV *const sv|STRLEN uoffset \
Apd |void |sv_pos_b2u |NULLOK SV *const sv|NN I32 *const offsetp
Apd |STRLEN |sv_pos_b2u_flags|NN SV *const sv|STRLEN const offset \
|U32 flags
-Apmdb |char* |sv_pvn_force |NN SV* sv|NULLOK STRLEN* lp
+ApMdb |char* |sv_pvn_force |NN SV* sv|NULLOK STRLEN* lp
Apd |char* |sv_pvutf8n_force|NN SV *const sv|NULLOK STRLEN *const lp
Apd |char* |sv_pvbyten_force|NN SV *const sv|NULLOK STRLEN *const lp
Apd |char* |sv_recode_to_utf8 |NN SV* sv|NN SV *encoding
@@ -1657,7 +1864,7 @@ p |void |sv_resetpvn |NULLOK const char* s|STRLEN len \
Afpd |void |sv_setpvf |NN SV *const sv|NN const char *const pat|...
Apd |void |sv_vsetpvf |NN SV *const sv|NN const char *const pat|NULLOK va_list *const args
Apd |void |sv_setiv |NN SV *const sv|const IV num
-Apdb |void |sv_setpviv |NN SV *const sv|const IV num
+ApdbD |void |sv_setpviv |NN SV *const sv|const IV num
Apd |void |sv_setuv |NN SV *const sv|const UV num
Apd |void |sv_setnv |NN SV *const sv|const NV num
Apd |SV* |sv_setref_iv |NN SV *const rv|NULLOK const char *const classname|const IV iv
@@ -1671,16 +1878,16 @@ Apd |void |sv_setpv |NN SV *const sv|NULLOK const char *const ptr
Apd |void |sv_setpvn |NN SV *const sv|NULLOK const char *const ptr|const STRLEN len
Apd |char *|sv_setpv_bufsize|NN SV *const sv|const STRLEN cur|const STRLEN len
Xp |void |sv_sethek |NN SV *const sv|NULLOK const HEK *const hek
-Apmdb |void |sv_setsv |NN SV *dstr|NULLOK SV *sstr
-Apmdb |void |sv_taint |NN SV* sv
+ApMdb |void |sv_setsv |NN SV *dstr|NULLOK SV *sstr
+ApMdb |void |sv_taint |NN SV* sv
ApdR |bool |sv_tainted |NN SV *const sv
Apd |int |sv_unmagic |NN SV *const sv|const int type
Apd |int |sv_unmagicext |NN SV *const sv|const int type|NULLOK MGVTBL *vtbl
-Apdmb |void |sv_unref |NN SV* sv
+ApdMb |void |sv_unref |NN SV* sv
Apd |void |sv_unref_flags |NN SV *const ref|const U32 flags
Apd |void |sv_untaint |NN SV *const sv
Apd |void |sv_upgrade |NN SV *const sv|svtype new_type
-Apdmb |void |sv_usepvn |NN SV* sv|NULLOK char* ptr|STRLEN len
+ApdMb |void |sv_usepvn |NN SV* sv|NULLOK char* ptr|STRLEN len
Apd |void |sv_usepvn_flags|NN SV *const sv|NULLOK char* ptr|const STRLEN len\
|const U32 flags
Apd |void |sv_vcatpvfn |NN SV *const sv|NN const char *const pat|const STRLEN patlen \
@@ -1693,64 +1900,75 @@ Apd |void |sv_vsetpvfn |NN SV *const sv|NN const char *const pat|const STRLEN pa
|NULLOK va_list *const args|NULLOK SV **const svargs \
|const Size_t sv_count|NULLOK bool *const maybe_tainted
ApR |NV |str_to_version |NN SV *sv
-EXpRM |SV* |swash_init |NN const char* pkg|NN const char* name|NN SV* listsv|I32 minbits|I32 none
-EXpM |UV |swash_fetch |NN SV *swash|NN const U8 *ptr|bool do_utf8
-#ifdef PERL_IN_REGCOMP_C
-EiMR |SV* |add_cp_to_invlist |NULLOK SV* invlist|const UV cp
-EiMRn |bool |invlist_is_iterating|NN SV* const invlist
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_DOOP_C)
+EiR |SV* |add_cp_to_invlist |NULLOK SV* invlist|const UV cp
+Ei |void |invlist_extend |NN SV* const invlist|const UV len
+Ei |void |invlist_set_len|NN SV* const invlist|const UV len|const bool offset
+EiRT |UV |invlist_highest|NN SV* const invlist
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_OP_C)
+EiRT |STRLEN*|get_invlist_iter_addr |NN SV* invlist
+EiT |void |invlist_iterinit|NN SV* invlist
+EiRT |bool |invlist_iternext|NN SV* invlist|NN UV* start|NN UV* end
+EiT |void |invlist_iterfinish|NN SV* invlist
+#endif
+#if defined(PERL_IN_REGCOMP_C)
+EiRT |bool |invlist_is_iterating|NN SV* const invlist
+EiR |SV* |invlist_contents|NN SV* const invlist \
+ |const bool traditional_style
+EixRT |UV |invlist_lowest|NN SV* const invlist
#ifndef PERL_EXT_RE_BUILD
-EiMRn |UV* |_invlist_array_init |NN SV* const invlist|const bool will_have_0
-EiMRn |UV |invlist_max |NN SV* const invlist
-EsM |void |_append_range_to_invlist |NN SV* const invlist|const UV start|const UV end
-EsM |void |invlist_extend |NN SV* const invlist|const UV len
-EsM |void |invlist_replace_list_destroys_src|NN SV *dest|NN SV *src
-EiMRn |IV* |get_invlist_previous_index_addr|NN SV* invlist
-EiM |void |invlist_set_len|NN SV* const invlist|const UV len|const bool offset
-EiMn |void |invlist_set_previous_index|NN SV* const invlist|const IV index
-EiMRn |IV |invlist_previous_index|NN SV* const invlist
-EiMn |void |invlist_trim |NN SV* invlist
-EiM |void |invlist_clear |NN SV* invlist
-sM |void |initialize_invlist_guts|NN SV* invlist|const Size_t initial_size
-#endif
-EiMRn |STRLEN*|get_invlist_iter_addr |NN SV* invlist
-EiMn |void |invlist_iterinit|NN SV* invlist
-EsMRn |bool |invlist_iternext|NN SV* invlist|NN UV* start|NN UV* end
-EiMn |void |invlist_iterfinish|NN SV* invlist
-EiMRn |UV |invlist_highest|NN SV* const invlist
-EMRs |SV* |_make_exactf_invlist |NN RExC_state_t *pRExC_state \
+EiRT |UV* |_invlist_array_init |NN SV* const invlist|const bool will_have_0
+EiRT |UV |invlist_max |NN SV* const invlist
+EiRT |IV* |get_invlist_previous_index_addr|NN SV* invlist
+EiT |void |invlist_set_previous_index|NN SV* const invlist|const IV index
+EiRT |IV |invlist_previous_index|NN SV* const invlist
+EiT |void |invlist_trim |NN SV* invlist
+Ei |void |invlist_clear |NN SV* invlist
+#endif
+ESRT |bool |new_regcurly |NN const char *s|NN const char *e
+ERS |SV* |make_exactf_invlist |NN RExC_state_t *pRExC_state \
|NN regnode *node
-EsMR |SV* |invlist_contents|NN SV* const invlist \
- |const bool traditional_style
-EsRn |bool |new_regcurly |NN const char *s|NN const char *e
+#ifndef PERL_EXT_RE_BUILD
+ES |void |_append_range_to_invlist |NN SV* const invlist|const UV start|const UV end
+ES |void |invlist_replace_list_destroys_src|NN SV *dest|NN SV *src
+S |void |initialize_invlist_guts|NN SV* invlist|const Size_t initial_size
+#endif
#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C)
-EXmM |void |_invlist_intersection |NN SV* const a|NN SV* const b|NN SV** i
-EXpM |void |_invlist_intersection_maybe_complement_2nd \
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_UTF8_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_DOOP_C)
+m |void |_invlist_intersection |NN SV* const a|NN SV* const b|NN SV** i
+EXp |void |_invlist_intersection_maybe_complement_2nd \
|NULLOK SV* const a|NN SV* const b \
|const bool complement_b|NN SV** i
-EXmM |void |_invlist_union |NULLOK SV* const a|NN SV* const b|NN SV** output
-EXpM |void |_invlist_union_maybe_complement_2nd \
+Cm |void |_invlist_union |NULLOK SV* const a|NN SV* const b|NN SV** output
+EXp |void |_invlist_union_maybe_complement_2nd \
|NULLOK SV* const a|NN SV* const b \
|const bool complement_b|NN SV** output
-EXmM |void |_invlist_subtract|NN SV* const a|NN SV* const b|NN SV** result
-EXpM |void |_invlist_invert|NN SV* const invlist
-EXMpR |SV* |_new_invlist |IV initial_size
-EXMpR |SV* |_add_range_to_invlist |NULLOK SV* invlist|UV start|UV end
-EXMpR |SV* |_setup_canned_invlist|const STRLEN size|const UV element0|NN UV** other_elements_ptr
+m |void |_invlist_subtract|NN SV* const a|NN SV* const b|NN SV** result
+EXp |void |_invlist_invert|NN SV* const invlist
+EXpR |SV* |_new_invlist |IV initial_size
+EXpR |SV* |_add_range_to_invlist |NULLOK SV* invlist|UV start|UV end
+EXpR |SV* |_setup_canned_invlist|const STRLEN size|const UV element0|NN UV** other_elements_ptr
#endif
#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_SV_C)
-EMpX |SV* |invlist_clone |NN SV* const invlist|NULLOK SV* newlist
-#endif
-#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) || defined(PERL_IN_PP_C)
-EiMRn |UV* |invlist_array |NN SV* const invlist
-EiMRn |bool |is_invlist |NULLOK SV* const invlist
-EiMRn |bool* |get_invlist_offset_addr|NN SV* invlist
-EiMRn |UV |_invlist_len |NN SV* const invlist
-EMiRn |bool |_invlist_contains_cp|NN SV* const invlist|const UV cp
-EXpMRn |SSize_t|_invlist_search |NN SV* const invlist|const UV cp
+EpX |SV* |invlist_clone |NN SV* const invlist|NULLOK SV* newlist
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) \
+ || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UTF8_C) \
+ || defined(PERL_IN_PP_C) || defined(PERL_IN_OP_C) \
+ || defined(PERL_IN_DOOP_C)
+EiRT |UV* |invlist_array |NN SV* const invlist
+EiRT |bool |is_invlist |NULLOK SV* const invlist
+EiRT |bool* |get_invlist_offset_addr|NN SV* invlist
+EiRT |UV |_invlist_len |NN SV* const invlist
+EiRT |bool |_invlist_contains_cp|NN SV* const invlist|const UV cp
+EXpRT |SSize_t|_invlist_search |NN SV* const invlist|const UV cp
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C) || defined(PERL_IN_UNIVERSAL_C)
+EiT |const char *|get_regex_charset_name|const U32 flags|NN STRLEN* const lenp
#endif
#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C)
-EXpM |SV* |_get_regclass_nonbitmap_data \
+EXp |SV* |_get_regclass_nonbitmap_data \
|NULLOK const regexp *prog \
|NN const struct regnode *node \
|bool doinit \
@@ -1758,73 +1976,60 @@ EXpM |SV* |_get_regclass_nonbitmap_data \
|NULLOK SV **lonly_utf8_locale \
|NULLOK SV **output_invlist
#endif
-#if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C)
-EXMp |void |_invlist_dump |NN PerlIO *file|I32 level \
+#if defined(PERL_IN_REGCOMP_C) || defined (PERL_IN_DUMP_C) || defined(PERL_IN_OP_C)
+EXp |void |_invlist_dump |NN PerlIO *file|I32 level \
|NN const char* const indent \
|NN SV* const invlist
#endif
Ap |void |taint_env
Ap |void |taint_proper |NULLOK const char* f|NN const char *const s
-EpM |char * |_byte_dump_string \
+EXp |char * |_byte_dump_string \
|NN const U8 * const start \
|const STRLEN len \
|const bool format
#if defined(PERL_IN_UTF8_C)
-inR |int |does_utf8_overflow|NN const U8 * const s \
+iTR |int |does_utf8_overflow|NN const U8 * const s \
|NN const U8 * e \
|const bool consider_overlongs
-inR |int |is_utf8_overlong_given_start_byte_ok|NN const U8 * const s \
+iTR |int |is_utf8_overlong_given_start_byte_ok|NN const U8 * const s \
|const STRLEN len
-inR |int |isFF_OVERLONG |NN const U8 * const s|const STRLEN len
-sMR |char * |unexpected_non_continuation_text \
+iTR |int |isFF_OVERLONG |NN const U8 * const s|const STRLEN len
+SR |char * |unexpected_non_continuation_text \
|NN const U8 * const s \
|STRLEN print_len \
|const STRLEN non_cont_byte_pos \
|const STRLEN expect_len
-s |void |warn_on_first_deprecated_use \
+#if 0 /* Not currently used, but may be needed in the future */
+S |void |warn_on_first_deprecated_use \
|NN const char * const name \
|NN const char * const alternative \
|const bool use_locale \
|NN const char * const file \
|const unsigned line
-s |U32 |check_and_deprecate \
- |NN const U8 * p \
- |NN const U8 ** e \
- |const unsigned type \
- |const bool use_locale \
- |NN const char * const file \
- |const unsigned line
-s |UV |_to_utf8_case |const UV uv1 \
+#endif
+S |UV |_to_utf8_case |const UV uv1 \
|NULLOK const U8 *p \
|NN U8* ustrp \
|NN STRLEN *lenp \
|NN SV *invlist \
- |NN const int * const invmap \
- |NULLOK const unsigned int * const * const aux_tables \
+ |NN const I32 * const invmap \
+ |NULLOK const U32 * const * const aux_tables \
|NULLOK const U8 * const aux_table_lengths \
|NN const char * const normal
-s |UV |turkic_fc |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
-s |UV |turkic_lc |NN const U8 * const p0|NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
-s |UV |turkic_uc |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
-#endif
-ApbmdD |UV |to_utf8_lower |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
-AMp |UV |_to_utf8_lower_flags|NN const U8 *p|NULLOK const U8* e \
- |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags \
- |NN const char * const file|const int line
-ApbmdD |UV |to_utf8_upper |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
-AMp |UV |_to_utf8_upper_flags |NN const U8 *p|NULLOK const U8 *e \
- |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags \
- |NN const char * const file|const int line
-ApbmdD |UV |to_utf8_title |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
-AMp |UV |_to_utf8_title_flags |NN const U8 *p|NULLOK const U8* e \
- |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags \
- |NN const char * const file|const int line
-ApbmdD |UV |to_utf8_fold |NN const U8 *p|NN U8* ustrp|NULLOK STRLEN *lenp
-AMp |UV |_to_utf8_fold_flags|NN const U8 *p|NULLOK const U8 *e \
- |NN U8* ustrp|NULLOK STRLEN *lenp|U8 flags \
- |NN const char * const file|const int line
+S |UV |turkic_fc |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
+S |UV |turkic_lc |NN const U8 * const p0|NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
+S |UV |turkic_uc |NN const U8 * const p |NN const U8 * const e|NN U8* ustrp|NN STRLEN *lenp
+#endif
+Cp |UV |_to_utf8_lower_flags|NN const U8 *p|NULLOK const U8* e \
+ |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags
+Cp |UV |_to_utf8_upper_flags |NN const U8 *p|NULLOK const U8 *e \
+ |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags
+Cp |UV |_to_utf8_title_flags |NN const U8 *p|NULLOK const U8* e \
+ |NN U8* ustrp|NULLOK STRLEN *lenp|bool flags
+Cp |UV |_to_utf8_fold_flags|NN const U8 *p|NULLOK const U8 *e \
+ |NN U8* ustrp|NULLOK STRLEN *lenp|U8 flags
#if defined(PERL_IN_MG_C) || defined(PERL_IN_PP_C)
-pn |bool |translate_substr_offsets|STRLEN curlen|IV pos1_iv \
+pT |bool |translate_substr_offsets|STRLEN curlen|IV pos1_iv \
|bool pos1_is_uv|IV len_iv \
|bool len_is_uv|NN STRLEN *posp \
|NN STRLEN *lenp
@@ -1832,7 +2037,7 @@ pn |bool |translate_substr_offsets|STRLEN curlen|IV pos1_iv \
#if defined(UNLINK_ALL_VERSIONS)
Ap |I32 |unlnk |NN const char* f
#endif
-Abpd |SSize_t|unpack_str |NN const char *pat|NN const char *patend|NN const char *s \
+AbpdD |SSize_t|unpack_str |NN const char *pat|NN const char *patend|NN const char *s \
|NULLOK const char *strbeg|NN const char *strend|NULLOK char **new_s \
|I32 ocnt|U32 flags
Apd |SSize_t|unpackstring |NN const char *pat|NN const char *patend|NN const char *s \
@@ -1842,70 +2047,71 @@ Ap |void |unsharepvn |NULLOK const char* sv|I32 len|U32 hash
p |void |unshare_hek |NULLOK HEK* hek
: Used in perly.y
p |void |utilize |int aver|I32 floor|NULLOK OP* version|NN OP* idop|NULLOK OP* arg
-ApM |void |_force_out_malformed_utf8_message \
+Cp |void |_force_out_malformed_utf8_message \
|NN const U8 *const p|NN const U8 * const e|const U32 flags \
|const bool die_here
-EXp |U8* |utf16_to_utf8 |NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
-EXp |U8* |utf16_to_utf8_reversed|NN U8* p|NN U8 *d|I32 bytelen|NN I32 *newlen
+EXp |U8* |utf16_to_utf8 |NN U8* p|NN U8 *d|Size_t bytelen|NN Size_t *newlen
+EXp |U8* |utf16_to_utf8_reversed|NN U8* p|NN U8 *d|Size_t bytelen|NN Size_t *newlen
AdpR |STRLEN |utf8_length |NN const U8* s|NN const U8 *e
AipdR |IV |utf8_distance |NN const U8 *a|NN const U8 *b
-AipdRn |U8* |utf8_hop |NN const U8 *s|SSize_t off
-AipdRn |U8* |utf8_hop_back|NN const U8 *s|SSize_t off|NN const U8 *start
-AipdRn |U8* |utf8_hop_forward|NN const U8 *s|SSize_t off|NN const U8 *end
-AipdRn |U8* |utf8_hop_safe |NN const U8 *s|SSize_t off|NN const U8 *start|NN const U8 *end
-ApMd |U8* |utf8_to_bytes |NN U8 *s|NN STRLEN *lenp
+AipdRT |U8* |utf8_hop |NN const U8 *s|SSize_t off
+AipdRT |U8* |utf8_hop_back|NN const U8 *s|SSize_t off|NN const U8 *start
+AipdRT |U8* |utf8_hop_forward|NN const U8 *s|SSize_t off|NN const U8 *end
+AipdRT |U8* |utf8_hop_safe |NN const U8 *s|SSize_t off|NN const U8 *start|NN const U8 *end
+Apxd |U8* |utf8_to_bytes |NN U8 *s|NN STRLEN *lenp
Apd |int |bytes_cmp_utf8 |NN const U8 *b|STRLEN blen|NN const U8 *u \
|STRLEN ulen
-AModp |U8* |bytes_from_utf8|NN const U8 *s|NN STRLEN *lenp|NN bool *is_utf8p
-AMnp |U8* |bytes_from_utf8_loc|NN const U8 *s \
+AMxdp |U8* |bytes_from_utf8|NN const U8 *s|NN STRLEN *lenp|NN bool *is_utf8p
+AxTp |U8* |bytes_from_utf8_loc|NN const U8 *s \
|NN STRLEN *lenp \
|NN bool *is_utf8p \
|NULLOK const U8 ** first_unconverted
-ApMd |U8* |bytes_to_utf8 |NN const U8 *s|NN STRLEN *lenp
+Apxd |U8* |bytes_to_utf8 |NN const U8 *s|NN STRLEN *lenp
ApdD |UV |utf8_to_uvchr |NN const U8 *s|NULLOK STRLEN *retlen
-AbpdD |UV |utf8_to_uvuni |NN const U8 *s|NULLOK STRLEN *retlen
-AbpMD |UV |valid_utf8_to_uvuni |NN const U8 *s|NULLOK STRLEN *retlen
-Aopd |UV |utf8_to_uvchr_buf |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
-ApdD |UV |utf8_to_uvuni_buf |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
-pM |bool |check_utf8_print |NN const U8 *s|const STRLEN len
-
-Adnop |UV |utf8n_to_uvchr |NN const U8 *s \
+CbpdD |UV |utf8_to_uvuni |NN const U8 *s|NULLOK STRLEN *retlen
+CbpD |UV |valid_utf8_to_uvuni |NN const U8 *s|NULLOK STRLEN *retlen
+AMpd |UV |utf8_to_uvchr_buf |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
+Cip |UV |utf8_to_uvchr_buf_helper|NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
+CpdD |UV |utf8_to_uvuni_buf |NN const U8 *s|NN const U8 *send|NULLOK STRLEN *retlen
+p |bool |check_utf8_print |NN const U8 *s|const STRLEN len
+
+AdMTp |UV |utf8n_to_uvchr |NN const U8 *s \
|STRLEN curlen \
|NULLOK STRLEN *retlen \
|const U32 flags
-Adnop |UV |utf8n_to_uvchr_error|NN const U8 *s \
+AdMTp |UV |utf8n_to_uvchr_error|NN const U8 *s \
|STRLEN curlen \
|NULLOK STRLEN *retlen \
|const U32 flags \
|NULLOK U32 * errors
-AMndi |UV |utf8n_to_uvchr_msgs|NN const U8 *s \
+AxTdip |UV |utf8n_to_uvchr_msgs|NN const U8 *s \
|STRLEN curlen \
|NULLOK STRLEN *retlen \
|const U32 flags \
|NULLOK U32 * errors \
|NULLOK AV ** msgs
-AMnp |UV |_utf8n_to_uvchr_msgs_helper \
+CTp |UV |_utf8n_to_uvchr_msgs_helper \
|NN const U8 *s \
|STRLEN curlen \
|NULLOK STRLEN *retlen \
|const U32 flags \
|NULLOK U32 * errors \
|NULLOK AV ** msgs
-AipnR |UV |valid_utf8_to_uvchr |NN const U8 *s|NULLOK STRLEN *retlen
-Ap |UV |utf8n_to_uvuni|NN const U8 *s|STRLEN curlen|NULLOK STRLEN *retlen|U32 flags
+CipTRd |UV |valid_utf8_to_uvchr |NN const U8 *s|NULLOK STRLEN *retlen
+Cdp |UV |utf8n_to_uvuni|NN const U8 *s|STRLEN curlen|NULLOK STRLEN *retlen|U32 flags
Adm |U8* |uvchr_to_utf8 |NN U8 *d|UV uv
-Ap |U8* |uvuni_to_utf8 |NN U8 *d|UV uv
+Cp |U8* |uvuni_to_utf8 |NN U8 *d|UV uv
Adm |U8* |uvchr_to_utf8_flags |NN U8 *d|UV uv|UV flags
-AdmM |U8* |uvchr_to_utf8_flags_msgs|NN U8 *d|UV uv|UV flags|NULLOK HV ** msgs
-Apod |U8* |uvoffuni_to_utf8_flags |NN U8 *d|UV uv|const UV flags
-ApM |U8* |uvoffuni_to_utf8_flags_msgs|NN U8 *d|UV uv|const UV flags|NULLOK HV** msgs
-Ap |U8* |uvuni_to_utf8_flags |NN U8 *d|UV uv|UV flags
+Admx |U8* |uvchr_to_utf8_flags_msgs|NN U8 *d|UV uv|UV flags|NULLOK HV ** msgs
+CMpd |U8* |uvoffuni_to_utf8_flags |NN U8 *d|UV uv|const UV flags
+Cp |U8* |uvoffuni_to_utf8_flags_msgs|NN U8 *d|UV uv|const UV flags|NULLOK HV** msgs
+Cdp |U8* |uvuni_to_utf8_flags |NN U8 *d|UV uv|UV flags
Apd |char* |pv_uni_display |NN SV *dsv|NN const U8 *spv|STRLEN len|STRLEN pvlim|UV flags
ApdR |char* |sv_uni_display |NN SV *dsv|NN SV *ssv|STRLEN pvlim|UV flags
EXpR |Size_t |_inverse_folds |const UV cp \
- |NN unsigned int * first_folds_to \
- |NN const unsigned int ** remaining_folds_to
+ |NN U32 * first_folds_to \
+ |NN const U32 ** remaining_folds_to
: Used by Data::Alias
EXp |void |vivify_defelem |NN SV* sv
: Used in pp.c
@@ -1915,8 +2121,8 @@ p |I32 |wait4pid |Pid_t pid|NN int* statusp|int flags
: Used in locale.c and perl.c
p |U32 |parse_unicode_opts|NN const char **popt
Ap |U32 |seed
-Xpno |double |drand48_r |NN perl_drand48_t *random_state
-Xpno |void |drand48_init_r |NN perl_drand48_t *random_state|U32 seed
+XpTo |double |drand48_r |NN perl_drand48_t *random_state
+XpTo |void |drand48_init_r |NN perl_drand48_t *random_state|U32 seed
: Only used in perl.c
p |void |get_hash_seed |NN unsigned char * const seed_buffer
: Used in doio.c, pp_hot.c, pp_sys.c
@@ -1950,9 +2156,9 @@ Ap |I32 |whichsig_sv |NN SV* sigsv
Ap |I32 |whichsig_pv |NN const char* sig
Ap |I32 |whichsig_pvn |NN const char* sig|STRLEN len
: used to check for NULs in pathnames and other names
-AiR |bool |is_safe_syscall|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name
+AiRdp |bool |is_safe_syscall|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name
#ifdef PERL_CORE
-inR |bool |should_warn_nl|NN const char *pv
+iTR |bool |should_warn_nl|NN const char *pv
#endif
: Used in pp_ctl.c
p |void |write_to_stderr|NN SV* msv
@@ -1974,17 +2180,17 @@ p |void |parser_free_nexttoke_ops|NN yy_parser *parser \
|NN OPSLAB *slab
#endif
#if defined(PERL_IN_TOKE_C)
-s |int |yywarn |NN const char *const s|U32 flags
+S |int |yywarn |NN const char *const s|U32 flags
#endif
#if defined(MYMALLOC)
Ap |void |dump_mstats |NN const char* s
Ap |int |get_mstats |NN perl_mstats_t *buf|int buflen|int level
#endif
-Anpa |Malloc_t|safesysmalloc |MEM_SIZE nbytes
-Anpa |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
-AnpR |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
-Anp |Free_t |safesysfree |Malloc_t where
-Asrnx |void |croak_memory_wrap
+ATpa |Malloc_t|safesysmalloc |MEM_SIZE nbytes
+ATpa |Malloc_t|safesyscalloc |MEM_SIZE elements|MEM_SIZE size
+ATpR |Malloc_t|safesysrealloc|Malloc_t where|MEM_SIZE nbytes
+ATp |Free_t |safesysfree |Malloc_t where
+AirTep |void |croak_memory_wrap
#if defined(PERL_GLOBAL_STRUCT)
Ap |struct perl_vars *|GetVars
Ap |struct perl_vars*|init_global_struct
@@ -1996,19 +2202,19 @@ Afpd |void |sv_catpvf_mg |NN SV *const sv|NN const char *const pat|...
Apd |void |sv_vcatpvf_mg |NN SV *const sv|NN const char *const pat \
|NULLOK va_list *const args
Apd |void |sv_catpv_mg |NN SV *const sv|NULLOK const char *const ptr
-Apdbm |void |sv_catpvn_mg |NN SV *sv|NN const char *ptr|STRLEN len
-Apdbm |void |sv_catsv_mg |NN SV *dsv|NULLOK SV *ssv
+ApdbM |void |sv_catpvn_mg |NN SV *sv|NN const char *ptr|STRLEN len
+ApdbM |void |sv_catsv_mg |NN SV *dsv|NULLOK SV *ssv
Afpd |void |sv_setpvf_mg |NN SV *const sv|NN const char *const pat|...
Apd |void |sv_vsetpvf_mg |NN SV *const sv|NN const char *const pat \
|NULLOK va_list *const args
Apd |void |sv_setiv_mg |NN SV *const sv|const IV i
-Apdb |void |sv_setpviv_mg |NN SV *const sv|const IV iv
+ApdbD |void |sv_setpviv_mg |NN SV *const sv|const IV iv
Apd |void |sv_setuv_mg |NN SV *const sv|const UV u
Apd |void |sv_setnv_mg |NN SV *const sv|const NV num
Apd |void |sv_setpv_mg |NN SV *const sv|NULLOK const char *const ptr
Apd |void |sv_setpvn_mg |NN SV *const sv|NN const char *const ptr|const STRLEN len
Apd |void |sv_setsv_mg |NN SV *const dstr|NULLOK SV *const sstr
-Apdbm |void |sv_usepvn_mg |NN SV *sv|NULLOK char *ptr|STRLEN len
+ApdbM |void |sv_usepvn_mg |NN SV *sv|NULLOK char *ptr|STRLEN len
ApR |MGVTBL*|get_vtbl |int vtbl_id
Apd |char* |pv_display |NN SV *dsv|NN const char *pv|STRLEN cur|STRLEN len \
|STRLEN pvlim
@@ -2038,23 +2244,32 @@ Ap |void |do_sv_dump |I32 level|NN PerlIO *file|NULLOK SV *sv|I32 nest \
|I32 maxnest|bool dumpops|STRLEN pvlim
Ap |void |magic_dump |NULLOK const MAGIC *mg
Ap |void |reginitcolors
-ApdRmb |char* |sv_2pv_nolen |NN SV* sv
-ApdRmb |char* |sv_2pvutf8_nolen|NN SV* sv
-ApdRmb |char* |sv_2pvbyte_nolen|NN SV* sv
-ApmdbR |char* |sv_pv |NN SV *sv
-ApmdbR |char* |sv_pvutf8 |NN SV *sv
-ApmdbR |char* |sv_pvbyte |NN SV *sv
-Apmdb |STRLEN |sv_utf8_upgrade|NN SV *sv
+ApdRMb |char* |sv_2pv_nolen |NN SV* sv
+ApdRMb |char* |sv_2pvutf8_nolen|NN SV* sv
+ApdRMb |char* |sv_2pvbyte_nolen|NN SV* sv
+ApMdbR |char* |sv_pv |NN SV *sv
+ApMdbR |char* |sv_pvutf8 |NN SV *sv
+ApMdbR |char* |sv_pvbyte |NN SV *sv
+ApMdb |STRLEN |sv_utf8_upgrade|NN SV *sv
Amd |STRLEN |sv_utf8_upgrade_nomg|NN SV *sv
-Apd |bool |sv_utf8_downgrade|NN SV *const sv|const bool fail_ok
+ApdMb |bool |sv_utf8_downgrade|NN SV *const sv|const bool fail_ok
+Amd |bool |sv_utf8_downgrade_nomg|NN SV *const sv|const bool fail_ok
+Apd |bool |sv_utf8_downgrade_flags|NN SV *const sv|const bool fail_ok|const U32 flags
Apd |void |sv_utf8_encode |NN SV *const sv
Apd |bool |sv_utf8_decode |NN SV *const sv
-Apdmb |void |sv_force_normal|NN SV *sv
+ApdMb |void |sv_force_normal|NN SV *sv
Apd |void |sv_force_normal_flags|NN SV *const sv|const U32 flags
pX |SSize_t|tmps_grow_p |SSize_t ix
Apd |SV* |sv_rvweaken |NN SV *const sv
Apd |SV* |sv_rvunweaken |NN SV *const sv
-AnpMd |SV* |sv_get_backrefs|NN SV *const sv
+ATpxd |SV* |sv_get_backrefs|NN SV *const sv
+AiTMdp |SV * |SvREFCNT_inc |NULLOK SV *sv
+AiTMdp |SV * |SvREFCNT_inc_NN|NN SV *sv
+AiTMdp |void |SvREFCNT_inc_void|NULLOK SV *sv
+AiMdp |void |SvREFCNT_dec |NULLOK SV *sv
+AiMdp |void |SvREFCNT_dec_NN|NN SV *sv
+AiTp |void |SvAMAGIC_on |NN SV *sv
+AiTp |void |SvAMAGIC_off |NN SV *sv
: This is indirectly referenced by globals.c. This is somewhat annoying.
p |int |magic_killbackrefs|NN SV *sv|NN MAGIC *mg
Ap |OP* |newANONATTRSUB |I32 floor|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block
@@ -2081,9 +2296,9 @@ ApR |DIR* |dirp_dup |NULLOK DIR *const dp|NN CLONE_PARAMS *const param
ApR |GP* |gp_dup |NULLOK GP *const gp|NN CLONE_PARAMS *const param
ApR |MAGIC* |mg_dup |NULLOK MAGIC *mg|NN CLONE_PARAMS *const param
#if defined(PERL_IN_SV_C)
-s |SV ** |sv_dup_inc_multiple|NN SV *const *source|NN SV **dest \
+S |SV ** |sv_dup_inc_multiple|NN SV *const *source|NN SV **dest \
|SSize_t items|NN CLONE_PARAMS *const param
-sR |SV* |sv_dup_common |NN const SV *const sstr \
+SR |SV* |sv_dup_common |NN const SV *const sstr \
|NN CLONE_PARAMS *const param
#endif
ApR |SV* |sv_dup |NULLOK const SV *const sstr|NN CLONE_PARAMS *const param
@@ -2107,46 +2322,47 @@ Ap |void |sys_intern_dup |NN struct interp_intern* src|NN struct interp_intern*
# endif
#endif
-Amop |const XOP * |custom_op_xop |NN const OP *o
-AbpR |const char * |custom_op_name |NN const OP *o
-AbpR |const char * |custom_op_desc |NN const OP *o
+: The reason for the 'u' flag is that this passes "aTHX_ x" to its callee: not
+: a legal C parameter
+Admu |const XOP * |Perl_custom_op_xop |NN const OP *o
+AbpRdD |const char * |custom_op_name |NN const OP *o
+AbpRdD |const char * |custom_op_desc |NN const OP *o
pRX |XOPRETANY |custom_op_get_field |NN const OP *o|const xop_flags_enum field
-Aop |void |custom_op_register |NN Perl_ppaddr_t ppaddr \
+Adop |void |custom_op_register |NN Perl_ppaddr_t ppaddr \
|NN const XOP *xop
Adp |void |sv_nosharing |NULLOK SV *sv
-Adpbm |void |sv_nolocking |NULLOK SV *sv
+AdpbD |void |sv_nolocking |NULLOK SV *sv
Adp |bool |sv_destroyable |NULLOK SV *sv
-Adpb |void |sv_nounlocking |NULLOK SV *sv
+AdpbD |void |sv_nounlocking |NULLOK SV *sv
Adp |int |nothreadhook
p |void |init_constants
#if defined(PERL_IN_DOOP_C)
-sR |Size_t |do_trans_simple |NN SV * const sv
-sR |Size_t |do_trans_count |NN SV * const sv
-sR |Size_t |do_trans_complex |NN SV * const sv
-sR |Size_t |do_trans_simple_utf8 |NN SV * const sv
-sR |Size_t |do_trans_count_utf8 |NN SV * const sv
-sR |Size_t |do_trans_complex_utf8 |NN SV * const sv
+SR |Size_t |do_trans_simple |NN SV * const sv|NN const OPtrans_map * const tbl
+SR |Size_t |do_trans_count |NN SV * const sv|NN const OPtrans_map * const tbl
+SR |Size_t |do_trans_complex |NN SV * const sv|NN const OPtrans_map * const tbl
+SR |Size_t |do_trans_invmap |NN SV * const sv|NN AV * const map
+SR |Size_t |do_trans_count_invmap |NN SV * const sv|NN AV * const map
#endif
#if defined(PERL_IN_GV_C)
-s |void |gv_init_svtype |NN GV *gv|const svtype sv_type
-s |void |gv_magicalize_isa |NN GV *gv
-s |bool|parse_gv_stash_name|NN HV **stash|NN GV **gv \
+S |void |gv_init_svtype |NN GV *gv|const svtype sv_type
+S |void |gv_magicalize_isa |NN GV *gv
+S |bool|parse_gv_stash_name|NN HV **stash|NN GV **gv \
|NN const char **name|NN STRLEN *len \
|NN const char *nambeg|STRLEN full_len \
|const U32 is_utf8|const I32 add
-s |bool|find_default_stash|NN HV **stash|NN const char *name \
+S |bool|find_default_stash|NN HV **stash|NN const char *name \
|STRLEN len|const U32 is_utf8|const I32 add \
|const svtype sv_type
-s |bool|gv_magicalize|NN GV *gv|NN HV *stash|NN const char *name \
+S |bool|gv_magicalize|NN GV *gv|NN HV *stash|NN const char *name \
|STRLEN len \
|const svtype sv_type
-s |void|maybe_multimagic_gv|NN GV *gv|NN const char *name|const svtype sv_type
-s |bool|gv_is_in_main|NN const char *name|STRLEN len \
+S |void|maybe_multimagic_gv|NN GV *gv|NN const char *name|const svtype sv_type
+S |bool|gv_is_in_main|NN const char *name|STRLEN len \
|const U32 is_utf8
-s |void |require_tie_mod|NN GV *gv|NN const char varname \
+S |void |require_tie_mod|NN GV *gv|NN const char varname \
|NN const char * name|STRLEN len \
|const U32 flags
#endif
@@ -2156,196 +2372,197 @@ po |SV* |hfree_next_entry |NN HV *hv|NN STRLEN *indexp
#endif
#if defined(PERL_IN_HV_C)
-s |void |hsplit |NN HV *hv|STRLEN const oldsize|STRLEN newsize
-s |void |hv_free_entries|NN HV *hv
-s |SV* |hv_free_ent_ret|NN HV *hv|NN HE *entry
-sR |HE* |new_he
-sanR |HEK* |save_hek_flags |NN const char *str|I32 len|U32 hash|int flags
-sn |void |hv_magic_check |NN HV *hv|NN bool *needs_copy|NN bool *needs_store
-s |void |unshare_hek_or_pvn|NULLOK const HEK* hek|NULLOK const char* str|I32 len|U32 hash
-sR |HEK* |share_hek_flags|NN const char *str|STRLEN len|U32 hash|int flags
-rs |void |hv_notallowed |int flags|NN const char *key|I32 klen|NN const char *msg
-in |U32|ptr_hash|PTRV u
-s |struct xpvhv_aux*|hv_auxinit|NN HV *hv
-sn |struct xpvhv_aux*|hv_auxinit_internal|NN struct xpvhv_aux *iter
-sM |SV* |hv_delete_common|NULLOK HV *hv|NULLOK SV *keysv \
+S |void |hsplit |NN HV *hv|STRLEN const oldsize|STRLEN newsize
+S |void |hv_free_entries|NN HV *hv
+S |SV* |hv_free_ent_ret|NN HV *hv|NN HE *entry
+SR |HE* |new_he
+SaTR |HEK* |save_hek_flags |NN const char *str|I32 len|U32 hash|int flags
+ST |void |hv_magic_check |NN HV *hv|NN bool *needs_copy|NN bool *needs_store
+S |void |unshare_hek_or_pvn|NULLOK const HEK* hek|NULLOK const char* str|I32 len|U32 hash
+SR |HEK* |share_hek_flags|NN const char *str|STRLEN len|U32 hash|int flags
+rS |void |hv_notallowed |int flags|NN const char *key|I32 klen|NN const char *msg
+iT |U32|ptr_hash|PTRV u
+S |struct xpvhv_aux*|hv_auxinit|NN HV *hv
+ST |struct xpvhv_aux*|hv_auxinit_internal|NN struct xpvhv_aux *iter
+Sx |SV* |hv_delete_common|NULLOK HV *hv|NULLOK SV *keysv \
|NULLOK const char *key|STRLEN klen|int k_flags|I32 d_flags \
|U32 hash
-sM |void |clear_placeholders |NN HV *hv|U32 items
+Sx |void |clear_placeholders |NN HV *hv|U32 items
#endif
#if defined(PERL_IN_MG_C)
-s |void |save_magic_flags|I32 mgs_ix|NN SV *sv|U32 flags
-s |int |magic_methpack |NN SV *sv|NN const MAGIC *mg|NN SV *meth
-s |SV* |magic_methcall1|NN SV *sv|NN const MAGIC *mg \
+S |void |save_magic_flags|I32 mgs_ix|NN SV *sv|U32 flags
+S |int |magic_methpack |NN SV *sv|NN const MAGIC *mg|NN SV *meth
+S |SV* |magic_methcall1|NN SV *sv|NN const MAGIC *mg \
|NN SV *meth|U32 flags \
|int n|NULLOK SV *val
-s |void |restore_magic |NULLOK const void *p
-s |void |unwind_handler_stack|NULLOK const void *p
-s |void |fixup_errno_string|NN SV* sv
+S |void |restore_magic |NULLOK const void *p
+S |void |unwind_handler_stack|NULLOK const void *p
+S |void |fixup_errno_string|NN SV* sv
#endif
#if defined(PERL_IN_OP_C)
-sRn |bool |is_handle_constructor|NN const OP *o|I32 numargs
-sR |I32 |assignment_type|NULLOK const OP *o
-s |void |forget_pmop |NN PMOP *const o
-s |void |find_and_forget_pmops |NN OP *o
-s |void |cop_free |NN COP *cop
-s |OP* |modkids |NULLOK OP *o|I32 type
-s |OP* |scalarboolean |NN OP *o
-sR |OP* |search_const |NN OP *o
-sR |OP* |new_logop |I32 type|I32 flags|NN OP **firstp|NN OP **otherp
-s |void |simplify_sort |NN OP *o
-sRn |bool |scalar_mod_type|NULLOK const OP *o|I32 type
-s |OP * |my_kid |NULLOK OP *o|NULLOK OP *attrs|NN OP **imopsp
-s |OP * |dup_attrlist |NN OP *o
-s |void |apply_attrs |NN HV *stash|NN SV *target|NULLOK OP *attrs
-s |void |apply_attrs_my |NN HV *stash|NN OP *target|NULLOK OP *attrs|NN OP **imopsp
-s |void |bad_type_pv |I32 n|NN const char *t|NN const OP *o|NN const OP *kid
-s |void |bad_type_gv |I32 n|NN GV *gv|NN const OP *kid|NN const char *t
-s |void |no_bareword_allowed|NN OP *o
-sR |OP* |no_fh_allowed|NN OP *o
-sR |OP* |too_few_arguments_pv|NN OP *o|NN const char* name|U32 flags
-s |OP* |too_many_arguments_pv|NN OP *o|NN const char* name|U32 flags
-s |bool |looks_like_bool|NN const OP* o
-s |OP* |newGIVWHENOP |NULLOK OP* cond|NN OP *block \
+SRT |bool |is_handle_constructor|NN const OP *o|I32 numargs
+SR |I32 |assignment_type|NULLOK const OP *o
+S |void |forget_pmop |NN PMOP *const o
+S |void |find_and_forget_pmops |NN OP *o
+S |void |cop_free |NN COP *cop
+S |OP* |modkids |NULLOK OP *o|I32 type
+S |OP* |scalarboolean |NN OP *o
+SR |OP* |search_const |NN OP *o
+SR |OP* |new_logop |I32 type|I32 flags|NN OP **firstp|NN OP **otherp
+S |void |simplify_sort |NN OP *o
+SRT |bool |scalar_mod_type|NULLOK const OP *o|I32 type
+S |OP * |my_kid |NULLOK OP *o|NULLOK OP *attrs|NN OP **imopsp
+S |OP * |dup_attrlist |NN OP *o
+S |void |apply_attrs |NN HV *stash|NN SV *target|NULLOK OP *attrs
+S |void |apply_attrs_my |NN HV *stash|NN OP *target|NULLOK OP *attrs|NN OP **imopsp
+S |void |bad_type_pv |I32 n|NN const char *t|NN const OP *o|NN const OP *kid
+S |void |bad_type_gv |I32 n|NN GV *gv|NN const OP *kid|NN const char *t
+S |void |no_bareword_allowed|NN OP *o
+SR |OP* |no_fh_allowed|NN OP *o
+SR |OP* |too_few_arguments_pv|NN OP *o|NN const char* name|U32 flags
+S |OP* |too_many_arguments_pv|NN OP *o|NN const char* name|U32 flags
+S |bool |looks_like_bool|NN const OP* o
+S |OP* |newGIVWHENOP |NULLOK OP* cond|NN OP *block \
|I32 enter_opcode|I32 leave_opcode \
|PADOFFSET entertarg
-s |OP* |ref_array_or_hash|NULLOK OP* cond
-s |bool |process_special_blocks |I32 floor \
+S |OP* |ref_array_or_hash|NULLOK OP* cond
+S |bool |process_special_blocks |I32 floor \
|NN const char *const fullname\
|NN GV *const gv|NN CV *const cv
-s |void |clear_special_blocks |NN const char *const fullname\
+S |void |clear_special_blocks |NN const char *const fullname\
|NN GV *const gv|NN CV *const cv
#endif
XpR |void* |Slab_Alloc |size_t sz
Xp |void |Slab_Free |NN void *op
#if defined(PERL_DEBUG_READONLY_OPS)
# if defined(PERL_CORE)
-px |void |Slab_to_ro |NN OPSLAB *slab
-px |void |Slab_to_rw |NN OPSLAB *const slab
+pe |void |Slab_to_ro |NN OPSLAB *slab
+pe |void |Slab_to_rw |NN OPSLAB *const slab
# endif
: Used in OpREFCNT_inc() in sv.c
-poxM |OP * |op_refcnt_inc |NULLOK OP *o
+poex |OP * |op_refcnt_inc |NULLOK OP *o
: FIXME - can be static.
-poxM |PADOFFSET |op_refcnt_dec |NN OP *o
+poex |PADOFFSET |op_refcnt_dec |NN OP *o
#endif
#if defined(PERL_IN_PERL_C)
-s |void |find_beginning |NN SV* linestr_sv|NN PerlIO *rsfp
-s |void |forbid_setid |const char flag|const bool suidscript
-s |void |incpush |NN const char *const dir|STRLEN len \
+S |void |find_beginning |NN SV* linestr_sv|NN PerlIO *rsfp
+S |void |forbid_setid |const char flag|const bool suidscript
+S |void |incpush |NN const char *const dir|STRLEN len \
|U32 flags
-s |SV* |mayberelocate |NN const char *const dir|STRLEN len \
+S |SV* |mayberelocate |NN const char *const dir|STRLEN len \
|U32 flags
-s |void |incpush_use_sep|NN const char *p|STRLEN len|U32 flags
-s |void |init_interp
-s |void |init_ids
-s |void |init_main_stash
-s |void |init_perllib
-s |void |init_postdump_symbols|int argc|NN char **argv|NULLOK char **env
-s |void |init_predump_symbols
-rs |void |my_exit_jump
-s |void |nuke_stacks
-s |PerlIO *|open_script |NN const char *scriptname|bool dosearch \
+S |void |incpush_use_sep|NN const char *p|STRLEN len|U32 flags
+S |void |init_interp
+S |void |init_ids
+S |void |init_main_stash
+S |void |init_perllib
+S |void |init_postdump_symbols|int argc|NN char **argv|NULLOK char **env
+S |void |init_predump_symbols
+rS |void |my_exit_jump
+S |void |nuke_stacks
+S |PerlIO *|open_script |NN const char *scriptname|bool dosearch \
|NN bool *suidscript
-sr |void |usage
+Sr |void |usage
#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
-so |void |validate_suid |NN PerlIO *rsfp
+So |void |validate_suid |NN PerlIO *rsfp
#endif
-sr |void |minus_v
+Sr |void |minus_v
-s |void* |parse_body |NULLOK char **env|XSINIT_t xsinit
-rs |void |run_body |I32 oldscope
+S |void* |parse_body |NULLOK char **env|XSINIT_t xsinit
+rS |void |run_body |I32 oldscope
# ifndef PERL_IS_MINIPERL
-s |SV * |incpush_if_exists|NN AV *const av|NN SV *dir|NN SV *const stem
+S |SV * |incpush_if_exists|NN AV *const av|NN SV *dir|NN SV *const stem
# endif
#endif
#if defined(PERL_IN_PP_C)
-s |size_t |do_chomp |NN SV *retval|NN SV *sv|bool chomping
-s |OP* |do_delete_local
-sR |SV* |refto |NN SV* sv
+S |size_t |do_chomp |NN SV *retval|NN SV *sv|bool chomping
+S |OP* |do_delete_local
+SR |SV* |refto |NN SV* sv
#endif
#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C)
: Used in pp_hot.c
-pRxo |GV* |softref2xv |NN SV *const sv|NN const char *const what \
+pReo |GV* |softref2xv |NN SV *const sv|NN const char *const what \
|const svtype type|NN SV ***spp
+iTR |bool |lossless_NV_to_IV|const NV nv|NN IV * ivp
#endif
#if defined(PERL_IN_PP_PACK_C)
-s |SSize_t|unpack_rec |NN struct tempsym* symptr|NN const char *s \
+S |SSize_t|unpack_rec |NN struct tempsym* symptr|NN const char *s \
|NN const char *strbeg|NN const char *strend|NULLOK const char **new_s
-s |SV ** |pack_rec |NN SV *cat|NN struct tempsym* symptr|NN SV **beglist|NN SV **endlist
-s |SV* |mul128 |NN SV *sv|U8 m
-s |SSize_t|measure_struct |NN struct tempsym* symptr
-s |bool |next_symbol |NN struct tempsym* symptr
-sR |SV* |is_an_int |NN const char *s|STRLEN l
-s |int |div128 |NN SV *pnum|NN bool *done
-s |const char *|group_end |NN const char *patptr|NN const char *patend \
+S |SV ** |pack_rec |NN SV *cat|NN struct tempsym* symptr|NN SV **beglist|NN SV **endlist
+S |SV* |mul128 |NN SV *sv|U8 m
+S |SSize_t|measure_struct |NN struct tempsym* symptr
+S |bool |next_symbol |NN struct tempsym* symptr
+SR |SV* |is_an_int |NN const char *s|STRLEN l
+S |int |div128 |NN SV *pnum|NN bool *done
+S |const char *|group_end |NN const char *patptr|NN const char *patend \
|char ender
-sR |const char *|get_num |NN const char *patptr|NN SSize_t *lenptr
-ns |bool |need_utf8 |NN const char *pat|NN const char *patend
-ns |char |first_symbol |NN const char *pat|NN const char *patend
-sR |char * |sv_exp_grow |NN SV *sv|STRLEN needed
-snR |char * |my_bytes_to_utf8|NN const U8 *start|STRLEN len|NN char *dest \
+SR |const char *|get_num |NN const char *patptr|NN SSize_t *lenptr
+TS |bool |need_utf8 |NN const char *pat|NN const char *patend
+TS |char |first_symbol |NN const char *pat|NN const char *patend
+SR |char * |sv_exp_grow |NN SV *sv|STRLEN needed
+STR |char * |my_bytes_to_utf8|NN const U8 *start|STRLEN len|NN char *dest \
|const bool needs_swap
#endif
#if defined(PERL_IN_PP_CTL_C)
-sR |OP* |docatch |Perl_ppaddr_t firstpp
-sR |OP* |dofindlabel |NN OP *o|NN const char *label|STRLEN len \
+SdR |OP* |docatch |Perl_ppaddr_t firstpp
+SR |OP* |dofindlabel |NN OP *o|NN const char *label|STRLEN len \
|U32 flags|NN OP **opstack|NN OP **oplimit
-s |MAGIC *|doparseform |NN SV *sv
-snR |bool |num_overflow |NV value|I32 fldsize|I32 frcsize
-sR |I32 |dopoptoeval |I32 startingblock
-sR |I32 |dopoptogivenfor|I32 startingblock
-sR |I32 |dopoptolabel |NN const char *label|STRLEN len|U32 flags
-sR |I32 |dopoptoloop |I32 startingblock
-sR |I32 |dopoptosub_at |NN const PERL_CONTEXT* cxstk|I32 startingblock
-sR |I32 |dopoptowhen |I32 startingblock
-s |void |save_lines |NULLOK AV *array|NN SV *sv
-s |bool |doeval_compile |U8 gimme \
+S |MAGIC *|doparseform |NN SV *sv
+STR |bool |num_overflow |NV value|I32 fldsize|I32 frcsize
+SR |I32 |dopoptoeval |I32 startingblock
+SR |I32 |dopoptogivenfor|I32 startingblock
+SR |I32 |dopoptolabel |NN const char *label|STRLEN len|U32 flags
+SR |I32 |dopoptoloop |I32 startingblock
+SR |I32 |dopoptosub_at |NN const PERL_CONTEXT* cxstk|I32 startingblock
+SR |I32 |dopoptowhen |I32 startingblock
+S |void |save_lines |NULLOK AV *array|NN SV *sv
+S |bool |doeval_compile |U8 gimme \
|NULLOK CV* outside|U32 seq|NULLOK HV* hh
-sR |PerlIO *|check_type_and_open|NN SV *name
+SR |PerlIO *|check_type_and_open|NN SV *name
#ifndef PERL_DISABLE_PMC
-sR |PerlIO *|doopen_pm |NN SV *name
-#endif
-iRn |bool |path_is_searchable|NN const char *name
-sR |I32 |run_user_filter|int idx|NN SV *buf_sv|int maxlen
-sR |PMOP* |make_matcher |NN REGEXP* re
-sR |bool |matcher_matches_sv|NN PMOP* matcher|NN SV* sv
-s |void |destroy_matcher|NN PMOP* matcher
-s |OP* |do_smartmatch |NULLOK HV* seen_this \
+SR |PerlIO *|doopen_pm |NN SV *name
+#endif
+iRT |bool |path_is_searchable|NN const char *name
+SR |I32 |run_user_filter|int idx|NN SV *buf_sv|int maxlen
+SR |PMOP* |make_matcher |NN REGEXP* re
+SR |bool |matcher_matches_sv|NN PMOP* matcher|NN SV* sv
+S |void |destroy_matcher|NN PMOP* matcher
+S |OP* |do_smartmatch |NULLOK HV* seen_this \
|NULLOK HV* seen_other|const bool copied
#endif
#if defined(PERL_IN_PP_HOT_C)
-s |void |do_oddball |NN SV **oddkey|NN SV **firstkey
+S |void |do_oddball |NN SV **oddkey|NN SV **firstkey
i |HV* |opmethod_stash |NN SV* meth
#endif
#if defined(PERL_IN_PP_SORT_C)
-s |I32 |sv_ncmp |NN SV *const a|NN SV *const b
-s |I32 |sv_i_ncmp |NN SV *const a|NN SV *const b
-s |I32 |amagic_ncmp |NN SV *const a|NN SV *const b
-s |I32 |amagic_i_ncmp |NN SV *const a|NN SV *const b
-s |I32 |amagic_cmp |NN SV *const str1|NN SV *const str2
+S |I32 |sv_ncmp |NN SV *const a|NN SV *const b
+S |I32 |sv_i_ncmp |NN SV *const a|NN SV *const b
+S |I32 |amagic_ncmp |NN SV *const a|NN SV *const b
+S |I32 |amagic_i_ncmp |NN SV *const a|NN SV *const b
+S |I32 |amagic_cmp |NN SV *const str1|NN SV *const str2
# ifdef USE_LOCALE_COLLATE
-s |I32 |amagic_cmp_locale|NN SV *const str1|NN SV *const str2
+S |I32 |amagic_cmp_locale|NN SV *const str1|NN SV *const str2
# endif
-s |I32 |sortcv |NN SV *const a|NN SV *const b
-s |I32 |sortcv_xsub |NN SV *const a|NN SV *const b
-s |I32 |sortcv_stacked |NN SV *const a|NN SV *const b
+S |I32 |sortcv |NN SV *const a|NN SV *const b
+S |I32 |sortcv_xsub |NN SV *const a|NN SV *const b
+S |I32 |sortcv_stacked |NN SV *const a|NN SV *const b
#endif
#if defined(PERL_IN_PP_SYS_C)
-s |OP* |doform |NN CV *cv|NN GV *gv|NULLOK OP *retop
+S |OP* |doform |NN CV *cv|NN GV *gv|NULLOK OP *retop
# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
-sR |int |dooneliner |NN const char *cmd|NN const char *filename
+SR |int |dooneliner |NN const char *cmd|NN const char *filename
# endif
-s |SV * |space_join_names_mortal|NULLOK char *const *array
+S |SV * |space_join_names_mortal|NULLOK char *const *array
#endif
p |OP * |tied_method|NN SV *methname|NN SV **sp \
|NN SV *const sv|NN const MAGIC *const mg \
@@ -2357,108 +2574,109 @@ Ep |void |regprop |NULLOK const regexp *prog|NN SV* sv|NN const regnode* o|NULLO
Ep |int |re_printf |NN const char *fmt|...
#endif
#if defined(PERL_IN_REGCOMP_C)
-Es |regnode_offset|reg |NN RExC_state_t *pRExC_state \
+ES |regnode_offset|reg |NN RExC_state_t *pRExC_state \
|I32 paren|NN I32 *flagp|U32 depth
-Es |regnode_offset|regnode_guts|NN RExC_state_t *pRExC_state \
+ES |regnode_offset|regnode_guts|NN RExC_state_t *pRExC_state \
|const U8 op \
|const STRLEN extra_len \
|NN const char* const name
-Es |void |change_engine_size|NN RExC_state_t *pRExC_state|const Ptrdiff_t size
-Es |regnode_offset|reganode|NN RExC_state_t *pRExC_state|U8 op \
+ES |void |change_engine_size|NN RExC_state_t *pRExC_state|const Ptrdiff_t size
+ES |regnode_offset|reganode|NN RExC_state_t *pRExC_state|U8 op \
|U32 arg
-Es |regnode_offset|reg2Lanode|NN RExC_state_t *pRExC_state \
+ES |regnode_offset|reg2Lanode|NN RExC_state_t *pRExC_state \
|const U8 op \
|const U32 arg1 \
|const I32 arg2
-Es |regnode_offset|regatom |NN RExC_state_t *pRExC_state \
+ES |regnode_offset|regatom |NN RExC_state_t *pRExC_state \
|NN I32 *flagp|U32 depth
-Es |regnode_offset|regbranch |NN RExC_state_t *pRExC_state \
+ES |regnode_offset|regbranch |NN RExC_state_t *pRExC_state \
|NN I32 *flagp|I32 first|U32 depth
-Es |void |set_ANYOF_arg |NN RExC_state_t* const pRExC_state \
+ES |void |set_ANYOF_arg |NN RExC_state_t* const pRExC_state \
|NN regnode* const node \
|NULLOK SV* const cp_list \
|NULLOK SV* const runtime_defns \
|NULLOK SV* const only_utf8_locale_list
-Es |void |output_posix_warnings \
+ES |void |output_posix_warnings \
|NN RExC_state_t *pRExC_state \
|NN AV* posix_warnings
-Es |AV* |add_multi_match|NULLOK AV* multi_char_matches \
+EiT |Size_t |find_first_differing_byte_pos|NN const U8 * s1|NN const U8 * s2| const Size_t max
+ES |AV* |add_multi_match|NULLOK AV* multi_char_matches \
|NN SV* multi_string \
|const STRLEN cp_count
-Es |regnode_offset|regclass|NN RExC_state_t *pRExC_state \
+ES |regnode_offset|regclass|NN RExC_state_t *pRExC_state \
|NN I32 *flagp|U32 depth|const bool stop_at_1 \
|bool allow_multi_fold \
|const bool silence_non_portable \
|const bool strict \
|bool optimizable \
|NULLOK SV** ret_invlist
-Es |void|add_above_Latin1_folds|NN RExC_state_t *pRExC_state|const U8 cp \
+ES |void|add_above_Latin1_folds|NN RExC_state_t *pRExC_state|const U8 cp \
|NN SV** invlist
Ei |regnode_offset|handle_named_backref|NN RExC_state_t *pRExC_state \
|NN I32 *flagp \
|NN char * parse_start \
|char ch
-EsnR |unsigned int|regex_set_precedence|const U8 my_operator
-Es |regnode_offset|handle_regex_sets|NN RExC_state_t *pRExC_state \
+ESTR |unsigned int|regex_set_precedence|const U8 my_operator
+ES |regnode_offset|handle_regex_sets|NN RExC_state_t *pRExC_state \
|NULLOK SV ** return_invlist \
|NN I32 *flagp|U32 depth \
|NN char * const oregcomp_parse
-Es |void |set_regex_pv |NN RExC_state_t *pRExC_state|NN REGEXP *Rx
+ES |void |set_regex_pv |NN RExC_state_t *pRExC_state|NN REGEXP *Rx
#if defined(DEBUGGING) && defined(ENABLE_REGEX_SETS_DEBUGGING)
-Es |void |dump_regex_sets_structures \
+ES |void |dump_regex_sets_structures \
|NN RExC_state_t *pRExC_state \
|NN AV * stack \
|const IV fence|NN AV * fence_stack
#endif
-Es |void|parse_lparen_question_flags|NN RExC_state_t *pRExC_state
-Es |regnode_offset|reg_node|NN RExC_state_t *pRExC_state|U8 op
-Es |regnode_offset|regpiece|NN RExC_state_t *pRExC_state \
+ES |void|parse_lparen_question_flags|NN RExC_state_t *pRExC_state
+ES |regnode_offset|reg_node|NN RExC_state_t *pRExC_state|U8 op
+ES |regnode_offset|regpiece|NN RExC_state_t *pRExC_state \
|NN I32 *flagp|U32 depth
-Es |bool |grok_bslash_N |NN RExC_state_t *pRExC_state \
+ES |bool |grok_bslash_N |NN RExC_state_t *pRExC_state \
|NULLOK regnode_offset* nodep \
|NULLOK UV *code_point_p \
|NULLOK int* cp_count \
|NN I32 *flagp \
|const bool strict \
|const U32 depth
-Es |void |reginsert |NN RExC_state_t *pRExC_state \
+ES |void |reginsert |NN RExC_state_t *pRExC_state \
|const U8 op \
|const regnode_offset operand \
|const U32 depth
-Es |bool |regtail |NN RExC_state_t * pRExC_state \
+ESR |bool |regtail |NN RExC_state_t * pRExC_state \
|NN const regnode_offset p \
|NN const regnode_offset val \
|const U32 depth
-Es |SV * |reg_scan_name |NN RExC_state_t *pRExC_state \
+ES |SV * |reg_scan_name |NN RExC_state_t *pRExC_state \
|U32 flags
-Es |U32 |join_exact |NN RExC_state_t *pRExC_state \
+ES |U32 |join_exact |NN RExC_state_t *pRExC_state \
|NN regnode *scan|NN UV *min_subtract \
|NN bool *unfolded_multi_char \
|U32 flags|NULLOK regnode *val|U32 depth
-Ein |U8 |compute_EXACTish|NN RExC_state_t *pRExC_state
-Es |void |nextchar |NN RExC_state_t *pRExC_state
-Es |void |skip_to_be_ignored_text|NN RExC_state_t *pRExC_state \
+EiT |U8 |compute_EXACTish|NN RExC_state_t *pRExC_state
+ES |void |nextchar |NN RExC_state_t *pRExC_state
+ES |void |skip_to_be_ignored_text|NN RExC_state_t *pRExC_state \
|NN char ** p \
|const bool force_to_xmod
-Ein |char * |reg_skipcomment|NN RExC_state_t *pRExC_state|NN char * p
-Es |void |scan_commit |NN const RExC_state_t *pRExC_state \
+EiT |char * |reg_skipcomment|NN RExC_state_t *pRExC_state|NN char * p
+ES |void |scan_commit |NN const RExC_state_t *pRExC_state \
|NN struct scan_data_t *data \
|NN SSize_t *minlenp \
|int is_inf
-Es |void |populate_ANYOF_from_invlist|NN regnode *node|NN SV** invlist_ptr
-Es |void |ssc_anything |NN regnode_ssc *ssc
-EsRn |int |ssc_is_anything|NN const regnode_ssc *ssc
-Es |void |ssc_init |NN const RExC_state_t *pRExC_state \
+ES |void |populate_ANYOF_from_invlist|NN regnode *node|NN SV** invlist_ptr
+ES |void |ssc_anything |NN regnode_ssc *ssc
+ESRT |int |ssc_is_anything|NN const regnode_ssc *ssc
+ES |void |ssc_init |NN const RExC_state_t *pRExC_state \
|NN regnode_ssc *ssc
-EsRn |int |ssc_is_cp_posixl_init|NN const RExC_state_t *pRExC_state \
+ESRT |int |ssc_is_cp_posixl_init|NN const RExC_state_t *pRExC_state \
|NN const regnode_ssc *ssc
-Es |void |ssc_and |NN const RExC_state_t *pRExC_state \
+ES |void |ssc_and |NN const RExC_state_t *pRExC_state \
|NN regnode_ssc *ssc \
|NN const regnode_charclass *and_with
-Es |void |ssc_or |NN const RExC_state_t *pRExC_state \
+ES |void |ssc_or |NN const RExC_state_t *pRExC_state \
|NN regnode_ssc *ssc \
|NN const regnode_charclass *or_with
-Es |SV* |get_ANYOF_cp_list_for_ssc \
+ES |SV* |get_ANYOF_cp_list_for_ssc \
|NN const RExC_state_t *pRExC_state \
|NN const regnode_charclass* const node
Ei |void |ssc_intersection|NN regnode_ssc *ssc \
@@ -2469,42 +2687,41 @@ Ei |void |ssc_add_range |NN regnode_ssc *ssc \
|UV const start|UV const end
Ei |void |ssc_cp_and |NN regnode_ssc *ssc \
|UV const cp
-Ein |void |ssc_clear_locale|NN regnode_ssc *ssc
-Ens |bool |is_ssc_worth_it|NN const RExC_state_t * pRExC_state \
+EiT |void |ssc_clear_locale|NN regnode_ssc *ssc
+ETS |bool |is_ssc_worth_it|NN const RExC_state_t * pRExC_state \
|NN const regnode_ssc * ssc
-Es |void |ssc_finalize |NN RExC_state_t *pRExC_state \
+ES |void |ssc_finalize |NN RExC_state_t *pRExC_state \
|NN regnode_ssc *ssc
-Es |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \
+ES |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \
|NN regnode **scanp|NN SSize_t *minlenp \
|NN SSize_t *deltap|NN regnode *last \
|NULLOK struct scan_data_t *data \
|I32 stopparen|U32 recursed_depth \
|NULLOK regnode_ssc *and_withp \
|U32 flags|U32 depth
-EsR |SV * |get_ANYOFM_contents|NN const regnode * n
-EsRn |U32 |add_data |NN RExC_state_t* const pRExC_state \
+ESR |SV * |get_ANYOFM_contents|NN const regnode * n
+ESRT |U32 |add_data |NN RExC_state_t* const pRExC_state \
|NN const char* const s|const U32 n
-rs |void |re_croak2 |bool utf8|NN const char* pat1|NN const char* pat2|...
-Es |int |handle_possible_posix \
+rS |void |re_croak2 |bool utf8|NN const char* pat1|NN const char* pat2|...
+ES |int |handle_possible_posix \
|NN RExC_state_t *pRExC_state \
|NN const char* const s \
|NULLOK char ** updated_parse_ptr \
|NULLOK AV** posix_warnings \
|const bool check_only
-Es |I32 |make_trie |NN RExC_state_t *pRExC_state \
+ES |I32 |make_trie |NN RExC_state_t *pRExC_state \
|NN regnode *startbranch|NN regnode *first \
|NN regnode *last|NN regnode *tail \
|U32 word_count|U32 flags|U32 depth
-Es |regnode *|construct_ahocorasick_from_trie|NN RExC_state_t *pRExC_state \
+ES |regnode *|construct_ahocorasick_from_trie|NN RExC_state_t *pRExC_state \
|NN regnode *source|U32 depth
-EnsR |const char *|cntrl_to_mnemonic|const U8 c
-EnsR |int |edit_distance |NN const UV *src \
+ETSR |int |edit_distance |NN const UV *src \
|NN const UV *tgt \
|const STRLEN x \
|const STRLEN y \
|const SSize_t maxDistance
EpX |SV * |parse_uniprop_string|NN const char * const name \
- |const Size_t name_len \
+ |Size_t name_len \
|const bool is_utf8 \
|const bool to_fold \
|const bool runtime \
@@ -2524,141 +2741,142 @@ EXp |SV * |handle_user_defined_property|NN const char * name \
|const STRLEN level
# ifdef DEBUGGING
Ep |int |re_indentf |NN const char *fmt|U32 depth|...
-Es |void |regdump_intflags|NULLOK const char *lead| const U32 flags
-Es |void |regdump_extflags|NULLOK const char *lead| const U32 flags
-Es |const regnode*|dumpuntil|NN const regexp *r|NN const regnode *start \
+ES |void |regdump_intflags|NULLOK const char *lead| const U32 flags
+ES |void |regdump_extflags|NULLOK const char *lead| const U32 flags
+ES |const regnode*|dumpuntil|NN const regexp *r|NN const regnode *start \
|NN const regnode *node \
|NULLOK const regnode *last \
|NULLOK const regnode *plast \
|NN SV* sv|I32 indent|U32 depth
-Es |void |put_code_point |NN SV* sv|UV c
-Es |bool |put_charclass_bitmap_innards|NN SV* sv \
+ES |void |put_code_point |NN SV* sv|UV c
+ES |bool |put_charclass_bitmap_innards|NN SV* sv \
|NULLOK char* bitmap \
|NULLOK SV* nonbitmap_invlist \
|NULLOK SV* only_utf8_locale_invlist\
|NULLOK const regnode * const node \
+ |const U8 flags \
|const bool force_as_is_display
-Es |SV* |put_charclass_bitmap_innards_common \
+ES |SV* |put_charclass_bitmap_innards_common \
|NN SV* invlist \
|NULLOK SV* posixes \
|NULLOK SV* only_utf8 \
|NULLOK SV* not_utf8 \
|NULLOK SV* only_utf8_locale \
|const bool invert
-Es |void |put_charclass_bitmap_innards_invlist \
+ES |void |put_charclass_bitmap_innards_invlist \
|NN SV *sv \
|NN SV* invlist
-Es |void |put_range |NN SV* sv|UV start|const UV end \
+ES |void |put_range |NN SV* sv|UV start|const UV end \
|const bool allow_literals
-Es |void |dump_trie |NN const struct _reg_trie_data *trie\
+ES |void |dump_trie |NN const struct _reg_trie_data *trie\
|NULLOK HV* widecharmap|NN AV *revcharmap\
|U32 depth
-Es |void |dump_trie_interim_list|NN const struct _reg_trie_data *trie\
+ES |void |dump_trie_interim_list|NN const struct _reg_trie_data *trie\
|NULLOK HV* widecharmap|NN AV *revcharmap\
|U32 next_alloc|U32 depth
-Es |void |dump_trie_interim_table|NN const struct _reg_trie_data *trie\
+ES |void |dump_trie_interim_table|NN const struct _reg_trie_data *trie\
|NULLOK HV* widecharmap|NN AV *revcharmap\
|U32 next_alloc|U32 depth
-Es |bool |regtail_study |NN RExC_state_t *pRExC_state \
+ESR |bool |regtail_study |NN RExC_state_t *pRExC_state \
|NN regnode_offset p|NN const regnode_offset val|U32 depth
# endif
#endif
#if defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_UTF8_C)
-EXRpM |bool |isFOO_lc |const U8 classnum|const U8 character
+EXRp |bool |isFOO_lc |const U8 classnum|const U8 character
#endif
-#if defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_TOKE_C)
-ERp |bool |_is_grapheme |NN const U8 * strbeg|NN const U8 * s|NN const U8 *strend|const UV cp
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_TOKE_C)
+ERp |bool |is_grapheme |NN const U8 * strbeg|NN const U8 * s|NN const U8 *strend|const UV cp
#endif
#if defined(PERL_IN_REGEXEC_C)
-ERs |bool |isFOO_utf8_lc |const U8 classnum|NN const U8* character|NN const U8* e
-ERns |U8 * |find_next_masked|NN U8 * s \
+ERS |bool |isFOO_utf8_lc |const U8 classnum|NN const U8* character|NN const U8* e
+ERTS |U8 * |find_next_masked|NN U8 * s \
|NN const U8 * send \
|const U8 byte|const U8 mask
-ERns |U8 *|find_span_end |NN U8* s|NN const U8 * send|const U8 span_byte
-ERns |U8 *|find_span_end_mask|NN U8 * s|NN const U8 * send \
+ERTS |U8 *|find_span_end |NN U8* s|NN const U8 * send|const U8 span_byte
+ERTS |U8 *|find_span_end_mask|NN U8 * s|NN const U8 * send \
|const U8 span_byte|const U8 mask
-ERs |SSize_t|regmatch |NN regmatch_info *reginfo|NN char *startpos|NN regnode *prog
-WERs |I32 |regrepeat |NN regexp *prog|NN char **startposp \
+ERS |SSize_t|regmatch |NN regmatch_info *reginfo|NN char *startpos|NN regnode *prog
+WERS |I32 |regrepeat |NN regexp *prog|NN char **startposp \
|NN const regnode *p \
|NN char *loceol \
|NN regmatch_info *const reginfo \
|I32 max
-ERs |bool |regtry |NN regmatch_info *reginfo|NN char **startposp
-ERs |bool |reginclass |NULLOK regexp * const prog \
+ERS |bool |regtry |NN regmatch_info *reginfo|NN char **startposp
+ERS |bool |reginclass |NULLOK regexp * const prog \
|NN const regnode * const n \
|NN const U8 * const p \
|NN const U8 * const p_end \
|bool const utf8_target
-WEs |CHECKPOINT|regcppush |NN const regexp *rex|I32 parenfloor\
+WES |CHECKPOINT|regcppush |NN const regexp *rex|I32 parenfloor\
|U32 maxopenparen
-WEs |void |regcppop |NN regexp *rex|NN U32 *maxopenparen_p
-WEs |void |regcp_restore |NN regexp *rex|I32 ix|NN U32 *maxopenparen_p
-ERsn |U8* |reghop3 |NN U8 *s|SSize_t off|NN const U8 *lim
-ERsn |U8* |reghop4 |NN U8 *s|SSize_t off|NN const U8 *llim \
+WES |void |regcppop |NN regexp *rex|NN U32 *maxopenparen_p
+WES |void |regcp_restore |NN regexp *rex|I32 ix|NN U32 *maxopenparen_p
+ERST |U8* |reghop3 |NN U8 *s|SSize_t off|NN const U8 *lim
+ERST |U8* |reghop4 |NN U8 *s|SSize_t off|NN const U8 *llim \
|NN const U8 *rlim
-ERsn |U8* |reghopmaybe3 |NN U8 *s|SSize_t off|NN const U8 * const lim
-ERs |char* |find_byclass |NN regexp * prog|NN const regnode *c \
+ERST |U8* |reghopmaybe3 |NN U8 *s|SSize_t off|NN const U8 * const lim
+ERS |char* |find_byclass |NN regexp * prog|NN const regnode *c \
|NN char *s|NN const char *strend \
|NULLOK regmatch_info *reginfo
-Es |void |to_utf8_substr |NN regexp * prog
-Es |bool |to_byte_substr |NN regexp * prog
-ERsn |I32 |reg_check_named_buff_matched |NN const regexp *rex \
+ES |void |to_utf8_substr |NN regexp * prog
+ES |bool |to_byte_substr |NN regexp * prog
+ERST |I32 |reg_check_named_buff_matched |NN const regexp *rex \
|NN const regnode *scan
-EsR |bool |isGCB |const GCB_enum before \
+ESR |bool |isGCB |const GCB_enum before \
|const GCB_enum after \
|NN const U8 * const strbeg \
|NN const U8 * const curpos \
|const bool utf8_target
-EsR |GCB_enum|backup_one_GCB|NN const U8 * const strbeg \
+ESR |GCB_enum|backup_one_GCB|NN const U8 * const strbeg \
|NN U8 ** curpos \
|const bool utf8_target
-EsR |bool |isLB |LB_enum before \
+ESR |bool |isLB |LB_enum before \
|LB_enum after \
|NN const U8 * const strbeg \
|NN const U8 * const curpos \
|NN const U8 * const strend \
|const bool utf8_target
-EsR |LB_enum|advance_one_LB |NN U8 ** curpos \
+ESR |LB_enum|advance_one_LB |NN U8 ** curpos \
|NN const U8 * const strend \
|const bool utf8_target
-EsR |LB_enum|backup_one_LB |NN const U8 * const strbeg \
+ESR |LB_enum|backup_one_LB |NN const U8 * const strbeg \
|NN U8 ** curpos \
|const bool utf8_target
-EsR |bool |isSB |SB_enum before \
+ESR |bool |isSB |SB_enum before \
|SB_enum after \
|NN const U8 * const strbeg \
|NN const U8 * const curpos \
|NN const U8 * const strend \
|const bool utf8_target
-EsR |SB_enum|advance_one_SB |NN U8 ** curpos \
+ESR |SB_enum|advance_one_SB |NN U8 ** curpos \
|NN const U8 * const strend \
|const bool utf8_target
-EsR |SB_enum|backup_one_SB |NN const U8 * const strbeg \
+ESR |SB_enum|backup_one_SB |NN const U8 * const strbeg \
|NN U8 ** curpos \
|const bool utf8_target
-EsR |bool |isWB |WB_enum previous \
+ESR |bool |isWB |WB_enum previous \
|WB_enum before \
|WB_enum after \
|NN const U8 * const strbeg \
|NN const U8 * const curpos \
|NN const U8 * const strend \
|const bool utf8_target
-EsR |WB_enum|advance_one_WB |NN U8 ** curpos \
+ESR |WB_enum|advance_one_WB |NN U8 ** curpos \
|NN const U8 * const strend \
|const bool utf8_target \
|const bool skip_Extend_Format
-EsR |WB_enum|backup_one_WB |NN WB_enum * previous \
+ESR |WB_enum|backup_one_WB |NN WB_enum * previous \
|NN const U8 * const strbeg \
|NN U8 ** curpos \
|const bool utf8_target
-Ein |I32 |foldEQ_latin1_s2_folded|NN const char* a|NN const char* b|I32 len
+EiT |I32 |foldEQ_latin1_s2_folded|NN const char* a|NN const char* b|I32 len
# ifdef DEBUGGING
-Es |void |dump_exec_pos |NN const char *locinput|NN const regnode *scan|NN const char *loc_regeol\
+ES |void |dump_exec_pos |NN const char *locinput|NN const regnode *scan|NN const char *loc_regeol\
|NN const char *loc_bostr|NN const char *loc_reg_starttry|const bool do_utf8|const U32 depth
-Es |void |debug_start_match|NN const REGEXP *prog|const bool do_utf8\
+ES |void |debug_start_match|NN const REGEXP *prog|const bool do_utf8\
|NN const char *start|NN const char *end\
|NN const char *blurb
@@ -2667,14 +2885,14 @@ Ep |int |re_exec_indentf |NN const char *fmt|U32 depth|...
#endif
#if defined(PERL_IN_DUMP_C)
-s |CV* |deb_curcv |I32 ix
-s |void |debprof |NN const OP *o
-s |UV |sequence_num |NULLOK const OP *o
-s |SV* |pm_description |NN const PMOP *pm
+S |CV* |deb_curcv |I32 ix
+S |void |debprof |NN const OP *o
+S |UV |sequence_num |NULLOK const OP *o
+S |SV* |pm_description |NN const PMOP *pm
#endif
#if defined(PERL_IN_SCOPE_C)
-s |SV* |save_scalar_at |NN SV **sptr|const U32 flags
+S |SV* |save_scalar_at |NN SV **sptr|const U32 flags
#endif
#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
@@ -2684,7 +2902,7 @@ po |void |sv_add_backref |NN SV *const tsv|NN SV *const sv
#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C)
: Used in hv.c and mg.c
-poM |void |sv_kill_backrefs |NN SV *const sv|NULLOK AV *const av
+pox |void |sv_kill_backrefs |NN SV *const sv|NULLOK AV *const av
#endif
#if defined(PERL_IN_SV_C) || defined (PERL_IN_OP_C)
@@ -2695,46 +2913,46 @@ pR |SV * |varname |NULLOK const GV *const gv|const char gvtype \
pX |void |sv_del_backref |NN SV *const tsv|NN SV *const sv
#if defined(PERL_IN_SV_C)
-niR |char * |uiv_2buf |NN char *const buf|const IV iv|UV uv|const int is_uv|NN char **const peob
+TiR |char * |uiv_2buf |NN char *const buf|const IV iv|UV uv|const int is_uv|NN char **const peob
i |void |sv_unglob |NN SV *const sv|U32 flags
-s |const char *|sv_display |NN SV *const sv|NN char *tmpbuf|STRLEN tmpbuf_size
-s |void |not_a_number |NN SV *const sv
-s |void |not_incrementable |NN SV *const sv
-s |I32 |visit |NN SVFUNC_t f|const U32 flags|const U32 mask
+S |const char *|sv_display |NN SV *const sv|NN char *tmpbuf|STRLEN tmpbuf_size
+S |void |not_a_number |NN SV *const sv
+S |void |not_incrementable |NN SV *const sv
+S |I32 |visit |NN SVFUNC_t f|const U32 flags|const U32 mask
# ifdef DEBUGGING
-s |void |del_sv |NN SV *p
+S |void |del_sv |NN SV *p
# endif
# if !defined(NV_PRESERVES_UV)
# ifdef DEBUGGING
-s |int |sv_2iuv_non_preserve |NN SV *const sv|I32 numtype
+S |int |sv_2iuv_non_preserve |NN SV *const sv|I32 numtype
# else
-s |int |sv_2iuv_non_preserve |NN SV *const sv
+S |int |sv_2iuv_non_preserve |NN SV *const sv
# endif
# endif
-sR |STRLEN |expect_number |NN const char **const pattern
-sn |STRLEN |sv_pos_u2b_forwards|NN const U8 *const start \
+SR |STRLEN |expect_number |NN const char **const pattern
+ST |STRLEN |sv_pos_u2b_forwards|NN const U8 *const start \
|NN const U8 *const send|NN STRLEN *const uoffset \
|NN bool *const at_end
-sn |STRLEN |sv_pos_u2b_midway|NN const U8 *const start \
+ST |STRLEN |sv_pos_u2b_midway|NN const U8 *const start \
|NN const U8 *send|STRLEN uoffset|const STRLEN uend
-s |STRLEN |sv_pos_u2b_cached|NN SV *const sv|NN MAGIC **const mgp \
+S |STRLEN |sv_pos_u2b_cached|NN SV *const sv|NN MAGIC **const mgp \
|NN const U8 *const start|NN const U8 *const send \
|STRLEN uoffset|STRLEN uoffset0|STRLEN boffset0
-s |void |utf8_mg_len_cache_update|NN SV *const sv|NN MAGIC **const mgp \
+S |void |utf8_mg_len_cache_update|NN SV *const sv|NN MAGIC **const mgp \
|const STRLEN ulen
-s |void |utf8_mg_pos_cache_update|NN SV *const sv|NN MAGIC **const mgp \
+S |void |utf8_mg_pos_cache_update|NN SV *const sv|NN MAGIC **const mgp \
|const STRLEN byte|const STRLEN utf8|const STRLEN blen
-s |STRLEN |sv_pos_b2u_midway|NN const U8 *const s|NN const U8 *const target \
+S |STRLEN |sv_pos_b2u_midway|NN const U8 *const s|NN const U8 *const target \
|NN const U8 *end|STRLEN endu
-s |void |assert_uft8_cache_coherent|NN const char *const func \
+S |void |assert_uft8_cache_coherent|NN const char *const func \
|STRLEN from_cache|STRLEN real|NN SV *const sv
-sn |char * |F0convert |NV nv|NN char *const endbuf|NN STRLEN *const len
-s |SV * |more_sv
-s |bool |sv_2iuv_common |NN SV *const sv
-s |void |glob_assign_glob|NN SV *const dstr|NN SV *const sstr \
+ST |char * |F0convert |NV nv|NN char *const endbuf|NN STRLEN *const len
+S |SV * |more_sv
+S |bool |sv_2iuv_common |NN SV *const sv
+S |void |glob_assign_glob|NN SV *const dstr|NN SV *const sstr \
|const int dtype
-sRn |PTR_TBL_ENT_t *|ptr_table_find|NN PTR_TBL_t *const tbl|NULLOK const void *const sv
-s |void |anonymise_cv_maybe |NN GV *gv|NN CV *cv
+SRT |PTR_TBL_ENT_t *|ptr_table_find|NN PTR_TBL_t *const tbl|NULLOK const void *const sv
+S |void |anonymise_cv_maybe |NN GV *gv|NN CV *cv
#endif
: Used in sv.c and hv.c
@@ -2746,122 +2964,127 @@ EXpR |SV* |get_and_check_backslash_N_name|NN const char* s \
|NN const char** error_msg
: For use ONLY in B::Hooks::Parser, by special dispensation
-EXpMR |char* |scan_str |NN char *start|int keep_quoted \
+EXpxR |char* |scan_str |NN char *start|int keep_quoted \
|int keep_delims|int re_reparse \
|NULLOK char **delimp
-EXpM |char* |scan_word |NN char *s|NN char *dest|STRLEN destlen \
+EXpx |char* |scan_word |NN char *s|NN char *dest|STRLEN destlen \
|int allow_package|NN STRLEN *slp
-EXpMR |char* |skipspace_flags|NN char *s|U32 flags
+EXpxR |char* |skipspace_flags|NN char *s|U32 flags
#if defined(PERL_IN_TOKE_C)
-s |void |check_uni
-s |void |force_next |I32 type
-s |char* |force_version |NN char *s|int guessing
-s |char* |force_strict_version |NN char *s
-s |char* |force_word |NN char *start|int token|int check_keyword \
+S |void |check_uni
+S |void |force_next |I32 type
+S |char* |force_version |NN char *s|int guessing
+S |char* |force_strict_version |NN char *s
+S |char* |force_word |NN char *start|int token|int check_keyword \
|int allow_pack
-s |SV* |tokeq |NN SV *sv
-sR |char* |scan_const |NN char *start
-sR |SV* |get_and_check_backslash_N_name_wrapper|NN const char* s \
+S |SV* |tokeq |NN SV *sv
+SR |char* |scan_const |NN char *start
+SR |SV* |get_and_check_backslash_N_name_wrapper|NN const char* s \
|NN const char* const e
-sR |char* |scan_formline |NN char *s
-sR |char* |scan_heredoc |NN char *s
-s |char* |scan_ident |NN char *s|NN char *dest \
+SR |char* |scan_formline |NN char *s
+SR |char* |scan_heredoc |NN char *s
+S |char* |scan_ident |NN char *s|NN char *dest \
|STRLEN destlen|I32 ck_uni
-sR |char* |scan_inputsymbol|NN char *start
-sR |char* |scan_pat |NN char *start|I32 type
-sR |char* |scan_subst |NN char *start
-sR |char* |scan_trans |NN char *start
-s |void |update_debugger_info|NULLOK SV *orig_sv \
+SR |char* |scan_inputsymbol|NN char *start
+SR |char* |scan_pat |NN char *start|I32 type
+SR |char* |scan_subst |NN char *start
+SR |char* |scan_trans |NN char *start
+S |void |update_debugger_info|NULLOK SV *orig_sv \
|NULLOK const char *const buf|STRLEN len
-sR |char* |swallow_bom |NN U8 *s
+SR |char* |swallow_bom |NN U8 *s
#ifndef PERL_NO_UTF16_FILTER
-s |I32 |utf16_textfilter|int idx|NN SV *sv|int maxlen
-s |U8* |add_utf16_textfilter|NN U8 *const s|bool reversed
+S |I32 |utf16_textfilter|int idx|NN SV *sv|int maxlen
+S |U8* |add_utf16_textfilter|NN U8 *const s|bool reversed
#endif
-s |void |checkcomma |NN const char *s|NN const char *name \
+S |void |checkcomma |NN const char *s|NN const char *name \
|NN const char *what
-s |void |force_ident |NN const char *s|int kind
-s |void |force_ident_maybe_lex|char pit
-s |void |incline |NN const char *s|NN const char *end
-s |int |intuit_method |NN char *s|NULLOK SV *ioname|NULLOK CV *cv
-s |int |intuit_more |NN char *s|NN char *e
-s |I32 |lop |I32 f|U8 x|NN char *s
-rs |void |missingterm |NULLOK char *s|STRLEN len
-s |void |no_op |NN const char *const what|NULLOK char *s
-s |int |pending_ident
-sR |I32 |sublex_done
-sR |I32 |sublex_push
-sR |I32 |sublex_start
-sR |char * |filter_gets |NN SV *sv|STRLEN append
-sR |HV * |find_in_my_stash|NN const char *pkgname|STRLEN len
-sR |char * |tokenize_use |int is_use|NN char *s
-so |SV* |new_constant |NULLOK const char *s|STRLEN len \
+S |void |force_ident |NN const char *s|int kind
+S |void |force_ident_maybe_lex|char pit
+S |void |incline |NN const char *s|NN const char *end
+S |int |intuit_method |NN char *s|NULLOK SV *ioname|NULLOK CV *cv
+S |int |intuit_more |NN char *s|NN char *e
+S |I32 |lop |I32 f|U8 x|NN char *s
+rS |void |missingterm |NULLOK char *s|STRLEN len
+S |void |no_op |NN const char *const what|NULLOK char *s
+S |int |pending_ident
+SR |I32 |sublex_done
+SR |I32 |sublex_push
+SR |I32 |sublex_start
+SR |char * |filter_gets |NN SV *sv|STRLEN append
+SR |HV * |find_in_my_stash|NN const char *pkgname|STRLEN len
+SR |char * |tokenize_use |int is_use|NN char *s
+So |SV* |new_constant |NULLOK const char *s|STRLEN len \
|NN const char *key|STRLEN keylen|NN SV *sv \
|NULLOK SV *pv|NULLOK const char *type \
|STRLEN typelen \
|NULLOK const char ** error_msg
-s |int |ao |int toketype
-s |void|parse_ident|NN char **s|NN char **d \
+S |int |ao |int toketype
+S |void|parse_ident|NN char **s|NN char **d \
|NN char * const e|int allow_package \
|bool is_utf8|bool check_dollar \
|bool tick_warn
# if defined(PERL_CR_FILTER)
-s |I32 |cr_textfilter |int idx|NULLOK SV *sv|int maxlen
-s |void |strip_return |NN SV *sv
+S |I32 |cr_textfilter |int idx|NULLOK SV *sv|int maxlen
+S |void |strip_return |NN SV *sv
# endif
# if defined(DEBUGGING)
-s |int |tokereport |I32 rv|NN const YYSTYPE* lvalp
-sf |void |printbuf |NN const char *const fmt|NN const char *const s
+S |int |tokereport |I32 rv|NN const YYSTYPE* lvalp
+Sf |void |printbuf |NN const char *const fmt|NN const char *const s
# endif
#endif
-EXMp |bool |validate_proto |NN SV *name|NULLOK SV *proto|bool warn \
+EdXxp |bool |validate_proto |NN SV *name|NULLOK SV *proto|bool warn \
|bool curstash
#if defined(PERL_IN_UNIVERSAL_C)
-s |bool |isa_lookup |NN HV *stash|NN const char * const name \
+SG |bool |isa_lookup |NULLOK HV *stash|NULLOK SV *namesv|NULLOK const char * name \
|STRLEN len|U32 flags
+SG |bool |sv_derived_from_svpvn |NULLOK SV *sv \
+ |NULLOK SV *namesv \
+ |NULLOK const char * name \
+ |const STRLEN len \
+ |U32 flags
#endif
#if defined(PERL_IN_LOCALE_C)
# ifdef USE_LOCALE
-sn |const char*|category_name |const int category
-s |const char*|switch_category_locale_to_template|const int switch_category|const int template_category|NULLOK const char * template_locale
-s |void |restore_switched_locale|const int category|NULLOK const char * const original_locale
+ST |const char*|category_name |const int category
+S |const char*|switch_category_locale_to_template|const int switch_category|const int template_category|NULLOK const char * template_locale
+S |void |restore_switched_locale|const int category|NULLOK const char * const original_locale
# endif
# ifdef HAS_NL_LANGINFO
-sn |const char*|my_nl_langinfo|const nl_item item|bool toggle
+ST |const char*|my_nl_langinfo|const nl_item item|bool toggle
# else
-sn |const char*|my_nl_langinfo|const int item|bool toggle
+ST |const char*|my_nl_langinfo|const int item|bool toggle
# endif
-inR |const char *|save_to_buffer|NULLOK const char * string \
+iTR |const char *|save_to_buffer|NULLOK const char * string \
|NULLOK char **buf \
|NN Size_t *buf_size \
|const Size_t offset
# if defined(USE_LOCALE)
-s |char* |stdize_locale |NN char* locs
-s |void |new_collate |NULLOK const char* newcoll
-s |void |new_ctype |NN const char* newctype
-s |void |set_numeric_radix|const bool use_locale
-s |void |new_numeric |NULLOK const char* newnum
+S |char* |stdize_locale |NN char* locs
+S |void |new_collate |NULLOK const char* newcoll
+S |void |new_ctype |NN const char* newctype
+S |void |set_numeric_radix|const bool use_locale
+S |void |new_numeric |NULLOK const char* newnum
# ifdef USE_POSIX_2008_LOCALE
-sn |const char*|emulate_setlocale|const int category \
+ST |const char*|emulate_setlocale|const int category \
|NULLOK const char* locale \
|unsigned int index \
|const bool is_index_valid
# endif
# ifdef WIN32
-s |char* |win32_setlocale|int category|NULLOK const char* locale
+S |char* |win32_setlocale|int category|NULLOK const char* locale
# endif
# ifdef DEBUGGING
-s |void |print_collxfrm_input_and_return \
+S |void |print_collxfrm_input_and_return \
|NN const char * const s \
|NN const char * const e \
|NULLOK const STRLEN * const xlen \
|const bool is_utf8
-s |void |print_bytes_for_locale |NN const char * const s \
+S |void |print_bytes_for_locale |NN const char * const s \
|NN const char * const e \
|const bool is_utf8
-snR |char * |setlocale_debug_string |const int category \
+STR |char * |setlocale_debug_string |const int category \
|NULLOK const char* const locale \
|NULLOK const char* const retval
# endif
@@ -2873,16 +3096,16 @@ snR |char * |setlocale_debug_string |const int category \
|| defined(PERL_IN_MG_C) \
|| defined (PERL_EXT_POSIX) \
|| defined (PERL_EXT_LANGINFO))
-ApM |bool |_is_cur_LC_category_utf8|int category
+Cp |bool |_is_cur_LC_category_utf8|int category
#endif
#if defined(PERL_IN_UTIL_C)
-s |SV* |mess_alloc
-s |SV * |with_queued_errors|NN SV *ex
-s |bool |invoke_exception_hook|NULLOK SV *ex|bool warn
+S |SV* |mess_alloc
+S |SV * |with_queued_errors|NN SV *ex
+S |bool |invoke_exception_hook|NULLOK SV *ex|bool warn
#if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
-sn |void |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
+ST |void |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
|NN const char *type_name|NULLOK const SV *sv \
|Malloc_t oldalloc|Malloc_t newalloc \
|NN const char *filename|const int linenumber \
@@ -2891,32 +3114,26 @@ sn |void |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
#endif
#if defined(PERL_MEM_LOG)
-pn |Malloc_t |mem_log_alloc |const UV nconst|UV typesize|NN const char *type_name|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
-pn |Malloc_t |mem_log_realloc |const UV n|const UV typesize|NN const char *type_name|Malloc_t oldalloc|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
-pn |Malloc_t |mem_log_free |Malloc_t oldalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pT |Malloc_t |mem_log_alloc |const UV nconst|UV typesize|NN const char *type_name|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pT |Malloc_t |mem_log_realloc |const UV n|const UV typesize|NN const char *type_name|Malloc_t oldalloc|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pT |Malloc_t |mem_log_free |Malloc_t oldalloc|NN const char *filename|const int linenumber|NN const char *funcname
#endif
#if defined(PERL_IN_UTF8_C)
-sR |HV * |new_msg_hv |NN const char * const message \
+SR |HV * |new_msg_hv |NN const char * const message \
|U32 categories \
|U32 flag
-sRM |UV |check_locale_boundary_crossing \
+SR |UV |check_locale_boundary_crossing \
|NN const U8* const p \
|const UV result \
|NN U8* const ustrp \
|NN STRLEN *lenp
iR |bool |is_utf8_common |NN const U8 *const p \
+ |NN const U8 *const e \
|NULLOK SV* const invlist
-iR |bool |is_utf8_common_with_len|NN const U8 *const p \
- |NN const U8 *const e \
- |NULLOK SV* const invlist
-sR |SV* |swatch_get |NN SV* swash|UV start|UV span
-sRM |U8* |swash_scan_list_line|NN U8* l|NN U8* const lend|NN UV* min \
- |NN UV* max|NN UV* val|const bool wants_value \
- |NN const U8* const typestr
#endif
-EXiMn |void |append_utf8_from_native_byte|const U8 byte|NN U8** dest
+EXiTp |void |append_utf8_from_native_byte|const U8 byte|NN U8** dest
Apd |void |sv_set_undef |NN SV *sv
Apd |void |sv_setsv_flags |NN SV *dstr|NULLOK SV *sstr|const I32 flags
@@ -2925,70 +3142,70 @@ Apd |void |sv_catpvn_flags|NN SV *const dstr|NN const char *sstr|const STRLEN le
Apd |void |sv_catpv_flags |NN SV *dstr|NN const char *sstr \
|const I32 flags
Apd |void |sv_catsv_flags |NN SV *const dsv|NULLOK SV *const ssv|const I32 flags
-Apmd |STRLEN |sv_utf8_upgrade_flags|NN SV *const sv|const I32 flags
-Ap |STRLEN |sv_utf8_upgrade_flags_grow|NN SV *const sv|const I32 flags|STRLEN extra
+Amd |STRLEN |sv_utf8_upgrade_flags|NN SV *const sv|const I32 flags
+Adp |STRLEN |sv_utf8_upgrade_flags_grow|NN SV *const sv|const I32 flags|STRLEN extra
Apd |char* |sv_pvn_force_flags|NN SV *const sv|NULLOK STRLEN *const lp|const I32 flags
-Apmb |void |sv_copypv |NN SV *const dsv|NN SV *const ssv
-Apmd |void |sv_copypv_nomg |NN SV *const dsv|NN SV *const ssv
+AdpMb |void |sv_copypv |NN SV *const dsv|NN SV *const ssv
+Amd |void |sv_copypv_nomg |NN SV *const dsv|NN SV *const ssv
Apd |void |sv_copypv_flags |NN SV *const dsv|NN SV *const ssv|const I32 flags
-Apo |char* |my_atof2 |NN const char *orig|NN NV* value
-Ap |char* |my_atof3 |NN const char *orig|NN NV* value|const STRLEN len
-Apn |int |my_socketpair |int family|int type|int protocol|int fd[2]
-Apn |int |my_dirfd |NULLOK DIR* dir
+Cpo |char* |my_atof2 |NN const char *orig|NN NV* value
+Cp |char* |my_atof3 |NN const char *orig|NN NV* value|const STRLEN len
+ApT |int |my_socketpair |int family|int type|int protocol|int fd[2]
+ApT |int |my_dirfd |NULLOK DIR* dir
#ifdef PERL_ANY_COW
-: Used in pp_hot.c and regexec.c
-pMXE |SV* |sv_setsv_cow |NULLOK SV* dstr|NN SV* sstr
+: Used in regexec.c
+pxXE |SV* |sv_setsv_cow |NULLOK SV* dstr|NN SV* sstr
#endif
Aop |const char *|PerlIO_context_layers|NULLOK const char *mode
#if defined(USE_PERLIO)
-Ap |int |PerlIO_close |NULLOK PerlIO *f
+Apdh |int |PerlIO_close |NULLOK PerlIO *f
Ap |int |PerlIO_fill |NULLOK PerlIO *f
-Ap |int |PerlIO_fileno |NULLOK PerlIO *f
-Ap |int |PerlIO_eof |NULLOK PerlIO *f
-Ap |int |PerlIO_error |NULLOK PerlIO *f
-Ap |int |PerlIO_flush |NULLOK PerlIO *f
-Ap |void |PerlIO_clearerr |NULLOK PerlIO *f
-Ap |void |PerlIO_set_cnt |NULLOK PerlIO *f|SSize_t cnt
-Ap |void |PerlIO_set_ptrcnt |NULLOK PerlIO *f|NULLOK STDCHAR *ptr \
+Apdh |int |PerlIO_fileno |NULLOK PerlIO *f
+Apdh |int |PerlIO_eof |NULLOK PerlIO *f
+Apdh |int |PerlIO_error |NULLOK PerlIO *f
+Apdh |int |PerlIO_flush |NULLOK PerlIO *f
+Apdh |void |PerlIO_clearerr |NULLOK PerlIO *f
+Apdh |void |PerlIO_set_cnt |NULLOK PerlIO *f|SSize_t cnt
+Apdh |void |PerlIO_set_ptrcnt |NULLOK PerlIO *f|NULLOK STDCHAR *ptr \
|SSize_t cnt
-Ap |void |PerlIO_setlinebuf |NULLOK PerlIO *f
-Ap |SSize_t|PerlIO_read |NULLOK PerlIO *f|NN void *vbuf \
+Apdh |void |PerlIO_setlinebuf |NULLOK PerlIO *f
+Apdh |SSize_t|PerlIO_read |NULLOK PerlIO *f|NN void *vbuf \
|Size_t count
-Ap |SSize_t|PerlIO_write |NULLOK PerlIO *f|NN const void *vbuf \
+Apdh |SSize_t|PerlIO_write |NULLOK PerlIO *f|NN const void *vbuf \
|Size_t count
Ap |SSize_t|PerlIO_unread |NULLOK PerlIO *f|NN const void *vbuf \
|Size_t count
-Ap |Off_t |PerlIO_tell |NULLOK PerlIO *f
-Ap |int |PerlIO_seek |NULLOK PerlIO *f|Off_t offset|int whence
+Apdh |Off_t |PerlIO_tell |NULLOK PerlIO *f
+Apdh |int |PerlIO_seek |NULLOK PerlIO *f|Off_t offset|int whence
Xp |void |PerlIO_save_errno |NULLOK PerlIO *f
Xp |void |PerlIO_restore_errno |NULLOK PerlIO *f
-Ap |STDCHAR *|PerlIO_get_base |NULLOK PerlIO *f
-Ap |STDCHAR *|PerlIO_get_ptr |NULLOK PerlIO *f
-ApR |SSize_t |PerlIO_get_bufsiz |NULLOK PerlIO *f
-ApR |SSize_t |PerlIO_get_cnt |NULLOK PerlIO *f
+Apdh |STDCHAR *|PerlIO_get_base |NULLOK PerlIO *f
+Apdh |STDCHAR *|PerlIO_get_ptr |NULLOK PerlIO *f
+ApRdh |SSize_t |PerlIO_get_bufsiz |NULLOK PerlIO *f
+ApRdh |SSize_t |PerlIO_get_cnt |NULLOK PerlIO *f
-ApR |PerlIO *|PerlIO_stdin
-ApR |PerlIO *|PerlIO_stdout
-ApR |PerlIO *|PerlIO_stderr
+ApRdh |PerlIO *|PerlIO_stdin
+ApRdh |PerlIO *|PerlIO_stdout
+ApRdh |PerlIO *|PerlIO_stderr
#endif /* USE_PERLIO */
: Only used in dump.c
p |void |deb_stack_all
#if defined(PERL_IN_DEB_C)
-s |void |deb_stack_n |NN SV** stack_base|I32 stack_min \
+S |void |deb_stack_n |NN SV** stack_base|I32 stack_min \
|I32 stack_max|I32 mark_min|I32 mark_max
#endif
: pad API
ApdR |PADLIST*|pad_new |int flags
#ifdef DEBUGGING
-pnX |void|set_padlist| NN CV * cv | NULLOK PADLIST * padlist
+pTX |void|set_padlist| NN CV * cv | NULLOK PADLIST * padlist
#endif
#if defined(PERL_IN_PAD_C)
-s |PADOFFSET|pad_alloc_name|NN PADNAME *name|U32 flags \
+Sd |PADOFFSET|pad_alloc_name|NN PADNAME *name|U32 flags \
|NULLOK HV *typestash|NULLOK HV *ourstash
#endif
Apd |PADOFFSET|pad_add_name_pvn|NN const char *namepv|STRLEN namelen\
@@ -3000,11 +3217,11 @@ Apd |PADOFFSET|pad_add_name_pv|NN const char *name\
Apd |PADOFFSET|pad_add_name_sv|NN SV *name\
|U32 flags|NULLOK HV *typestash\
|NULLOK HV *ourstash
-AMpd |PADOFFSET|pad_alloc |I32 optype|U32 tmptype
+Axpd |PADOFFSET|pad_alloc |I32 optype|U32 tmptype
Apd |PADOFFSET|pad_add_anon |NN CV* func|I32 optype
p |void |pad_add_weakref|NN CV* func
#if defined(PERL_IN_PAD_C)
-sd |void |pad_check_dup |NN PADNAME *name|U32 flags \
+Sd |void |pad_check_dup |NN PADNAME *name|U32 flags \
|NULLOK const HV *ourstash
#endif
Apd |PADOFFSET|pad_findmy_pvn|NN const char* namepv|STRLEN namelen|U32 flags
@@ -3013,7 +3230,7 @@ Apd |PADOFFSET|pad_findmy_sv|NN SV* name|U32 flags
ApdD |PADOFFSET|find_rundefsvoffset |
Apd |SV* |find_rundefsv |
#if defined(PERL_IN_PAD_C)
-sd |PADOFFSET|pad_findlex |NN const char *namepv|STRLEN namelen|U32 flags \
+Sd |PADOFFSET|pad_findlex |NN const char *namepv|STRLEN namelen|U32 flags \
|NN const CV* cv|U32 seq|int warn \
|NULLOK SV** out_capture \
|NN PADNAME** out_name|NN int *out_flags
@@ -3027,29 +3244,32 @@ Apd |U32 |intro_my
pd |OP * |pad_leavemy
pd |void |pad_swipe |PADOFFSET po|bool refadjust
#if defined(PERL_IN_PAD_C)
-sd |void |pad_reset
+Sd |void |pad_reset
#endif
-AMpd |void |pad_tidy |padtidy_type type
+Axpd |void |pad_tidy |padtidy_type type
pd |void |pad_free |PADOFFSET po
pd |void |do_dump_pad |I32 level|NN PerlIO *file|NULLOK PADLIST *padlist|int full
#if defined(PERL_IN_PAD_C)
# if defined(DEBUGGING)
-sd |void |cv_dump |NN const CV *cv|NN const char *title
+Sd |void |cv_dump |NN const CV *cv|NN const char *title
# endif
#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_IN_OP_C)
+iT |bool |PadnameIN_SCOPE|NN const PADNAME * const pn|const U32 seq
+#endif
Apd |CV* |cv_clone |NN CV* proto
p |CV* |cv_clone_into |NN CV* proto|NN CV *target
pd |void |pad_fixup_inner_anons|NN PADLIST *padlist|NN CV *old_cv|NN CV *new_cv
pdX |void |pad_push |NN PADLIST *padlist|int depth
-ApbdR |HV* |pad_compname_type|const PADOFFSET po
-AMpdRn |PADNAME *|padnamelist_fetch|NN PADNAMELIST *pnl|SSize_t key
+ApbdRM |HV* |pad_compname_type|const PADOFFSET po
+AxpdRT |PADNAME *|padnamelist_fetch|NN PADNAMELIST *pnl|SSize_t key
Xop |void |padnamelist_free|NN PADNAMELIST *pnl
-AMpd |PADNAME **|padnamelist_store|NN PADNAMELIST *pnl|SSize_t key \
+Axpd |PADNAME **|padnamelist_store|NN PADNAMELIST *pnl|SSize_t key \
|NULLOK PADNAME *val
Xop |void |padname_free |NN PADNAME *pn
#if defined(USE_ITHREADS)
pdR |PADNAME *|padname_dup |NN PADNAME *src|NN CLONE_PARAMS *param
-pR |PADNAMELIST *|padnamelist_dup|NN PADNAMELIST *srcpad \
+pdR |PADNAMELIST *|padnamelist_dup|NN PADNAMELIST *srcpad \
|NN CLONE_PARAMS *param
pdR |PADLIST *|padlist_dup |NN PADLIST *srcpad \
|NN CLONE_PARAMS *param
@@ -3073,21 +3293,21 @@ Apod |void |hv_assert |NN HV *hv
ApdR |SV* |hv_scalar |NN HV *hv
p |void |hv_pushkv |NN HV *hv|U32 flags
-ApdRM |SV* |hv_bucket_ratio|NN HV *hv
+ApdRx |SV* |hv_bucket_ratio|NN HV *hv
ApoR |I32* |hv_riter_p |NN HV *hv
ApoR |HE** |hv_eiter_p |NN HV *hv
Apo |void |hv_riter_set |NN HV *hv|I32 riter
Apo |void |hv_eiter_set |NN HV *hv|NULLOK HE *eiter
Ap |void |hv_rand_set |NN HV *hv|U32 new_xhv_rand
Ap |void |hv_name_set |NN HV *hv|NULLOK const char *name|U32 len|U32 flags
-p |void |hv_ename_add |NN HV *hv|NN const char *name|U32 len \
+pd |void |hv_ename_add |NN HV *hv|NN const char *name|U32 len \
|U32 flags
-p |void |hv_ename_delete|NN HV *hv|NN const char *name|U32 len \
+pd |void |hv_ename_delete|NN HV *hv|NN const char *name|U32 len \
|U32 flags
: Used in dump.c and hv.c
-poM |AV** |hv_backreferences_p |NN HV *hv
+pox |AV** |hv_backreferences_p |NN HV *hv
#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_SCOPE_C)
-poM |void |hv_kill_backrefs |NN HV *hv
+pox |void |hv_kill_backrefs |NN HV *hv
#endif
Apd |void |hv_clear_placeholders |NN HV *hv
XpoR |SSize_t*|hv_placeholders_p |NN HV *hv
@@ -3098,11 +3318,11 @@ Apo |void |hv_placeholders_set |NN HV *hv|I32 ph
p |SV* |magic_scalarpack|NN HV *hv|NN MAGIC *mg
#if defined(PERL_IN_SV_C)
-s |SV * |find_hash_subscript|NULLOK const HV *const hv \
+S |SV * |find_hash_subscript|NULLOK const HV *const hv \
|NN const SV *const val
-s |SSize_t|find_array_subscript|NULLOK const AV *const av \
+S |SSize_t|find_array_subscript|NULLOK const AV *const av \
|NN const SV *const val
-sMd |SV* |find_uninit_var|NULLOK const OP *const obase \
+Sxd |SV* |find_uninit_var|NULLOK const OP *const obase \
|NULLOK const SV *const uninit_sv|bool match \
|NN const char **desc_p
#endif
@@ -3116,28 +3336,26 @@ p |void |dump_sv_child |NN SV *sv
#endif
#ifdef PERL_DONT_CREATE_GVSV
-Apbm |GV* |gv_SVadd |NULLOK GV *gv
+ApbM |GV* |gv_SVadd |NULLOK GV *gv
#endif
#if defined(PERL_IN_UTIL_C)
-s |bool |ckwarn_common |U32 w
+S |bool |ckwarn_common |U32 w
#endif
ApoP |bool |ckwarn |U32 w
ApoP |bool |ckwarn_d |U32 w
: FIXME - exported for ByteLoader - public or private?
-XEopMR |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \
+XEopxR |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \
|NN const char *const bits|STRLEN size
-: DON'T REMOVE THE my_sprintf LINE.
-Apnod |int |my_sprintf |NN char *buffer|NN const char *pat|...
-Apnodf |int |my_snprintf |NN char *buffer|const Size_t len|NN const char *format|...
-Apnod |int |my_vsnprintf |NN char *buffer|const Size_t len|NN const char *format|va_list ap
+AMpTdf |int |my_snprintf |NN char *buffer|const Size_t len|NN const char *format|...
+AMpTd |int |my_vsnprintf |NN char *buffer|const Size_t len|NN const char *format|va_list ap
#ifdef USE_QUADMATH
-Apnd |const char* |quadmath_format_single|NN const char* format
-Apnd |bool|quadmath_format_needed|NN const char* format
+pTd |bool |quadmath_format_valid|NN const char* format
+pTd |bool|quadmath_format_needed|NN const char* format
#endif
: Used in mg.c, sv.c
-px |void |my_clearenv
+pe |void |my_clearenv
#ifdef PERL_IMPLICIT_CONTEXT
#ifdef PERL_GLOBAL_STRUCT_PRIVATE
@@ -3148,50 +3366,50 @@ Apo |void* |my_cxt_init |NN int *indexp|size_t size
#endif
#endif
#if defined(PERL_IN_UTIL_C)
-so |void |xs_version_bootcheck|U32 items|U32 ax|NN const char *xs_p \
+So |void |xs_version_bootcheck|U32 items|U32 ax|NN const char *xs_p \
|STRLEN xs_len
#endif
-Xpon |I32 |xs_handshake |const U32 key|NN void * v_my_perl\
+XpoT |I32 |xs_handshake |const U32 key|NN void * v_my_perl\
|NN const char * file| ...
Xp |void |xs_boot_epilog |const I32 ax
#ifndef HAS_STRLCAT
-Apnod |Size_t |my_strlcat |NULLOK char *dst|NULLOK const char *src|Size_t size
+ApTd |Size_t |my_strlcat |NULLOK char *dst|NULLOK const char *src|Size_t size
#endif
#ifndef HAS_STRLCPY
-Apnod |Size_t |my_strlcpy |NULLOK char *dst|NULLOK const char *src|Size_t size
+ApTd |Size_t |my_strlcpy |NULLOK char *dst|NULLOK const char *src|Size_t size
#endif
#ifndef HAS_STRNLEN
-Apnod |Size_t |my_strnlen |NN const char *str|Size_t maxlen
+AipTd |Size_t |my_strnlen |NN const char *str|Size_t maxlen
#endif
#ifndef HAS_MKOSTEMP
-pno |int |my_mkostemp |NN char *templte|int flags
+pTo |int |my_mkostemp |NN char *templte|int flags
#endif
#ifndef HAS_MKSTEMP
-pno |int |my_mkstemp |NN char *templte
+pTo |int |my_mkstemp |NN char *templte
#endif
-APpdn |bool |isinfnan |NV nv
-p |bool |isinfnansv |NN SV *sv
+APpdT |bool |isinfnan |NV nv
+pd |bool |isinfnansv |NN SV *sv
#if !defined(HAS_SIGNBIT)
-AMdnoP |int |Perl_signbit |NV f
+AxdToP |int |Perl_signbit |NV f
#endif
: Used by B
-XEMop |void |emulate_cop_io |NN const COP *const c|NN SV *const sv
+XExop |void |emulate_cop_io |NN const COP *const c|NN SV *const sv
: Used by SvRX and SvRXOK
-XEMop |REGEXP *|get_re_arg|NULLOK SV *sv
+XExop |REGEXP *|get_re_arg|NULLOK SV *sv
-Aop |SV* |mro_get_private_data|NN struct mro_meta *const smeta \
+Aopdh |SV* |mro_get_private_data|NN struct mro_meta *const smeta \
|NN const struct mro_alg *const which
-Aop |SV* |mro_set_private_data|NN struct mro_meta *const smeta \
+Aopdh |SV* |mro_set_private_data|NN struct mro_meta *const smeta \
|NN const struct mro_alg *const which \
|NN SV *const data
Aop |const struct mro_alg *|mro_get_from_name|NN SV *name
-Aop |void |mro_register |NN const struct mro_alg *mro
+Aopd |void |mro_register |NN const struct mro_alg *mro
Aop |void |mro_set_mro |NN struct mro_meta *const meta \
|NN SV *const name
: Used in HvMROMETA(), which is public.
@@ -3202,13 +3420,13 @@ p |struct mro_meta* |mro_meta_dup |NN struct mro_meta* smeta|NN CLONE_PARAMS* pa
#endif
Apd |AV* |mro_get_linear_isa|NN HV* stash
#if defined(PERL_IN_MRO_C)
-sd |AV* |mro_get_linear_isa_dfs|NN HV* stash|U32 level
-s |void |mro_clean_isarev|NN HV * const isa \
+Sd |AV* |mro_get_linear_isa_dfs|NN HV* stash|U32 level
+S |void |mro_clean_isarev|NN HV * const isa \
|NN const char * const name \
|const STRLEN len \
|NULLOK HV * const exceptions \
|U32 hash|U32 flags
-s |void |mro_gather_and_rename|NN HV * const stashes \
+S |void |mro_gather_and_rename|NN HV * const stashes \
|NN HV * const seen_stashes \
|NULLOK HV *stash \
|NULLOK HV *oldstash \
@@ -3217,36 +3435,32 @@ s |void |mro_gather_and_rename|NN HV * const stashes \
: Used in hv.c, mg.c, pp.c, sv.c
pd |void |mro_isa_changed_in|NN HV* stash
Apd |void |mro_method_changed_in |NN HV* stash
-pdx |void |mro_package_moved |NULLOK HV * const stash|NULLOK HV * const oldstash|NN const GV * const gv|U32 flags
+pde |void |mro_package_moved |NULLOK HV * const stash|NULLOK HV * const oldstash|NN const GV * const gv|U32 flags
: Only used in perl.c
p |void |boot_core_mro
-Apon |void |sys_init |NN int* argc|NN char*** argv
-Apon |void |sys_init3 |NN int* argc|NN char*** argv|NN char*** env
-Apon |void |sys_term
-ApoM |const char *|cop_fetch_label|NN COP *const cop \
+ApoT |void |sys_init |NN int* argc|NN char*** argv
+ApoT |void |sys_init3 |NN int* argc|NN char*** argv|NN char*** env
+ApoT |void |sys_term
+Apxd |const char *|cop_fetch_label|NN COP *const cop \
|NULLOK STRLEN *len|NULLOK U32 *flags
: Only used in op.c and the perl compiler
-ApoM |void|cop_store_label \
+Apxd |void|cop_store_label \
|NN COP *const cop|NN const char *label|STRLEN len|U32 flags
-xpo |int |keyword_plugin_standard|NN char* keyword_ptr|STRLEN keyword_len|NN OP** op_ptr
+epo |int |keyword_plugin_standard|NN char* keyword_ptr|STRLEN keyword_len|NN OP** op_ptr
#if defined(USE_ITHREADS)
# if defined(PERL_IN_SV_C)
-s |void |unreferenced_to_tmp_stack|NN AV *const unreferenced
+S |void |unreferenced_to_tmp_stack|NN AV *const unreferenced
# endif
-ARnop |CLONE_PARAMS *|clone_params_new|NN PerlInterpreter *const from \
+ARTop |CLONE_PARAMS *|clone_params_new|NN PerlInterpreter *const from \
|NN PerlInterpreter *const to
-Anop |void |clone_params_del|NN CLONE_PARAMS *param
+ATop |void |clone_params_del|NN CLONE_PARAMS *param
#endif
: Used in perl.c and toke.c
op |void |populate_isa |NN const char *name|STRLEN len|...
-: Used in keywords.c and toke.c
-Xop |bool |feature_is_enabled|NN const char *const name \
- |STRLEN namelen
-
: Some static inline functions need predeclaration because they are used
: inside other static inline functions.
#if defined(PERL_CORE) || defined (PERL_EXT)
@@ -3256,32 +3470,33 @@ Ei |STRLEN |sv_or_pv_pos_u2b|NN SV *sv|NN const char *pv|STRLEN pos \
Ap |void |clear_defarray |NN AV* av|bool abandon
-ApM |void |leave_adjust_stacks|NN SV **from_sp|NN SV **to_sp \
+Apx |void |leave_adjust_stacks|NN SV **from_sp|NN SV **to_sp \
|U8 gimme|int filter
#ifndef PERL_NO_INLINE_FUNCTIONS
-AiM |PERL_CONTEXT * |cx_pushblock|U8 type|U8 gimme|NN SV** sp|I32 saveix
-AiM |void |cx_popblock|NN PERL_CONTEXT *cx
-AiM |void |cx_topblock|NN PERL_CONTEXT *cx
-AiM |void |cx_pushsub |NN PERL_CONTEXT *cx|NN CV *cv \
+Aixp |U8 |gimme_V |
+Aixp |PERL_CONTEXT * |cx_pushblock|U8 type|U8 gimme|NN SV** sp|I32 saveix
+Aixp |void |cx_popblock|NN PERL_CONTEXT *cx
+Aixp |void |cx_topblock|NN PERL_CONTEXT *cx
+Aixp |void |cx_pushsub |NN PERL_CONTEXT *cx|NN CV *cv \
|NULLOK OP *retop|bool hasargs
-AiM |void |cx_popsub_common|NN PERL_CONTEXT *cx
-AiM |void |cx_popsub_args |NN PERL_CONTEXT *cx
-AiM |void |cx_popsub |NN PERL_CONTEXT *cx
-AiM |void |cx_pushformat |NN PERL_CONTEXT *cx|NN CV *cv \
+Aixp |void |cx_popsub_common|NN PERL_CONTEXT *cx
+Aixp |void |cx_popsub_args |NN PERL_CONTEXT *cx
+Aixp |void |cx_popsub |NN PERL_CONTEXT *cx
+Aixp |void |cx_pushformat |NN PERL_CONTEXT *cx|NN CV *cv \
|NULLOK OP *retop|NULLOK GV *gv
-AiM |void |cx_popformat |NN PERL_CONTEXT *cx
-AiM |void |cx_pusheval |NN PERL_CONTEXT *cx \
+Aixp |void |cx_popformat |NN PERL_CONTEXT *cx
+Aixp |void |cx_pusheval |NN PERL_CONTEXT *cx \
|NULLOK OP *retop|NULLOK SV *namesv
-AiM |void |cx_popeval |NN PERL_CONTEXT *cx
-AiM |void |cx_pushloop_plain|NN PERL_CONTEXT *cx
-AiM |void |cx_pushloop_for |NN PERL_CONTEXT *cx \
+Aixp |void |cx_popeval |NN PERL_CONTEXT *cx
+Aixp |void |cx_pushloop_plain|NN PERL_CONTEXT *cx
+Aixp |void |cx_pushloop_for |NN PERL_CONTEXT *cx \
|NN void *itervarp|NULLOK SV *itersave
-AiM |void |cx_poploop |NN PERL_CONTEXT *cx
-AiM |void |cx_pushwhen |NN PERL_CONTEXT *cx
-AiM |void |cx_popwhen |NN PERL_CONTEXT *cx
-AiM |void |cx_pushgiven |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv
-AiM |void |cx_popgiven |NN PERL_CONTEXT *cx
+Aixp |void |cx_poploop |NN PERL_CONTEXT *cx
+Aixp |void |cx_pushwhen |NN PERL_CONTEXT *cx
+Aixp |void |cx_popwhen |NN PERL_CONTEXT *cx
+Aixp |void |cx_pushgiven |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv
+Aixp |void |cx_popgiven |NN PERL_CONTEXT *cx
#endif
#ifdef USE_DTRACE
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/01_test b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/01_test
new file mode 100644
index 00000000000..bf2885339e6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/01_test
@@ -0,0 +1,13 @@
+################################################################################
+##
+## Copyright (C) 2019, Pali <pali@cpan.org>
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=tests plan => 1
+
+# This test file is used as target dependency for Makefile
+ok 1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME
index 9fba5029fb4..07c84e9ec93 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/HvNAME
@@ -31,8 +31,8 @@ HvNAMELEN_get(hv)
=tests plan => 4
-ok(Devel::PPPort::HvNAME_get(\%Devel::PPPort::), 'Devel::PPPort');
+is(Devel::PPPort::HvNAME_get(\%Devel::PPPort::), 'Devel::PPPort');
ok(!defined Devel::PPPort::HvNAME_get({}));
-ok(Devel::PPPort::HvNAMELEN_get(\%Devel::PPPort::), length('Devel::PPPort'));
-ok(Devel::PPPort::HvNAMELEN_get({}), 0);
+is(Devel::PPPort::HvNAMELEN_get(\%Devel::PPPort::), length('Devel::PPPort'));
+is(Devel::PPPort::HvNAMELEN_get({}), 0);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV
index 4f0ded321c2..c20cb85876c 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/SvPV
@@ -17,21 +17,8 @@ sv_2pvbyte
sv_2pv_flags
sv_pvn_force_flags
-=dontwarn
-
-NEED_sv_2pv_flags
-NEED_sv_2pv_flags_GLOBAL
-
=implementation
-/* Backwards compatibility stuff... :-( */
-#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
-# define NEED_sv_2pv_flags
-#endif
-#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
-# define NEED_sv_2pv_flags_GLOBAL
-#endif
-
/* Hint: sv_2pv_nolen
* Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
*/
@@ -47,21 +34,14 @@ __UNDEFINED__ sv_2pv_nolen(sv) SvPV_nolen(sv)
#if { VERSION < 5.7.0 }
-#if { NEED sv_2pvbyte }
-
-char *
-sv_2pvbyte(pTHX_ SV *sv, STRLEN *lp)
-{
- sv_utf8_downgrade(sv,0);
- return SvPV(sv,*lp);
-}
-
-#endif
+__UNDEFINED__ sv_2pvbyte(sv, lp) (sv_utf8_downgrade((sv), 0), SvPV((sv), *(lp)))
/* Hint: sv_2pvbyte
* Use the SvPVbyte() macro instead of sv_2pvbyte().
*/
+/* Replace sv_2pvbyte with SvPVbyte */
+
#undef SvPVbyte
#define SvPVbyte(sv, lp) \
@@ -83,46 +63,31 @@ __UNDEFINED__ sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv)
* Always use the SvPV() macro instead of sv_pvn().
*/
+/* Replace sv_pvn with SvPV */
+
/* Hint: sv_pvn_force
* Always use the SvPV_force() macro instead of sv_pvn_force().
*/
+/* Replace sv_pvn_force with SvPV_force */
+
/* If these are undefined, they're not handled by the core anyway */
__UNDEFINED__ SV_IMMEDIATE_UNREF 0
__UNDEFINED__ SV_GMAGIC 0
__UNDEFINED__ SV_COW_DROP_PV 0
__UNDEFINED__ SV_UTF8_NO_ENCODING 0
-__UNDEFINED__ SV_NOSTEAL 0
__UNDEFINED__ SV_CONST_RETURN 0
__UNDEFINED__ SV_MUTABLE_RETURN 0
__UNDEFINED__ SV_SMAGIC 0
__UNDEFINED__ SV_HAS_TRAILING_NUL 0
__UNDEFINED__ SV_COW_SHARED_HASH_KEYS 0
-#if { VERSION < 5.7.2 }
-
-#if { NEED sv_2pv_flags }
-
-char *
-sv_2pv_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
-{
- STRLEN n_a = (STRLEN) flags;
- return sv_2pv(sv, lp ? lp : &n_a);
-}
-
-#endif
-
-#if { NEED sv_pvn_force_flags }
-
-char *
-sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
-{
- STRLEN n_a = (STRLEN) flags;
- return sv_pvn_force(sv, lp ? lp : &n_a);
-}
-
-#endif
-
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+ __UNDEFINED__ sv_2pv_flags(sv, lp, flags) ({ SV *_sv = (sv); const I32 _flags = (flags); STRLEN *_lp = lp; _lp = _lp ? : &PL_na; (!(_flags & SV_GMAGIC) && SvGMAGICAL(_sv)) ? ({ char *_pv; SvGMAGICAL_off(_sv); _pv = sv_2pv(_sv, _lp); SvGMAGICAL_on(_sv); _pv; }) : sv_2pv(_sv, _lp); })
+ __UNDEFINED__ sv_pvn_force_flags(sv, lp, flags) ({ SV *_sv = (sv); const I32 _flags = (flags); STRLEN *_lp = lp; _lp = _lp ? : &PL_na; (!(_flags & SV_GMAGIC) && SvGMAGICAL(_sv)) ? ({ char *_pv; SvGMAGICAL_off(_sv); _pv = sv_pvn_force(_sv, _lp); SvGMAGICAL_on(_sv); _pv; }) : sv_pvn_force(_sv, _lp); })
+#else
+ __UNDEFINED__ sv_2pv_flags(sv, lp, flags) ((PL_Sv = (sv)), (!((flags) & SV_GMAGIC) && SvGMAGICAL(PL_Sv)) ? (SvGMAGICAL_off(PL_Sv), (PL_Xpv = (XPV *)sv_2pv(PL_Sv, (lp) ? (lp) : &PL_na)), SvGMAGICAL_on(PL_Sv), (char *)PL_Xpv) : sv_2pv(PL_Sv, (lp) ? (lp) : &PL_na))
+ __UNDEFINED__ sv_pvn_force_flags(sv, lp, flags) ((PL_Sv = (sv)), (!((flags) & SV_GMAGIC) && SvGMAGICAL(PL_Sv)) ? (SvGMAGICAL_off(PL_Sv), (PL_Xpv = (XPV *)sv_pvn_force(PL_Sv, (lp) ? (lp) : &PL_na)), SvGMAGICAL_on(PL_Sv), (char *)PL_Xpv) : sv_pvn_force(PL_Sv, (lp) ? (lp) : &PL_na))
#endif
#if { VERSION < 5.8.8 } || ( { VERSION >= 5.9.0 } && { VERSION < 5.9.3 } )
@@ -191,12 +156,6 @@ __UNDEFINED__ SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \
(Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
} STMT_END
-=xsinit
-
-#define NEED_sv_2pv_flags
-#define NEED_sv_pvn_force_flags
-#define NEED_sv_2pvbyte
-
=xsubs
IV
@@ -465,70 +424,70 @@ SvPV_renew(sv, nlen, insv)
my $mhx = "mhx";
-ok(&Devel::PPPort::SvPVbyte($mhx), 3);
+is(&Devel::PPPort::SvPVbyte($mhx), 3);
my $i = 42;
-ok(&Devel::PPPort::SvPV_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_const($mhx), $i++);
-ok(&Devel::PPPort::SvPV_mutable($mhx), $i++);
-ok(&Devel::PPPort::SvPV_flags($mhx), $i++);
-ok(&Devel::PPPort::SvPV_flags_const($mhx), $i++);
-
-ok(&Devel::PPPort::SvPV_flags_const_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_flags_mutable($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_mutable($mhx), $i++);
-
-ok(&Devel::PPPort::SvPV_force_nomg($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_flags($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_flags_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_flags_mutable($mhx), $i++);
-
-ok(&Devel::PPPort::SvPV_nolen_const($mhx), $i++);
-ok(&Devel::PPPort::SvPV_nomg($mhx), $i++);
-ok(&Devel::PPPort::SvPV_nomg_const($mhx), $i++);
-ok(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_nomg_nolen($mhx), $i++);
-
-$mhx = 42; ok(&Devel::PPPort::SvPV_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_const($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_mutable($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_flags($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_flags_const($mhx), 2);
-
-$mhx = 42; ok(&Devel::PPPort::SvPV_flags_const_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_flags_mutable($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_mutable($mhx), 2);
-
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_nomg($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags_mutable($mhx), 2);
-
-$mhx = 42; ok(&Devel::PPPort::SvPV_nolen_const($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_nomg($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_const($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_nolen($mhx), 0);
+is(&Devel::PPPort::SvPV_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_const($mhx), $i++);
+is(&Devel::PPPort::SvPV_mutable($mhx), $i++);
+is(&Devel::PPPort::SvPV_flags($mhx), $i++);
+is(&Devel::PPPort::SvPV_flags_const($mhx), $i++);
+
+is(&Devel::PPPort::SvPV_flags_const_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_flags_mutable($mhx), $i++);
+is(&Devel::PPPort::SvPV_force($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_mutable($mhx), $i++);
+
+is(&Devel::PPPort::SvPV_force_nomg($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_flags($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_flags_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_flags_mutable($mhx), $i++);
+
+is(&Devel::PPPort::SvPV_nolen_const($mhx), $i++);
+is(&Devel::PPPort::SvPV_nomg($mhx), $i++);
+is(&Devel::PPPort::SvPV_nomg_const($mhx), $i++);
+is(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_nomg_nolen($mhx), $i++);
+
+$mhx = 42; is(&Devel::PPPort::SvPV_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_const($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_mutable($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_flags($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_flags_const($mhx), 2);
+
+$mhx = 42; is(&Devel::PPPort::SvPV_flags_const_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_flags_mutable($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_force($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_mutable($mhx), 2);
+
+$mhx = 42; is(&Devel::PPPort::SvPV_force_nomg($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_flags($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_flags_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_flags_mutable($mhx), 2);
+
+$mhx = 42; is(&Devel::PPPort::SvPV_nolen_const($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_nomg($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_nomg_const($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_nomg_nolen($mhx), 0);
my $str = "";
&Devel::PPPort::SvPV_force($str);
my($s2, $before, $after) = &Devel::PPPort::SvPV_renew($str, 81, "x"x80);
-ok($str, "x"x80);
-ok($s2, "x"x80);
+is($str, "x"x80);
+is($s2, "x"x80);
ok($before < 81);
-ok($after, 81);
+is($after, 81);
$str = "x"x400;
&Devel::PPPort::SvPV_force($str);
($s2, $before, $after) = &Devel::PPPort::SvPV_renew($str, 41, "x"x40);
-ok($str, "x"x40);
-ok($s2, "x"x40);
+is($str, "x"x40);
+is($s2, "x"x40);
ok($before > 41);
-ok($after, 41);
+is($after, 41);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set
index 30452aee66f..8c3f91b7970 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/Sv_set
@@ -12,9 +12,109 @@
=provides
__UNDEFINED__
+SV_NOSTEAL
+sv_setsv_flags
+newSVsv_nomg
=implementation
+__UNDEFINED__ SV_NOSTEAL 16
+
+#if ( { VERSION >= 5.7.3 } && { VERSION < 5.8.7 } ) || ( { VERSION >= 5.9.0 } && { VERSION < 5.9.2 } )
+#undef sv_setsv_flags
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#define sv_setsv_flags(dstr, sstr, flags) \
+ STMT_START { \
+ if (((flags) & SV_NOSTEAL) && (sstr) && (SvFLAGS((SV *)(sstr)) & SVs_TEMP)) { \
+ SvTEMP_off((SV *)(sstr)); \
+ Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL); \
+ SvTEMP_on((SV *)(sstr)); \
+ } else { \
+ Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL); \
+ } \
+ } STMT_END
+#else
+ ( \
+ (((flags) & SV_NOSTEAL) && (sstr) && (SvFLAGS((SV *)(sstr)) & SVs_TEMP)) ? ( \
+ SvTEMP_off((SV *)(sstr)), \
+ Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL), \
+ SvTEMP_on((SV *)(sstr)), \
+ 1 \
+ ) : ( \
+ Perl_sv_setsv_flags(aTHX_ (dstr), (sstr), (flags) & ~SV_NOSTEAL), \
+ 1 \
+ ) \
+ )
+#endif
+#endif
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+__UNDEFINED__ sv_setsv_flags(dstr, sstr, flags) \
+ STMT_START { \
+ if (((flags) & SV_NOSTEAL) && (sstr) && (SvFLAGS((SV *)(sstr)) & SVs_TEMP)) { \
+ SvTEMP_off((SV *)(sstr)); \
+ if (!((flags) & SV_GMAGIC) && (sstr) && SvGMAGICAL((SV *)(sstr))) { \
+ SvGMAGICAL_off((SV *)(sstr)); \
+ sv_setsv((dstr), (sstr)); \
+ SvGMAGICAL_on((SV *)(sstr)); \
+ } else { \
+ sv_setsv((dstr), (sstr)); \
+ } \
+ SvTEMP_on((SV *)(sstr)); \
+ } else { \
+ if (!((flags) & SV_GMAGIC) && (sstr) && SvGMAGICAL((SV *)(sstr))) { \
+ SvGMAGICAL_off((SV *)(sstr)); \
+ sv_setsv((dstr), (sstr)); \
+ SvGMAGICAL_on((SV *)(sstr)); \
+ } else { \
+ sv_setsv((dstr), (sstr)); \
+ } \
+ } \
+ } STMT_END
+#else
+__UNDEFINED__ sv_setsv_flags(dstr, sstr, flags) \
+ ( \
+ (((flags) & SV_NOSTEAL) && (sstr) && (SvFLAGS((SV *)(sstr)) & SVs_TEMP)) ? ( \
+ SvTEMP_off((SV *)(sstr)), \
+ (!((flags) & SV_GMAGIC) && (sstr) && SvGMAGICAL((SV *)(sstr))) ? ( \
+ SvGMAGICAL_off((SV *)(sstr)), \
+ sv_setsv((dstr), (sstr)), \
+ SvGMAGICAL_on((SV *)(sstr)), \
+ 1 \
+ ) : ( \
+ sv_setsv((dstr), (sstr)), \
+ 1 \
+ ), \
+ SvTEMP_on((SV *)(sstr)), \
+ 1 \
+ ) : ( \
+ (!((flags) & SV_GMAGIC) && (sstr) && SvGMAGICAL((SV *)(sstr))) ? ( \
+ SvGMAGICAL_off((SV *)(sstr)), \
+ sv_setsv((dstr), (sstr)), \
+ SvGMAGICAL_on((SV *)(sstr)), \
+ 1 \
+ ) : ( \
+ sv_setsv((dstr), (sstr)), \
+ 1 \
+ ) \
+ ) \
+ )
+#endif
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+__UNDEFINED__ newSVsv_flags(sv, flags) ({ SV *_sv = newSV(0); sv_setsv_flags(_sv, (sv), (flags)); _sv; })
+#else
+__UNDEFINED__ newSVsv_flags(sv, flags) ((PL_Sv = newSV(0)), sv_setsv_flags(PL_Sv, (sv), (flags)), PL_Sv)
+#endif
+
+__UNDEFINED__ newSVsv_nomg(sv) newSVsv_flags((sv), SV_NOSTEAL)
+
+#if { VERSION >= 5.17.5 }
+__UNDEFINED__ sv_mortalcopy_flags(sv, flags) Perl_sv_mortalcopy_flags(aTHX_ (sv), (flags))
+#else
+__UNDEFINED__ sv_mortalcopy_flags(sv, flags) sv_2mortal(newSVsv_flags((sv), (flags)))
+#endif
+
__UNDEFINED__ SvMAGIC_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
(((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
@@ -94,20 +194,90 @@ TestSvSTASH_set(sv, name)
SvREFCNT_dec(SvSTASH(sv));
SvSTASH_set(sv, (HV*) SvREFCNT_inc(gv_stashpv(name, 0)));
-=tests plan => 5
+IV
+Test_sv_setsv_SV_NOSTEAL()
+ PREINIT:
+ SV *sv1, *sv2;
+ CODE:
+ sv1 = sv_2mortal(newSVpv("test1", 0));
+ sv2 = sv_2mortal(newSVpv("test2", 0));
+ sv_setsv_flags(sv2, sv1, SV_NOSTEAL);
+ RETVAL = (strEQ(SvPV_nolen(sv1), "test1") && strEQ(SvPV_nolen(sv2), "test1"));
+ OUTPUT:
+ RETVAL
+
+SV *
+newSVsv_nomg(sv)
+ SV *sv
+ CODE:
+ RETVAL = newSVsv_nomg(sv);
+ OUTPUT:
+ RETVAL
+
+void
+sv_setsv_compile_test(sv)
+ SV *sv
+ CODE:
+ sv_setsv(sv, NULL);
+ sv_setsv_flags(sv, NULL, 0);
+ sv_setsv_flags(sv, NULL, SV_NOSTEAL);
+
+=tests plan => 15
my $foo = 5;
-ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
-ok(&Devel::PPPort::TestSvPVX_const("mhx"), 43);
-ok(&Devel::PPPort::TestSvPVX_mutable("mhx"), 44);
+is(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
+is(&Devel::PPPort::TestSvPVX_const("mhx"), 43);
+is(&Devel::PPPort::TestSvPVX_mutable("mhx"), 44);
my $bar = [];
bless $bar, 'foo';
-ok($bar->x(), 'foobar');
+is($bar->x(), 'foobar');
Devel::PPPort::TestSvSTASH_set($bar, 'bar');
-ok($bar->x(), 'hacker');
+is($bar->x(), 'hacker');
+
+ if (ivers($]) != ivers(5.7.2)) {
+ ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+ }
+ else {
+ skip("7.2 broken for NOSTEAL", 1);
+ }
+
+ tie my $scalar, 'TieScalarCounter', 'string';
+
+ is tied($scalar)->{fetch}, 0;
+ is tied($scalar)->{store}, 0;
+ my $copy = Devel::PPPort::newSVsv_nomg($scalar);
+ is tied($scalar)->{fetch}, 0;
+ is tied($scalar)->{store}, 0;
+
+ my $fetch = $scalar;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ my $copy2 = Devel::PPPort::newSVsv_nomg($scalar);
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is $copy2, 'string';
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+ my ($class, $value) = @_;
+ return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+ my ($self) = @_;
+ $self->{fetch}++;
+ return $self->{value};
+}
+
+sub STORE {
+ my ($self, $value) = @_;
+ $self->{store}++;
+ $self->{value} = $value;
+}
package foo;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call
index 7c46cbb450a..35258549f82 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/call
@@ -20,6 +20,7 @@ call_method
load_module
vload_module
G_METHOD
+G_RETHROW
=implementation
@@ -28,14 +29,29 @@ __UNDEFINED__ call_sv perl_call_sv
__UNDEFINED__ call_pv perl_call_pv
__UNDEFINED__ call_argv perl_call_argv
__UNDEFINED__ call_method perl_call_method
-
__UNDEFINED__ eval_sv perl_eval_sv
+#if { VERSION >= 5.3.98 } && { VERSION < 5.6.0 }
+__UNDEFINED__ eval_pv perl_eval_pv
+#endif
/* Replace: 0 */
+#if { VERSION < 5.6.0 }
+__UNDEFINED__ Perl_eval_sv perl_eval_sv
+#if { VERSION >= 5.3.98 }
+__UNDEFINED__ Perl_eval_pv perl_eval_pv
+#endif
+#endif
+
__UNDEFINED__ PERL_LOADMOD_DENY 0x1
__UNDEFINED__ PERL_LOADMOD_NOIMPORT 0x2
__UNDEFINED__ PERL_LOADMOD_IMPORT_OPS 0x4
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define D_PPP_CROAK_IF_ERROR(cond) ({ SV *_errsv; ((cond) && (_errsv = ERRSV) && (SvROK(_errsv) || SvTRUE(_errsv)) && (croak_sv(_errsv), 1)); })
+#else
+# define D_PPP_CROAK_IF_ERROR(cond) ((cond) && (SvROK(ERRSV) || SvTRUE(ERRSV)) && (croak_sv(ERRSV), 1))
+#endif
+
#ifndef G_METHOD
# define G_METHOD 64
# ifdef call_sv
@@ -50,13 +66,36 @@ __UNDEFINED__ PERL_LOADMOD_IMPORT_OPS 0x4
# endif
#endif
-/* Replace perl_eval_pv with eval_pv */
+#ifndef G_RETHROW
+# define G_RETHROW 8192
+# ifdef eval_sv
+# undef eval_sv
+# endif
+# if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define eval_sv(sv, flags) ({ I32 _flags = (flags); I32 _ret = Perl_eval_sv(aTHX_ sv, (_flags & ~G_RETHROW)); D_PPP_CROAK_IF_ERROR(_flags & G_RETHROW); _ret; })
+# else
+# define eval_sv(sv, flags) ((PL_na = Perl_eval_sv(aTHX_ sv, ((flags) & ~G_RETHROW))), D_PPP_CROAK_IF_ERROR((flags) & G_RETHROW), (I32)PL_na)
+# endif
+#endif
+/* Older Perl versions have broken croak_on_error=1 */
+#if { VERSION < 5.31.2 }
+# ifdef eval_pv
+# undef eval_pv
+# if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define eval_pv(p, croak_on_error) ({ SV *_sv = Perl_eval_pv(aTHX_ p, 0); D_PPP_CROAK_IF_ERROR(croak_on_error); _sv; })
+# else
+# define eval_pv(p, croak_on_error) ((PL_Sv = Perl_eval_pv(aTHX_ p, 0)), D_PPP_CROAK_IF_ERROR(croak_on_error), PL_Sv)
+# endif
+# endif
+#endif
+
+/* This is backport for Perl 5.3.97d and older which do not provide perl_eval_pv */
#ifndef eval_pv
#if { NEED eval_pv }
SV*
-eval_pv(char *p, I32 croak_on_error)
+eval_pv(const char *p, I32 croak_on_error)
{
dSP;
SV* sv = newSVpv(p, 0);
@@ -69,8 +108,7 @@ eval_pv(char *p, I32 croak_on_error)
sv = POPs;
PUTBACK;
- if (croak_on_error && SvTRUEx(ERRSV))
- croak_sv(ERRSV);
+ D_PPP_CROAK_IF_ERROR(croak_on_error);
return sv;
}
@@ -78,7 +116,7 @@ eval_pv(char *p, I32 croak_on_error)
#endif
#endif
-#ifndef vload_module
+#if ! defined(vload_module) && defined(start_subparse)
#if { NEED vload_module }
void
@@ -121,16 +159,11 @@ vload_module(U32 flags, SV *name, SV *ver, va_list *args)
COP * const ocurcop = PL_curcop;
const int oexpect = PL_expect;
-#if { VERSION >= 5.004 }
utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
- veop, modname, imop);
-#elif { VERSION > 5.003 }
- utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
- veop, modname, imop);
-#else
- utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
- modname, imop);
+#if { VERSION > 5.003 }
+ veop,
#endif
+ modname, imop);
PL_expect = oexpect;
PL_copline = ocopline;
PL_curcop = ocurcop;
@@ -184,6 +217,13 @@ G_DISCARD()
OUTPUT:
RETVAL
+I32
+G_RETHROW()
+ CODE:
+ RETVAL = G_RETHROW;
+ OUTPUT:
+ RETVAL
+
void
eval_sv(sv, flags)
SV* sv
@@ -304,13 +344,7 @@ load_module(flags, name, version, ...)
Perl_load_module(aTHX_ flags, SvREFCNT_inc_simple(name),
SvREFCNT_inc_simple(version), NULL);
-=tests plan => 52
-
-sub eq_array
-{
- my($a, $b) = @_;
- join(':', @$a) eq join(':', @$b);
-}
+=tests plan => 88
sub f
{
@@ -356,9 +390,69 @@ for $test (
ok(eq_array( [ &Devel::PPPort::call_sv_G_METHOD('meth', $flags, $obj, @$args) ], $expected));
};
-ok(&Devel::PPPort::eval_pv('f()', 0), 'y');
-ok(&Devel::PPPort::eval_pv('f(qw(a b c))', 0), 'y');
+is(&Devel::PPPort::eval_pv('f()', 0), 'y');
+is(&Devel::PPPort::eval_pv('f(qw(a b c))', 0), 'y');
-ok(!defined $::{'less::'}, 1, "Hadn't loaded less yet");
+is(!defined $::{'less::'}, 1, "Hadn't loaded less yet");
Devel::PPPort::load_module(0, "less", undef);
-ok(defined $::{'less::'}, 1, "Have now loaded less");
+is(defined $::{'less::'}, 1, "Have now loaded less");
+
+ok(eval { Devel::PPPort::eval_pv('die', 0); 1 });
+ok(!eval { Devel::PPPort::eval_pv('die', 1); 1 });
+ok($@ =~ /^Died at \(eval [0-9]+\) line 1\.\n$/);
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('', 0); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('', 1); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('$@ = "string2"', 0); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('$@ = "string2"', 1); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('$@ = "string2"; die "string3"', 0); 1 });
+ok(!eval { $@ = 'string1'; Devel::PPPort::eval_pv('$@ = "string2"; die "string3"', 1); 1 });
+ok($@ =~ /^string3 at \(eval [0-9]+\) line 1\.\n$/);
+ok(!eval { Devel::PPPort::eval_pv('die False->new', 1); 1 }, 'check false value is rethrown');
+
+if ("$]" >= '5.007003' or ("$]" >= '5.006001' and "$]" < '5.007')) {
+ my $hashref = { key => 'value' };
+ is(eval { Devel::PPPort::eval_pv('die $hashref', 1); 1 }, undef, 'check plain hashref is rethrown');
+ is(ref($@), 'HASH', 'check $@ is hashref') and
+ is($@->{key}, 'value', 'check $@ hashref has correct value');
+
+ my $false = False->new;
+ ok(!$false);
+ is(eval { Devel::PPPort::eval_pv('die $false', 1); 1 }, undef, 'check false objects are rethrown');
+ is(ref($@), 'False', 'check that $@ contains False object');
+ is("$@", "$false", 'check we got the expected object');
+} else {
+ skip 'skip: no support for references in $@', 7;
+}
+
+ok(eval { Devel::PPPort::eval_sv('die', 0); 1 });
+ok(!eval { Devel::PPPort::eval_sv('die', &Devel::PPPort::G_RETHROW); 1 });
+ok($@ =~ /^Died at \(eval [0-9]+\) line 1\.\n$/);
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('', 0); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('', &Devel::PPPort::G_RETHROW); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('$@ = "string2"', 0); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('$@ = "string2"', &Devel::PPPort::G_RETHROW); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('$@ = "string2"; die "string3"', 0); 1 });
+ok(!eval { $@ = 'string1'; Devel::PPPort::eval_sv('$@ = "string2"; die "string3"', &Devel::PPPort::G_RETHROW); 1 });
+ok($@ =~ /^string3 at \(eval [0-9]+\) line 1\.\n$/);
+ok(!eval { Devel::PPPort::eval_sv('die False->new', &Devel::PPPort::G_RETHROW); 1 }, 'check false value is rethrown');
+
+if ("$]" >= '5.007003' or ("$]" >= '5.006001' and "$]" < '5.007')) {
+ my $hashref = { key => 'value' };
+ is(eval { Devel::PPPort::eval_sv('die $hashref', &Devel::PPPort::G_RETHROW); 1 }, undef, 'check plain hashref is rethrown');
+ is(ref($@), 'HASH', 'check $@ is hashref') and
+ is($@->{key}, 'value', 'check $@ hashref has correct value');
+
+ my $false = False->new;
+ ok(!$false);
+ is(eval { Devel::PPPort::eval_sv('die $false', &Devel::PPPort::G_RETHROW); 1 }, undef, 'check false objects are rethrown');
+ is(ref($@), 'False', 'check that $@ contains False object');
+ is("$@", "$false", 'check we got the expected object');
+} else {
+ skip 'skip: no support for references in $@', 7;
+}
+
+{
+ package False;
+ use overload bool => sub { 0 }, '""' => sub { 'Foo' };
+ sub new { bless {}, shift }
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop
index 40d31267c27..c9a92ea3f70 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/cop
@@ -74,7 +74,7 @@ DPPP_dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock)
# if { NEED caller_cx }
const PERL_CONTEXT *
-caller_cx(pTHX_ I32 count, const PERL_CONTEXT **dbcxp)
+caller_cx(pTHX_ I32 level, const PERL_CONTEXT **dbcxp)
{
register I32 cxix = DPPP_dopoptosub_at(cxstack, cxstack_ix);
register const PERL_CONTEXT *cx;
@@ -93,8 +93,8 @@ caller_cx(pTHX_ I32 count, const PERL_CONTEXT **dbcxp)
/* caller() should not report the automatic calls to &DB::sub */
if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 &&
ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub))
- count++;
- if (!count--)
+ level++;
+ if (!level--)
break;
cxix = DPPP_dopoptosub_at(ccstack, cxix - 1);
}
@@ -167,7 +167,7 @@ caller_cx(level)
#endif /* 5.6.0 */
-=tests plan => 28
+=tests plan => 8
my $package;
{
@@ -175,7 +175,7 @@ my $package;
$package = &Devel::PPPort::CopSTASHPV();
}
print "# $package\n";
-ok($package, "MyPackage");
+is($package, "MyPackage");
my $file = &Devel::PPPort::CopFILE();
print "# $file\n";
@@ -183,10 +183,7 @@ ok($file =~ /cop/i);
BEGIN {
if ("$]" < 5.006000) {
- # Skip
- for (1..28) {
- ok(1, 1);
- }
+ skip("Perl version too early", 8);
exit;
}
}
@@ -223,9 +220,6 @@ for (
) {
my ($sub, $arg, @want) = @$_;
my @got = $sub->($arg);
- ok(@got, @want);
- for (0..$#want) {
- ok($got[$_], $want[$_]);
- }
+ ok(eq_array(\@got, \@want));
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception
index 8dd21cc70fa..e4fa8cec5dd 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/exception
@@ -55,14 +55,14 @@ my $rv;
$Devel::PPPort::exception_caught = undef;
$rv = eval { &Devel::PPPort::exception(0) };
-ok($@, '');
+is($@, '');
ok(defined $rv);
-ok($rv, 42);
-ok($Devel::PPPort::exception_caught, 0);
+is($rv, 42);
+is($Devel::PPPort::exception_caught, 0);
$Devel::PPPort::exception_caught = undef;
$rv = eval { &Devel::PPPort::exception(1) };
-ok($@, "boo\n");
+is($@, "boo\n");
ok(not defined $rv);
-ok($Devel::PPPort::exception_caught, 1);
+is($Devel::PPPort::exception_caught, 1);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format
index 03c632d3baa..094076febe0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/format
@@ -55,9 +55,64 @@ croak_NVgf(num)
PPCODE:
Perl_croak(aTHX_ "%.20" NVgf "\n", num);
-=tests plan => 1
+#if { VERSION >= 5.004 }
+
+SV *
+sprintf_iv(iv)
+ IV iv
+CODE:
+ RETVAL = newSVpvf("XX_%" IVdf "_XX", iv);
+OUTPUT:
+ RETVAL
+
+SV *
+sprintf_uv(uv)
+ UV uv
+CODE:
+ RETVAL = newSVpvf("XX_%" UVuf "_XX", uv);
+OUTPUT:
+ RETVAL
+
+SV *
+sprintf_ivmax()
+CODE:
+ RETVAL = newSVpvf("%" IVdf, IV_MAX);
+OUTPUT:
+ RETVAL
+
+SV *
+sprintf_uvmax()
+CODE:
+ RETVAL = newSVpvf("%" UVuf, UV_MAX);
+OUTPUT:
+ RETVAL
+
+#endif
+
+=tests plan => 5
+
+use Config;
+
+if ("$]" < '5.004') {
+ skip 'skip: No newSVpvf support', 5;
+ exit;
+}
my $num = 1.12345678901234567890;
eval { Devel::PPPort::croak_NVgf($num) };
ok($@ =~ /^1.1234567890/);
+
+is(Devel::PPPort::sprintf_iv(-8), 'XX_-8_XX');
+is(Devel::PPPort::sprintf_uv(15), 'XX_15_XX');
+
+my $ivsize = $Config::Config{ivsize};
+if ($ivsize && ($ivsize == 4 || $ivsize == 8)) {
+ my $ivmax = ($ivsize == 4) ? '2147483647' : '9223372036854775807';
+ my $uvmax = ($ivsize == 4) ? '4294967295' : '18446744073709551615';
+ is(Devel::PPPort::sprintf_ivmax(), $ivmax);
+ is(Devel::PPPort::sprintf_uvmax(), $uvmax);
+}
+else {
+ skip 'skip: unknown ivsize', 2;
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok
index 9ca6627f1af..df73008d0b8 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/grok
@@ -657,14 +657,14 @@ Perl_grok_oct(string)
=tests plan => 10
-ok(&Devel::PPPort::grok_number("42"), 42);
+is(&Devel::PPPort::grok_number("42"), 42);
ok(!defined(&Devel::PPPort::grok_number("A")));
-ok(&Devel::PPPort::grok_bin("10000001"), 129);
-ok(&Devel::PPPort::grok_hex("deadbeef"), 0xdeadbeef);
-ok(&Devel::PPPort::grok_oct("377"), 255);
+is(&Devel::PPPort::grok_bin("10000001"), 129);
+is(&Devel::PPPort::grok_hex("deadbeef"), 0xdeadbeef);
+is(&Devel::PPPort::grok_oct("377"), 255);
-ok(&Devel::PPPort::Perl_grok_number("42"), 42);
+is(&Devel::PPPort::Perl_grok_number("42"), 42);
ok(!defined(&Devel::PPPort::Perl_grok_number("A")));
-ok(&Devel::PPPort::Perl_grok_bin("10000001"), 129);
-ok(&Devel::PPPort::Perl_grok_hex("deadbeef"), 0xdeadbeef);
-ok(&Devel::PPPort::Perl_grok_oct("377"), 255);
+is(&Devel::PPPort::Perl_grok_bin("10000001"), 129);
+is(&Devel::PPPort::Perl_grok_hex("deadbeef"), 0xdeadbeef);
+is(&Devel::PPPort::Perl_grok_oct("377"), 255);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv
index d2f526f416f..6f7119a0924 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/gv
@@ -11,24 +11,23 @@
=provides
+GV_NOADD_MASK
gv_fetchpvn_flags
+GvSVn
+isGV_with_GP
+gv_fetchsv
+get_cvn_flags
+gv_init_pvn
=implementation
-#ifndef gv_fetchpvn_flags
-#if { NEED gv_fetchpvn_flags }
-
-GV*
-gv_fetchpvn_flags(pTHX_ const char* name, STRLEN len, int flags, int types) {
- char *namepv = savepvn(name, len);
- GV* stash = gv_fetchpv(namepv, TRUE, SVt_PVHV);
- Safefree(namepv);
- return stash;
-}
-
-#endif
+#if { VERSION >= 5.9.2 } && { VERSION <= 5.9.3 } /* 5.9.2 and 5.9.3 ignore the length param */
+#undef gv_fetchpvn_flags
#endif
+__UNDEFINED__ GV_NOADD_MASK 0xE0
+__UNDEFINED__ gv_fetchpvn_flags(name, len, flags, sv_type) gv_fetchpv(SvPVX(sv_2mortal(newSVpvn((name), (len)))), ((flags) & GV_NOADD_MASK) ? FALSE : TRUE, (I32)(sv_type))
+
__UNDEFINED__ GvSVn(gv) GvSV(gv)
__UNDEFINED__ isGV_with_GP(gv) isGV(gv)
__UNDEFINED__ gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt)
@@ -36,10 +35,6 @@ __UNDEFINED__ gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), fl
__UNDEFINED__ get_cvn_flags(name, namelen, flags) get_cv(name, flags)
__UNDEFINED__ gv_init_pvn(gv, stash, ptr, len, flags) gv_init(gv, stash, ptr, len, flags & GV_ADDMULTI ? TRUE : FALSE)
-=xsinit
-
-#define NEED_gv_fetchpvn_flags
-
=xsubs
int
@@ -92,11 +87,7 @@ get_cvn_flags()
SV*
gv_fetchpvn_flags()
CODE:
-#if { VERSION < 5.9.2 } || { VERSION > 5.9.3 } /* 5.9.2 and 5.9.3 ignore the length param */
RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSIONFAKE", sizeof("Devel::PPPort::VERSIONFAKE")-5, 0, SVt_PV));
-#else
- RETVAL = newRV_inc((SV*)gv_fetchpvn_flags("Devel::PPPort::VERSION", 0, 0, SVt_PV));
-#endif
OUTPUT:
RETVAL
@@ -127,15 +118,15 @@ gv_init_type(namesv, multi, flags)
=tests plan => 7
-ok(Devel::PPPort::GvSVn(), 1);
+is(Devel::PPPort::GvSVn(), 1);
-ok(Devel::PPPort::isGV_with_GP(), 2);
+is(Devel::PPPort::isGV_with_GP(), 2);
-ok(Devel::PPPort::get_cvn_flags(), 3);
+is(Devel::PPPort::get_cvn_flags(), 3);
-ok(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION);
+is(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION);
-ok(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION);
+is(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION);
-ok(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check");
+is(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check");
ok($::{sanity_check});
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/inctools b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/inctools
new file mode 100644
index 00000000000..ba181fa6e7b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/inctools
@@ -0,0 +1,127 @@
+# These are tools that must be included in ppport.h. It doesn't work if given
+# a .pl suffix
+
+sub format_version
+{
+ # Given an input version that is acceptable to parse_version(), return a
+ # string of the standard representation of it.
+
+ my($r,$v,$s) = parse_version(shift);
+
+ if ($r < 5 || ($r == 5 && $v < 6)) {
+ my $ver = sprintf "%d.%03d", $r, $v;
+ $s > 0 and $ver .= sprintf "_%02d", $s;
+
+ return $ver;
+ }
+
+ return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub parse_version
+{
+ # Returns a triplet, (5, major, minor) from the input, treated as a string,
+ # which can be in any of several typical formats.
+
+ my $ver = shift;
+ $ver = "" unless defined $ver;
+
+ my($r,$v,$s);
+
+ if ( ($r, $v, $s) = $ver =~ /^(5)(\d{3})(\d{3})$/ # 5029010, from the file
+ # names in our
+ # parts/base/ and
+ # parts/todo directories
+ or ($r, $v, $s) = $ver =~ /^(\d+)\.(\d+)\.(\d+)$/ # 5.25.7
+ or ($r, $v, $s) = $ver =~ /^(\d+)\.(\d{3})(\d{3})$/ # 5.025008, from the
+ # output of $]
+ or ($r, $v, $s) = $ver =~ /^(\d+)\.(\d{1,3})()$/ # 5.24, 5.004
+ or ($r, $v, $s) = $ver =~ /^(\d+)\.(00[1-5])_?(\d{2})$/ # 5.003_07
+ ) {
+
+ $s = 0 unless $s;
+
+ die "Only Perl 5 is supported '$ver'\n" if $r != 5;
+ die "Invalid version number: $ver\n" if $v >= 1000 || $s >= 1000;
+ return (5, 0 + $v, 0 + $s);
+ }
+
+ # For some safety, don't assume something is a version number if it has a
+ # literal dot as one of the three characters. This will have to be fixed
+ # when we reach 5.46
+ if ($ver !~ /\./ && (($r, $v, $s) = $ver =~ /^(.)(.)(.)$/)) # vstring 5.25.7
+ {
+ $r = ord $r;
+ $v = ord $v;
+ $s = ord $s;
+
+ die "Only Perl 5 is supported '$ver'\n" if $r != 5;
+ return (5, $v, $s);
+ }
+
+ my $mesg = "";
+ $mesg = ". (In 5.00x_yz, x must be 1-5.)" if $ver =~ /_/;
+ die "Invalid version number format: '$ver'$mesg\n";
+}
+
+sub int_parse_version
+{
+ # Returns integer 7 digit human-readable version, suitable for use in file
+ # names in parts/todo parts/base.
+
+ return 0 + join "", map { sprintf("%03d", $_) } parse_version(shift);
+}
+
+sub ivers # Shorter name for int_parse_version
+{
+ return int_parse_version(shift);
+}
+
+sub format_version_line
+{
+ # Returns a floating point representation of the input version
+
+ my $version = int_parse_version(shift);
+ $version =~ s/^5\B/5./;
+ return $version;
+}
+
+sub dictionary_order($$) # Sort caselessly, ignoring punct
+{
+ my ($lc_a, $lc_b);
+ my ($squeezed_a, $squeezed_b);
+ my ($valid_a, $valid_b); # Meaning valid for all releases
+
+ # On early perls, the implicit pass by reference doesn't work, so we have
+ # to use the globals to initialize.
+ if ("$]" < "5.006" ) {
+ $valid_a = $a; $valid_b = $b;
+ }
+ else {
+ ($valid_a, $valid_b) = @_;
+ }
+
+ $lc_a = lc $valid_a;
+ $lc_b = lc $valid_b;
+
+ $squeezed_a = $lc_a;
+ $squeezed_a =~ s/[\W_]//g; # No punct, including no underscore
+ $squeezed_b = $lc_b;
+ $squeezed_b =~ s/[\W_]//g;
+
+ return( $squeezed_a cmp $squeezed_b
+ or $lc_a cmp $lc_b
+ or $valid_a cmp $valid_b);
+}
+
+sub sort_api_lines # Sort lines of the form flags|return|name|args...
+ # by 'name'
+{
+ $a =~ / ^ [^|]* \| [^|]* \| (\w+) /x; # 3rd field '|' is sep
+ my $a_name = $1;
+ $b =~ / ^ [^|]* \| [^|]* \| (\w+) /x;
+ my $b_name = $1;
+ return dictionary_order($a_name, $b_name);
+}
+
+1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/locale b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/locale
new file mode 100644
index 00000000000..699adfdc39c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/locale
@@ -0,0 +1,58 @@
+=provides
+
+__UNDEFINED__
+
+=implementation
+
+
+/* If this doesn't exist, it's not needed, so noop */
+__UNDEFINED__ switch_to_global_locale()
+
+/* Originally, this didn't return a value, but in perls like that, the value
+ * should always be TRUE. Add a return to Perl_sync_locale() when it's
+ * available. And actually do a sync when its not, if locales are available on
+ * this system. */
+#ifdef sync_locale
+# if { VERSION < 5.27.9 }
+# if { VERSION >= 5.21.3 }
+# undef sync_locale
+# define sync_locale() (Perl_sync_locale(aTHX), 1)
+# elif defined(sync_locale) /* These should be the 5.20 maints*/
+# undef sync_locale /* Just copy their defn and return 1 */
+# define sync_locale() (new_ctype(setlocale(LC_CTYPE, NULL)), \
+ new_collate(setlocale(LC_COLLATE, NULL)), \
+ set_numeric_local(), \
+ new_numeric(setlocale(LC_NUMERIC, NULL)), \
+ 1)
+# elif defined(new_ctype) && defined(LC_CTYPE)
+# define sync_locale() (new_ctype(setlocale(LC_CTYPE, NULL)), 1)
+# endif
+# endif
+#endif
+
+__UNDEFINED__ sync_locale() 1
+
+=xsubs
+
+bool
+sync_locale()
+ CODE:
+ RETVAL = sync_locale();
+ OUTPUT:
+ RETVAL
+
+
+=tests plan => 1
+
+use Config;
+
+ # We don't know for sure that we are in the global locale for testing. But
+ # if this is unthreaded, it almost certainly is. But Configure can be called
+ # to force POSIX locales on unthreaded systems. If this becomes a problem
+ # this check could be beefed up.
+ if ($Config{usethreads}) {
+ ok(1);
+}
+else {
+ ok(&Devel::PPPort::sync_locale());
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH
index a17972c7082..d1b6d3e6a2a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mPUSH
@@ -118,14 +118,14 @@ mXPUSHu()
=tests plan => 10
-ok(join(':', &Devel::PPPort::mPUSHs()), "foo:bar:42");
-ok(join(':', &Devel::PPPort::mPUSHp()), "one:two:three");
-ok(join(':', &Devel::PPPort::mPUSHn()), "0.5:-0.25:0.125");
-ok(join(':', &Devel::PPPort::mPUSHi()), "-1:2:-3");
-ok(join(':', &Devel::PPPort::mPUSHu()), "1:2:3");
-
-ok(join(':', &Devel::PPPort::mXPUSHs()), "foo:bar:42");
-ok(join(':', &Devel::PPPort::mXPUSHp()), "one:two:three");
-ok(join(':', &Devel::PPPort::mXPUSHn()), "0.5:-0.25:0.125");
-ok(join(':', &Devel::PPPort::mXPUSHi()), "-1:2:-3");
-ok(join(':', &Devel::PPPort::mXPUSHu()), "1:2:3");
+is(join(':', &Devel::PPPort::mPUSHs()), "foo:bar:42");
+is(join(':', &Devel::PPPort::mPUSHp()), "one:two:three");
+is(join(':', &Devel::PPPort::mPUSHn()), "0.5:-0.25:0.125");
+is(join(':', &Devel::PPPort::mPUSHi()), "-1:2:-3");
+is(join(':', &Devel::PPPort::mPUSHu()), "1:2:3");
+
+is(join(':', &Devel::PPPort::mXPUSHs()), "foo:bar:42");
+is(join(':', &Devel::PPPort::mXPUSHp()), "one:two:three");
+is(join(':', &Devel::PPPort::mXPUSHn()), "0.5:-0.25:0.125");
+is(join(':', &Devel::PPPort::mXPUSHi()), "-1:2:-3");
+is(join(':', &Devel::PPPort::mXPUSHu()), "1:2:3");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic
index cecf3ca63c1..3d3b740fc78 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/magic
@@ -18,6 +18,11 @@ __UNDEFINED__
/sv_\w+_mg/
sv_magic_portable
+SvIV_nomg
+SvUV_nomg
+SvNV_nomg
+SvTRUE_nomg
+
=implementation
__UNDEFINED__ SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
@@ -27,8 +32,22 @@ __UNDEFINED__ sv_catpvn_nomg sv_catpvn
__UNDEFINED__ sv_catsv_nomg sv_catsv
__UNDEFINED__ sv_setsv_nomg sv_setsv
__UNDEFINED__ sv_pvn_nomg sv_pvn
-__UNDEFINED__ SvIV_nomg SvIV
-__UNDEFINED__ SvUV_nomg SvUV
+
+#ifdef SVf_IVisUV
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+__UNDEFINED__ SvIV_nomg(sv) (!SvGMAGICAL((sv)) ? SvIV((sv)) : ({ SV *_sviv = sv_mortalcopy_flags((sv), SV_NOSTEAL); IV _iv = SvIV(_sviv); SvFLAGS((sv)) = (SvFLAGS((sv)) & ~SVf_IVisUV) | (SvFLAGS(_sviv) & SVf_IVisUV); _iv; }))
+__UNDEFINED__ SvUV_nomg(sv) (!SvGMAGICAL((sv)) ? SvUV((sv)) : ({ SV *_svuv = sv_mortalcopy_flags((sv), SV_NOSTEAL); UV _uv = SvUV(_svuv); SvFLAGS((sv)) = (SvFLAGS((sv)) & ~SVf_IVisUV) | (SvFLAGS(_svuv) & SVf_IVisUV); _uv; }))
+#else
+__UNDEFINED__ SvIV_nomg(sv) (!SvGMAGICAL((sv)) ? SvIV((sv)) : ((PL_Sv = sv_mortalcopy_flags((sv), SV_NOSTEAL)), sv_upgrade(PL_Sv, SVt_PVIV), (SvIVX(PL_Sv) = SvIV(PL_Sv)), (SvFLAGS((sv)) = (SvFLAGS((sv)) & ~SVf_IVisUV) | (SvFLAGS(PL_Sv) & SVf_IVisUV)), SvIVX(PL_Sv)))
+__UNDEFINED__ SvUV_nomg(sv) (!SvGMAGICAL((sv)) ? SvIV((sv)) : ((PL_Sv = sv_mortalcopy_flags((sv), SV_NOSTEAL)), sv_upgrade(PL_Sv, SVt_PVIV), (SvUVX(PL_Sv) = SvUV(PL_Sv)), (SvFLAGS((sv)) = (SvFLAGS((sv)) & ~SVf_IVisUV) | (SvFLAGS(PL_Sv) & SVf_IVisUV)), SvUVX(PL_Sv)))
+#endif
+#else
+__UNDEFINED__ SvIV_nomg(sv) (!SvGMAGICAL((sv)) ? SvIV((sv)) : SvIVx(sv_mortalcopy_flags((sv), SV_NOSTEAL)))
+__UNDEFINED__ SvUV_nomg(sv) (!SvGMAGICAL((sv)) ? SvUV((sv)) : SvUVx(sv_mortalcopy_flags((sv), SV_NOSTEAL)))
+#endif
+
+__UNDEFINED__ SvNV_nomg(sv) (!SvGMAGICAL((sv)) ? SvNV((sv)) : SvNVx(sv_mortalcopy_flags((sv), SV_NOSTEAL)))
+__UNDEFINED__ SvTRUE_nomg(sv) (!SvGMAGICAL((sv)) ? SvTRUE((sv)) : SvTRUEx(sv_mortalcopy_flags((sv), SV_NOSTEAL)))
#ifndef sv_catpv_mg
# define sv_catpv_mg(sv, ptr) \
@@ -167,7 +186,7 @@ __UNDEFINED__ SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring
#if { NEED mg_findext }
MAGIC *
-mg_findext(SV * sv, int type, const MGVTBL *vtbl) {
+mg_findext(const SV * sv, int type, const MGVTBL *vtbl) {
if (sv) {
MAGIC *mg;
@@ -481,31 +500,110 @@ sv_magic_portable(sv)
OUTPUT:
RETVAL
-=tests plan => 23
+UV
+above_IV_MAX()
+ CODE:
+ RETVAL = (UV)IV_MAX+100;
+ OUTPUT:
+ RETVAL
+
+#ifdef SVf_IVisUV
+
+U32
+SVf_IVisUV(sv)
+ SV *sv
+ CODE:
+ RETVAL = (SvFLAGS(sv) & SVf_IVisUV);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef SvIV_nomg
+
+IV
+magic_SvIV_nomg(sv)
+ SV *sv
+ CODE:
+ RETVAL = SvIV_nomg(sv);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef SvUV_nomg
+
+UV
+magic_SvUV_nomg(sv)
+ SV *sv
+ CODE:
+ RETVAL = SvUV_nomg(sv);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef SvNV_nomg
+
+NV
+magic_SvNV_nomg(sv)
+ SV *sv
+ CODE:
+ RETVAL = SvNV_nomg(sv);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef SvTRUE_nomg
+
+bool
+magic_SvTRUE_nomg(sv)
+ SV *sv
+ CODE:
+ RETVAL = SvTRUE_nomg(sv);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef SvPV_nomg_nolen
+
+char *
+magic_SvPV_nomg_nolen(sv)
+ SV *sv
+ CODE:
+ RETVAL = SvPV_nomg_nolen(sv);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+=tests plan => 63
# Find proper magic
ok(my $obj1 = Devel::PPPort->new_with_mg());
-ok(Devel::PPPort::as_string($obj1), 'hello');
+is(Devel::PPPort::as_string($obj1), 'hello');
# Find with no magic
my $obj = bless {}, 'Fake::Class';
-ok(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
+is(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
# Find with other magic (not the magic we are looking for)
ok($obj = Devel::PPPort->new_with_other_mg());
-ok(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
+is(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
# Okay, attempt to remove magic that isn't there
Devel::PPPort::remove_other_magic($obj1);
-ok(Devel::PPPort::as_string($obj1), 'hello');
+is(Devel::PPPort::as_string($obj1), 'hello');
# Remove magic that IS there
Devel::PPPort::remove_null_magic($obj1);
-ok(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
+is(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
# Removing when no magic present
Devel::PPPort::remove_null_magic($obj1);
-ok(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
+is(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
use Tie::Hash;
my %h;
@@ -514,34 +612,34 @@ $h{foo} = 'foo';
$h{bar} = '';
&Devel::PPPort::sv_catpv_mg($h{foo}, 'bar');
-ok($h{foo}, 'foobar');
+is($h{foo}, 'foobar');
&Devel::PPPort::sv_catpvn_mg($h{bar}, 'baz');
-ok($h{bar}, 'baz');
+is($h{bar}, 'baz');
&Devel::PPPort::sv_catsv_mg($h{foo}, '42');
-ok($h{foo}, 'foobar42');
+is($h{foo}, 'foobar42');
&Devel::PPPort::sv_setiv_mg($h{bar}, 42);
-ok($h{bar}, 42);
+is($h{bar}, 42);
&Devel::PPPort::sv_setnv_mg($h{PI}, 3.14159);
ok(abs($h{PI} - 3.14159) < 0.01);
&Devel::PPPort::sv_setpv_mg($h{mhx}, 'mhx');
-ok($h{mhx}, 'mhx');
+is($h{mhx}, 'mhx');
&Devel::PPPort::sv_setpvn_mg($h{mhx}, 'Marcus');
-ok($h{mhx}, 'Marcus');
+is($h{mhx}, 'Marcus');
&Devel::PPPort::sv_setsv_mg($h{sv}, 'SV');
-ok($h{sv}, 'SV');
+is($h{sv}, 'SV');
&Devel::PPPort::sv_setuv_mg($h{sv}, 4711);
-ok($h{sv}, 4711);
+is($h{sv}, 4711);
&Devel::PPPort::sv_usepvn_mg($h{sv}, 'Perl');
-ok($h{sv}, 'Perl');
+is($h{sv}, 'Perl');
# v1 is treated as a bareword in older perls...
my $ver = do { local $SIG{'__WARN__'} = sub {}; eval qq[v1.2.0] };
@@ -552,3 +650,108 @@ ok(!Devel::PPPort::SvVSTRING_mg(4711));
my $foo = 'bar';
ok(Devel::PPPort::sv_magic_portable($foo));
ok($foo eq 'bar');
+
+ tie my $scalar, 'TieScalarCounter', 10;
+ my $fetch = $scalar;
+
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is Devel::PPPort::magic_SvIV_nomg($scalar), 10;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is Devel::PPPort::magic_SvUV_nomg($scalar), 10;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is Devel::PPPort::magic_SvNV_nomg($scalar), 10;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is Devel::PPPort::magic_SvPV_nomg_nolen($scalar), 10;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ ok Devel::PPPort::magic_SvTRUE_nomg($scalar);
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+
+ my $object = OverloadedObject->new('string', 5.5, 0);
+
+ is Devel::PPPort::magic_SvIV_nomg($object), 5;
+ is Devel::PPPort::magic_SvUV_nomg($object), 5;
+ is Devel::PPPort::magic_SvNV_nomg($object), 5.5;
+ is Devel::PPPort::magic_SvPV_nomg_nolen($object), 'string';
+ ok !Devel::PPPort::magic_SvTRUE_nomg($object);
+
+tie my $negative, 'TieScalarCounter', -1;
+$fetch = $negative;
+
+is tied($negative)->{fetch}, 1;
+is tied($negative)->{store}, 0;
+is Devel::PPPort::magic_SvIV_nomg($negative), -1;
+if (ivers($]) >= ivers(5.6)) {
+ ok !Devel::PPPort::SVf_IVisUV($negative);
+} else {
+ skip 'SVf_IVisUV is unsupported', 1;
+}
+is tied($negative)->{fetch}, 1;
+is tied($negative)->{store}, 0;
+Devel::PPPort::magic_SvUV_nomg($negative);
+if (ivers($]) >= ivers(5.6)) {
+ ok !Devel::PPPort::SVf_IVisUV($negative);
+} else {
+ skip 'SVf_IVisUV is unsupported', 1;
+}
+is tied($negative)->{fetch}, 1;
+is tied($negative)->{store}, 0;
+
+tie my $big, 'TieScalarCounter', Devel::PPPort::above_IV_MAX();
+$fetch = $big;
+
+is tied($big)->{fetch}, 1;
+is tied($big)->{store}, 0;
+Devel::PPPort::magic_SvIV_nomg($big);
+if (ivers($]) >= ivers(5.6)) {
+ ok Devel::PPPort::SVf_IVisUV($big);
+} else {
+ skip 'SVf_IVisUV is unsupported', 1;
+}
+is tied($big)->{fetch}, 1;
+is tied($big)->{store}, 0;
+is Devel::PPPort::magic_SvUV_nomg($big), Devel::PPPort::above_IV_MAX();
+if (ivers($]) >= ivers(5.6)) {
+ ok Devel::PPPort::SVf_IVisUV($big);
+} else {
+ skip 'SVf_IVisUV is unsupported', 1;
+}
+is tied($big)->{fetch}, 1;
+is tied($big)->{store}, 0;
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+ my ($class, $value) = @_;
+ return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+ my ($self) = @_;
+ $self->{fetch}++;
+ return $self->{value};
+}
+
+sub STORE {
+ my ($self, $value) = @_;
+ $self->{store}++;
+ $self->{value} = $value;
+}
+
+package OverloadedObject;
+
+sub new {
+ my ($class, $str, $num, $bool) = @_;
+ return bless { str => $str, num => $num, bool => $bool }, $class;
+}
+
+use overload
+ '""' => sub { $_[0]->{str} },
+ '0+' => sub { $_[0]->{num} },
+ 'bool' => sub { $_[0]->{bool} },
+ ;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory
index 9a5425e39ed..aa102e22e6d 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/memory
@@ -27,6 +27,8 @@ __UNDEFINED__ memEQs(s1, l, s2) \
(sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1)))
__UNDEFINED__ memNEs(s1, l, s2) !memEQs(s1, l, s2)
+__UNDEFINED__ memCHRs(s, c) ((const char *) memchr("" s "" , c, sizeof(s)-1))
+
__UNDEFINED__ MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t))
__UNDEFINED__ CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
#ifdef HAS_MEMSET
@@ -82,4 +84,4 @@ checkmem()
=tests plan => 1
-ok(Devel::PPPort::checkmem(), 6);
+is(Devel::PPPort::checkmem(), 6);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess
index e9af1740aba..14c7def17a9 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/mess
@@ -28,8 +28,6 @@ Perl_croak_no_modify
croak_memory_wrap
croak_xs_usage
-PERL_ARGS_ASSERT_CROAK_XS_USAGE
-
=dontwarn
NEED_mess
@@ -50,24 +48,25 @@ NEED_vmess
#ifndef croak_sv
#if { VERSION >= 5.7.3 } || ( { VERSION >= 5.6.1 } && { VERSION < 5.7.0 } )
# if ( { VERSION >= 5.8.0 } && { VERSION < 5.8.9 } ) || ( { VERSION >= 5.9.0 } && { VERSION < 5.10.1 } )
-# define D_PPP_FIX_UTF8_ERRSV(errsv, sv) \
- STMT_START { \
- if (sv != errsv) \
- SvFLAGS(errsv) = (SvFLAGS(errsv) & ~SVf_UTF8) | \
- (SvFLAGS(sv) & SVf_UTF8); \
+# define D_PPP_FIX_UTF8_ERRSV_FOR_SV(sv) \
+ STMT_START { \
+ SV *_errsv = ERRSV; \
+ SvFLAGS(_errsv) = (SvFLAGS(_errsv) & ~SVf_UTF8) | \
+ (SvFLAGS(sv) & SVf_UTF8); \
} STMT_END
# else
-# define D_PPP_FIX_UTF8_ERRSV(errsv, sv) STMT_START {} STMT_END
+# define D_PPP_FIX_UTF8_ERRSV_FOR_SV(sv) STMT_START {} STMT_END
# endif
-# define croak_sv(sv) \
- STMT_START { \
- if (SvROK(sv)) { \
- sv_setsv(ERRSV, sv); \
- croak(NULL); \
- } else { \
- D_PPP_FIX_UTF8_ERRSV(ERRSV, sv); \
- croak("%" SVf, SVfARG(sv)); \
- } \
+# define croak_sv(sv) \
+ STMT_START { \
+ SV *_sv = (sv); \
+ if (SvROK(_sv)) { \
+ sv_setsv(ERRSV, _sv); \
+ croak(NULL); \
+ } else { \
+ D_PPP_FIX_UTF8_ERRSV_FOR_SV(_sv); \
+ croak("%" SVf, SVfARG(_sv)); \
+ } \
} STMT_END
#elif { VERSION >= 5.4.0 }
# define croak_sv(sv) croak("%" SVf, SVfARG(sv))
@@ -79,9 +78,9 @@ NEED_vmess
#ifndef die_sv
#if { NEED die_sv }
OP *
-die_sv(pTHX_ SV *sv)
+die_sv(pTHX_ SV *baseex)
{
- croak_sv(sv);
+ croak_sv(baseex);
return (OP *)NULL;
}
#endif
@@ -95,22 +94,23 @@ die_sv(pTHX_ SV *sv)
#endif
#endif
-#ifndef vmess
-#if { NEED vmess }
+#if ! defined vmess && { VERSION >= 5.4.0 }
+# if { NEED vmess }
+
SV*
vmess(pTHX_ const char* pat, va_list* args)
{
mess(pat, args);
return PL_mess_sv;
}
-#endif
+# endif
#endif
-#if { VERSION < 5.6.0 }
+#if { VERSION < 5.6.0 } && { VERSION >= 5.4.0 }
#undef mess
#endif
-#if !defined(mess_nocontext) && !defined(Perl_mess_nocontext)
+#if !defined(mess_nocontext) && !defined(Perl_mess_nocontext) && { VERSION >= 5.4.0 }
#if { NEED mess_nocontext }
SV*
mess_nocontext(const char* pat, ...)
@@ -146,7 +146,7 @@ mess(pTHX_ const char* pat, ...)
#endif
#endif
-#ifndef mess_sv
+#if ! defined mess_sv && { VERSION >= 5.4.0 }
#if { NEED mess_sv }
SV *
mess_sv(pTHX_ SV *basemsg, bool consume)
@@ -201,9 +201,6 @@ mess_sv(pTHX_ SV *basemsg, bool consume)
#ifndef croak_xs_usage
#if { NEED croak_xs_usage }
-#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
-#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
-#endif
void
croak_xs_usage(const CV *const cv, const char *const params)
@@ -211,7 +208,11 @@ croak_xs_usage(const CV *const cv, const char *const params)
dTHX;
const GV *const gv = CvGV(cv);
+#ifdef PERL_ARGS_ASSERT_CROAK_XS_USAGE
PERL_ARGS_ASSERT_CROAK_XS_USAGE;
+#else
+ assert(cv); assert(params);
+#endif
if (gv) {
const char *const gvname = GvNAME(gv);
@@ -236,6 +237,12 @@ croak_xs_usage(const CV *const cv, const char *const params)
#define NEED_mess_sv
#define NEED_croak_xs_usage
+=xsmisc
+
+static IV counter;
+static void reset_counter(void) { counter = 0; }
+static void inc_counter(void) { counter++; }
+
=xsubs
void
@@ -245,6 +252,25 @@ CODE:
croak_sv(sv);
void
+croak_sv_errsv()
+CODE:
+ croak_sv(ERRSV);
+
+void
+croak_sv_with_counter(sv)
+ SV *sv
+CODE:
+ reset_counter();
+ croak_sv((inc_counter(), sv));
+
+IV
+get_counter()
+CODE:
+ RETVAL = counter;
+OUTPUT:
+ RETVAL
+
+void
die_sv(sv)
SV *sv
CODE:
@@ -256,6 +282,8 @@ warn_sv(sv)
CODE:
warn_sv(sv);
+#if { VERSION >= 5.4.0 }
+
SV *
mess_sv(sv, consume)
SV *sv
@@ -265,6 +293,8 @@ CODE:
OUTPUT:
RETVAL
+#endif
+
void
croak_no_modify()
CODE:
@@ -281,9 +311,9 @@ croak_xs_usage(params)
CODE:
croak_xs_usage(cv, params);
-=tests plan => 93
+=tests plan => 102
-BEGIN { if ($] lt '5.006') { $^W = 0; } }
+BEGIN { if ("$]" < '5.006') { $^W = 0; } }
my $warn;
my $die;
@@ -297,13 +327,13 @@ my $obj = bless {}, 'Package';
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\xE1\n") };
-ok $@, "\xE1\n";
-ok $die, "\xE1\n";
+is $@, "\xE1\n";
+is $die, "\xE1\n";
undef $die;
ok !defined eval { Devel::PPPort::croak_sv(10) };
-ok $@ =~ /^10 at $0 line /;
-ok $die =~ /^10 at $0 line /;
+ok $@ =~ /^10 at \Q$0\E line /;
+ok $die =~ /^10 at \Q$0\E line /;
undef $die;
$@ = 'should not be visible (1)';
@@ -311,8 +341,8 @@ ok !defined eval {
$@ = 'should not be visible (2)';
Devel::PPPort::croak_sv('');
};
-ok $@ =~ /^ at $0 line /;
-ok $die =~ /^ at $0 line /;
+ok $@ =~ /^ at \Q$0\E line /;
+ok $die =~ /^ at \Q$0\E line /;
undef $die;
$@ = 'should not be visible';
@@ -320,8 +350,8 @@ ok !defined eval {
$@ = 'this must be visible';
Devel::PPPort::croak_sv($@)
};
-ok $@ =~ /^this must be visible at $0 line /;
-ok $die =~ /^this must be visible at $0 line /;
+ok $@ =~ /^this must be visible at \Q$0\E line /;
+ok $die =~ /^this must be visible at \Q$0\E line /;
undef $die;
$@ = 'should not be visible';
@@ -329,125 +359,159 @@ ok !defined eval {
$@ = "this must be visible\n";
Devel::PPPort::croak_sv($@)
};
-ok $@, "this must be visible\n";
-ok $die, "this must be visible\n";
+is $@, "this must be visible\n";
+is $die, "this must be visible\n";
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+ $@ = 'this must be visible';
+ Devel::PPPort::croak_sv_errsv()
+};
+ok $@ =~ /^this must be visible at \Q$0\E line /;
+ok $die =~ /^this must be visible at \Q$0\E line /;
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+ $@ = "this must be visible\n";
+ Devel::PPPort::croak_sv_errsv()
+};
+is $@, "this must be visible\n";
+is $die, "this must be visible\n";
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv_with_counter("message\n") };
+is $@, "message\n";
+is Devel::PPPort::get_counter(), 1;
undef $die;
ok !defined eval { Devel::PPPort::croak_sv('') };
-ok $@ =~ /^ at $0 line /;
-ok $die =~ /^ at $0 line /;
+ok $@ =~ /^ at \Q$0\E line /;
+ok $die =~ /^ at \Q$0\E line /;
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\xE1") };
-ok $@ =~ /^\xE1 at $0 line /;
-ok $die =~ /^\xE1 at $0 line /;
+ok $@ =~ /^\xE1 at \Q$0\E line /;
+ok $die =~ /^\xE1 at \Q$0\E line /;
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1") };
-ok $@ =~ /^\xC3\xA1 at $0 line /;
-ok $die =~ /^\xC3\xA1 at $0 line /;
+ok $@ =~ /^\xC3\xA1 at \Q$0\E line /;
+ok $die =~ /^\xC3\xA1 at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv("\xE1\n");
-ok $warn, "\xE1\n";
+is $warn, "\xE1\n";
undef $warn;
Devel::PPPort::warn_sv(10);
-ok $warn =~ /^10 at $0 line /;
+ok $warn =~ /^10 at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv('');
-ok $warn =~ /^ at $0 line /;
+ok $warn =~ /^ at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv("\xE1");
-ok $warn =~ /^\xE1 at $0 line /;
+ok $warn =~ /^\xE1 at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv("\xC3\xA1");
-ok $warn =~ /^\xC3\xA1 at $0 line /;
+ok $warn =~ /^\xC3\xA1 at \Q$0\E line /;
-ok Devel::PPPort::mess_sv("\xE1\n", 0), "\xE1\n";
-ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1\n"}, 1), "\xE1\n";
+is Devel::PPPort::mess_sv("\xE1\n", 0), "\xE1\n";
+is Devel::PPPort::mess_sv(do {my $tmp = "\xE1\n"}, 1), "\xE1\n";
-ok Devel::PPPort::mess_sv(10, 0) =~ /^10 at $0 line /;
-ok Devel::PPPort::mess_sv(do {my $tmp = 10}, 1) =~ /^10 at $0 line /;
+ok Devel::PPPort::mess_sv(10, 0) =~ /^10 at \Q$0\E line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = 10}, 1) =~ /^10 at \Q$0\E line /;
-ok Devel::PPPort::mess_sv('', 0) =~ /^ at $0 line /;
-ok Devel::PPPort::mess_sv(do {my $tmp = ''}, 1) =~ /^ at $0 line /;
+ok Devel::PPPort::mess_sv('', 0) =~ /^ at \Q$0\E line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = ''}, 1) =~ /^ at \Q$0\E line /;
-ok Devel::PPPort::mess_sv("\xE1", 0) =~ /^\xE1 at $0 line /;
-ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1"}, 1) =~ /^\xE1 at $0 line /;
+ok Devel::PPPort::mess_sv("\xE1", 0) =~ /^\xE1 at \Q$0\E line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1"}, 1) =~ /^\xE1 at \Q$0\E line /;
-ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ /^\xC3\xA1 at $0 line /;
-ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ /^\xC3\xA1 at $0 line /;
+ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ /^\xC3\xA1 at \Q$0\E line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ /^\xC3\xA1 at \Q$0\E line /;
-if ($] ge '5.006') {
- BEGIN { if ($] ge '5.006' && $] lt '5.008') { require utf8; utf8->import(); } }
+if ("$]" >= '5.006') {
+ BEGIN { if ("$]" >= '5.006' && "$]" < '5.008') { require utf8; utf8->import(); } }
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\x{100}\n") };
- ok $@, "\x{100}\n";
- if ($] ne '5.008') {
- ok $die, "\x{100}\n";
+ if ("$]" < '5.007001' || "$]" > '5.007003') {
+ is $@, "\x{100}\n";
+ } else {
+ skip 'skip: broken utf8 support in die hook', 1;
+ }
+ if ("$]" < '5.007001' || "$]" > '5.008') {
+ is $die, "\x{100}\n";
} else {
- skip 'skip: broken utf8 support in die hook', 0;
+ skip 'skip: broken utf8 support in die hook', 1;
}
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\x{100}") };
- ok $@ =~ /^\x{100} at $0 line /;
- if ($] ne '5.008') {
- ok $die =~ /^\x{100} at $0 line /;
+ if ("$]" < '5.007001' || "$]" > '5.007003') {
+ ok $@ =~ /^\x{100} at \Q$0\E line /;
} else {
- skip 'skip: broken utf8 support in die hook', 0;
+ skip 'skip: broken utf8 support in die hook', 1;
+ }
+ if ("$]" < '5.007001' || "$]" > '5.008') {
+ ok $die =~ /^\x{100} at \Q$0\E line /;
+ } else {
+ skip 'skip: broken utf8 support in die hook', 1;
}
- if ($] ne '5.008') {
+ if ("$]" < '5.007001' || "$]" > '5.008') {
undef $warn;
Devel::PPPort::warn_sv("\x{100}\n");
- ok $warn, "\x{100}\n";
+ is $warn, "\x{100}\n";
undef $warn;
Devel::PPPort::warn_sv("\x{100}");
- ok (my $tmp = $warn) =~ /^\x{100} at $0 line /;
+ ok (my $tmp = $warn) =~ /^\x{100} at \Q$0\E line /;
} else {
- skip 'skip: broken utf8 support in warn hook', 0 for 1..2;
+ skip 'skip: broken utf8 support in warn hook', 2;
}
- ok Devel::PPPort::mess_sv("\x{100}\n", 0), "\x{100}\n";
- ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}\n"}, 1), "\x{100}\n";
+ is Devel::PPPort::mess_sv("\x{100}\n", 0), "\x{100}\n";
+ is Devel::PPPort::mess_sv(do {my $tmp = "\x{100}\n"}, 1), "\x{100}\n";
- ok Devel::PPPort::mess_sv("\x{100}", 0) =~ /^\x{100} at $0 line /;
- ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}"}, 1) =~ /^\x{100} at $0 line /;
+ ok Devel::PPPort::mess_sv("\x{100}", 0) =~ /^\x{100} at \Q$0\E line /;
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}"}, 1) =~ /^\x{100} at \Q$0\E line /;
} else {
- skip 'skip: no utf8 support', 0 for 1..12;
+ skip 'skip: no utf8 support', 12;
}
if (ord('A') != 65) {
- skip 'skip: no ASCII support', 0 for 1..24;
-} elsif ($] ge '5.008' && $] ne '5.012000') {
+ skip 'skip: no ASCII support', 24;
+} elsif ( "$]" >= '5.008'
+ && "$]" != '5.013000' # Broken in these ranges
+ && ! ("$]" >= '5.011005' && "$]" <= '5.012000'))
+{
undef $die;
ok !defined eval { Devel::PPPort::croak_sv(eval '"\N{U+E1}\n"') };
- ok $@, "\xE1\n";
- ok $die, "\xE1\n";
+ is $@, "\xE1\n";
+ is $die, "\xE1\n";
undef $die;
ok !defined eval { Devel::PPPort::croak_sv(eval '"\N{U+E1}"') };
- ok $@ =~ /^\xE1 at $0 line /;
- ok $die =~ /^\xE1 at $0 line /;
+ ok $@ =~ /^\xE1 at \Q$0\E line /;
+ ok $die =~ /^\xE1 at \Q$0\E line /;
{
undef $die;
my $expect = eval '"\N{U+C3}\N{U+A1}\n"';
ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1\n") };
- ok $@, $expect;
- ok $die, $expect;
+ is $@, $expect;
+ is $die, $expect;
}
{
undef $die;
- my $expect = eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ my $expect = eval 'qr/^\N{U+C3}\N{U+A1} at \Q$0\E line /';
ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1") };
ok $@ =~ $expect;
ok $die =~ $expect;
@@ -455,36 +519,41 @@ if (ord('A') != 65) {
undef $warn;
Devel::PPPort::warn_sv(eval '"\N{U+E1}\n"');
- ok $warn, "\xE1\n";
+ is $warn, "\xE1\n";
undef $warn;
Devel::PPPort::warn_sv(eval '"\N{U+E1}"');
- ok $warn =~ /^\xE1 at $0 line /;
+ ok $warn =~ /^\xE1 at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv("\xC3\xA1\n");
- ok $warn, eval '"\N{U+C3}\N{U+A1}\n"';
+ is $warn, eval '"\N{U+C3}\N{U+A1}\n"';
undef $warn;
Devel::PPPort::warn_sv("\xC3\xA1");
- ok $warn =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ ok $warn =~ eval 'qr/^\N{U+C3}\N{U+A1} at \Q$0\E line /';
- ok Devel::PPPort::mess_sv(eval('"\N{U+E1}\n"'), 0), eval '"\N{U+E1}\n"';
- ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}\n"'}, 1), eval '"\N{U+E1}\n"';
+ if ("$]" < '5.004') {
+ skip 'skip: no support for mess_sv', 8;
+ }
+ else {
+ is Devel::PPPort::mess_sv(eval('"\N{U+E1}\n"'), 0), eval '"\N{U+E1}\n"';
+ is Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}\n"'}, 1), eval '"\N{U+E1}\n"';
- ok Devel::PPPort::mess_sv(eval('"\N{U+E1}"'), 0) =~ eval 'qr/^\N{U+E1} at $0 line /';
- ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}"'}, 1) =~ eval 'qr/^\N{U+E1} at $0 line /';
+ ok Devel::PPPort::mess_sv(eval('"\N{U+E1}"'), 0) =~ eval 'qr/^\N{U+E1} at \Q$0\E line /';
+ ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}"'}, 1) =~ eval 'qr/^\N{U+E1} at \Q$0\E line /';
- ok Devel::PPPort::mess_sv("\xC3\xA1\n", 0), eval '"\N{U+C3}\N{U+A1}\n"';
- ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1\n"}, 1), eval '"\N{U+C3}\N{U+A1}\n"';
+ is Devel::PPPort::mess_sv("\xC3\xA1\n", 0), eval '"\N{U+C3}\N{U+A1}\n"';
+ is Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1\n"}, 1), eval '"\N{U+C3}\N{U+A1}\n"';
- ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
- ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ eval 'qr/^\N{U+C3}\N{U+A1} at \Q$0\E line /';
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ eval 'qr/^\N{U+C3}\N{U+A1} at \Q$0\E line /';
+ }
} else {
- skip 'skip: no support for \N{U+..} syntax', 0 for 1..24;
+ skip 'skip: no support for \N{U+..} syntax', 24;
}
-if ($] ge '5.007003' or ($] ge '5.006001' and $] lt '5.007')) {
+if ("$]" >= '5.007003' or ("$]" >= '5.006001' and "$]" < '5.007')) {
undef $die;
ok !defined eval { Devel::PPPort::croak_sv($scalar_ref) };
ok $@ == $scalar_ref;
@@ -505,14 +574,14 @@ if ($] ge '5.007003' or ($] ge '5.006001' and $] lt '5.007')) {
ok $@ == $obj;
ok $die == $obj;
} else {
- skip 'skip: no support for exceptions', 0 for 1..12;
+ skip 'skip: no support for exceptions', 12;
}
ok !defined eval { Devel::PPPort::croak_no_modify() };
-ok $@ =~ /^Modification of a read-only value attempted at $0 line /;
+ok $@ =~ /^Modification of a read-only value attempted at \Q$0\E line /;
ok !defined eval { Devel::PPPort::croak_memory_wrap() };
-ok $@ =~ /^panic: memory wrap at $0 line /;
+ok $@ =~ /^panic: memory wrap at \Q$0\E line /;
ok !defined eval { Devel::PPPort::croak_xs_usage("params") };
-ok $@ =~ /^Usage: Devel::PPPort::croak_xs_usage\(params\) at $0 line /;
+ok $@ =~ /^Usage: Devel::PPPort::croak_xs_usage\(params\) at \Q$0\E line /;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc
index 2bd2dcfb028..deb1fb87a63 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/misc
@@ -17,7 +17,6 @@ EXTERN_C
INT2PTR
MUTABLE_PTR
NVTYPE
-PERL_GCC_BRACE_GROUPS_FORBIDDEN
PERLIO_FUNCS_CAST
PERLIO_FUNCS_DECL
PERL_UNUSED_ARG
@@ -32,7 +31,6 @@ START_EXTERN_C
STMT_END
STMT_START
SvRX
-UTF8_MAXBYTES
WIDEST_UTYPE
XSRETURN
@@ -52,26 +50,83 @@ __UNDEFINED__ __ASSERT_(statement) assert(statement),
__UNDEFINED__ __ASSERT_(statement)
#endif
-#ifndef SvRX
-#if { NEED SvRX }
-
-void *
-SvRX(pTHX_ SV *rv)
-{
- if (SvROK(rv)) {
- SV *sv = SvRV(rv);
- if (SvMAGICAL(sv)) {
- MAGIC *mg = mg_find(sv, PERL_MAGIC_qr);
- if (mg && mg->mg_obj) {
- return mg->mg_obj;
- }
- }
- }
- return 0;
-}
-#endif
-#endif
-
+/* These could become provided if/when they become part of the public API */
+__UNDEF_NOT_PROVIDED__ withinCOUNT(c, l, n) \
+ (((WIDEST_UTYPE) (((c)) - ((l) | 0))) <= (((WIDEST_UTYPE) ((n) | 0))))
+__UNDEF_NOT_PROVIDED__ inRANGE(c, l, u) \
+ ( (sizeof(c) == sizeof(U8)) ? withinCOUNT(((U8) (c)), (l), ((u) - (l))) \
+ : (sizeof(c) == sizeof(U16)) ? withinCOUNT(((U16) (c)), (l), ((u) - (l))) \
+ : (sizeof(c) == sizeof(U32)) ? withinCOUNT(((U32) (c)), (l), ((u) - (l))) \
+ : (withinCOUNT(((WIDEST_UTYPE) (c)), (l), ((u) - (l)))))
+
+/* The '| 0' part ensures a compiler error if c is not integer (like e.g., a
+ * pointer) */
+#undef FITS_IN_8_BITS /* handy.h version uses a core-only constant */
+__UNDEF_NOT_PROVIDED__ FITS_IN_8_BITS(c) ( (sizeof(c) == 1) \
+ || !(((WIDEST_UTYPE)((c) | 0)) & ~0xFF))
+
+/* Create the macro for "is'macro'_utf8_safe(s, e)". For code points below
+ * 256, it calls the equivalent _L1 macro by converting the UTF-8 to code
+ * point. That is so that it can automatically get the bug fixes done in this
+ * file. */
+#define D_PPP_IS_GENERIC_UTF8_SAFE(s, e, macro) \
+ (((e) - (s)) <= 0 \
+ ? 0 \
+ : UTF8_IS_INVARIANT((s)[0]) \
+ ? is ## macro ## _L1((s)[0]) \
+ : (((e) - (s)) < UTF8SKIP(s)) \
+ ? 0 \
+ : UTF8_IS_DOWNGRADEABLE_START((s)[0]) \
+ /* The cast in the line below is only to silence warnings */ \
+ ? is ## macro ## _L1((WIDEST_UTYPE) LATIN1_TO_NATIVE( \
+ UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \
+ & UTF_START_MASK(2), \
+ (s)[1]))) \
+ : is ## macro ## _utf8(s))
+
+/* Create the macro for "is'macro'_LC_utf8_safe(s, e)". For code points below
+ * 256, it calls the equivalent _L1 macro by converting the UTF-8 to code
+ * point. That is so that it can automatically get the bug fixes done in this
+ * file. */
+#define D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, macro) \
+ (((e) - (s)) <= 0 \
+ ? 0 \
+ : UTF8_IS_INVARIANT((s)[0]) \
+ ? is ## macro ## _LC((s)[0]) \
+ : (((e) - (s)) < UTF8SKIP(s)) \
+ ? 0 \
+ : UTF8_IS_DOWNGRADEABLE_START((s)[0]) \
+ /* The cast in the line below is only to silence warnings */ \
+ ? is ## macro ## _LC((WIDEST_UTYPE) LATIN1_TO_NATIVE( \
+ UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \
+ & UTF_START_MASK(2), \
+ (s)[1]))) \
+ : is ## macro ## _utf8(s))
+
+/* A few of the early functions are broken. For these and the non-LC case,
+ * machine generated code is substituted. But that code doesn't work for
+ * locales. This is just like the above macro, but at the end, we call the
+ * macro we've generated for the above 255 case, which is correct since locale
+ * isn't involved. This will generate extra code to handle the 0-255 inputs,
+ * but hopefully it will be optimized out by the C compiler. But just in case
+ * it isn't, this macro is only used on the few versions that are broken */
+
+#define D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, macro) \
+ (((e) - (s)) <= 0 \
+ ? 0 \
+ : UTF8_IS_INVARIANT((s)[0]) \
+ ? is ## macro ## _LC((s)[0]) \
+ : (((e) - (s)) < UTF8SKIP(s)) \
+ ? 0 \
+ : UTF8_IS_DOWNGRADEABLE_START((s)[0]) \
+ /* The cast in the line below is only to silence warnings */ \
+ ? is ## macro ## _LC((WIDEST_UTYPE) LATIN1_TO_NATIVE( \
+ UTF8_ACCUMULATE(NATIVE_UTF8_TO_I8((s)[0]) \
+ & UTF_START_MASK(2), \
+ (s)[1]))) \
+ : is ## macro ## _utf8_safe(s, e))
+
+__UNDEFINED__ SvRX(rv) (SvROK((rv)) ? (SvMAGICAL(SvRV((rv))) ? (mg_find(SvRV((rv)), PERL_MAGIC_qr) ? mg_find(SvRV((rv)), PERL_MAGIC_qr)->mg_obj : NULL) : NULL) : NULL)
__UNDEFINED__ SvRXOK(sv) (!!SvRX(sv))
#ifndef PERL_UNUSED_DECL
@@ -168,9 +223,9 @@ __UNDEFINED__ PTR2NV(p) NUM2PTR(NV,p)
# define EXTERN_C extern
#endif
-#if defined(PERL_GCC_PEDANTIC)
+#if { VERSION < 5.004 } || defined(PERL_GCC_PEDANTIC)
# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
-# define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+__UNDEF_NOT_PROVIDED__ PERL_GCC_BRACE_GROUPS_FORBIDDEN
# endif
#endif
@@ -258,8 +313,6 @@ __UNDEFINED__ dVAR dNOOP
__UNDEFINED__ SVf "_"
-__UNDEFINED__ UTF8_MAXBYTES UTF8_MAXLEN
-
__UNDEFINED__ CPERLscope(x) x
__UNDEFINED__ PERL_HASH(hash,str,len) \
@@ -307,52 +360,103 @@ typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
# endif
#endif
+/* On versions without NATIVE_TO_ASCII, only ASCII is supported */
+#if defined(EBCDIC) && defined(NATIVE_TO_ASCI)
+__UNDEFINED__ NATIVE_TO_LATIN1(c) NATIVE_TO_ASCII(c)
+__UNDEFINED__ LATIN1_TO_NATIVE(c) ASCII_TO_NATIVE(c)
+__UNDEFINED__ NATIVE_TO_UNI(c) ((c) > 255 ? (c) : NATIVE_TO_LATIN1(c))
+__UNDEFINED__ UNI_TO_NATIVE(c) ((c) > 255 ? (c) : LATIN1_TO_NATIVE(c))
+#else
+__UNDEFINED__ NATIVE_TO_LATIN1(c) (c)
+__UNDEFINED__ LATIN1_TO_NATIVE(c) (c)
+__UNDEFINED__ NATIVE_TO_UNI(c) (c)
+__UNDEFINED__ UNI_TO_NATIVE(c) (c)
+#endif
+
+/* Warning: LATIN1_TO_NATIVE, NATIVE_TO_LATIN1 NATIVE_TO_UNI UNI_TO_NATIVE
+ EBCDIC is not supported on versions earlier than 5.7.1
+ */
+
+/* The meaning of this changed; use the modern version */
+#undef isPSXSPC
+#undef isPSXSPC_A
+#undef isPSXSPC_L1
+
+/* Hint: isPSXSPC, isPSXSPC_A, isPSXSPC_L1, isPSXSPC_utf8_safe
+ This is equivalent to the corresponding isSPACE-type macro. On perls
+ before 5.18, this matched a vertical tab and SPACE didn't. But the
+ ppport.h SPACE version does match VT in all perl releases. Since VT's are
+ extremely rarely found in real-life files, this difference effectively
+ doesn't matter */
+
+/* Hint: isSPACE, isSPACE_A, isSPACE_L1, isSPACE_utf8_safe
+ Until Perl 5.18, this did not match the vertical tab (VT). The ppport.h
+ version does match it in all perl releases. Since VT's are extremely rarely
+ found in real-life files, this difference effectively doesn't matter */
+
#ifdef EBCDIC
-/* This is the first version where these macros are fully correct. Relying on
- * the C library functions, as earlier releases did, causes problems with
- * locales */
+/* This is the first version where these macros are fully correct on EBCDIC
+ * platforms. Relying on * the C library functions, as earlier releases did,
+ * causes problems with * locales */
# if { VERSION < 5.22.0 }
# undef isALNUM
# undef isALNUM_A
+# undef isALNUM_L1
# undef isALNUMC
# undef isALNUMC_A
+# undef isALNUMC_L1
# undef isALPHA
# undef isALPHA_A
+# undef isALPHA_L1
# undef isALPHANUMERIC
# undef isALPHANUMERIC_A
+# undef isALPHANUMERIC_L1
# undef isASCII
# undef isASCII_A
+# undef isASCII_L1
# undef isBLANK
# undef isBLANK_A
+# undef isBLANK_L1
# undef isCNTRL
# undef isCNTRL_A
+# undef isCNTRL_L1
# undef isDIGIT
# undef isDIGIT_A
+# undef isDIGIT_L1
# undef isGRAPH
# undef isGRAPH_A
+# undef isGRAPH_L1
# undef isIDCONT
# undef isIDCONT_A
+# undef isIDCONT_L1
# undef isIDFIRST
# undef isIDFIRST_A
+# undef isIDFIRST_L1
# undef isLOWER
# undef isLOWER_A
+# undef isLOWER_L1
# undef isOCTAL
# undef isOCTAL_A
+# undef isOCTAL_L1
# undef isPRINT
# undef isPRINT_A
-# undef isPSXSPC
-# undef isPSXSPC_A
+# undef isPRINT_L1
# undef isPUNCT
# undef isPUNCT_A
+# undef isPUNCT_L1
# undef isSPACE
# undef isSPACE_A
+# undef isSPACE_L1
# undef isUPPER
# undef isUPPER_A
+# undef isUPPER_L1
# undef isWORDCHAR
# undef isWORDCHAR_A
+# undef isWORDCHAR_L1
# undef isXDIGIT
# undef isXDIGIT_A
+# undef isXDIGIT_L1
# endif
__UNDEFINED__ isASCII(c) (isCNTRL(c) || isPRINT(c))
@@ -379,6 +483,16 @@ __UNDEFINED__ isCNTRL(c) ( (c) == '\0' || (c) == '\a' || (c) == '\b'
|| (c) == 0x3D /* U+15 NAK */ \
|| (c) == 0x3F /* U+1A SUB */ \
)
+
+#if '^' == 106 /* EBCDIC POSIX-BC */
+# define D_PPP_OUTLIER_CONTROL 0x5F
+#else /* EBCDIC 1047 037 */
+# define D_PPP_OUTLIER_CONTROL 0xFF
+#endif
+
+/* The controls are everything below blank, plus one outlier */
+__UNDEFINED__ isCNTRL_L1(c) ((WIDEST_UTYPE) (c) < ' ' \
+ || (WIDEST_UTYPE) (c) == D_PPP_OUTLIER_CONTROL)
/* The ordering of the tests in this and isUPPER are to exclude most characters
* early */
__UNDEFINED__ isLOWER(c) ( (c) >= 'a' && (c) <= 'z' \
@@ -409,94 +523,534 @@ __UNDEFINED__ isUPPER(c) ( (c) >= 'A' && (c) <= 'Z'
# undef isUPPER_A
# endif
-# if { VERSION < 5.8.0 }
-/* Hint: isCNTRL
- * Earlier perls omitted DEL */
+# if { VERSION == 5.7.0 } /* this perl made space GRAPH */
+# undef isGRAPH
+# endif
+
+# if { VERSION < 5.8.0 } /* earlier perls omitted DEL */
# undef isCNTRL
# endif
# if { VERSION < 5.10.0 }
-/* Hint: isPRINT
- * The implementation in older perl versions includes all of the
- * isSPACE() characters, which is wrong. The version provided by
- * Devel::PPPort always overrides a present buggy version.
- */
+/* earlier perls included all of the isSPACE() characters, which is wrong. The
+ * version provided by Devel::PPPort always overrides an existing buggy
+ * version. */
# undef isPRINT
# undef isPRINT_A
# endif
# if { VERSION < 5.14.0 }
-/* Hint: isASCII
- * The implementation in older perl versions always returned true if the
- * parameter was a signed char
- */
+/* earlier perls always returned true if the parameter was a signed char */
# undef isASCII
# undef isASCII_A
# endif
-# if { VERSION < 5.20.0 }
-/* Hint: isSPACE
- * The implementation in older perl versions didn't include \v */
+# if { VERSION < 5.17.8 } /* earlier perls didn't include PILCROW, SECTION SIGN */
+# undef isPUNCT_L1
+# endif
+
+# if { VERSION < 5.13.7 } /* khw didn't investigate why this failed */
+# undef isALNUMC_L1
+#endif
+
+# if { VERSION < 5.20.0 } /* earlier perls didn't include \v */
# undef isSPACE
# undef isSPACE_A
+# undef isSPACE_L1
+
# endif
__UNDEFINED__ isASCII(c) ((WIDEST_UTYPE) (c) <= 127)
__UNDEFINED__ isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127)
+__UNDEFINED__ isCNTRL_L1(c) (isCNTRL(c) || ( (WIDEST_UTYPE) (c) <= 0x9F \
+ && (WIDEST_UTYPE) (c) >= 0x80))
__UNDEFINED__ isLOWER(c) ((c) >= 'a' && (c) <= 'z')
__UNDEFINED__ isUPPER(c) ((c) <= 'Z' && (c) >= 'A')
+
#endif /* Below are definitions common to EBCDIC and ASCII */
+__UNDEFINED__ isASCII_L1(c) isASCII(c)
+__UNDEFINED__ isASCII_LC(c) isASCII(c)
__UNDEFINED__ isALNUM(c) isWORDCHAR(c)
__UNDEFINED__ isALNUMC(c) isALPHANUMERIC(c)
+__UNDEFINED__ isALNUMC_L1(c) isALPHANUMERIC_L1(c)
__UNDEFINED__ isALPHA(c) (isUPPER(c) || isLOWER(c))
+__UNDEFINED__ isALPHA_L1(c) (isUPPER_L1(c) || isLOWER_L1(c))
__UNDEFINED__ isALPHANUMERIC(c) (isALPHA(c) || isDIGIT(c))
+__UNDEFINED__ isALPHANUMERIC_L1(c) (isALPHA_L1(c) || isDIGIT(c))
+__UNDEFINED__ isALPHANUMERIC_LC(c) (isALPHA_LC(c) || isDIGIT_LC(c))
__UNDEFINED__ isBLANK(c) ((c) == ' ' || (c) == '\t')
-__UNDEFINED__ isDIGIT(c) ((c) <= '9' && (c) >= '0')
+__UNDEFINED__ isBLANK_L1(c) ( isBLANK(c) \
+ || ( FITS_IN_8_BITS(c) \
+ && NATIVE_TO_LATIN1((U8) c) == 0xA0))
+__UNDEFINED__ isBLANK_LC(c) isBLANK(c)
+__UNDEFINED__ isDIGIT(c) inRANGE(c, '0', '9')
+__UNDEFINED__ isDIGIT_L1(c) isDIGIT(c)
__UNDEFINED__ isGRAPH(c) (isWORDCHAR(c) || isPUNCT(c))
+__UNDEFINED__ isGRAPH_L1(c) ( isPRINT_L1(c) \
+ && (c) != ' ' \
+ && NATIVE_TO_LATIN1((U8) c) != 0xA0)
__UNDEFINED__ isIDCONT(c) isWORDCHAR(c)
+__UNDEFINED__ isIDCONT_L1(c) isWORDCHAR_L1(c)
+__UNDEFINED__ isIDCONT_LC(c) isWORDCHAR_LC(c)
__UNDEFINED__ isIDFIRST(c) (isALPHA(c) || (c) == '_')
+__UNDEFINED__ isIDFIRST_L1(c) (isALPHA_L1(c) || (U8) (c) == '_')
+__UNDEFINED__ isIDFIRST_LC(c) (isALPHA_LC(c) || (U8) (c) == '_')
+__UNDEFINED__ isLOWER_L1(c) ( isLOWER(c) \
+ || ( FITS_IN_8_BITS(c) \
+ && ( ( NATIVE_TO_LATIN1((U8) c) >= 0xDF \
+ && NATIVE_TO_LATIN1((U8) c) != 0xF7) \
+ || NATIVE_TO_LATIN1((U8) c) == 0xAA \
+ || NATIVE_TO_LATIN1((U8) c) == 0xBA \
+ || NATIVE_TO_LATIN1((U8) c) == 0xB5)))
__UNDEFINED__ isOCTAL(c) (((WIDEST_UTYPE)((c)) & ~7) == '0')
+__UNDEFINED__ isOCTAL_L1(c) isOCTAL(c)
__UNDEFINED__ isPRINT(c) (isGRAPH(c) || (c) == ' ')
+__UNDEFINED__ isPRINT_L1(c) (FITS_IN_8_BITS(c) && ! isCNTRL_L1(c))
__UNDEFINED__ isPSXSPC(c) isSPACE(c)
-__UNDEFINED__ isPUNCT(c) ( (c) == '-' || (c) == '!' || (c) == '"' \
- || (c) == '#' || (c) == '$' || (c) == '%' \
- || (c) == '&' || (c) == '\'' || (c) == '(' \
- || (c) == ')' || (c) == '*' || (c) == '+' \
- || (c) == ',' || (c) == '.' || (c) == '/' \
- || (c) == ':' || (c) == ';' || (c) == '<' \
- || (c) == '=' || (c) == '>' || (c) == '?' \
- || (c) == '@' || (c) == '[' || (c) == '\\' \
- || (c) == ']' || (c) == '^' || (c) == '_' \
- || (c) == '`' || (c) == '{' || (c) == '|' \
+__UNDEFINED__ isPSXSPC_L1(c) isSPACE_L1(c)
+__UNDEFINED__ isPUNCT(c) ( (c) == '-' || (c) == '!' || (c) == '"' \
+ || (c) == '#' || (c) == '$' || (c) == '%' \
+ || (c) == '&' || (c) == '\'' || (c) == '(' \
+ || (c) == ')' || (c) == '*' || (c) == '+' \
+ || (c) == ',' || (c) == '.' || (c) == '/' \
+ || (c) == ':' || (c) == ';' || (c) == '<' \
+ || (c) == '=' || (c) == '>' || (c) == '?' \
+ || (c) == '@' || (c) == '[' || (c) == '\\' \
+ || (c) == ']' || (c) == '^' || (c) == '_' \
+ || (c) == '`' || (c) == '{' || (c) == '|' \
|| (c) == '}' || (c) == '~')
-__UNDEFINED__ isSPACE(c) ( isBLANK(c) || (c) == '\n' || (c) == '\r' \
+__UNDEFINED__ isPUNCT_L1(c) ( isPUNCT(c) \
+ || ( FITS_IN_8_BITS(c) \
+ && ( NATIVE_TO_LATIN1((U8) c) == 0xA1 \
+ || NATIVE_TO_LATIN1((U8) c) == 0xA7 \
+ || NATIVE_TO_LATIN1((U8) c) == 0xAB \
+ || NATIVE_TO_LATIN1((U8) c) == 0xB6 \
+ || NATIVE_TO_LATIN1((U8) c) == 0xB7 \
+ || NATIVE_TO_LATIN1((U8) c) == 0xBB \
+ || NATIVE_TO_LATIN1((U8) c) == 0xBF)))
+__UNDEFINED__ isSPACE(c) ( isBLANK(c) || (c) == '\n' || (c) == '\r' \
|| (c) == '\v' || (c) == '\f')
+__UNDEFINED__ isSPACE_L1(c) ( isSPACE(c) \
+ || (FITS_IN_8_BITS(c) \
+ && ( NATIVE_TO_LATIN1((U8) c) == 0x85 \
+ || NATIVE_TO_LATIN1((U8) c) == 0xA0)))
+__UNDEFINED__ isUPPER_L1(c) ( isUPPER(c) \
+ || (FITS_IN_8_BITS(c) \
+ && ( NATIVE_TO_LATIN1((U8) c) >= 0xC0 \
+ && NATIVE_TO_LATIN1((U8) c) <= 0xDE \
+ && NATIVE_TO_LATIN1((U8) c) != 0xD7)))
__UNDEFINED__ isWORDCHAR(c) (isALPHANUMERIC(c) || (c) == '_')
-__UNDEFINED__ isXDIGIT(c) ( isDIGIT(c) \
- || ((c) >= 'a' && (c) <= 'f') \
+__UNDEFINED__ isWORDCHAR_L1(c) (isIDFIRST_L1(c) || isDIGIT(c))
+__UNDEFINED__ isWORDCHAR_LC(c) (isIDFIRST_LC(c) || isDIGIT_LC(c))
+__UNDEFINED__ isXDIGIT(c) ( isDIGIT(c) \
+ || ((c) >= 'a' && (c) <= 'f') \
|| ((c) >= 'A' && (c) <= 'F'))
+__UNDEFINED__ isXDIGIT_L1(c) isXDIGIT(c)
+__UNDEFINED__ isXDIGIT_LC(c) isxdigit(c)
+
+__UNDEFINED__ isALNUM_A(c) isALNUM(c)
+__UNDEFINED__ isALNUMC_A(c) isALNUMC(c)
+__UNDEFINED__ isALPHA_A(c) isALPHA(c)
+__UNDEFINED__ isALPHANUMERIC_A(c) isALPHANUMERIC(c)
+__UNDEFINED__ isASCII_A(c) isASCII(c)
+__UNDEFINED__ isBLANK_A(c) isBLANK(c)
+__UNDEFINED__ isCNTRL_A(c) isCNTRL(c)
+__UNDEFINED__ isDIGIT_A(c) isDIGIT(c)
+__UNDEFINED__ isGRAPH_A(c) isGRAPH(c)
+__UNDEFINED__ isIDCONT_A(c) isIDCONT(c)
+__UNDEFINED__ isIDFIRST_A(c) isIDFIRST(c)
+__UNDEFINED__ isLOWER_A(c) isLOWER(c)
+__UNDEFINED__ isOCTAL_A(c) isOCTAL(c)
+__UNDEFINED__ isPRINT_A(c) isPRINT(c)
+__UNDEFINED__ isPSXSPC_A(c) isPSXSPC(c)
+__UNDEFINED__ isPUNCT_A(c) isPUNCT(c)
+__UNDEFINED__ isSPACE_A(c) isSPACE(c)
+__UNDEFINED__ isUPPER_A(c) isUPPER(c)
+__UNDEFINED__ isWORDCHAR_A(c) isWORDCHAR(c)
+__UNDEFINED__ isXDIGIT_A(c) isXDIGIT(c)
+
+__UNDEFINED__ isASCII_utf8_safe(s,e) (((e) - (s)) <= 0 ? 0 : isASCII(*(s)))
+__UNDEFINED__ isASCII_uvchr(c) (FITS_IN_8_BITS(c) ? isASCII_L1(c) : 0)
+
+#if { VERSION >= 5.006 }
+# ifdef isALPHA_uni /* If one defined, all are; this is just an exemplar */
+# define D_PPP_is_ctype(upper, lower, c) \
+ (FITS_IN_8_BITS(c) \
+ ? is ## upper ## _L1(c) \
+ : is ## upper ## _uni((UV) (c))) /* _uni is old synonym */
+# else
+# define D_PPP_is_ctype(upper, lower, c) \
+ (FITS_IN_8_BITS(c) \
+ ? is ## upper ## _L1(c) \
+ : is_uni_ ## lower((UV) (c))) /* is_uni_ is even older */
+# endif
+
+__UNDEFINED__ isALPHA_uvchr(c) D_PPP_is_ctype(ALPHA, alpha, c)
+__UNDEFINED__ isALPHANUMERIC_uvchr(c) (isALPHA_uvchr(c) || isDIGIT_uvchr(c))
+# ifdef is_uni_blank
+__UNDEFINED__ isBLANK_uvchr(c) D_PPP_is_ctype(BLANK, blank, c)
+# else
+__UNDEFINED__ isBLANK_uvchr(c) (FITS_IN_8_BITS(c) \
+ ? isBLANK_L1(c) \
+ : ( (UV) (c) == 0x1680 /* Unicode 3.0 */ \
+ || inRANGE((UV) (c), 0x2000, 0x200A) \
+ || (UV) (c) == 0x202F /* Unicode 3.0 */\
+ || (UV) (c) == 0x205F /* Unicode 3.2 */\
+ || (UV) (c) == 0x3000))
+# endif
+__UNDEFINED__ isCNTRL_uvchr(c) D_PPP_is_ctype(CNTRL, cntrl, c)
+__UNDEFINED__ isDIGIT_uvchr(c) D_PPP_is_ctype(DIGIT, digit, c)
+__UNDEFINED__ isGRAPH_uvchr(c) D_PPP_is_ctype(GRAPH, graph, c)
+__UNDEFINED__ isIDCONT_uvchr(c) isWORDCHAR_uvchr(c)
+__UNDEFINED__ isIDFIRST_uvchr(c) D_PPP_is_ctype(IDFIRST, idfirst, c)
+__UNDEFINED__ isLOWER_uvchr(c) D_PPP_is_ctype(LOWER, lower, c)
+__UNDEFINED__ isPRINT_uvchr(c) D_PPP_is_ctype(PRINT, print, c)
+__UNDEFINED__ isPSXSPC_uvchr(c) isSPACE_uvchr(c)
+__UNDEFINED__ isPUNCT_uvchr(c) D_PPP_is_ctype(PUNCT, punct, c)
+__UNDEFINED__ isSPACE_uvchr(c) D_PPP_is_ctype(SPACE, space, c)
+__UNDEFINED__ isUPPER_uvchr(c) D_PPP_is_ctype(UPPER, upper, c)
+__UNDEFINED__ isXDIGIT_uvchr(c) D_PPP_is_ctype(XDIGIT, xdigit, c)
+__UNDEFINED__ isWORDCHAR_uvchr(c) (FITS_IN_8_BITS(c) \
+ ? isWORDCHAR_L1(c) : isALPHANUMERIC_uvchr(c))
+
+__UNDEFINED__ isALPHA_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, ALPHA)
+# ifdef isALPHANUMERIC_utf8
+__UNDEFINED__ isALPHANUMERIC_utf8_safe(s,e) \
+ D_PPP_IS_GENERIC_UTF8_SAFE(s, e, ALPHANUMERIC)
+# else
+__UNDEFINED__ isALPHANUMERIC_utf8_safe(s,e) \
+ (isALPHA_utf8_safe(s,e) || isDIGIT_utf8_safe(s,e))
+# endif
+
+/* This was broken before 5.18, and just use this instead of worrying about
+ * which releases the official works on */
+# if 'A' == 65
+__UNDEFINED__ isBLANK_utf8_safe(s,e) \
+( ( LIKELY((e) > (s)) ) ? /* Machine generated */ \
+ ( ( 0x09 == ((const U8*)s)[0] || 0x20 == ((const U8*)s)[0] ) ? 1 \
+ : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ? \
+ ( ( 0xC2 == ((const U8*)s)[0] ) ? \
+ ( ( 0xA0 == ((const U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE1 == ((const U8*)s)[0] ) ? \
+ ( ( ( 0x9A == ((const U8*)s)[1] ) && ( 0x80 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : ( 0xE2 == ((const U8*)s)[0] ) ? \
+ ( ( 0x80 == ((const U8*)s)[1] ) ? \
+ ( ( inRANGE(((const U8*)s)[2], 0x80, 0x8A ) || 0xAF == ((const U8*)s)[2] ) ? 3 : 0 )\
+ : ( ( 0x81 == ((const U8*)s)[1] ) && ( 0x9F == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : ( ( ( 0xE3 == ((const U8*)s)[0] ) && ( 0x80 == ((const U8*)s)[1] ) ) && ( 0x80 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+ : 0 )
+
+# elif 'A' == 193 && '^' == 95 /* EBCDIC 1047 */
+
+__UNDEFINED__ isBLANK_utf8_safe(s,e) \
+( ( LIKELY((e) > (s)) ) ? \
+ ( ( 0x05 == ((const U8*)s)[0] || 0x40 == ((const U8*)s)[0] ) ? 1 \
+ : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ? \
+ ( ( 0x80 == ((const U8*)s)[0] ) ? \
+ ( ( 0x41 == ((const U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xBC == ((const U8*)s)[0] ) ? \
+ ( ( ( 0x63 == ((const U8*)s)[1] ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : ( 0xCA == ((const U8*)s)[0] ) ? \
+ ( ( 0x41 == ((const U8*)s)[1] ) ? \
+ ( ( inRANGE(((const U8*)s)[2], 0x41, 0x4A ) || 0x51 == ((const U8*)s)[2] ) ? 3 : 0 )\
+ : ( 0x42 == ((const U8*)s)[1] ) ? \
+ ( ( 0x56 == ((const U8*)s)[2] ) ? 3 : 0 ) \
+ : ( ( 0x43 == ((const U8*)s)[1] ) && ( 0x73 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : ( ( ( 0xCE == ((const U8*)s)[0] ) && ( 0x41 == ((const U8*)s)[1] ) ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+: 0 )
+
+# elif 'A' == 193 && '^' == 176 /* EBCDIC 037 */
+
+__UNDEFINED__ isBLANK_utf8_safe(s,e) \
+( ( LIKELY((e) > (s)) ) ? \
+ ( ( 0x05 == ((const U8*)s)[0] || 0x40 == ((const U8*)s)[0] ) ? 1 \
+ : ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) ? \
+ ( ( 0x78 == ((const U8*)s)[0] ) ? \
+ ( ( 0x41 == ((const U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xBD == ((const U8*)s)[0] ) ? \
+ ( ( ( 0x62 == ((const U8*)s)[1] ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : ( 0xCA == ((const U8*)s)[0] ) ? \
+ ( ( 0x41 == ((const U8*)s)[1] ) ? \
+ ( ( inRANGE(((const U8*)s)[2], 0x41, 0x4A ) || 0x51 == ((const U8*)s)[2] ) ? 3 : 0 )\
+ : ( 0x42 == ((const U8*)s)[1] ) ? \
+ ( ( 0x56 == ((const U8*)s)[2] ) ? 3 : 0 ) \
+ : ( ( 0x43 == ((const U8*)s)[1] ) && ( 0x72 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : ( ( ( 0xCE == ((const U8*)s)[0] ) && ( 0x41 == ((const U8*)s)[1] ) ) && ( 0x41 == ((const U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+: 0 )
+
+# else
+# error Unknown character set
+# endif
+
+__UNDEFINED__ isCNTRL_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, CNTRL)
+__UNDEFINED__ isDIGIT_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, DIGIT)
+__UNDEFINED__ isGRAPH_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, GRAPH)
+# ifdef isIDCONT_utf8
+__UNDEFINED__ isIDCONT_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, IDCONT)
+# else
+__UNDEFINED__ isIDCONT_utf8_safe(s,e) isWORDCHAR_utf8_safe(s,e)
+# endif
+
+__UNDEFINED__ isIDFIRST_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, IDFIRST)
+__UNDEFINED__ isLOWER_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, LOWER)
+__UNDEFINED__ isPRINT_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, PRINT)
+
+# undef isPSXSPC_utf8_safe /* Use the modern definition */
+__UNDEFINED__ isPSXSPC_utf8_safe(s,e) isSPACE_utf8_safe(s,e)
+
+__UNDEFINED__ isPUNCT_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, PUNCT)
+__UNDEFINED__ isSPACE_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, SPACE)
+__UNDEFINED__ isUPPER_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, UPPER)
+
+# ifdef isWORDCHAR_utf8
+__UNDEFINED__ isWORDCHAR_utf8_safe(s,e) D_PPP_IS_GENERIC_UTF8_SAFE(s, e, WORDCHAR)
+# else
+__UNDEFINED__ isWORDCHAR_utf8_safe(s,e) \
+ (isALPHANUMERIC_utf8_safe(s,e) || (*(s)) == '_')
+# endif
+
+/* This was broken before 5.12, and just use this instead of worrying about
+ * which releases the official works on */
+# if 'A' == 65
+__UNDEFINED__ isXDIGIT_utf8_safe(s,e) \
+( ( LIKELY((e) > (s)) ) ? \
+ ( ( inRANGE(((const U8*)s)[0], 0x30, 0x39 ) || inRANGE(((const U8*)s)[0], 0x41, 0x46 ) || inRANGE(((const U8*)s)[0], 0x61, 0x66 ) ) ? 1\
+ : ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xEF == ((const U8*)s)[0] ) ) ? ( ( 0xBC == ((const U8*)s)[1] ) ?\
+ ( ( inRANGE(((const U8*)s)[2], 0x90, 0x99 ) || inRANGE(((const U8*)s)[2], 0xA1, 0xA6 ) ) ? 3 : 0 )\
+ : ( ( 0xBD == ((const U8*)s)[1] ) && ( inRANGE(((const U8*)s)[2], 0x81, 0x86 ) ) ) ? 3 : 0 ) : 0 )\
+: 0 )
+
+# elif 'A' == 193 && '^' == 95 /* EBCDIC 1047 */
+
+__UNDEFINED__ isXDIGIT_utf8_safe(s,e) \
+( ( LIKELY((e) > (s)) ) ? \
+ ( ( inRANGE(((const U8*)s)[0], 0x81, 0x86 ) || inRANGE(((const U8*)s)[0], 0xC1, 0xC6 ) || inRANGE(((const U8*)s)[0], 0xF0, 0xF9 ) ) ? 1\
+ : ( ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xDD == ((const U8*)s)[0] ) ) && ( 0x73 == ((const U8*)s)[1] ) ) ? ( ( 0x67 == ((const U8*)s)[2] ) ?\
+ ( ( inRANGE(((const U8*)s)[3], 0x57, 0x59 ) || inRANGE(((const U8*)s)[3], 0x62, 0x68 ) ) ? 4 : 0 )\
+ : ( ( inRANGE(((const U8*)s)[2], 0x68, 0x69 ) ) && ( inRANGE(((const U8*)s)[3], 0x42, 0x47 ) ) ) ? 4 : 0 ) : 0 )\
+: 0 )
+
+# elif 'A' == 193 && '^' == 176 /* EBCDIC 037 */
+
+__UNDEFINED__ isXDIGIT_utf8_safe(s,e) \
+( ( LIKELY((e) > (s)) ) ? \
+ ( ( inRANGE(((const U8*)s)[0], 0x81, 0x86 ) || inRANGE(((const U8*)s)[0], 0xC1, 0xC6 ) || inRANGE(((const U8*)s)[0], 0xF0, 0xF9 ) ) ? 1\
+ : ( ( ( LIKELY(((e) - (s)) >= UTF8SKIP(s)) ) && ( 0xDD == ((const U8*)s)[0] ) ) && ( 0x72 == ((const U8*)s)[1] ) ) ? ( ( 0x66 == ((const U8*)s)[2] ) ?\
+ ( ( inRANGE(((const U8*)s)[3], 0x57, 0x59 ) || 0x5F == ((const U8*)s)[3] || inRANGE(((const U8*)s)[3], 0x62, 0x67 ) ) ? 4 : 0 )\
+ : ( ( inRANGE(((const U8*)s)[2], 0x67, 0x68 ) ) && ( inRANGE(((const U8*)s)[3], 0x42, 0x47 ) ) ) ? 4 : 0 ) : 0 )\
+: 0 )
+
+# else
+# error Unknown character set
+# endif
+
+__UNDEFINED__ isALPHA_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, ALPHA)
+# ifdef isALPHANUMERIC_utf8
+__UNDEFINED__ isALPHANUMERIC_LC_utf8_safe(s,e) \
+ D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, ALPHANUMERIC)
+# else
+__UNDEFINED__ isALPHANUMERIC_LC_utf8_safe(s,e) \
+ (isALPHA_LC_utf8_safe(s,e) || isDIGIT_LC_utf8_safe(s,e))
+# endif
+
+__UNDEFINED__ isBLANK_LC_utf8_safe(s,e) \
+ D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, BLANK)
+__UNDEFINED__ isCNTRL_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, CNTRL)
+__UNDEFINED__ isDIGIT_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, DIGIT)
+__UNDEFINED__ isGRAPH_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, GRAPH)
+# ifdef isIDCONT_utf8
+__UNDEFINED__ isIDCONT_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, IDCONT)
+# else
+__UNDEFINED__ isIDCONT_LC_utf8_safe(s,e) isWORDCHAR_LC_utf8_safe(s,e)
+# endif
+
+__UNDEFINED__ isIDFIRST_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, IDFIRST)
+__UNDEFINED__ isLOWER_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, LOWER)
+__UNDEFINED__ isPRINT_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, PRINT)
+
+# undef isPSXSPC_LC_utf8_safe /* Use the modern definition */
+__UNDEFINED__ isPSXSPC_LC_utf8_safe(s,e) isSPACE_LC_utf8_safe(s,e)
+
+__UNDEFINED__ isPUNCT_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, PUNCT)
+__UNDEFINED__ isSPACE_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, SPACE)
+__UNDEFINED__ isUPPER_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, UPPER)
+
+# ifdef isWORDCHAR_utf8
+__UNDEFINED__ isWORDCHAR_LC_utf8_safe(s,e) D_PPP_IS_GENERIC_LC_UTF8_SAFE(s, e, WORDCHAR)
+# else
+__UNDEFINED__ isWORDCHAR_LC_utf8_safe(s,e) \
+ (isALPHANUMERIC_LC_utf8_safe(s,e) || (*(s)) == '_')
+# endif
+
+__UNDEFINED__ isXDIGIT_LC_utf8_safe(s,e) \
+ D_PPP_IS_GENERIC_LC_UTF8_SAFE_BROKEN(s, e, XDIGIT)
+
+/* Warning: isALPHANUMERIC_utf8_safe, isALPHA_utf8_safe, isASCII_utf8_safe,
+ * isBLANK_utf8_safe, isCNTRL_utf8_safe, isDIGIT_utf8_safe, isGRAPH_utf8_safe,
+ * isIDCONT_utf8_safe, isIDFIRST_utf8_safe, isLOWER_utf8_safe,
+ * isPRINT_utf8_safe, isPSXSPC_utf8_safe, isPUNCT_utf8_safe, isSPACE_utf8_safe,
+ * isUPPER_utf8_safe, isWORDCHAR_utf8_safe, isWORDCHAR_utf8_safe,
+ * isXDIGIT_utf8_safe,
+ * isALPHANUMERIC_LC_utf8_safe, isALPHA_LC_utf8_safe, isASCII_LC_utf8_safe,
+ * isBLANK_LC_utf8_safe, isCNTRL_LC_utf8_safe, isDIGIT_LC_utf8_safe,
+ * isGRAPH_LC_utf8_safe, isIDCONT_LC_utf8_safe, isIDFIRST_LC_utf8_safe,
+ * isLOWER_LC_utf8_safe, isPRINT_LC_utf8_safe, isPSXSPC_LC_utf8_safe,
+ * isPUNCT_LC_utf8_safe, isSPACE_LC_utf8_safe, isUPPER_LC_utf8_safe,
+ * isWORDCHAR_LC_utf8_safe, isWORDCHAR_LC_utf8_safe, isXDIGIT_LC_utf8_safe,
+ * isALPHANUMERIC_uvchr, isALPHA_uvchr, isASCII_uvchr, isBLANK_uvchr,
+ * isCNTRL_uvchr, isDIGIT_uvchr, isGRAPH_uvchr, isIDCONT_uvchr,
+ * isIDFIRST_uvchr, isLOWER_uvchr, isPRINT_uvchr, isPSXSPC_uvchr,
+ * isPUNCT_uvchr, isSPACE_uvchr, isUPPER_uvchr, isWORDCHAR_uvchr,
+ * isWORDCHAR_uvchr, isXDIGIT_uvchr
+ *
+ * The UTF-8 handling is buggy in early Perls, and this can give inaccurate
+ * results for code points above 0xFF, until the implementation started
+ * settling down in 5.12 and 5.14 */
+
+#endif
+
+#define D_PPP_TOO_SHORT_MSG "Malformed UTF-8 character starting with:" \
+ " \\x%02x (too short; %d bytes available, need" \
+ " %d)\n"
+/* Perls starting here had a new API which handled multi-character results */
+#if { VERSION >= 5.7.3 }
-__UNDEFINED__ isALNUM_A isALNUM
-__UNDEFINED__ isALNUMC_A isALNUMC
-__UNDEFINED__ isALPHA_A isALPHA
-__UNDEFINED__ isALPHANUMERIC_A isALPHANUMERIC
-__UNDEFINED__ isASCII_A isASCII
-__UNDEFINED__ isBLANK_A isBLANK
-__UNDEFINED__ isCNTRL_A isCNTRL
-__UNDEFINED__ isDIGIT_A isDIGIT
-__UNDEFINED__ isGRAPH_A isGRAPH
-__UNDEFINED__ isIDCONT_A isIDCONT
-__UNDEFINED__ isIDFIRST_A isIDFIRST
-__UNDEFINED__ isLOWER_A isLOWER
-__UNDEFINED__ isOCTAL_A isOCTAL
-__UNDEFINED__ isPRINT_A isPRINT
-__UNDEFINED__ isPSXSPC_A isPSXSPC
-__UNDEFINED__ isPUNCT_A isPUNCT
-__UNDEFINED__ isSPACE_A isSPACE
-__UNDEFINED__ isUPPER_A isUPPER
-__UNDEFINED__ isWORDCHAR_A isWORDCHAR
-__UNDEFINED__ isXDIGIT_A isXDIGIT
+__UNDEFINED__ toLOWER_uvchr(c, s, l) UNI_TO_NATIVE(to_uni_lower(NATIVE_TO_UNI(c), s, l))
+__UNDEFINED__ toUPPER_uvchr(c, s, l) UNI_TO_NATIVE(to_uni_upper(NATIVE_TO_UNI(c), s, l))
+__UNDEFINED__ toTITLE_uvchr(c, s, l) UNI_TO_NATIVE(to_uni_title(NATIVE_TO_UNI(c), s, l))
+__UNDEFINED__ toFOLD_uvchr(c, s, l) UNI_TO_NATIVE(to_uni_fold( NATIVE_TO_UNI(c), s, l))
+
+# if { VERSION != 5.15.6 } /* Just this version is broken */
+
+ /* Prefer the macro to the function */
+# if defined toLOWER_utf8
+# define D_PPP_TO_LOWER_CALLEE(s,r,l) toLOWER_utf8(s,r,l)
+# else
+# define D_PPP_TO_LOWER_CALLEE(s,r,l) to_utf8_lower(s,r,l)
+# endif
+# if defined toTITLE_utf8
+# define D_PPP_TO_TITLE_CALLEE(s,r,l) toTITLE_utf8(s,r,l)
+# else
+# define D_PPP_TO_TITLE_CALLEE(s,r,l) to_utf8_title(s,r,l)
+# endif
+# if defined toUPPER_utf8
+# define D_PPP_TO_UPPER_CALLEE(s,r,l) toUPPER_utf8(s,r,l)
+# else
+# define D_PPP_TO_UPPER_CALLEE(s,r,l) to_utf8_upper(s,r,l)
+# endif
+# if defined toFOLD_utf8
+# define D_PPP_TO_FOLD_CALLEE(s,r,l) toFOLD_utf8(s,r,l)
+# else
+# define D_PPP_TO_FOLD_CALLEE(s,r,l) to_utf8_fold(s,r,l)
+# endif
+# else /* Below is 5.15.6, which failed to make the macros available
+# outside of core, so we have to use the 'Perl_' form. khw
+# decided it was easier to just handle this case than have to
+# document the exception, and make an exception in the tests below
+# */
+# define D_PPP_TO_LOWER_CALLEE(s,r,l) \
+ Perl__to_utf8_lower_flags(aTHX_ s, r, l, 0, NULL)
+# define D_PPP_TO_TITLE_CALLEE(s,r,l) \
+ Perl__to_utf8_title_flags(aTHX_ s, r, l, 0, NULL)
+# define D_PPP_TO_UPPER_CALLEE(s,r,l) \
+ Perl__to_utf8_upper_flags(aTHX_ s, r, l, 0, NULL)
+# define D_PPP_TO_FOLD_CALLEE(s,r,l) \
+ Perl__to_utf8_fold_flags(aTHX_ s, r, l, FOLD_FLAGS_FULL, NULL)
+# endif
+
+/* The actual implementation of the backported macros. If too short, croak,
+ * otherwise call the original that doesn't have an upper limit parameter */
+# define D_PPP_GENERIC_MULTI_ARG_TO(name, s, e,r,l) \
+ (((((e) - (s)) <= 0) \
+ /* We could just do nothing, but modern perls croak */ \
+ ? (croak("Attempting case change on zero length string"), \
+ 0) /* So looks like it returns something, and will compile */ \
+ : ((e) - (s)) < UTF8SKIP(s)) \
+ ? (croak(D_PPP_TOO_SHORT_MSG, \
+ s[0], (int) ((e) - (s)), (int) UTF8SKIP(s)), \
+ 0) \
+ : D_PPP_TO_ ## name ## _CALLEE(s,r,l))
+
+__UNDEFINED__ toUPPER_utf8_safe(s,e,r,l) \
+ D_PPP_GENERIC_MULTI_ARG_TO(UPPER,s,e,r,l)
+__UNDEFINED__ toLOWER_utf8_safe(s,e,r,l) \
+ D_PPP_GENERIC_MULTI_ARG_TO(LOWER,s,e,r,l)
+__UNDEFINED__ toTITLE_utf8_safe(s,e,r,l) \
+ D_PPP_GENERIC_MULTI_ARG_TO(TITLE,s,e,r,l)
+__UNDEFINED__ toFOLD_utf8_safe(s,e,r,l) \
+ D_PPP_GENERIC_MULTI_ARG_TO(FOLD,s,e,r,l)
+
+#elif { VERSION >= 5.006 }
+
+/* Here we have UTF-8 support, but using the original API where the case
+ * changing functions merely returned the changed code point; hence they
+ * couldn't handle multi-character results. */
+
+# ifdef uvchr_to_utf8
+# define D_PPP_UV_TO_UTF8 uvchr_to_utf8
+# else
+# define D_PPP_UV_TO_UTF8 uv_to_utf8
+# endif
+
+ /* Get the utf8 of the case changed value, and store its length; then have
+ * to re-calculate the changed case value in order to return it */
+# define D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(name, c, s, l) \
+ (*(l) = (D_PPP_UV_TO_UTF8(s, \
+ UNI_TO_NATIVE(to_uni_ ## name(NATIVE_TO_UNI(c)))) - (s)), \
+ UNI_TO_NATIVE(to_uni_ ## name(NATIVE_TO_UNI(c))))
+
+__UNDEFINED__ toLOWER_uvchr(c, s, l) \
+ D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(lower, c, s, l)
+__UNDEFINED__ toUPPER_uvchr(c, s, l) \
+ D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(upper, c, s, l)
+__UNDEFINED__ toTITLE_uvchr(c, s, l) \
+ D_PPP_GENERIC_SINGLE_ARG_TO_UVCHR(title, c, s, l)
+__UNDEFINED__ toFOLD_uvchr(c, s, l) toLOWER_uvchr(c, s, l)
+
+# define D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(name, s, e, r, l) \
+ (((((e) - (s)) <= 0) \
+ ? (croak("Attempting case change on zero length string"), \
+ 0) /* So looks like it returns something, and will compile */ \
+ : ((e) - (s)) < UTF8SKIP(s)) \
+ ? (croak(D_PPP_TOO_SHORT_MSG, \
+ s[0], (int) ((e) - (s)), (int) UTF8SKIP(s)), \
+ 0) \
+ /* Get the changed code point and store its UTF-8 */ \
+ : D_PPP_UV_TO_UTF8(r, to_utf8_ ## name(s)), \
+ /* Then store its length, and re-get code point for return */ \
+ *(l) = UTF8SKIP(r), to_utf8_ ## name(r))
+
+/* Warning: toUPPER_utf8_safe, toLOWER_utf8_safe, toTITLE_utf8_safe,
+ * toUPPER_uvchr, toLOWER_uvchr, toTITLE_uvchr
+ The UTF-8 case changing operations had bugs before around 5.12 or 5.14;
+ this backport does not correct them.
+
+ In perls before 7.3, multi-character case changing is not implemented; this
+ backport uses the simple case changes available in those perls. */
+
+__UNDEFINED__ toUPPER_utf8_safe(s,e,r,l) \
+ D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(upper, s, e, r, l)
+__UNDEFINED__ toLOWER_utf8_safe(s,e,r,l) \
+ D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(lower, s, e, r, l)
+__UNDEFINED__ toTITLE_utf8_safe(s,e,r,l) \
+ D_PPP_GENERIC_SINGLE_ARG_TO_UTF8(title, s, e, r, l)
+
+ /* Warning: toFOLD_utf8_safe, toFOLD_uvchr
+ The UTF-8 case changing operations had bugs before around 5.12 or 5.14;
+ this backport does not correct them.
+
+ In perls before 7.3, case folding is not implemented; instead, this
+ backport substitutes simple (not multi-character, which isn't available)
+ lowercasing. This gives the correct result in most, but not all, instances
+ */
+
+__UNDEFINED__ toFOLD_utf8_safe(s,e,r,l) toLOWER_utf8_safe(s,e,r,l)
+
+#endif
/* Until we figure out how to support this in older perls... */
#if { VERSION >= 5.8.0 }
@@ -513,8 +1067,6 @@ __UNDEFINED__ C_ARRAY_END(a) ((a) + C_ARRAY_LENGTH(a))
__UNDEFINED__ LIKELY(x) (x)
__UNDEFINED__ UNLIKELY(x) (x)
-__UNDEFINED__ UNICODE_REPLACEMENT 0xFFFD
-
#ifndef MUTABLE_PTR
#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
# define MUTABLE_PTR(p) ({ void *_p = (p); _p; })
@@ -559,10 +1111,6 @@ XS(XS_Devel__PPPort_dAXMARK)
XSRETURN(1);
}
-=xsinit
-
-#define NEED_SvRX
-
=xsboot
{
@@ -768,7 +1316,7 @@ DEFSV_modify()
int
ERRSV()
CODE:
- RETVAL = SvTRUE(ERRSV);
+ RETVAL = SvTRUEx(ERRSV);
OUTPUT:
RETVAL
@@ -855,325 +1403,1168 @@ check_c_array()
mXPUSHi(*(C_ARRAY_END(x)-1)); /* 13 */
bool
-test_isBLANK(UV ord)
+isBLANK(ord)
+ UV ord
CODE:
RETVAL = isBLANK(ord);
OUTPUT:
RETVAL
bool
-test_isBLANK_A(UV ord)
+isBLANK_A(ord)
+ UV ord
CODE:
RETVAL = isBLANK_A(ord);
OUTPUT:
RETVAL
bool
-test_isUPPER(UV ord)
+isBLANK_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isBLANK_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isUPPER(ord)
+ UV ord
CODE:
RETVAL = isUPPER(ord);
OUTPUT:
RETVAL
bool
-test_isUPPER_A(UV ord)
+isUPPER_A(ord)
+ UV ord
CODE:
RETVAL = isUPPER_A(ord);
OUTPUT:
RETVAL
bool
-test_isLOWER(UV ord)
+isUPPER_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isUPPER_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isLOWER(ord)
+ UV ord
CODE:
RETVAL = isLOWER(ord);
OUTPUT:
RETVAL
bool
-test_isLOWER_A(UV ord)
+isLOWER_A(ord)
+ UV ord
CODE:
RETVAL = isLOWER_A(ord);
OUTPUT:
RETVAL
bool
-test_isALPHA(UV ord)
+isLOWER_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isLOWER_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isALPHA(ord)
+ UV ord
CODE:
RETVAL = isALPHA(ord);
OUTPUT:
RETVAL
bool
-test_isALPHA_A(UV ord)
+isALPHA_A(ord)
+ UV ord
CODE:
RETVAL = isALPHA_A(ord);
OUTPUT:
RETVAL
bool
-test_isWORDCHAR(UV ord)
+isALPHA_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isALPHA_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isWORDCHAR(ord)
+ UV ord
CODE:
RETVAL = isWORDCHAR(ord);
OUTPUT:
RETVAL
bool
-test_isWORDCHAR_A(UV ord)
+isWORDCHAR_A(ord)
+ UV ord
CODE:
RETVAL = isWORDCHAR_A(ord);
OUTPUT:
RETVAL
bool
-test_isALPHANUMERIC(UV ord)
+isWORDCHAR_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isWORDCHAR_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isALPHANUMERIC(ord)
+ UV ord
CODE:
RETVAL = isALPHANUMERIC(ord);
OUTPUT:
RETVAL
bool
-test_isALPHANUMERIC_A(UV ord)
+isALPHANUMERIC_A(ord)
+ UV ord
CODE:
RETVAL = isALPHANUMERIC_A(ord);
OUTPUT:
RETVAL
bool
-test_isALNUM(UV ord)
+isALNUM(ord)
+ UV ord
CODE:
RETVAL = isALNUM(ord);
OUTPUT:
RETVAL
bool
-test_isALNUM_A(UV ord)
+isALNUM_A(ord)
+ UV ord
CODE:
RETVAL = isALNUM_A(ord);
OUTPUT:
RETVAL
bool
-test_isDIGIT(UV ord)
+isDIGIT(ord)
+ UV ord
CODE:
RETVAL = isDIGIT(ord);
OUTPUT:
RETVAL
bool
-test_isDIGIT_A(UV ord)
+isDIGIT_A(ord)
+ UV ord
CODE:
RETVAL = isDIGIT_A(ord);
OUTPUT:
RETVAL
bool
-test_isOCTAL(UV ord)
+isOCTAL(ord)
+ UV ord
CODE:
RETVAL = isOCTAL(ord);
OUTPUT:
RETVAL
bool
-test_isOCTAL_A(UV ord)
+isOCTAL_A(ord)
+ UV ord
CODE:
RETVAL = isOCTAL_A(ord);
OUTPUT:
RETVAL
bool
-test_isIDFIRST(UV ord)
+isIDFIRST(ord)
+ UV ord
CODE:
RETVAL = isIDFIRST(ord);
OUTPUT:
RETVAL
bool
-test_isIDFIRST_A(UV ord)
+isIDFIRST_A(ord)
+ UV ord
CODE:
RETVAL = isIDFIRST_A(ord);
OUTPUT:
RETVAL
bool
-test_isIDCONT(UV ord)
+isIDCONT(ord)
+ UV ord
CODE:
RETVAL = isIDCONT(ord);
OUTPUT:
RETVAL
bool
-test_isIDCONT_A(UV ord)
+isIDCONT_A(ord)
+ UV ord
CODE:
RETVAL = isIDCONT_A(ord);
OUTPUT:
RETVAL
bool
-test_isSPACE(UV ord)
+isSPACE(ord)
+ UV ord
CODE:
RETVAL = isSPACE(ord);
OUTPUT:
RETVAL
bool
-test_isSPACE_A(UV ord)
+isSPACE_A(ord)
+ UV ord
CODE:
RETVAL = isSPACE_A(ord);
OUTPUT:
RETVAL
bool
-test_isASCII(UV ord)
+isASCII(ord)
+ UV ord
CODE:
RETVAL = isASCII(ord);
OUTPUT:
RETVAL
bool
-test_isASCII_A(UV ord)
+isASCII_A(ord)
+ UV ord
CODE:
RETVAL = isASCII_A(ord);
OUTPUT:
RETVAL
bool
-test_isCNTRL(UV ord)
+isCNTRL(ord)
+ UV ord
CODE:
RETVAL = isCNTRL(ord);
OUTPUT:
RETVAL
bool
-test_isCNTRL_A(UV ord)
+isCNTRL_A(ord)
+ UV ord
CODE:
RETVAL = isCNTRL_A(ord);
OUTPUT:
RETVAL
bool
-test_isPRINT(UV ord)
+isPRINT(ord)
+ UV ord
CODE:
RETVAL = isPRINT(ord);
OUTPUT:
RETVAL
bool
-test_isPRINT_A(UV ord)
+isPRINT_A(ord)
+ UV ord
CODE:
RETVAL = isPRINT_A(ord);
OUTPUT:
RETVAL
bool
-test_isGRAPH(UV ord)
+isGRAPH(ord)
+ UV ord
CODE:
RETVAL = isGRAPH(ord);
OUTPUT:
RETVAL
bool
-test_isGRAPH_A(UV ord)
+isGRAPH_A(ord)
+ UV ord
CODE:
RETVAL = isGRAPH_A(ord);
OUTPUT:
RETVAL
bool
-test_isPUNCT(UV ord)
+isPUNCT(ord)
+ UV ord
CODE:
RETVAL = isPUNCT(ord);
OUTPUT:
RETVAL
bool
-test_isPUNCT_A(UV ord)
+isPUNCT_A(ord)
+ UV ord
CODE:
RETVAL = isPUNCT_A(ord);
OUTPUT:
RETVAL
bool
-test_isXDIGIT(UV ord)
+isXDIGIT(ord)
+ UV ord
CODE:
RETVAL = isXDIGIT(ord);
OUTPUT:
RETVAL
bool
-test_isXDIGIT_A(UV ord)
+isXDIGIT_A(ord)
+ UV ord
CODE:
RETVAL = isXDIGIT_A(ord);
OUTPUT:
RETVAL
bool
-test_isPSXSPC(UV ord)
+isPSXSPC(ord)
+ UV ord
CODE:
RETVAL = isPSXSPC(ord);
OUTPUT:
RETVAL
bool
-test_isPSXSPC_A(UV ord)
+isPSXSPC_A(ord)
+ UV ord
CODE:
RETVAL = isPSXSPC_A(ord);
OUTPUT:
RETVAL
+bool
+isALPHANUMERIC_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isALPHANUMERIC_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isALNUMC_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isALNUMC_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isDIGIT_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isDIGIT_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isOCTAL_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isOCTAL_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isIDFIRST_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isIDFIRST_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isIDCONT_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isIDCONT_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isSPACE_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isSPACE_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isASCII_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isASCII_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isCNTRL_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isCNTRL_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isPRINT_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isPRINT_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isGRAPH_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isGRAPH_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isPUNCT_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isPUNCT_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isXDIGIT_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isXDIGIT_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isPSXSPC_L1(ord)
+ UV ord
+ CODE:
+ RETVAL = isPSXSPC_L1(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isASCII_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isASCII_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isASCII_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ PERL_UNUSED_ARG(offset);
+ RETVAL = isASCII_utf8_safe(s, s + 1 + offset);
+ OUTPUT:
+ RETVAL
+
+#if { VERSION >= 5.006 }
+
+bool
+isBLANK_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isBLANK_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isALPHA_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isALPHA_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isALPHANUMERIC_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isALPHANUMERIC_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isCNTRL_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isCNTRL_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isDIGIT_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isDIGIT_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isIDFIRST_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isIDFIRST_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isIDCONT_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isIDCONT_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isGRAPH_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isGRAPH_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isLOWER_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isLOWER_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isPRINT_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isPRINT_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isPSXSPC_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isPSXSPC_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isPUNCT_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isPUNCT_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isSPACE_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isSPACE_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isUPPER_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isUPPER_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isWORDCHAR_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isWORDCHAR_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isXDIGIT_uvchr(ord)
+ UV ord
+ CODE:
+ RETVAL = isXDIGIT_uvchr(ord);
+ OUTPUT:
+ RETVAL
+
+bool
+isALPHA_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isALPHA_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isALPHANUMERIC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isALPHANUMERIC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isBLANK_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isBLANK_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isCNTRL_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isCNTRL_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isDIGIT_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isDIGIT_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isGRAPH_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isGRAPH_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isIDCONT_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isIDCONT_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isIDFIRST_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isIDFIRST_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isLOWER_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isLOWER_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isPRINT_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isPRINT_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isPSXSPC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isPSXSPC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isPUNCT_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isPUNCT_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isSPACE_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isSPACE_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isUPPER_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isUPPER_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isWORDCHAR_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isWORDCHAR_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isXDIGIT_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isXDIGIT_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isALPHA_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isALPHA_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isALPHANUMERIC_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isALPHANUMERIC_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isASCII_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ PERL_UNUSED_ARG(offset);
+ RETVAL = isASCII_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isBLANK_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isBLANK_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isCNTRL_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isCNTRL_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isDIGIT_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isDIGIT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isGRAPH_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isGRAPH_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isIDCONT_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isIDCONT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isIDFIRST_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isIDFIRST_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isLOWER_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isLOWER_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isPRINT_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isPRINT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isPSXSPC_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isPSXSPC_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isPUNCT_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isPUNCT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isSPACE_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isSPACE_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isUPPER_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isUPPER_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isWORDCHAR_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isWORDCHAR_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+bool
+isXDIGIT_LC_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ CODE:
+ RETVAL = isXDIGIT_LC_utf8_safe(s, s + UTF8SKIP(s) + offset);
+ OUTPUT:
+ RETVAL
+
+AV *
+toLOWER_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ PREINIT:
+ U8 u[UTF8_MAXBYTES+1];
+ Size_t len;
+ UV ret;
+ SV* utf8;
+ AV * av;
+ CODE:
+ av = newAV();
+ ret = toLOWER_utf8_safe(s, s + UTF8SKIP(s) + offset, u, &len);
+ av_push(av, newSVuv(ret));
+
+ utf8 = newSVpvn((char *) u, len);
+ SvUTF8_on(utf8);
+ av_push(av, utf8);
+
+ av_push(av, newSVuv(len));
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+AV *
+toTITLE_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ PREINIT:
+ U8 u[UTF8_MAXBYTES+1];
+ Size_t len;
+ UV ret;
+ SV* utf8;
+ AV * av;
+ CODE:
+ av = newAV();
+ ret = toTITLE_utf8_safe(s, s + UTF8SKIP(s) + offset, u, &len);
+ av_push(av, newSVuv(ret));
+
+ utf8 = newSVpvn((char *) u, len);
+ SvUTF8_on(utf8);
+ av_push(av, utf8);
+
+ av_push(av, newSVuv(len));
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+AV *
+toUPPER_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ PREINIT:
+ U8 u[UTF8_MAXBYTES+1];
+ Size_t len;
+ UV ret;
+ SV* utf8;
+ AV * av;
+ CODE:
+ av = newAV();
+ ret = toUPPER_utf8_safe(s, s + UTF8SKIP(s) + offset, u, &len);
+ av_push(av, newSVuv(ret));
+
+ utf8 = newSVpvn((char *) u, len);
+ SvUTF8_on(utf8);
+ av_push(av, utf8);
+
+ av_push(av, newSVuv(len));
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+AV *
+toFOLD_utf8_safe(s, offset)
+ unsigned char * s
+ int offset
+ PREINIT:
+ U8 u[UTF8_MAXBYTES+1];
+ Size_t len;
+ UV ret;
+ SV* utf8;
+ AV * av;
+ CODE:
+ av = newAV();
+ ret = toFOLD_utf8_safe(s, s + UTF8SKIP(s) + offset, u, &len);
+ av_push(av, newSVuv(ret));
+
+ utf8 = newSVpvn((char *) u, len);
+ SvUTF8_on(utf8);
+ av_push(av, utf8);
+
+ av_push(av, newSVuv(len));
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+AV *
+toLOWER_uvchr(c)
+ UV c
+ PREINIT:
+ U8 u[UTF8_MAXBYTES+1];
+ Size_t len;
+ UV ret;
+ SV* utf8;
+ AV * av;
+ CODE:
+ av = newAV();
+ ret = toLOWER_uvchr(c, u, &len);
+ av_push(av, newSVuv(ret));
+
+ utf8 = newSVpvn((char *) u, len);
+ SvUTF8_on(utf8);
+ av_push(av, utf8);
+
+ av_push(av, newSVuv(len));
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+AV *
+toTITLE_uvchr(c)
+ UV c
+ PREINIT:
+ U8 u[UTF8_MAXBYTES+1];
+ Size_t len;
+ UV ret;
+ SV* utf8;
+ AV * av;
+ CODE:
+ av = newAV();
+ ret = toTITLE_uvchr(c, u, &len);
+ av_push(av, newSVuv(ret));
+
+ utf8 = newSVpvn((char *) u, len);
+ SvUTF8_on(utf8);
+ av_push(av, utf8);
+
+ av_push(av, newSVuv(len));
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+AV *
+toUPPER_uvchr(c)
+ UV c
+ PREINIT:
+ U8 u[UTF8_MAXBYTES+1];
+ Size_t len;
+ UV ret;
+ SV* utf8;
+ AV * av;
+ CODE:
+ av = newAV();
+ ret = toUPPER_uvchr(c, u, &len);
+ av_push(av, newSVuv(ret));
+
+ utf8 = newSVpvn((char *) u, len);
+ SvUTF8_on(utf8);
+ av_push(av, utf8);
+
+ av_push(av, newSVuv(len));
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+AV *
+toFOLD_uvchr(c)
+ UV c
+ PREINIT:
+ U8 u[UTF8_MAXBYTES+1];
+ Size_t len;
+ UV ret;
+ SV* utf8;
+ AV * av;
+ CODE:
+ av = newAV();
+ ret = toFOLD_uvchr(c, u, &len);
+ av_push(av, newSVuv(ret));
+
+ utf8 = newSVpvn((char *) u, len);
+ SvUTF8_on(utf8);
+ av_push(av, utf8);
+
+ av_push(av, newSVuv(len));
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+#endif
+
+UV
+LATIN1_TO_NATIVE(cp)
+ UV cp
+ CODE:
+ if (cp > 255) RETVAL= cp;
+ else RETVAL= LATIN1_TO_NATIVE(cp);
+ OUTPUT:
+ RETVAL
+
+UV
+NATIVE_TO_LATIN1(cp)
+ UV cp
+ CODE:
+ RETVAL= NATIVE_TO_LATIN1(cp);
+ OUTPUT:
+ RETVAL
+
STRLEN
av_tindex(av)
- AV *av
+ SV *av
CODE:
- RETVAL = av_tindex(av);
+ RETVAL = av_tindex((AV*)SvRV(av));
OUTPUT:
RETVAL
STRLEN
av_top_index(av)
- AV *av
+ SV *av
CODE:
- RETVAL = av_top_index(av);
+ RETVAL = av_top_index((AV*)SvRV(av));
OUTPUT:
RETVAL
-=tests plan => 128
+=tests plan => 26826
use vars qw($my_sv @my_av %my_hv);
-ok(&Devel::PPPort::boolSV(1));
-ok(!&Devel::PPPort::boolSV(0));
+ok(&Devel::PPPort::boolSV(1), "Verify boolSV(1) is true");
+ok(!&Devel::PPPort::boolSV(0), "Verify boolSV(0) is false");
$_ = "Fred";
-ok(&Devel::PPPort::DEFSV(), "Fred");
-ok(&Devel::PPPort::UNDERBAR(), "Fred");
+is(&Devel::PPPort::DEFSV(), "Fred", '$_ is FRED; Verify DEFSV is FRED');
+is(&Devel::PPPort::UNDERBAR(), "Fred", 'And verify UNDERBAR is FRED');
-if ("$]" >= 5.009002 && "$]" < 5.023 && "$]" < 5.023004) {
+if (ivers($]) >= ivers(5.9.2) && ivers($]) < ivers(5.23)) {
eval q{
no warnings "deprecated";
- no if $^V > v5.17.9, warnings => "experimental::lexical_topic";
+ no if $^V >= v5.17.9, warnings => "experimental::lexical_topic";
my $_ = "Tony";
- ok(&Devel::PPPort::DEFSV(), "Fred");
- ok(&Devel::PPPort::UNDERBAR(), "Tony");
+ is(&Devel::PPPort::DEFSV(), "Fred", 'lexical_topic eval: $_ is Tony; Verify DEFSV is Fred');
+ is(&Devel::PPPort::UNDERBAR(), "Tony", 'And verify UNDERBAR is Tony');
};
+ die __FILE__ . __LINE__ . ": $@" if $@;
}
else {
- ok(1);
- ok(1);
+ skip("perl version outside testing range of lexical_topic", 2);
}
my @r = &Devel::PPPort::DEFSV_modify();
-ok(@r == 3);
-ok($r[0], 'Fred');
-ok($r[1], 'DEFSV');
-ok($r[2], 'Fred');
+ok(@r == 3, "Verify got 3 elements");
+is($r[0], 'Fred');
+is($r[1], 'DEFSV');
+is($r[2], 'Fred');
-ok(&Devel::PPPort::DEFSV(), "Fred");
+is(&Devel::PPPort::DEFSV(), "Fred");
eval { 1 };
-ok(!&Devel::PPPort::ERRSV());
+ok(!&Devel::PPPort::ERRSV(), "Verify ERRSV on true is false");
eval { cannot_call_this_one() };
-ok(&Devel::PPPort::ERRSV());
+ok(&Devel::PPPort::ERRSV(), "Verify ERRSV on false is true");
ok(&Devel::PPPort::gv_stashpvn('Devel::PPPort', 0));
ok(!&Devel::PPPort::gv_stashpvn('does::not::exist', 0));
@@ -1199,177 +2590,386 @@ ok(&Devel::PPPort::get_cv('my_cv', 0));
ok(!&Devel::PPPort::get_cv('not_my_cv', 0));
ok(&Devel::PPPort::get_cv('not_my_cv', 1));
-ok(Devel::PPPort::dXSTARG(42), 43);
-ok(Devel::PPPort::dAXMARK(4711), 4710);
+is(Devel::PPPort::dXSTARG(42), 43);
+is(Devel::PPPort::dAXMARK(4711), 4710);
-ok(Devel::PPPort::prepush(), 42);
+is(Devel::PPPort::prepush(), 42);
-ok(join(':', Devel::PPPort::xsreturn(0)), 'test1');
-ok(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
+is(join(':', Devel::PPPort::xsreturn(0)), 'test1');
+is(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
-ok(Devel::PPPort::PERL_ABS(42), 42);
-ok(Devel::PPPort::PERL_ABS(-13), 13);
+is(Devel::PPPort::PERL_ABS(42), 42, "Verify PERL_ABS(42) is 42");
+is(Devel::PPPort::PERL_ABS(-13), 13, "Verify PERL_ABS(-13) is 13");
-ok(Devel::PPPort::SVf(42), "$]" >= 5.004 ? '[42]' : '42');
-ok(Devel::PPPort::SVf('abc'), "$]" >= 5.004 ? '[abc]' : 'abc');
+is(Devel::PPPort::SVf(42), ivers($]) >= ivers(5.4) ? '[42]' : '42');
+is(Devel::PPPort::SVf('abc'), ivers($]) >= ivers(5.4) ? '[abc]' : 'abc');
-ok(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
+is(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
-ok(&Devel::PPPort::ptrtests(), 63);
+is(&Devel::PPPort::ptrtests(), 63);
-ok(&Devel::PPPort::OpSIBLING_tests(), 0);
+is(&Devel::PPPort::OpSIBLING_tests(), 0);
-if ("$]" >= 5.009000) {
+if (ivers($]) >= ivers(5.9)) {
eval q{
- ok(&Devel::PPPort::check_HeUTF8("hello"), "norm");
- ok(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
+ is(&Devel::PPPort::check_HeUTF8("hello"), "norm");
+ is(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
};
} else {
- ok(1, 1);
- ok(1, 1);
+ skip("Too early perl version", 2);
}
@r = &Devel::PPPort::check_c_array();
-ok($r[0], 4);
-ok($r[1], "13");
+is($r[0], 4);
+is($r[1], "13");
ok(!Devel::PPPort::SvRXOK(""));
ok(!Devel::PPPort::SvRXOK(bless [], "Regexp"));
-if ("$]" < 5.005) {
- skip 'no qr// objects in this perl', 0;
- skip 'no qr// objects in this perl', 0;
+if (ivers($]) < ivers(5.5)) {
+ skip 'no qr// objects in this perl', 2;
} else {
my $qr = eval 'qr/./';
- ok(Devel::PPPort::SvRXOK($qr));
+ ok(Devel::PPPort::SvRXOK($qr), "SVRXOK(qr) is true");
ok(Devel::PPPort::SvRXOK(bless $qr, "Surprise"));
}
-ok( Devel::PPPort::test_isBLANK(ord(" ")));
-ok(! Devel::PPPort::test_isBLANK(ord("\n")));
-
-ok( Devel::PPPort::test_isBLANK_A(ord("\t")));
-ok(! Devel::PPPort::test_isBLANK_A(ord("\r")));
-
-ok( Devel::PPPort::test_isUPPER(ord("A")));
-ok(! Devel::PPPort::test_isUPPER(ord("a")));
-
-ok( Devel::PPPort::test_isUPPER_A(ord("Z")));
-
-# One of these two is uppercase in EBCDIC; the other in Latin1, but neither are
-# ASCII uppercase.
-ok(! Devel::PPPort::test_isUPPER_A(ord(0xDC)));
-ok(! Devel::PPPort::test_isUPPER_A(ord(0xFC)));
-
-ok( Devel::PPPort::test_isLOWER(ord("b")));
-ok(! Devel::PPPort::test_isLOWER(ord("B")));
-
-ok( Devel::PPPort::test_isLOWER_A(ord("y")));
-
-# One of these two is lowercase in EBCDIC; the other in Latin1, but neither are
-# ASCII lowercase.
-ok(! Devel::PPPort::test_isLOWER_A(ord(0xDC)));
-ok(! Devel::PPPort::test_isLOWER_A(ord(0xFC)));
-
-ok( Devel::PPPort::test_isALPHA(ord("C")));
-ok(! Devel::PPPort::test_isALPHA(ord("1")));
-
-ok( Devel::PPPort::test_isALPHA_A(ord("x")));
-ok(! Devel::PPPort::test_isALPHA_A(0xDC));
-
-ok( Devel::PPPort::test_isWORDCHAR(ord("_")));
-ok(! Devel::PPPort::test_isWORDCHAR(ord("@")));
-
-ok( Devel::PPPort::test_isWORDCHAR_A(ord("2")));
-ok(! Devel::PPPort::test_isWORDCHAR_A(0xFC));
-
-ok( Devel::PPPort::test_isALPHANUMERIC(ord("4")));
-ok(! Devel::PPPort::test_isALPHANUMERIC(ord("_")));
-
-ok( Devel::PPPort::test_isALPHANUMERIC_A(ord("l")));
-ok(! Devel::PPPort::test_isALPHANUMERIC_A(0xDC));
-
-ok( Devel::PPPort::test_isALNUM(ord("c")));
-ok(! Devel::PPPort::test_isALNUM(ord("}")));
-
-ok( Devel::PPPort::test_isALNUM_A(ord("5")));
-ok(! Devel::PPPort::test_isALNUM_A(0xFC));
-
-ok( Devel::PPPort::test_isDIGIT(ord("6")));
-ok(! Devel::PPPort::test_isDIGIT(ord("_")));
-
-ok( Devel::PPPort::test_isDIGIT_A(ord("7")));
-ok(! Devel::PPPort::test_isDIGIT_A(0xDC));
-
-ok( Devel::PPPort::test_isOCTAL(ord("7")));
-ok(! Devel::PPPort::test_isOCTAL(ord("8")));
+ok( Devel::PPPort::NATIVE_TO_LATIN1(0xB6) == 0xB6);
+ok( Devel::PPPort::NATIVE_TO_LATIN1(0x1) == 0x1);
+ok( Devel::PPPort::NATIVE_TO_LATIN1(ord("A")) == 0x41);
+ok( Devel::PPPort::NATIVE_TO_LATIN1(ord("0")) == 0x30);
-ok( Devel::PPPort::test_isOCTAL_A(ord("0")));
-ok(! Devel::PPPort::test_isOCTAL_A(ord("9")));
-
-ok( Devel::PPPort::test_isIDFIRST(ord("D")));
-ok(! Devel::PPPort::test_isIDFIRST(ord("1")));
-
-ok( Devel::PPPort::test_isIDFIRST_A(ord("_")));
-ok(! Devel::PPPort::test_isIDFIRST_A(0xFC));
-
-ok( Devel::PPPort::test_isIDCONT(ord("e")));
-ok(! Devel::PPPort::test_isIDCONT(ord("@")));
-
-ok( Devel::PPPort::test_isIDCONT_A(ord("2")));
-ok(! Devel::PPPort::test_isIDCONT_A(0xDC));
-
-ok( Devel::PPPort::test_isSPACE(ord(" ")));
-ok(! Devel::PPPort::test_isSPACE(ord("_")));
-
-ok( Devel::PPPort::test_isSPACE_A(ord("\cK")));
-ok(! Devel::PPPort::test_isSPACE_A(ord("F")));
-
-# This stresses the edge for ASCII machines, but happens to work on EBCDIC as
-# well
-ok( Devel::PPPort::test_isASCII(0x7F));
-ok(! Devel::PPPort::test_isASCII(0x80));
-
-ok( Devel::PPPort::test_isASCII_A(ord("9")));
-
-# B6 is the PARAGRAPH SIGN in ASCII and EBCDIC
-ok(! Devel::PPPort::test_isASCII_A(0xB6));
-
-ok( Devel::PPPort::test_isCNTRL(ord("\e")));
-ok(! Devel::PPPort::test_isCNTRL(ord(" ")));
+ok( Devel::PPPort::LATIN1_TO_NATIVE(0xB6) == 0xB6, "Verify LATIN1_TO_NATIVE(0xB6) is 0xB6");
+if (ord("A") == 65) {
+ ok( Devel::PPPort::LATIN1_TO_NATIVE(0x41) == 0x41);
+ ok( Devel::PPPort::LATIN1_TO_NATIVE(0x30) == 0x30);
+}
+else {
+ ok( Devel::PPPort::LATIN1_TO_NATIVE(0x41) == 0xC1);
+ ok( Devel::PPPort::LATIN1_TO_NATIVE(0x30) == 0xF0);
+}
-ok( Devel::PPPort::test_isCNTRL_A(ord("\a")));
-ok(! Devel::PPPort::test_isCNTRL_A(0xB6));
+ok( Devel::PPPort::isALNUMC_L1(ord("5")));
+ok( Devel::PPPort::isALNUMC_L1(0xFC));
+ok(! Devel::PPPort::isALNUMC_L1(0xB6));
-ok( Devel::PPPort::test_isPRINT(ord(" ")));
-ok(! Devel::PPPort::test_isPRINT(ord("\n")));
+ok( Devel::PPPort::isOCTAL(ord("7")), "Verify '7' is OCTAL");
+ok(! Devel::PPPort::isOCTAL(ord("8")), "Verify '8' isn't OCTAL");
-ok( Devel::PPPort::test_isPRINT_A(ord("G")));
-ok(! Devel::PPPort::test_isPRINT_A(0xB6));
+ok( Devel::PPPort::isOCTAL_A(ord("0")), "Verify '0' is OCTAL_A");
+ok(! Devel::PPPort::isOCTAL_A(ord("9")), "Verify '9' isn't OCTAL_A");
-ok( Devel::PPPort::test_isGRAPH(ord("h")));
-ok(! Devel::PPPort::test_isGRAPH(ord(" ")));
+ok( Devel::PPPort::isOCTAL_L1(ord("2")), "Verify '2' is OCTAL_L1");
+ok(! Devel::PPPort::isOCTAL_L1(ord("8")), "Verify '8' isn't OCTAL_L1");
-ok( Devel::PPPort::test_isGRAPH_A(ord("i")));
-ok(! Devel::PPPort::test_isGRAPH_A(0xB6));
+my $way_too_early_msg = 'UTF-8 not implemented on this perl';
-ok( Devel::PPPort::test_isPUNCT(ord("#")));
-ok(! Devel::PPPort::test_isPUNCT(ord(" ")));
+# For the other properties, we test every code point from 0.255, and a
+# smattering of higher ones. First populate a hash with keys like '65:ALPHA'
+# to indicate that the code point there is alphabetic
+my $i;
+my %types;
+for $i (0x41..0x5A, 0x61..0x7A, 0xAA, 0xB5, 0xBA, 0xC0..0xD6, 0xD8..0xF6,
+ 0xF8..0x101)
+{
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:ALPHA"} = 1;
+ $types{"$native:ALPHANUMERIC"} = 1;
+ $types{"$native:IDFIRST"} = 1;
+ $types{"$native:IDCONT"} = 1;
+ $types{"$native:PRINT"} = 1;
+ $types{"$native:WORDCHAR"} = 1;
+}
+for $i (0x30..0x39, 0x660, 0xFF19) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:ALPHANUMERIC"} = 1;
+ $types{"$native:DIGIT"} = 1;
+ $types{"$native:IDCONT"} = 1;
+ $types{"$native:WORDCHAR"} = 1;
+ $types{"$native:GRAPH"} = 1;
+ $types{"$native:PRINT"} = 1;
+ $types{"$native:XDIGIT"} = 1 if $i < 255 || ($i >= 0xFF10 && $i <= 0xFF19);
+}
-ok( Devel::PPPort::test_isPUNCT_A(ord("*")));
-ok(! Devel::PPPort::test_isPUNCT_A(0xB6));
+for $i (0..0x7F) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:ASCII"} = 1;
+}
+for $i (0..0x1f, 0x7F..0x9F) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:CNTRL"} = 1;
+}
+for $i (0x21..0x7E, 0xA1..0x101, 0x660) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:GRAPH"} = 1;
+ $types{"$native:PRINT"} = 1;
+}
+for $i (0x09, 0x20, 0xA0) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:BLANK"} = 1;
+ $types{"$native:SPACE"} = 1;
+ $types{"$native:PSXSPC"} = 1;
+ $types{"$native:PRINT"} = 1 if $i > 0x09;
+}
+for $i (0x09..0x0D, 0x85, 0x2029) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:SPACE"} = 1;
+ $types{"$native:PSXSPC"} = 1;
+}
+for $i (0x41..0x5A, 0xC0..0xD6, 0xD8..0xDE, 0x100) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:UPPER"} = 1;
+ $types{"$native:XDIGIT"} = 1 if $i < 0x47;
+}
+for $i (0x61..0x7A, 0xAA, 0xB5, 0xBA, 0xDF..0xF6, 0xF8..0xFF, 0x101) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:LOWER"} = 1;
+ $types{"$native:XDIGIT"} = 1 if $i < 0x67;
+}
+for $i (0x21..0x2F, 0x3A..0x40, 0x5B..0x60, 0x7B..0x7E, 0xB6, 0xA1, 0xA7, 0xAB,
+ 0xB7, 0xBB, 0xBF, 0x5BE)
+{
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:PUNCT"} = 1;
+ $types{"$native:GRAPH"} = 1;
+ $types{"$native:PRINT"} = 1;
+}
-ok( Devel::PPPort::test_isXDIGIT(ord("A")));
-ok(! Devel::PPPort::test_isXDIGIT(ord("_")));
+$i = ord('_');
+$types{"$i:WORDCHAR"} = 1;
+$types{"$i:IDFIRST"} = 1;
+$types{"$i:IDCONT"} = 1;
+
+# Now find all the unique code points included above.
+my %code_points_to_test;
+my $key;
+for $key (keys %types) {
+ $key =~ s/:.*//;
+ $code_points_to_test{$key} = 1;
+}
-ok( Devel::PPPort::test_isXDIGIT_A(ord("9")));
-ok(! Devel::PPPort::test_isXDIGIT_A(0xDC));
+# And test each one
+for $i (sort { $a <=> $b } keys %code_points_to_test) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ my $hex = sprintf("0x%02X", $native);
+
+ # And for each code point test each of the classes
+ my $class;
+ for $class (qw(ALPHA ALPHANUMERIC ASCII BLANK CNTRL DIGIT GRAPH IDCONT
+ IDFIRST LOWER PRINT PSXSPC PUNCT SPACE UPPER WORDCHAR
+ XDIGIT))
+ {
+ if ($i < 256) { # For the ones that can fit in a byte, test each of
+ # three macros.
+ my $suffix;
+ for $suffix ("", "_A", "_L1", "_uvchr") {
+ my $should_be = ($i > 0x7F && $suffix !~ /_(uvchr|L1)/)
+ ? 0 # Fail on non-ASCII unless unicode
+ : ($types{"$native:$class"} || 0);
+ if (ivers($]) < ivers(5.6) && $suffix eq '_uvchr') {
+ skip("No UTF-8 on this perl", 1);
+ next;
+ }
-ok( Devel::PPPort::test_isPSXSPC(ord(" ")));
-ok(! Devel::PPPort::test_isPSXSPC(ord("k")));
+ my $eval_string = "Devel::PPPort::is${class}$suffix($hex)";
+ local $SIG{__WARN__} = sub {};
+ my $is = eval $eval_string || 0;
+ die "eval 'For $i: $eval_string' gave $@" if $@;
+ is($is, $should_be, "'$eval_string'");
+ }
+ }
+
+ # For all code points, test the '_utf8' macros
+ my $sub_fcn;
+ for $sub_fcn ("", "_LC") {
+ my $skip = "";
+ if (ivers($]) < ivers(5.6)) {
+ $skip = $way_too_early_msg;
+ }
+ elsif (ivers($]) < ivers(5.7) && $native > 255) {
+ $skip = "Perls earlier than 5.7 give wrong answers for above Latin1 code points";
+ }
+ elsif (ivers($]) <= ivers(5.11.3) && $native == 0x2029 && ($class eq 'PRINT' || $class eq 'GRAPH')) {
+ $skip = "Perls earlier than 5.11.3 considered high space characters as isPRINT and isGRAPH";
+ }
+ elsif ($sub_fcn eq '_LC' && $i < 256) {
+ $skip = "Testing of code points whose results depend on locale is skipped ";
+ }
+ my $fcn = "Devel::PPPort::is${class}${sub_fcn}_utf8_safe";
+ my $utf8;
+
+ if ($skip) {
+ skip $skip, 1;
+ }
+ else {
+ $utf8 = quotemeta Devel::PPPort::uvchr_to_utf8($native);
+ my $should_be = $types{"$native:$class"} || 0;
+ my $eval_string = "$fcn(\"$utf8\", 0)";
+ local $SIG{__WARN__} = sub {};
+ my $is = eval $eval_string || 0;
+ die "eval 'For $i, $eval_string' gave $@" if $@;
+ is($is, $should_be, sprintf("For U+%04X '%s'", $native, $eval_string));
+ }
+
+ # And for the high code points, test that a too short malformation (the
+ # -1) causes it to fail
+ if ($i > 255) {
+ if ($skip) {
+ skip $skip, 1;
+ }
+ elsif (ivers($]) >= ivers(5.25.9)) {
+ skip("Prints an annoying error message that khw doesn't know how to easily suppress", 1);
+ }
+ else {
+ my $eval_string = "$fcn(\"$utf8\", -1)";
+ local $SIG{__WARN__} = sub {};
+ my $is = eval "$eval_string" || 0;
+ die "eval '$eval_string' gave $@" if $@;
+ is($is, 0, sprintf("For U+%04X '%s'", $native, $eval_string));
+ }
+ }
+ }
+ }
+}
-ok( Devel::PPPort::test_isPSXSPC_A(ord("\cK")));
-ok(! Devel::PPPort::test_isPSXSPC_A(0xFC));
+my %case_changing = ( 'LOWER' => [ [ ord('A'), ord('a') ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xC0),
+ Devel::PPPort::LATIN1_TO_NATIVE(0xE0) ],
+ [ 0x100, 0x101 ],
+ ],
+ 'FOLD' => [ [ ord('C'), ord('c') ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xC0),
+ Devel::PPPort::LATIN1_TO_NATIVE(0xE0) ],
+ [ 0x104, 0x105 ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
+ 'ss' ],
+ ],
+ 'UPPER' => [ [ ord('a'), ord('A'), ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xE0),
+ Devel::PPPort::LATIN1_TO_NATIVE(0xC0) ],
+ [ 0x101, 0x100 ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
+ 'SS' ],
+ ],
+ 'TITLE' => [ [ ord('c'), ord('C'), ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xE2),
+ Devel::PPPort::LATIN1_TO_NATIVE(0xC2) ],
+ [ 0x103, 0x102 ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
+ 'Ss' ],
+ ],
+ );
+
+my $name;
+for $name (keys %case_changing) {
+ my @code_points_to_test = @{$case_changing{$name}};
+ my $unchanged;
+ for $unchanged (@code_points_to_test) {
+ my @pair = @$unchanged;
+ my $original = $pair[0];
+ my $changed = $pair[1];
+ my $utf8_changed = $changed;
+ my $is_cp = $utf8_changed =~ /^\d+$/;
+ my $should_be_bytes;
+ if (ivers($]) >= ivers(5.6)) {
+ if ($is_cp) {
+ $utf8_changed = Devel::PPPort::uvchr_to_utf8($changed);
+ $should_be_bytes = Devel::PPPort::UTF8_SAFE_SKIP($utf8_changed, 0);
+ }
+ else {
+ die("Test currently doesn't work for non-ASCII multi-char case changes") if eval '$utf8_changed =~ /[[:^ascii:]]/';
+ $should_be_bytes = length $utf8_changed;
+ }
+ }
+
+ my $fcn = "to${name}_uvchr";
+ my $skip = "";
+
+ if (ivers($]) < ivers(5.6)) {
+ $skip = $way_too_early_msg;
+ }
+ elsif (! $is_cp) {
+ $skip = "Can't do uvchr on a multi-char string";
+ }
+ if ($skip) {
+ skip $skip, 4;
+ }
+ else {
+ if ($is_cp) {
+ $utf8_changed = Devel::PPPort::uvchr_to_utf8($changed);
+ $should_be_bytes = Devel::PPPort::UTF8_SAFE_SKIP($utf8_changed, 0);
+ }
+ else {
+ my $non_ascii_re = (ivers($]) >= ivers(5.6)) ? '[[:^ascii:]]' : '[^\x00-\x7F]';
+ die("Test currently doesn't work for non-ASCII multi-char case changes") if eval '$utf8_changed =~ /$non_ascii_re/';
+ $should_be_bytes = length $utf8_changed;
+ }
+
+ my $ret = eval "Devel::PPPort::$fcn($original)";
+ my $fail = $@; # Have to save $@, as it gets destroyed
+ is ($fail, "", "$fcn($original) didn't fail");
+ my $first = (ivers($]) != ivers(5.6))
+ ? substr($utf8_changed, 0, 1)
+ : $utf8_changed, 0, 1;
+ is($ret->[0], ord $first,
+ "ord of $fcn($original) is $changed");
+ is($ret->[1], $utf8_changed,
+ "UTF-8 of of $fcn($original) is correct");
+ is($ret->[2], $should_be_bytes,
+ "Length of $fcn($original) is $should_be_bytes");
+ }
+
+ my $truncate;
+ for $truncate (0..2) {
+ my $skip;
+ if (ivers($]) < ivers(5.6)) {
+ $skip = $way_too_early_msg;
+ }
+ elsif (! $is_cp && ivers($]) < ivers(5.7.3)) {
+ $skip = "Multi-character case change not implemented until 5.7.3";
+ }
+ elsif ($truncate == 2 && ivers($]) > ivers(5.25.8)) {
+ $skip = "Zero length inputs cause assertion failure; test dies in modern perls";
+ }
+ elsif ($truncate > 0 && length $changed > 1) {
+ $skip = "Don't test shortened multi-char case changes";
+ }
+ elsif ($truncate > 0 && Devel::PPPort::UVCHR_IS_INVARIANT($original)) {
+ $skip = "Don't try to test shortened single bytes";
+ }
+ if ($skip) {
+ skip $skip, 4;
+ }
+ else {
+ my $fcn = "to${name}_utf8_safe";
+ my $utf8 = quotemeta Devel::PPPort::uvchr_to_utf8($original);
+ my $real_truncate = ($truncate < 2)
+ ? $truncate : $should_be_bytes;
+ my $eval_string = "Devel::PPPort::$fcn(\"$utf8\", $real_truncate)";
+ my $ret = eval "no warnings; $eval_string" || 0;
+ my $fail = $@; # Have to save $@, as it gets destroyed
+ if ($truncate == 0) {
+ is ($fail, "", "Didn't fail on full length input");
+ my $first = (ivers($]) != ivers(5.6))
+ ? substr($utf8_changed, 0, 1)
+ : $utf8_changed, 0, 1;
+ is($ret->[0], ord $first,
+ "ord of $fcn($original) is $changed");
+ is($ret->[1], $utf8_changed,
+ "UTF-8 of of $fcn($original) is correct");
+ is($ret->[2], $should_be_bytes,
+ "Length of $fcn($original) is $should_be_bytes");
+ }
+ else {
+ is ($fail, eval 'qr/Malformed UTF-8 character/',
+ "Gave appropriate error for short char: $original");
+ skip("Expected failure means remaining tests for"
+ . " this aren't relevant", 3);
+ }
+ }
+ }
+ }
+}
-ok(&Devel::PPPort::av_top_index([1,2,3]), 2);
-ok(&Devel::PPPort::av_tindex([1,2,3,4]), 3);
+is(&Devel::PPPort::av_top_index([1,2,3]), 2);
+is(&Devel::PPPort::av_tindex([1,2,3,4]), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB
index 336a8e00b8d..fe0a6ce1717 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newCONSTSUB
@@ -13,6 +13,10 @@
newCONSTSUB
+=dontwarn
+
+NEED_newCONSTSUB /* Because we define this weirdly */
+
=implementation
/* Hint: newCONSTSUB
@@ -22,6 +26,11 @@ newCONSTSUB
/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
#if { VERSION < 5.004_63 } && { VERSION != 5.004_05 }
+
+/* And before that, we need to make sure this gets compiled for the functions
+ * that rely on it */
+#define NEED_newCONSTSUB
+
#if { NEED newCONSTSUB }
/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
@@ -43,13 +52,7 @@ newCONSTSUB(HV *stash, const char *name, SV *sv)
newSUB(
-#if { VERSION < 5.003_22 }
- start_subparse(),
-#elif { VERSION == 5.003_22 }
- start_subparse(0),
-#else /* 5.003_23 onwards */
start_subparse(FALSE, 0),
-#endif
newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */
@@ -95,10 +98,10 @@ call_newCONSTSUB_3()
=tests plan => 3
&Devel::PPPort::call_newCONSTSUB_1();
-ok(&Devel::PPPort::test_value_1(), 1);
+is(&Devel::PPPort::test_value_1(), 1);
&Devel::PPPort::call_newCONSTSUB_2();
-ok(&Devel::PPPort::test_value_2(), 2);
+is(&Devel::PPPort::test_value_2(), 2);
&Devel::PPPort::call_newCONSTSUB_3();
-ok(&Devel::PPPort::test_value_3(), 3);
+is(&Devel::PPPort::test_value_3(), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV
index 6db6dfc54fe..6be9ca55a8a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newRV
@@ -19,21 +19,13 @@ newRV_noinc
__UNDEFINED__ newRV_inc(sv) newRV(sv) /* Replace */
#ifndef newRV_noinc
-#if { NEED newRV_noinc }
-SV *
-newRV_noinc(SV *sv)
-{
- SV *rv = (SV *)newRV(sv);
- SvREFCNT_dec(sv);
- return rv;
-}
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define newRV_noinc(sv) ({ SV *_sv = (SV *)newRV((sv)); SvREFCNT_dec((sv)); _sv; })
+#else
+# define newRV_noinc(sv) ((PL_Sv = (SV *)newRV((sv))), SvREFCNT_dec((sv)), PL_Sv)
#endif
#endif
-=xsinit
-
-#define NEED_newRV_noinc
-
=xsubs
U32
@@ -63,5 +55,5 @@ newRV_noinc_REFCNT()
=tests plan => 2
-ok(&Devel::PPPort::newRV_inc_REFCNT, 1);
-ok(&Devel::PPPort::newRV_noinc_REFCNT, 1);
+is(&Devel::PPPort::newRV_inc_REFCNT, 1);
+is(&Devel::PPPort::newRV_noinc_REFCNT, 1);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type
index 039f8010bb5..4b17419917a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSV_type
@@ -16,25 +16,13 @@ newSV_type
=implementation
#ifndef newSV_type
-
-#if { NEED newSV_type }
-
-SV*
-newSV_type(pTHX_ svtype const t)
-{
- SV* const sv = newSV(0);
- sv_upgrade(sv, t);
- return sv;
-}
-
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define newSV_type(t) ({ SV *_sv = newSV(0); sv_upgrade(_sv, (t)); _sv; })
+#else
+# define newSV_type(t) ((PL_Sv = newSV(0)), sv_upgrade(PL_Sv, (t)), PL_Sv)
#endif
-
#endif
-=xsinit
-
-#define NEED_newSV_type
-
=xsubs
int
@@ -76,4 +64,4 @@ newSV_type()
=tests plan => 1
-ok(Devel::PPPort::newSV_type(), 4);
+is(Devel::PPPort::newSV_type(), 4);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv
index 7dbe5d03b4f..22e2fb6daa3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/newSVpv
@@ -31,25 +31,13 @@ __UNDEFINED__ newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UT
__UNDEFINED__ SVf_UTF8 0
#ifndef newSVpvn_flags
-
-#if { NEED newSVpvn_flags }
-
-SV *
-newSVpvn_flags(pTHX_ const char *s, STRLEN len, U32 flags)
-{
- SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len);
- SvFLAGS(sv) |= (flags & SVf_UTF8);
- return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
-}
-
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define newSVpvn_flags(s, len, flags) ({ SV *_sv = newSVpvn(D_PPP_CONSTPV_ARG((s)), (len)); SvFLAGS(_sv) |= ((flags) & SVf_UTF8); ((flags) & SVs_TEMP) ? sv_2mortal(_sv) : _sv; })
+#else
+# define newSVpvn_flags(s, len, flags) ((PL_Sv = newSVpvn(D_PPP_CONSTPV_ARG((s)), (len))), SvFLAGS(PL_Sv) |= ((flags) & SVf_UTF8), (((flags) & SVs_TEMP) ? sv_2mortal(PL_Sv) : PL_Sv))
#endif
-
#endif
-=xsinit
-
-#define NEED_newSVpvn_flags
-
=xsubs
void
@@ -82,28 +70,28 @@ newSVpvn_utf8()
my @s = &Devel::PPPort::newSVpvn();
ok(@s == 5);
-ok($s[0], "test");
-ok($s[1], "te");
-ok($s[2], "");
+is($s[0], "test");
+is($s[1], "te");
+is($s[2], "");
ok(!defined($s[3]));
ok(!defined($s[4]));
@s = &Devel::PPPort::newSVpvn_flags();
ok(@s == 5);
-ok($s[0], "test");
-ok($s[1], "te");
-ok($s[2], "");
+is($s[0], "test");
+is($s[1], "te");
+is($s[2], "");
ok(!defined($s[3]));
ok(!defined($s[4]));
@s = &Devel::PPPort::newSVpvn_utf8();
ok(@s == 1);
-ok($s[0], "test");
+is($s[0], "test");
if ("$]" >= 5.008001) {
require utf8;
ok(utf8::is_utf8($s[0]));
}
else {
- skip("skip: no is_utf8()", 0);
+ skip("skip: no is_utf8()", 1);
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest
index d7255b916f1..df18c3a4a82 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/podtest
@@ -22,11 +22,11 @@ else {
# Try loading Test::Pod
eval q{
use Test::Pod;
- $Test::Pod::VERSION >= 0.95
+ $Test::Pod::VERSION >= 1.41
or die "Test::Pod version only $Test::Pod::VERSION";
import Test::Pod tests => scalar @pods;
};
- $reason = 'Test::Pod >= 0.95 required' if $@;
+ $reason = 'Test::Pod >= 1.41 required' if $@;
}
if ($reason) {
@@ -37,7 +37,7 @@ if ($reason) {
for (@pods) {
print "# checking $_\n";
if ($reason) {
- skip("skip: $reason", 0);
+ skip("skip: $reason", 1);
}
else {
pod_file_ok($_);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin
index 9b56eaf5c60..975e3f64bab 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphbin
@@ -15,6 +15,8 @@
use strict;
+BEGIN { require warnings if "$]" > '5.006' }
+
# Disable broken TRIE-optimization
BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if "$]" >= 5.009004 && "$]" <= 5.009005 }
@@ -63,26 +65,31 @@ if ($opt{version}) {
usage() if $opt{help};
strip() if $opt{strip};
-if (exists $opt{'compat-version'}) {
- my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
- if ($@) {
- die "Invalid version number format: '$opt{'compat-version'}'\n";
- }
- die "Only Perl 5 is supported\n" if $r != 5;
- die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
- $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
-}
-else {
- $opt{'compat-version'} = 5;
-}
+$opt{'compat-version'} = __MIN_PERL__ unless exists $opt{'compat-version'};
+$opt{'compat-version'} = int_parse_version($opt{'compat-version'});
+
+my $int_min_perl = int_parse_version(__MIN_PERL__);
+# Each element of this hash looks something like:
+# 'Poison' => {
+# 'base' => '5.008000',
+# 'provided' => 1,
+# 'todo' => '5.003007'
+# },
my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
? ( $1 => {
($2 ? ( base => $2 ) : ()),
($3 ? ( todo => $3 ) : ()),
(index($4, 'v') >= 0 ? ( varargs => 1 ) : ()),
(index($4, 'p') >= 0 ? ( provided => 1 ) : ()),
- (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()),
+ (index($4, 'n') >= 0 ? ( noTHXarg => 1 ) : ()),
+ (index($4, 'c') >= 0 ? ( core_only => 1 ) : ()),
+ (index($4, 'd') >= 0 ? ( deprecated => 1 ) : ()),
+ (index($4, 'i') >= 0 ? ( inaccessible => 1 ) : ()),
+ (index($4, 'x') >= 0 ? ( experimental => 1 ) : ()),
+ (index($4, 'u') >= 0 ? ( undocumented => 1 ) : ()),
+ (index($4, 'o') >= 0 ? ( ppport_fnc => 1 ) : ()),
+ (index($4, 'V') >= 0 ? ( unverified => 1 ) : ()),
} )
: die "invalid spec: $_" } qw(
__PERL_API__
@@ -90,14 +97,19 @@ __PERL_API__
if (exists $opt{'list-unsupported'}) {
my $f;
- for $f (sort { lc $a cmp lc $b } keys %API) {
+ for $f (sort dictionary_order keys %API) {
+ next if $API{$f}{core_only};
+ next if $API{$f}{beyond_depr};
+ next if $API{$f}{inaccessible};
+ next if $API{$f}{experimental};
next unless $API{$f}{todo};
+ next if int_parse_version($API{$f}{todo}) <= $int_min_perl;
print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
}
exit 0;
}
-# Scan for possible replacement candidates
+# Scan for hints, possible replacement candidates, etc.
my(%replace, %need, %hints, %warnings, %depends);
my $replace = 0;
@@ -105,6 +117,7 @@ my($hint, $define, $function);
sub find_api
{
+ BEGIN { 'warnings'->unimport('uninitialized') if "$]" > '5.006' }
my $code = shift;
$code =~ s{
/ (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
@@ -115,24 +128,65 @@ sub find_api
while (<DATA>) {
if ($hint) {
+
+ # Here, we are in the middle of accumulating a hint or warning.
+ my $end_of_hint = 0;
+
+ # A line containing a comment end marker closes the hint. Remove that
+ # marker for processing below.
+ if (s/\s*$rcce(.*?)\s*$//) {
+ die "Nothing can follow the end of comment in '$_'\n" if length $1 > 0;
+ $end_of_hint = 1;
+ }
+
+ # Set $h to the hash of which type.
my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
- if (m{^\s*\*\s(.*?)\s*$}) {
- for (@{$hint->[1]}) {
- $h->{$_} ||= ''; # suppress warning with older perls
- $h->{$_} .= "$1\n";
- }
+
+ # Ignore any leading and trailing white space, and an optional star comment
+ # continuation marker, then place the meat of the line into $1
+ m/^\s*(?:\*\s*)?(.*?)\s*$/;
+
+ # Add the meat of this line to the hash value of each API element it
+ # applies to
+ for (@{$hint->[1]}) {
+ $h->{$_} ||= ''; # avoid the warning older perls generate
+ $h->{$_} .= "$1\n";
}
- else { undef $hint }
- }
- $hint = [$1, [split /,?\s+/, $2]]
- if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
+ # If the line had a comment close, we are through with this hint
+ undef $hint if $end_of_hint;
+
+ next;
+ }
- if ($define) {
+ # Set up $hint if this is the beginning of a Hint: or Warning:
+ # These are from a multi-line C comment in the file, with the first line
+ # looking like (a space has been inserted because this file can't have C
+ # comment markers in it):
+ # / * Warning: PL_expect, PL_copline, PL_rsfp
+ #
+ # $hint becomes
+ # [
+ # 'Warning',
+ # [
+ # 'PL_expect',
+ # 'PL_copline',
+ # 'PL_rsfp',
+ # ],
+ # ]
+ if (m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}) {
+ $hint = [$1, [split /,?\s+/, $2]];
+ next;
+ }
+
+ if ($define) { # If in the middle of a definition...
+
+ # append a continuation line ending with backslash.
if ($define->[1] =~ /\\$/) {
$define->[1] .= $_;
}
- else {
+ else { # Otherwise this line ends the definition, make foo depend on bar
+ # (and what bar depends on) if its not one of ppp's own constructs
if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
my @n = find_api($define->[1]);
push @{$depends{$define->[0]}}, @n if @n
@@ -141,6 +195,8 @@ while (<DATA>) {
}
}
+ # For '#define foo bar' or '#define foo(a,b,c) bar', $define becomes a
+ # reference to [ foo, bar ]
$define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
if ($function) {
@@ -158,11 +214,29 @@ while (<DATA>) {
$function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
+ # Set $replace to the number given for lines that look like
+ # / * Replace: \d+ * /
+ # (blanks added to keep real C comments from appearing in this file)
+ # Thus setting it to 1 starts a region where replacements are automatically
+ # done, and setting it to 0 ends that region.
$replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+
+ # Add bar => foo to %replace for lines like '#define foo bar in a region
+ # where $replace is non-zero
$replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+
+ # Add bar => foo to %replace for lines like '#define foo bar / * Replace * /
+ # (blanks added to keep real C comments from appearing in this file)
$replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+
+ # Add foo => bar to %replace for lines like / * Replace foo with bar * /
+ # (blanks added to keep real C comments from appearing in this file)
$replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+ # For lines like / * foo, bar depends on baz, bat * /
+ # create a list of the elements on the rhs, and make that list apply to each
+ # element in the lhs, which becomes a key in \%depends.
+ # (blanks added to keep real C comments from appearing in this file)
if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
my @deps = map { s/\s+//g; $_ } split /,/, $3;
my $d;
@@ -175,43 +249,145 @@ while (<DATA>) {
}
for (values %depends) {
- my %s;
- $_ = [sort grep !$s{$_}++, @$_];
+ my %seen;
+ $_ = [sort dictionary_order grep !$seen{$_}++, @$_];
}
if (exists $opt{'api-info'}) {
my $f;
my $count = 0;
my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
- for $f (sort { lc $a cmp lc $b } keys %API) {
+ for $f (sort dictionary_order keys %API) {
next unless $f =~ /$match/;
- print "\n=== $f ===\n\n";
+ print "\n=== $f ===\n";
my $info = 0;
- if ($API{$f}{base} || $API{$f}{todo}) {
- my $base = format_version($API{$f}{base} || $API{$f}{todo});
- print "Supported at least starting from perl-$base.\n";
- $info++;
+ my $base;
+ $base = int_parse_version($API{$f}{base}) if $API{$f}{base};
+ my $todo;
+ $todo = int_parse_version($API{$f}{todo}) if $API{$f}{todo};
+
+ # Output information if it is generally publicly usable
+ if ($base && ! $API{$f}{inaccessible} && ! $API{$f}{core_only}) {
+ my $with_or= "";
+ if ( $base <= $int_min_perl
+ || ( (! $API{$f}{provided} && ! $todo)
+ || ($todo && $todo >= $base)))
+ {
+ $with_or= " with or";
+ }
+ print "\nSupported at least since perl-",
+ format_version($base), ",$with_or without $ppport.";
+ if ($API{$f}{unverified}) {
+ print "\nThis information is based on inspection of the source code",
+ " and has not been\n",
+ "verified by successful compilation.";
+ }
+ print "\n";
+ $info++;
+ }
+ if ($API{$f}{provided} || $todo) {
+ print "\nThis is only supported by $ppport, and NOT by perl versions going forward.\n" unless $base;
+ if ($todo) {
+ if (! $base || $todo < $base) {
+ my $additionally = "";
+ $additionally .= " additionally" if $base;
+ print "$ppport$additionally provides support at least back to perl-",
+ format_version($todo),
+ ".\n";
+ }
+ }
+ elsif (! $base || $base > $int_min_perl) {
+ if (exists $depends{$f}) {
+ my $max = 0;
+ for (@{$depends{$f}}) {
+ $max = int_parse_version($API{$_}{todo}) if $API{$_}{todo} && $API{$_}{todo} > $max;
+ # XXX What to assume unspecified values are? This effectively makes them MIN_PERL
+ }
+ $todo = $max if $max;
+ }
+ print "\n$ppport provides support for this, but ironically, does not",
+ " currently know,\n",
+ "for this report, the minimum version it supports for this";
+ if ($API{$f}{undocumented}) {
+ print " and many things\n",
+ "it provides that are implemented as macros and aren't",
+ " documented. You can\n",
+ "help by submitting a documentation patch";
+ }
+ print ".\n";
+ if ($todo) {
+ if ($todo <= $int_min_perl) {
+ print "It may very well be supported all the way back to ",
+ format_version(__MIN_PERL__), ".\n";
+ }
+ else {
+ print "But given the things $f depends on, it's a good",
+ " guess that it isn't\n",
+ "supported prior to ", format_version($todo), ".\n";
+ }
+ }
+ }
}
if ($API{$f}{provided}) {
- my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "__MIN_PERL__";
- print "Support by $ppport provided back to perl-$todo.\n";
- print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
- print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+ print "Support needs to be explicitly requested by #define NEED_$f\n",
+ "(or #define NEED_${f}_GLOBAL).\n" if exists $need{$f};
+ $info++;
+ }
+
+ if ($base || ! $API{$f}{ppport_fnc}) {
+ my $email = "Send email to perl5-porters\@perl.org if you need to have this functionality.\n";
+ if ($API{$f}{inaccessible}) {
+ print "\nThis is not part of the public API, and may not even be accessible to XS code.\n";
+ $info++;
+ }
+ elsif ($API{$f}{core_only}) {
+ print "\nThis is not part of the public API, and should not be used by XS code.\n";
+ $info++;
+ }
+ elsif ($API{$f}{deprecated}) {
+ print "\nThis is deprecated and should not be used. Convert existing uses.\n";
+ $info++;
+ }
+ elsif ($API{$f}{experimental}) {
+ print "\nThe API for this is unstable and should not be used by XS code.\n", $email;
+ $info++;
+ }
+ elsif ($API{$f}{undocumented}) {
+ print "\nSince this is undocumented, the API should be considered unstable.\n";
+ if ($API{$f}{provided}) {
+ print "Consider bringing this up on the list: perl5-porters\@perl.org.\n";
+ }
+ else {
+ print "It may be that this is not intended for XS use, or it may just be\n",
+ "that no one has gotten around to documenting it.\n", $email;
+ }
+ $info++;
+ }
+ unless ($info) {
+ print "No portability information available. Check your spelling; or",
+ " this could be\na bug in Devel::PPPort. To report an issue:\n",
+ "https://github.com/Dual-Life/Devel-PPPort/issues/new\n";
+ }
+ }
+
+ print "\nDepends on: ", join(', ', @{$depends{$f}}), ".\n"
+ if exists $depends{$f};
+ if (exists $hints{$f} || exists $warnings{$f}) {
print "\n$hints{$f}" if exists $hints{$f};
print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
$info++;
}
- print "No portability information available.\n" unless $info;
$count++;
}
- $count or print "Found no API matching '$opt{'api-info'}'.";
+
+ $count or print "\nFound no API matching '$opt{'api-info'}'.";
print "\n";
exit 0;
}
if (exists $opt{'list-provided'}) {
my $f;
- for $f (sort { lc $a cmp lc $b } keys %API) {
+ for $f (sort dictionary_order keys %API) {
next unless $API{$f}{provided};
my @flags;
push @flags, 'explicit' if exists $need{$f};
@@ -317,7 +493,9 @@ for $filename (@files) {
$file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
if (exists $API{$func}{provided}) {
$file{uses_provided}{$func}++;
- if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+ if ( ! exists $API{$func}{base}
+ || int_parse_version($API{$func}{base}) > $opt{'compat-version'})
+ {
$file{uses}{$func}++;
my @deps = rec_depend($func);
if (@deps) {
@@ -331,7 +509,9 @@ for $filename (@files) {
}
}
}
- if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+ if ( exists $API{$func}{todo}
+ && int_parse_version($API{$func}{todo}) > $opt{'compat-version'})
+ {
if ($c =~ /\b$func\b/) {
$file{uses_todo}{$func}++;
}
@@ -382,9 +562,9 @@ for $filename (@files) {
my $c = $file{code};
my $warnings = 0;
- for $func (sort keys %{$file{uses_Perl}}) {
+ for $func (sort dictionary_order keys %{$file{uses_Perl}}) {
if ($API{$func}{varargs}) {
- unless ($API{$func}{nothxarg}) {
+ unless ($API{$func}{noTHXarg}) {
my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
{ $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
if ($changes) {
@@ -400,12 +580,12 @@ for $filename (@files) {
}
}
- for $func (sort keys %{$file{uses_replace}}) {
+ for $func (sort dictionary_order keys %{$file{uses_replace}}) {
warning("Uses $func instead of $replace{$func}");
$file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
}
- for $func (sort keys %{$file{uses_provided}}) {
+ for $func (sort dictionary_order keys %{$file{uses_provided}}) {
if ($file{uses}{$func}) {
if (exists $file{uses_deps}{$func}) {
diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
@@ -418,14 +598,15 @@ for $filename (@files) {
}
unless ($opt{quiet}) {
- for $func (sort keys %{$file{uses_todo}}) {
+ for $func (sort dictionary_order keys %{$file{uses_todo}}) {
+ next if int_parse_version($API{$func}{todo}) <= $int_min_perl;
print "*** WARNING: Uses $func, which may not be portable below perl ",
format_version($API{$func}{todo}), ", even with '$ppport'\n";
$warnings++;
}
}
- for $func (sort keys %{$file{needed_static}}) {
+ for $func (sort dictionary_order keys %{$file{needed_static}}) {
my $message = '';
if (not exists $file{uses}{$func}) {
$message = "No need to define NEED_$func if $func is never used";
@@ -439,7 +620,7 @@ for $filename (@files) {
}
}
- for $func (sort keys %{$file{needed_global}}) {
+ for $func (sort dictionary_order keys %{$file{needed_global}}) {
my $message = '';
if (not exists $global{uses}{$func}) {
$message = "No need to define NEED_${func}_GLOBAL if $func is never used";
@@ -463,7 +644,7 @@ for $filename (@files) {
if ($file{needs_inc_ppport}) {
my $pp = '';
- for $func (sort keys %{$file{needs}}) {
+ for $func (sort dictionary_order keys %{$file{needs}}) {
my $type = $file{needs}{$func};
next if $type eq 'extern';
my $suffix = $type eq 'global' ? '_GLOBAL' : '';
@@ -660,59 +841,6 @@ sub rec_depend
grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
}
-sub parse_version
-{
- my $ver = shift;
-
- if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
- return ($1, $2, $3);
- }
- elsif ($ver !~ /^\d+\.[\d_]+$/) {
- die "cannot parse version '$ver'\n";
- }
-
- $ver =~ s/_//g;
- $ver =~ s/$/000000/;
-
- my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
-
- $v = int $v;
- $s = int $s;
-
- if ($r < 5 || ($r == 5 && $v < 6)) {
- if ($s % 10) {
- die "cannot parse version '$ver'\n";
- }
- }
-
- return ($r, $v, $s);
-}
-
-sub format_version
-{
- my $ver = shift;
-
- $ver =~ s/$/000000/;
- my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
-
- $v = int $v;
- $s = int $s;
-
- if ($r < 5 || ($r == 5 && $v < 6)) {
- if ($s % 10) {
- die "invalid version '$ver'\n";
- }
- $s /= 10;
-
- $ver = sprintf "%d.%03d", $r, $v;
- $s > 0 and $ver .= sprintf "_%02d", $s;
-
- return $ver;
- }
-
- return sprintf "%d.%d.%d", $r, $v, $s;
-}
-
sub info
{
$opt{quiet} and return;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc
index 857f39e3fcb..57aa6ad5941 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphdoc
@@ -290,6 +290,10 @@ to display information for all known API elements.
=head1 BUGS
+Some of the suggested edits and/or generated patches may not compile as-is
+without tweaking manually. This is generally due to the need for an extra
+parameter to be added to the call to prevent buffer overflow.
+
If this version of F<ppport.h> is causing failure during
the compilation of this module, please check if newer versions
of either this module or C<Devel::PPPort> are available on CPAN
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest
index 2be43315633..9b13279f92e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/ppphtest
@@ -13,9 +13,7 @@
BEGIN {
if ($ENV{'SKIP_SLOW_TESTS'}) {
- for (1 .. 238) {
- skip("skip: SKIP_SLOW_TESTS", 0);
- }
+ skip("skip: SKIP_SLOW_TESTS", 238);
exit 0;
}
}
@@ -59,7 +57,7 @@ END {
ok(&Devel::PPPort::WriteFile("ppport.h"));
# Check GetFileContents()
-ok(-e "ppport.h", 1);
+is(-e "ppport.h", 1);
my $data;
@@ -69,8 +67,8 @@ while(<F>) {
}
close(F);
-ok(Devel::PPPort::GetFileContents("ppport.h"), $data);
-ok(Devel::PPPort::GetFileContents(), $data);
+is(Devel::PPPort::GetFileContents("ppport.h"), $data);
+is(Devel::PPPort::GetFileContents(), $data);
sub comment
{
@@ -168,7 +166,7 @@ for $t (@tests) {
$err =~ s/^/# *** /mg;
print "# *** ERROR ***\n$err\n";
}
- ok($@, '');
+ is($@, '');
for (keys %{$t->{files}}) {
unlink $_ or die "unlink('$_'): $!\n";
@@ -214,8 +212,8 @@ ok($o =~ /^This is.*ppport.*\d+\.\d+(?:_?\d+)?\.$/);
$o = ppport(qw(--nochanges));
ok($o =~ /^Scanning.*test\.xs/mi);
ok($o =~ /Analyzing.*test\.xs/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
-ok(matches($o, 'Analyzing', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, 'Analyzing', 'm'), 1);
ok($o =~ /Uses Perl_newSViv instead of newSViv/);
$o = ppport(qw(--quiet --nochanges));
@@ -232,7 +230,7 @@ Perl_newSViv();
my $o = ppport(qw(--copy=a));
ok($o =~ /^Scanning.*MyExt\.xs/mi);
ok($o =~ /Analyzing.*MyExt\.xs/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
ok($o =~ /^Needs to include.*ppport\.h/m);
ok($o !~ /^Uses grok_bin/m);
ok($o !~ /^Uses newSVpv/m);
@@ -244,7 +242,7 @@ ok(eq_files('MyExt.xsa', 'MyExt.ra'));
$o = ppport(qw(--copy=b --cplusplus));
ok($o =~ /^Scanning.*MyExt\.xs/mi);
ok($o =~ /Analyzing.*MyExt\.xs/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
ok($o =~ /^Needs to include.*ppport\.h/m);
ok($o !~ /^Uses grok_bin/m);
ok($o !~ /^Uses newSVpv/m);
@@ -350,7 +348,6 @@ ok($o =~ /^\s*$/);
---------------------------- file1.xs -----------------------------------------
#define NEED_newCONSTSUB
-#define NEED_sv_2pv_flags
#define NEED_PL_parser
#include "ppport.h"
@@ -367,7 +364,7 @@ mXPUSHp(foo);
my $o = ppport(qw(--nochanges));
ok($o =~ /^Scanning.*FooBar\.xs/mi);
ok($o =~ /Analyzing.*FooBar\.xs/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
ok($o !~ /^Looks good/m);
ok($o =~ /^Uses grok_bin/m);
@@ -387,7 +384,7 @@ ok($o =~ /Analyzing.*second\.h/mi);
ok($o =~ /^Scanning.*sub.*third\.c/mi);
ok($o =~ /Analyzing.*sub.*third\.c/mi);
ok($o !~ /^Scanning.*foobar/mi);
-ok(matches($o, '^Scanning', 'm'), 3);
+is(matches($o, '^Scanning', 'm'), 3);
---------------------------- First.xs -----------------------------------------
@@ -423,9 +420,9 @@ for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {
ok($o =~ /^Scanning.*\Q$_\E/mi);
ok($o =~ /Analyzing.*\Q$_\E/i);
}
-ok(matches($o, '^Scanning', 'm'), 6);
+is(matches($o, '^Scanning', 'm'), 6);
-ok(matches($o, '^Writing copy of', 'm'), 5);
+is(matches($o, '^Writing copy of', 'm'), 5);
ok(!-e "mod5.cf");
for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {
@@ -522,7 +519,6 @@ call_pv();
#define NEED_eval_pv_GLOBAL
#define NEED_grok_hex
#define NEED_newCONSTSUB_GLOBAL
-#define NEED_sv_2pv_flags_GLOBAL
#include "ppport.h"
newCONSTSUB();
@@ -635,7 +631,7 @@ SvPVutf8_force();
my $o = ppport(qw(--nochanges));
ok($o !~ /potentially required change/);
-ok(matches($o, '^Looks good', 'm'), 2);
+is(matches($o, '^Looks good', 'm'), 2);
---------------------------- FooBar.xs ----------------------------------------
@@ -658,20 +654,20 @@ call_pv();
my $o = ppport(qw(--api-info=INT2PTR));
my %found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
-ok(scalar keys %found, 1);
+is(scalar keys %found, 1, "found 1 key");
ok(exists $found{INT2PTR});
-ok(matches($o, '^Supported at least starting from perl-5\.6\.0\.', 'm'), 1);
-ok(matches($o, '^Support by .*ppport.* provided back to perl-5\.003\.', 'm'), 1);
+is(matches($o, '^Supported at least since perl-5\.6\.0', 'm'), 1, "INT2PTR supported without ppport.h to 5.6.0");
+is(matches($o, '^ppport.h additionally provides support at least back to perl-5\.003', 'm'), 1, "INT2PTR supported with ppport.h to 5.003");
$o = ppport(qw(--api-info=Zero));
%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
-ok(scalar keys %found, 1);
+is(scalar keys %found, 1, "found 1 key");
ok(exists $found{Zero});
-ok(matches($o, '^No portability information available\.', 'm'), 1);
+is(matches($o, '^Supported at least since perl-5.003', 'm'), 1, "Zero supported to 5.003");
$o = ppport(qw(--api-info=/Zero/));
%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
-ok(scalar keys %found, 2);
+is(scalar keys %found, 2, "found 2 keys");
ok(exists $found{Zero});
ok(exists $found{ZeroD});
@@ -688,32 +684,32 @@ for (@o) {
$p{$name} = defined $flags ? { map { ($_ => 1) } $flags =~ /(\w+)/g } : '';
}
ok(@o > 100);
-ok($fail, 0);
+is($fail, 0);
ok(exists $p{call_pv});
ok(not ref $p{call_pv});
ok(exists $p{grok_bin});
-ok(ref $p{grok_bin}, 'HASH');
-ok(scalar keys %{$p{grok_bin}}, 2);
+is(ref $p{grok_bin}, 'HASH');
+is(scalar keys %{$p{grok_bin}}, 2);
ok($p{grok_bin}{explicit});
ok($p{grok_bin}{depend});
ok(exists $p{gv_stashpvn});
-ok(ref $p{gv_stashpvn}, 'HASH');
-ok(scalar keys %{$p{gv_stashpvn}}, 2);
+is(ref $p{gv_stashpvn}, 'HASH');
+is(scalar keys %{$p{gv_stashpvn}}, 2);
ok($p{gv_stashpvn}{depend});
ok($p{gv_stashpvn}{hint});
ok(exists $p{sv_catpvf_mg});
-ok(ref $p{sv_catpvf_mg}, 'HASH');
-ok(scalar keys %{$p{sv_catpvf_mg}}, 2);
+is(ref $p{sv_catpvf_mg}, 'HASH');
+is(scalar keys %{$p{sv_catpvf_mg}}, 2);
ok($p{sv_catpvf_mg}{explicit});
ok($p{sv_catpvf_mg}{depend});
ok(exists $p{PL_signals});
-ok(ref $p{PL_signals}, 'HASH');
-ok(scalar keys %{$p{PL_signals}}, 1);
+is(ref $p{PL_signals}, 'HASH');
+is(scalar keys %{$p{PL_signals}}, 1);
ok($p{PL_signals}{explicit});
===============================================================================
@@ -729,13 +725,13 @@ for (@o) {
$p{$name} = $ver;
}
ok(@o > 100);
-ok($fail, 0);
+is($fail, 0);
ok(exists $p{utf8_distance});
-ok($p{utf8_distance}, '5.6.0');
+is($p{utf8_distance}, '5.6.0');
ok(exists $p{save_generic_svref});
-ok($p{save_generic_svref}, '5.005_03');
+is($p{save_generic_svref}, '5.005_03');
===============================================================================
@@ -744,17 +740,17 @@ ok($p{save_generic_svref}, '5.005_03');
my $o = ppport(qw(--nochanges));
ok($o =~ /^Scanning.*foo\.cpp/mi);
ok($o =~ /Analyzing.*foo\.cpp/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
-ok(matches($o, 'Analyzing', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, 'Analyzing', 'm'), 1);
$o = ppport(qw(--nochanges foo.cpp foo.o Makefile.PL));
ok($o =~ /Skipping the following files \(use --nofilter to avoid this\):/m);
-ok(matches($o, '^\|\s+foo\.o', 'mi'), 1);
-ok(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
+is(matches($o, '^\|\s+foo\.o', 'mi'), 1);
+is(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
ok($o =~ /^Scanning.*foo\.cpp/mi);
ok($o =~ /Analyzing.*foo\.cpp/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
-ok(matches($o, 'Analyzing', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, 'Analyzing', 'm'), 1);
$o = ppport(qw(--nochanges --nofilter foo.cpp foo.o Makefile.PL));
ok($o =~ /^Scanning.*foo\.cpp/mi);
@@ -763,8 +759,8 @@ ok($o =~ /^Scanning.*foo\.o/mi);
ok($o =~ /Analyzing.*foo\.o/mi);
ok($o =~ /^Scanning.*Makefile/mi);
ok($o =~ /Analyzing.*Makefile/mi);
-ok(matches($o, '^Scanning', 'm'), 3);
-ok(matches($o, 'Analyzing', 'm'), 3);
+is(matches($o, '^Scanning', 'm'), 3);
+is(matches($o, 'Analyzing', 'm'), 3);
---------------------------- foo.cpp ------------------------------------------
@@ -879,8 +875,6 @@ for (qw(file.xs)) {
---------------------------- file.xs -----------------------------------------
-#define NEED_sv_2pv_flags
-#define NEED_vnewSVpvf
#define NEED_warner
#include "ppport.h"
Perl_croak_nocontext("foo");
@@ -894,8 +888,6 @@ warner("foo");
---------------------------- file.xsr -----------------------------------------
-#define NEED_sv_2pv_flags
-#define NEED_vnewSVpvf
#define NEED_warner
#include "ppport.h"
Perl_croak_nocontext("foo");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools
index c51d91ab22c..c523d1c59aa 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pv_tools
@@ -257,20 +257,28 @@ ok($uni ? "$]" >= 5.006 : "$]" < 5.008);
my @r;
@r = &Devel::PPPort::pv_pretty();
-ok($r[0], $r[1]);
-ok($r[0], "foobarbaz");
-ok($r[2], $r[3]);
-ok($r[2], '<leftpv_p\retty\nright>');
-ok($r[4], $r[5]);
-skip(ord("A") != 65 ? "Skip for non-ASCII platform" : 0,
- $r[4], $uni ? 'N\375 Batter\355' : 'N\303\275 Batter\303');
-ok($r[6], $r[7]);
-skip(ord("A") != 65 ? "Skip for non-ASCII platform" : 0,
- $r[6], $uni ? '\301g\346tis Byrju...' : '\303\201g\303\246t...');
+is($r[0], $r[1]);
+is($r[0], "foobarbaz");
+is($r[2], $r[3]);
+is($r[2], '<leftpv_p\retty\nright>');
+is($r[4], $r[5]);
+if(ord("A") == 65) {
+ is($r[4], $uni ? 'N\375 Batter\355' : 'N\303\275 Batter\303');
+}
+else {
+ skip("Skip for non-ASCII platform");
+}
+is($r[6], $r[7]);
+if(ord("A") == 65) {
+ is($r[6], $uni ? '\301g\346tis Byrju...' : '\303\201g\303\246t...');
+}
+else {
+ skip("Skip for non-ASCII platform");
+}
@r = &Devel::PPPort::pv_display();
-ok($r[0], $r[1]);
-ok($r[0], '"foob\0rbaz"\0');
-ok($r[2], $r[3]);
+is($r[0], $r[1]);
+is($r[0], '"foob\0rbaz"\0');
+is($r[2], $r[3]);
ok($r[2] eq '"pv_di"...\0' ||
$r[2] eq '"pv_d"...\0'); # some perl implementations are broken... :(
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs
index b1be87b26bf..5720df31eef 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/pvs
@@ -132,23 +132,23 @@ OUTPUT:
my $x = 'foo';
-ok(Devel::PPPort::newSVpvs(), "newSVpvs");
-ok(Devel::PPPort::newSVpvs_flags(), "newSVpvs_flags");
-ok(Devel::PPPort::newSVpvs_share(), 3);
+is(Devel::PPPort::newSVpvs(), "newSVpvs");
+is(Devel::PPPort::newSVpvs_flags(), "newSVpvs_flags");
+is(Devel::PPPort::newSVpvs_share(), 3);
Devel::PPPort::sv_catpvs($x);
-ok($x, "foosv_catpvs");
+is($x, "foosv_catpvs");
Devel::PPPort::sv_setpvs($x);
-ok($x, "sv_setpvs");
+is($x, "sv_setpvs");
my %h = ('hv_fetchs' => 42);
Devel::PPPort::hv_stores(\%h, 4711);
-ok(scalar keys %h, 2);
+is(scalar keys %h, 2);
ok(exists $h{'hv_stores'});
-ok($h{'hv_stores'}, 4711);
-ok(Devel::PPPort::hv_fetchs(\%h), 42);
-ok(Devel::PPPort::gv_fetchpvs(), \*Devel::PPPort::VERSION);
-ok(Devel::PPPort::gv_stashpvs(), \%Devel::PPPort::);
+is($h{'hv_stores'}, 4711);
+is(Devel::PPPort::hv_fetchs(\%h), 42);
+is(Devel::PPPort::gv_fetchpvs(), \*Devel::PPPort::VERSION);
+is(Devel::PPPort::gv_stashpvs(), \%Devel::PPPort::);
-ok(Devel::PPPort::get_cvs(), 3);
+is(Devel::PPPort::get_cvs(), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv
index 921076fd320..6f87cf1df9e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/shared_pv
@@ -27,14 +27,14 @@ __UNDEFINED__
#if { NEED newSVpvn_share }
SV *
-newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
+newSVpvn_share(pTHX_ const char *s, I32 len, U32 hash)
{
SV *sv;
if (len < 0)
len = -len;
if (!hash)
- PERL_HASH(hash, (char*) src, len);
- sv = newSVpvn((char *) src, len);
+ PERL_HASH(hash, (char*) s, len);
+ sv = newSVpvn((char *) s, len);
sv_upgrade(sv, SVt_PVIV);
SvIVX(sv) = hash;
SvREADONLY_on(sv);
@@ -87,4 +87,4 @@ newSVpvn_share()
=tests plan => 1
-ok(&Devel::PPPort::newSVpvn_share(), 6);
+is(&Devel::PPPort::newSVpvn_share(), 6);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf
index b700d8b8ef8..f89abac063a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/snprintf
@@ -59,5 +59,5 @@ my_snprintf()
=tests plan => 2
my($l, $s) = Devel::PPPort::my_snprintf();
-ok($l, 8);
-ok($s, "foobar42");
+is($l, 8);
+is($s, "foobar42");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf
index 8d45411b4a9..e6f7390c07a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sprintf
@@ -18,6 +18,12 @@ my_sprintf
#if !defined(my_sprintf)
#if { NEED my_sprintf }
+/* Warning: my_sprintf
+ It's safer to use my_snprintf instead
+*/
+
+/* Replace my_sprintf with my_snprintf */
+
int
my_sprintf(char *buffer, const char* pat, ...)
{
@@ -51,5 +57,5 @@ my_sprintf()
=tests plan => 2
my($l, $s) = Devel::PPPort::my_sprintf();
-ok($l, 8);
-ok($s, "foobar42");
+is($l, 8);
+is($s, "foobar42");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs
index 82b5e435410..b58d5e0103d 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/strlfuncs
@@ -103,5 +103,5 @@ my @r = Devel::PPPort::my_strlfunc();
ok(@e == @r);
for (0 .. $#e) {
- ok($r[$_], $e[$_]);
+ is($r[$_], $e[$_]);
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/subparse b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/subparse
new file mode 100644
index 00000000000..0729c911e9f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/subparse
@@ -0,0 +1,29 @@
+################################################################################
+##
+## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
+## Version 2.x, Copyright (C) 2001, Paul Marquess.
+## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+##
+## This program is free software; you can redistribute it and/or
+## modify it under the same terms as Perl itself.
+##
+################################################################################
+
+=provides
+
+__UNDEFINED__
+
+=implementation
+
+#if { VERSION <= 5.003_22 }
+# undef start_subparse
+# if { VERSION < 5.003_22 }
+__UNDEFINED__ start_subparse(a, b) Perl_start_subparse()
+# else
+__UNDEFINED__ start_subparse(a, b) Perl_start_subparse(b)
+# endif
+
+#if {VERSION < 5.003_07 }
+foo
+#endif
+#endif
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf
index 89612844b4d..c71e805004d 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/sv_xpvf
@@ -26,16 +26,10 @@ sv_vsetpvf_mg
=implementation
#if { VERSION >= 5.004 } && !defined(vnewSVpvf)
-#if { NEED vnewSVpvf }
-
-SV *
-vnewSVpvf(pTHX_ const char *pat, va_list *args)
-{
- register SV *sv = newSV(0);
- sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
- return sv;
-}
-
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define vnewSVpvf(pat, args) ({ SV *_sv = newSV(0); sv_vsetpvfn(_sv, (pat), strlen((pat)), (args), Null(SV**), 0, Null(bool*)); _sv; })
+#else
+# define vnewSVpvf(pat, args) ((PL_Sv = newSV(0)), sv_vsetpvfn(PL_Sv, (pat), strlen((pat)), (args), Null(SV**), 0, Null(bool*)), PL_Sv)
#endif
#endif
@@ -51,7 +45,7 @@ vnewSVpvf(pTHX_ const char *pat, va_list *args)
#if { NEED sv_catpvf_mg }
void
-sv_catpvf_mg(pTHX_ SV *sv, const char *pat, ...)
+sv_catpvf_mg(pTHX_ SV * const sv, const char * const pat, ...)
{
va_list args;
va_start(args, pat);
@@ -68,7 +62,7 @@ sv_catpvf_mg(pTHX_ SV *sv, const char *pat, ...)
#if { NEED sv_catpvf_mg_nocontext }
void
-sv_catpvf_mg_nocontext(SV *sv, const char *pat, ...)
+sv_catpvf_mg_nocontext(SV * const sv, const char * const pat, ...)
{
dTHX;
va_list args;
@@ -103,7 +97,7 @@ sv_catpvf_mg_nocontext(SV *sv, const char *pat, ...)
#if { NEED sv_setpvf_mg }
void
-sv_setpvf_mg(pTHX_ SV *sv, const char *pat, ...)
+sv_setpvf_mg(pTHX_ SV * const sv, const char * const pat, ...)
{
va_list args;
va_start(args, pat);
@@ -120,7 +114,7 @@ sv_setpvf_mg(pTHX_ SV *sv, const char *pat, ...)
#if { NEED sv_setpvf_mg_nocontext }
void
-sv_setpvf_mg_nocontext(SV *sv, const char *pat, ...)
+sv_setpvf_mg_nocontext(SV * const sv, const char * const pat, ...)
{
dTHX;
va_list args;
@@ -153,7 +147,6 @@ sv_setpvf_mg_nocontext(SV *sv, const char *pat, ...)
=xsinit
-#define NEED_vnewSVpvf
#define NEED_sv_catpvf_mg
#define NEED_sv_catpvf_mg_nocontext
#define NEED_sv_setpvf_mg
@@ -290,24 +283,24 @@ tie %h, 'Tie::StdHash';
$h{foo} = 'foo-';
$h{bar} = '';
-ok(&Devel::PPPort::vnewSVpvf(), "$]" >= 5.004 ? 'Perl-42' : '%s-%d');
-ok(&Devel::PPPort::sv_vcatpvf('1-2-3-'), "$]" >= 5.004 ? '1-2-3-Perl-42' : '1-2-3-%s-%d');
-ok(&Devel::PPPort::sv_vsetpvf('1-2-3-'), "$]" >= 5.004 ? 'Perl-42' : '%s-%d');
+is(&Devel::PPPort::vnewSVpvf(), "$]" >= 5.004 ? 'Perl-42' : '%s-%d');
+is(&Devel::PPPort::sv_vcatpvf('1-2-3-'), "$]" >= 5.004 ? '1-2-3-Perl-42' : '1-2-3-%s-%d');
+is(&Devel::PPPort::sv_vsetpvf('1-2-3-'), "$]" >= 5.004 ? 'Perl-42' : '%s-%d');
&Devel::PPPort::sv_catpvf_mg($h{foo});
-ok($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42' : 'foo-');
+is($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42' : 'foo-');
&Devel::PPPort::Perl_sv_catpvf_mg($h{foo});
-ok($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42-Perl-43' : 'foo-');
+is($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42-Perl-43' : 'foo-');
&Devel::PPPort::sv_catpvf_mg_nocontext($h{foo});
-ok($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42-Perl-43-Perl-44' : 'foo-');
+is($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42-Perl-43-Perl-44' : 'foo-');
&Devel::PPPort::sv_setpvf_mg($h{bar});
-ok($h{bar}, "$]" >= 5.004 ? 'mhx-42' : '');
+is($h{bar}, "$]" >= 5.004 ? 'mhx-42' : '');
&Devel::PPPort::Perl_sv_setpvf_mg($h{bar});
-ok($h{bar}, "$]" >= 5.004 ? 'foo-43' : '');
+is($h{bar}, "$]" >= 5.004 ? 'foo-43' : '');
&Devel::PPPort::sv_setpvf_mg_nocontext($h{bar});
-ok($h{bar}, "$]" >= 5.004 ? 'bar-44' : '');
+is($h{bar}, "$]" >= 5.004 ? 'bar-44' : '');
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads
index 9a8f6ac4b30..786b72936c5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/threads
@@ -21,12 +21,26 @@ dTHXR
__UNDEFINED__ dTHR dNOOP
__UNDEFINED__ dTHX dNOOP
+/* Hint: dTHX
+
+ For pre-5.6.0 thread compatibility, instead use dTHXR, available only through
+ ppport.h */
+
__UNDEFINED__ dTHXa(x) dNOOP
__UNDEFINED__ pTHX void
__UNDEFINED__ pTHX_
__UNDEFINED__ aTHX
+/* Hint: aTHX
+
+ For pre-5.6.0 thread compatibility, instead use aTHXR, available only through
+ ppport.h */
+
__UNDEFINED__ aTHX_
+/* Hint: aTHX_
+
+ For pre-5.6.0 thread compatibility, instead use aTHXR_, available only
+ through ppport.h */
#if { VERSION < 5.6.0 }
# ifdef USE_THREADS
@@ -63,6 +77,6 @@ with_THX_arg(error)
=tests plan => 2
-ok(&Devel::PPPort::no_THX_arg("42"), 43);
+is(&Devel::PPPort::no_THX_arg("42"), 43);
eval { &Devel::PPPort::with_THX_arg("yes\n"); };
ok($@ =~ /^yes/);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/utf8 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/utf8
new file mode 100644
index 00000000000..28f01c058d3
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/utf8
@@ -0,0 +1,926 @@
+=provides
+
+__UNDEFINED__
+SvUTF8
+UTF8f
+UTF8fARG
+utf8_to_uvchr_buf
+sv_len_utf8
+sv_len_utf8_nomg
+
+=implementation
+
+#ifdef SVf_UTF8
+__UNDEFINED__ SvUTF8(sv) (SvFLAGS(sv) & SVf_UTF8)
+#endif
+
+#if { VERSION == 5.19.1 } /* 5.19.1 does not have UTF8fARG, only broken UTF8f */
+#undef UTF8f
+#endif
+
+#ifdef SVf_UTF8
+__UNDEFINED__ UTF8f SVf
+__UNDEFINED__ UTF8fARG(u,l,p) newSVpvn_flags((p), (l), ((u) ? SVf_UTF8 : 0) | SVs_TEMP)
+#endif
+
+#define D_PPP_MIN(a,b) (((a) <= (b)) ? (a) : (b))
+
+__UNDEFINED__ UNICODE_REPLACEMENT 0xFFFD
+
+#ifdef UTF8_MAXLEN
+__UNDEFINED__ UTF8_MAXBYTES UTF8_MAXLEN
+#endif
+
+__UNDEF_NOT_PROVIDED__ UTF_START_MARK(len) \
+ (((len) > 7) ? 0xFF : (0xFF & (0xFE << (7-(len)))))
+
+#if { VERSION < 5.018 } /* On non-EBCDIC was valid before this, */
+ /* but easier to just do one check */
+# undef UTF8_MAXBYTES_CASE
+#endif
+
+#if 'A' == 65
+# define D_PPP_BYTE_INFO_BITS 6 /* 6 bits meaningful in continuation bytes */
+__UNDEFINED__ UTF8_MAXBYTES_CASE 13
+#else
+# define D_PPP_BYTE_INFO_BITS 5 /* 5 bits meaningful in continuation bytes */
+__UNDEFINED__ UTF8_MAXBYTES_CASE 15
+#endif
+
+__UNDEF_NOT_PROVIDED__ UTF_ACCUMULATION_SHIFT D_PPP_BYTE_INFO_BITS
+
+#ifdef NATIVE_TO_UTF
+__UNDEF_NOT_PROVIDED__ NATIVE_UTF8_TO_I8(c) NATIVE_TO_UTF(c)
+#else /* System doesn't support EBCDIC */
+__UNDEF_NOT_PROVIDED__ NATIVE_UTF8_TO_I8(c) (c)
+#endif
+
+#ifdef UTF_TO_NATIVE
+__UNDEF_NOT_PROVIDED__ I8_TO_NATIVE_UTF8(c) UTF_TO_NATIVE(c)
+#else /* System doesn't support EBCDIC */
+__UNDEF_NOT_PROVIDED__ I8_TO_NATIVE_UTF8(c) (c)
+#endif
+
+__UNDEF_NOT_PROVIDED__ UTF_START_MASK(len) \
+ (((len) >= 7) ? 0x00 : (0x1F >> ((len)-2)))
+__UNDEF_NOT_PROVIDED__ UTF_IS_CONTINUATION_MASK \
+ ((U8) (0xFF << UTF_ACCUMULATION_SHIFT))
+__UNDEF_NOT_PROVIDED__ UTF_CONTINUATION_MARK \
+ (UTF_IS_CONTINUATION_MASK & 0xB0)
+__UNDEF_NOT_PROVIDED__ UTF_MIN_START_BYTE \
+ ((UTF_CONTINUATION_MARK >> UTF_ACCUMULATION_SHIFT) | UTF_START_MARK(2))
+
+__UNDEF_NOT_PROVIDED__ UTF_MIN_ABOVE_LATIN1_BYTE \
+ ((0x100 >> UTF_ACCUMULATION_SHIFT) | UTF_START_MARK(2))
+
+#if { VERSION < 5.007 } /* Was the complement of what should have been */
+# undef UTF8_IS_DOWNGRADEABLE_START
+#endif
+__UNDEF_NOT_PROVIDED__ UTF8_IS_DOWNGRADEABLE_START(c) \
+ inRANGE(NATIVE_UTF8_TO_I8(c), \
+ UTF_MIN_START_BYTE, UTF_MIN_ABOVE_LATIN1_BYTE - 1)
+__UNDEF_NOT_PROVIDED__ UTF_CONTINUATION_MASK \
+ ((U8) ((1U << UTF_ACCUMULATION_SHIFT) - 1))
+
+__UNDEF_NOT_PROVIDED__ UTF8_ACCUMULATE(base, added) \
+ (((base) << UTF_ACCUMULATION_SHIFT) \
+ | ((NATIVE_UTF8_TO_I8(added)) \
+ & UTF_CONTINUATION_MASK))
+
+__UNDEF_NOT_PROVIDED__ UTF8_ALLOW_ANYUV 0
+__UNDEF_NOT_PROVIDED__ UTF8_ALLOW_EMPTY 0x0001
+__UNDEF_NOT_PROVIDED__ UTF8_ALLOW_CONTINUATION 0x0002
+__UNDEF_NOT_PROVIDED__ UTF8_ALLOW_NON_CONTINUATION 0x0004
+__UNDEF_NOT_PROVIDED__ UTF8_ALLOW_SHORT 0x0008
+__UNDEF_NOT_PROVIDED__ UTF8_ALLOW_LONG 0x0010
+__UNDEF_NOT_PROVIDED__ UTF8_ALLOW_OVERFLOW 0x0080
+__UNDEF_NOT_PROVIDED__ UTF8_ALLOW_ANY ( UTF8_ALLOW_CONTINUATION \
+ |UTF8_ALLOW_NON_CONTINUATION \
+ |UTF8_ALLOW_SHORT \
+ |UTF8_ALLOW_LONG \
+ |UTF8_ALLOW_OVERFLOW)
+
+#if defined UTF8SKIP
+
+/* Don't use official versions because they use MIN, which may not be available */
+#undef UTF8_SAFE_SKIP
+#undef UTF8_CHK_SKIP
+
+__UNDEFINED__ UTF8_SAFE_SKIP(s, e) ( \
+ ((((e) - (s)) <= 0) \
+ ? 0 \
+ : D_PPP_MIN(((e) - (s)), UTF8SKIP(s))))
+
+__UNDEFINED__ UTF8_CHK_SKIP(s) \
+ (s[0] == '\0' ? 1 : ((U8) D_PPP_MIN(my_strnlen((char *) (s), UTF8SKIP(s)), \
+ UTF8SKIP(s))))
+/* UTF8_CHK_SKIP depends on my_strnlen */
+__UNDEFINED__ UTF8_SKIP(s) UTF8SKIP(s)
+#endif
+
+#if 'A' == 65
+__UNDEFINED__ UTF8_IS_INVARIANT(c) isASCII(c)
+#else
+__UNDEFINED__ UTF8_IS_INVARIANT(c) (isASCII(c) || isCNTRL_L1(c))
+#endif
+
+__UNDEFINED__ UVCHR_IS_INVARIANT(c) UTF8_IS_INVARIANT(c)
+
+#ifdef UVCHR_IS_INVARIANT
+# if 'A' == 65
+# ifdef QUADKIND
+# define D_PPP_UVCHR_SKIP_UPPER(c) \
+ (WIDEST_UTYPE) (c) < \
+ (((WIDEST_UTYPE) 1) << (6 * D_PPP_BYTE_INFO_BITS)) ? 7 : 13
+# else
+# define D_PPP_UVCHR_SKIP_UPPER(c) 7 /* 32 bit platform */
+# endif
+# else
+ /* In the releases this is backported to, UTF-EBCDIC had a max of 2**31-1 */
+# define D_PPP_UVCHR_SKIP_UPPER(c) 7
+# endif
+
+__UNDEFINED__ UVCHR_SKIP(c) \
+ UVCHR_IS_INVARIANT(c) ? 1 : \
+ (WIDEST_UTYPE) (c) < (32 * (1U << ( D_PPP_BYTE_INFO_BITS))) ? 2 : \
+ (WIDEST_UTYPE) (c) < (16 * (1U << (2 * D_PPP_BYTE_INFO_BITS))) ? 3 : \
+ (WIDEST_UTYPE) (c) < ( 8 * (1U << (3 * D_PPP_BYTE_INFO_BITS))) ? 4 : \
+ (WIDEST_UTYPE) (c) < ( 4 * (1U << (4 * D_PPP_BYTE_INFO_BITS))) ? 5 : \
+ (WIDEST_UTYPE) (c) < ( 2 * (1U << (5 * D_PPP_BYTE_INFO_BITS))) ? 6 : \
+ D_PPP_UVCHR_SKIP_UPPER(c)
+#endif
+
+#ifdef is_ascii_string
+__UNDEFINED__ is_invariant_string(s,l) is_ascii_string(s,l)
+__UNDEFINED__ is_utf8_invariant_string(s,l) is_ascii_string(s,l)
+
+/* Hint: is_ascii_string, is_invariant_string
+ is_utf8_invariant_string() does the same thing and is preferred because its
+ name is more accurate as to what it does */
+#endif
+
+#ifdef ibcmp_utf8
+__UNDEFINED__ foldEQ_utf8(s1,pe1,l1,u1,s2,pe2,l2,u2) \
+ cBOOL(! ibcmp_utf8(s1,pe1,l1,u1,s2,pe2,l2,u2))
+#endif
+
+#if defined(is_utf8_string) && defined(UTF8SKIP)
+__UNDEFINED__ isUTF8_CHAR(s, e) ( \
+ (e) <= (s) || ! is_utf8_string(s, UTF8_SAFE_SKIP(s, e)) \
+ ? 0 \
+ : UTF8SKIP(s))
+#endif
+
+#if 'A' == 65
+__UNDEFINED__ BOM_UTF8 "\xEF\xBB\xBF"
+__UNDEFINED__ REPLACEMENT_CHARACTER_UTF8 "\xEF\xBF\xBD"
+#elif '^' == 95
+__UNDEFINED__ BOM_UTF8 "\xDD\x73\x66\x73"
+__UNDEFINED__ REPLACEMENT_CHARACTER_UTF8 "\xDD\x73\x73\x71"
+#elif '^' == 176
+__UNDEFINED__ BOM_UTF8 "\xDD\x72\x65\x72"
+__UNDEFINED__ REPLACEMENT_CHARACTER_UTF8 "\xDD\x72\x72\x70"
+#else
+# error Unknown character set
+#endif
+
+#if { VERSION < 5.31.4 }
+ /* Versions prior to this accepted things that are now considered
+ * malformations, and didn't return -1 on error with warnings enabled
+ * */
+# undef utf8_to_uvchr_buf
+#endif
+
+/* This implementation brings modern, generally more restricted standards to
+ * utf8_to_uvchr_buf. Some of these are security related, and clearly must
+ * be done. But its arguable that the others need not, and hence should not.
+ * The reason they're here is that a module that intends to play with the
+ * latest perls should be able to work the same in all releases. An example is
+ * that perl no longer accepts any UV for a code point, but limits them to
+ * IV_MAX or below. This is for future internal use of the larger code points.
+ * If it turns out that some of these changes are breaking code that isn't
+ * intended to work with modern perls, the tighter restrictions could be
+ * relaxed. khw thinks this is unlikely, but has been wrong in the past. */
+
+/* 5.6.0 is the first release with UTF-8, and we don't implement this function
+ * there due to its likely lack of still being in use, and the underlying
+ * implementation is very different from later ones, without the later
+ * safeguards, so would require extra work to deal with */
+#if { VERSION >= 5.6.1 } && ! defined(utf8_to_uvchr_buf)
+ /* Choose which underlying implementation to use. At least one must be
+ * present or the perl is too early to handle this function */
+# if defined(utf8n_to_uvchr) || defined(utf8_to_uvchr) || defined(utf8_to_uv)
+# if defined(utf8n_to_uvchr) /* This is the preferred implementation */
+# define D_PPP_utf8_to_uvchr_buf_callee utf8n_to_uvchr
+# elif /* Must be at least 5.6.1 from #if above; \
+ If have both regular and _simple, regular has all args */ \
+ defined(utf8_to_uv) && defined(utf8_to_uv_simple)
+# define D_PPP_utf8_to_uvchr_buf_callee utf8_to_uv
+# elif defined(utf8_to_uvchr) /* The below won't work well on error input */
+# define D_PPP_utf8_to_uvchr_buf_callee(s, curlen, retlen, flags) \
+ utf8_to_uvchr((U8 *)(s), (retlen))
+# else
+# define D_PPP_utf8_to_uvchr_buf_callee(s, curlen, retlen, flags) \
+ utf8_to_uv((U8 *)(s), (retlen))
+# endif
+# endif
+
+# if { NEED utf8_to_uvchr_buf }
+
+UV
+utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
+{
+ UV ret;
+ STRLEN curlen;
+ bool overflows = 0;
+ const U8 *cur_s = s;
+ const bool do_warnings = ckWARN_d(WARN_UTF8);
+# if { VERSION < 5.26.0 } && ! defined(EBCDIC)
+ STRLEN overflow_length = 0;
+# endif
+
+ if (send > s) {
+ curlen = send - s;
+ }
+ else {
+ assert(0); /* Modern perls die under this circumstance */
+ curlen = 0;
+ if (! do_warnings) { /* Handle empty here if no warnings needed */
+ if (retlen) *retlen = 0;
+ return UNICODE_REPLACEMENT;
+ }
+ }
+
+# if { VERSION < 5.26.0 } && ! defined(EBCDIC)
+
+ /* Perl did not properly detect overflow for much of its history on
+ * non-EBCDIC platforms, often returning an overlong value which may or may
+ * not have been tolerated in the call. Also, earlier versions, when they
+ * did detect overflow, may have disallowed it completely. Modern ones can
+ * replace it with the REPLACEMENT CHARACTER, depending on calling
+ * parameters. Therefore detect it ourselves in releases it was
+ * problematic in. */
+
+ if (curlen > 0 && UNLIKELY(*s >= 0xFE)) {
+
+ /* First, on a 32-bit machine the first byte being at least \xFE
+ * automatically is overflow, as it indicates something requiring more
+ * than 31 bits */
+ if (sizeof(ret) < 8) {
+ overflows = 1;
+ overflow_length = (*s == 0xFE) ? 7 : 13;
+ }
+ else {
+ const U8 highest[] = /* 2*63-1 */
+ "\xFF\x80\x87\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF";
+ const U8 *cur_h = highest;
+
+ for (cur_s = s; cur_s < send; cur_s++, cur_h++) {
+ if (UNLIKELY(*cur_s == *cur_h)) {
+ continue;
+ }
+
+ /* If this byte is larger than the corresponding highest UTF-8
+ * byte, the sequence overflows; otherwise the byte is less
+ * than (as we handled the equality case above), and so the
+ * sequence doesn't overflow */
+ overflows = *cur_s > *cur_h;
+ break;
+
+ }
+
+ /* Here, either we set the bool and broke out of the loop, or got
+ * to the end and all bytes are the same which indicates it doesn't
+ * overflow. If it did overflow, it would be this number of bytes
+ * */
+ overflow_length = 13;
+ }
+ }
+
+ if (UNLIKELY(overflows)) {
+ ret = 0;
+
+ if (! do_warnings && retlen) {
+ *retlen = overflow_length;
+ }
+ }
+ else
+
+# endif /* < 5.26 */
+
+ /* Here, we are either in a release that properly detects overflow, or
+ * we have checked for overflow and the next statement is executing as
+ * part of the above conditional where we know we don't have overflow.
+ *
+ * The modern versions allow anything that evaluates to a legal UV, but
+ * not overlongs nor an empty input */
+ ret = D_PPP_utf8_to_uvchr_buf_callee(
+ (U8 *) /* Early perls: no const */
+ s, curlen, retlen, (UTF8_ALLOW_ANYUV
+ & ~(UTF8_ALLOW_LONG|UTF8_ALLOW_EMPTY)));
+
+# if { VERSION >= 5.26.0 } && { VERSION < 5.28.0 }
+
+ /* But actually, more modern versions restrict the UV to being no more than
+ * what an IV can hold, so it could still have gotten it wrong about
+ * overflowing. */
+ if (UNLIKELY(ret > IV_MAX)) {
+ overflows = 1;
+ }
+
+# endif
+
+ if (UNLIKELY(overflows)) {
+ if (! do_warnings) {
+ if (retlen) {
+ *retlen = D_PPP_MIN(*retlen, UTF8SKIP(s));
+ *retlen = D_PPP_MIN(*retlen, curlen);
+ }
+ return UNICODE_REPLACEMENT;
+ }
+ else {
+
+ /* We use the error message in use from 5.8-5.26 */
+ Perl_warner(aTHX_ packWARN(WARN_UTF8),
+ "Malformed UTF-8 character (overflow at 0x%" UVxf
+ ", byte 0x%02x, after start byte 0x%02x)",
+ ret, *cur_s, *s);
+ if (retlen) {
+ *retlen = (STRLEN) -1;
+ }
+ return 0;
+ }
+ }
+
+ /* Here, did not overflow, but if it failed for some other reason, and
+ * warnings are off, to emulate the behavior of the real utf8_to_uvchr(),
+ * try again, allowing anything. (Note a return of 0 is ok if the input
+ * was '\0') */
+ if (UNLIKELY(ret == 0 && (curlen == 0 || *s != '\0'))) {
+
+ /* If curlen is 0, we already handled the case where warnings are
+ * disabled, so this 'if' will be true, and so later on, we know that
+ * 's' is dereferencible */
+ if (do_warnings) {
+ *retlen = (STRLEN) -1;
+ }
+ else {
+ ret = D_PPP_utf8_to_uvchr_buf_callee(
+ (U8 *) /* Early perls: no const */
+ s, curlen, retlen, UTF8_ALLOW_ANY);
+ /* Override with the REPLACEMENT character, as that is what the
+ * modern version of this function returns */
+ ret = UNICODE_REPLACEMENT;
+
+# if { VERSION < 5.16.0 }
+
+ /* Versions earlier than this don't necessarily return the proper
+ * length. It should not extend past the end of string, nor past
+ * what the first byte indicates the length is, nor past the
+ * continuation characters */
+ if (retlen && (IV) *retlen >= 0) {
+ unsigned int i = 1;
+
+ *retlen = D_PPP_MIN(*retlen, curlen);
+ *retlen = D_PPP_MIN(*retlen, UTF8SKIP(s));
+ do {
+# ifdef UTF8_IS_CONTINUATION
+ if (! UTF8_IS_CONTINUATION(s[i]))
+# else /* Versions without the above don't support EBCDIC anyway */
+ if (s[i] < 0x80 || s[i] > 0xBF)
+# endif
+ {
+ *retlen = i;
+ break;
+ }
+ } while (++i < *retlen);
+ }
+
+# endif
+
+ }
+ }
+
+ return ret;
+}
+
+# endif
+#endif
+
+#if defined(UTF8SKIP) && defined(utf8_to_uvchr_buf)
+#undef utf8_to_uvchr /* Always redefine this unsafe function so that it refuses
+ to read past a NUL, making it much less likely to read
+ off the end of the buffer. A NUL indicates the start
+ of the next character anyway. If the input isn't
+ NUL-terminated, the function remains unsafe, as it
+ always has been. */
+
+__UNDEFINED__ utf8_to_uvchr(s, lp) \
+ ((*(s) == '\0') \
+ ? utf8_to_uvchr_buf(s,((s)+1), lp) /* Handle single NUL specially */ \
+ : utf8_to_uvchr_buf(s, (s) + UTF8_CHK_SKIP(s), (lp)))
+
+#endif
+
+/* Hint: utf8_to_uvchr
+ Use utf8_to_uvchr_buf() instead. But ONLY if you KNOW the upper bound
+ of the input string (not resorting to using UTF8SKIP, etc., to infer it).
+ The backported utf8_to_uvchr() will do a better job to prevent most cases
+ of trying to read beyond the end of the buffer */
+
+/* Replace utf8_to_uvchr with utf8_to_uvchr_buf */
+
+#ifdef sv_len_utf8
+ /* Older Perl versions have broken sv_len_utf8() when passed sv does not have SVf_UTF8 flag set */
+ /* Also note that SvGETMAGIC() may change presence of SVf_UTF8 flag */
+# if { VERSION < 5.17.5 }
+# undef sv_len_utf8
+# if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define sv_len_utf8_nomg(sv) ({ SV *_sv2 = (sv); (SvUTF8(_sv2) ? Perl_sv_len_utf8(aTHX_ (!SvGMAGICAL(_sv2) ? _sv2 : sv_mortalcopy_flags(_sv2, SV_NOSTEAL))) : ({ STRLEN _len; SvPV_nomg(_sv2, _len); _len; })); })
+# define sv_len_utf8(sv) ({ SV *_sv1 = (sv); SvGETMAGIC(_sv1); sv_len_utf8_nomg(_sv1); })
+# else
+# define sv_len_utf8_nomg(sv) (PL_Sv = (sv), (SvUTF8(PL_Sv) ? Perl_sv_len_utf8(aTHX_ (!SvGMAGICAL(PL_Sv) ? PL_Sv : sv_mortalcopy_flags(PL_Sv, SV_NOSTEAL))) : (SvPV_nomg(PL_Sv, PL_na), PL_na)))
+# define sv_len_utf8(sv) (PL_Sv = (sv), SvGETMAGIC(PL_Sv), sv_len_utf8_nomg(PL_Sv))
+# endif
+# endif
+# if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+ __UNDEFINED__ sv_len_utf8_nomg(sv) ({ SV *_sv = (sv); sv_len_utf8(!SvGMAGICAL(_sv) ? _sv : sv_mortalcopy_flags(_sv, SV_NOSTEAL)); })
+# else
+ __UNDEFINED__ sv_len_utf8_nomg(sv) ((PL_Sv = (sv)), sv_len_utf8(!SvGMAGICAL(PL_Sv) ? PL_Sv : sv_mortalcopy_flags(PL_Sv, SV_NOSTEAL)))
+# endif
+#endif
+
+=xsinit
+
+#define NEED_utf8_to_uvchr_buf
+
+=xsubs
+
+#if defined(UTF8f) && defined(newSVpvf)
+
+void
+UTF8f(x)
+ SV *x
+ PREINIT:
+ U32 u;
+ STRLEN len;
+ char *ptr;
+ INIT:
+ ptr = SvPV(x, len);
+ u = SvUTF8(x);
+ PPCODE:
+ x = sv_2mortal(newSVpvf("[%" UTF8f "]", UTF8fARG(u, len, ptr)));
+ XPUSHs(x);
+ XSRETURN(1);
+
+#endif
+
+#if { VERSION >= 5.006 } /* This is just a helper fcn, not publicized */ \
+ /* as being available and params not what the */ \
+ /* API function has; works on EBCDIC too */
+
+SV *
+uvchr_to_utf8(native)
+
+ UV native
+ PREINIT:
+ int len;
+ U8 string[UTF8_MAXBYTES+1];
+ int i;
+ UV uni;
+
+ CODE:
+ len = UVCHR_SKIP(native);
+
+ for (i = 0; i < len; i++) {
+ string[i] = '\0';
+ }
+
+ if (len <= 1) {
+ string[0] = native;
+ }
+ else {
+ i = len;
+ uni = NATIVE_TO_UNI(native);
+ while (i-- > 1) {
+ string[i] = I8_TO_NATIVE_UTF8((uni & UTF_CONTINUATION_MASK) | UTF_CONTINUATION_MARK);
+ uni >>= UTF_ACCUMULATION_SHIFT;
+ }
+ string[0] = I8_TO_NATIVE_UTF8((uni & UTF_START_MASK(len)) | UTF_START_MARK(len));
+ }
+
+ RETVAL = newSVpvn((char *) string, len);
+ SvUTF8_on(RETVAL);
+ OUTPUT:
+ RETVAL
+
+#endif
+#if defined(UTF8_SAFE_SKIP) && defined(UTF8SKIP)
+
+STRLEN
+UTF8_SAFE_SKIP(s, adjustment)
+ char * s
+ int adjustment
+ PREINIT:
+ const char *const_s;
+ CODE:
+ const_s = s;
+ /* Instead of passing in an 'e' ptr, use the real end, adjusted */
+ RETVAL = UTF8_SAFE_SKIP(const_s, s + UTF8SKIP(s) + adjustment);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef isUTF8_CHAR
+
+STRLEN
+isUTF8_CHAR(s, adjustment)
+ unsigned char * s
+ int adjustment
+ PREINIT:
+ const unsigned char *const_s;
+ const unsigned char *const_e;
+ CODE:
+ const_s = s;
+ /* Instead of passing in an 'e' ptr, use the real end, adjusted */
+ const_e = const_s + UTF8SKIP(const_s) + adjustment;
+ RETVAL = isUTF8_CHAR(const_s, const_e);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+
+#ifdef foldEQ_utf8
+
+STRLEN
+foldEQ_utf8(s1, l1, u1, s2, l2, u2)
+ char *s1
+ UV l1
+ bool u1
+ char *s2
+ UV l2
+ bool u2
+ PREINIT:
+ const char *const_s1;
+ const char *const_s2;
+ CODE:
+ const_s1 = s1;
+ const_s2 = s2;
+ RETVAL = foldEQ_utf8(const_s1, NULL, l1, u1, const_s2, NULL, l2, u2);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef utf8_to_uvchr_buf
+
+AV *
+utf8_to_uvchr_buf(s, adjustment)
+ unsigned char *s
+ int adjustment
+ PREINIT:
+ AV *av;
+ STRLEN len;
+ const unsigned char *const_s;
+ CODE:
+ av = newAV();
+ const_s = s;
+ av_push(av, newSVuv(utf8_to_uvchr_buf(const_s,
+ s + UTF8SKIP(s) + adjustment,
+ &len)));
+ if (len == (STRLEN) -1) {
+ av_push(av, newSViv(-1));
+ }
+ else {
+ av_push(av, newSVuv(len));
+ }
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef utf8_to_uvchr
+
+AV *
+utf8_to_uvchr(s)
+ unsigned char *s
+ PREINIT:
+ AV *av;
+ STRLEN len;
+ const unsigned char *const_s;
+ CODE:
+ av = newAV();
+ const_s = s;
+ av_push(av, newSVuv(utf8_to_uvchr(const_s, &len)));
+ if (len == (STRLEN) -1) {
+ av_push(av, newSViv(-1));
+ }
+ else {
+ av_push(av, newSVuv(len));
+ }
+ RETVAL = av;
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef sv_len_utf8
+
+STRLEN
+sv_len_utf8(sv)
+ SV *sv
+ CODE:
+ RETVAL = sv_len_utf8(sv);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef sv_len_utf8_nomg
+
+STRLEN
+sv_len_utf8_nomg(sv)
+ SV *sv
+ CODE:
+ RETVAL = sv_len_utf8_nomg(sv);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef UVCHR_IS_INVARIANT
+
+bool
+UVCHR_IS_INVARIANT(c)
+ unsigned c
+ PREINIT:
+ CODE:
+ RETVAL = UVCHR_IS_INVARIANT(c);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+#ifdef UVCHR_SKIP
+
+STRLEN
+UVCHR_SKIP(c)
+ UV c
+ PREINIT:
+ CODE:
+ RETVAL = UVCHR_SKIP(c);
+ OUTPUT:
+ RETVAL
+
+#endif
+
+=tests plan => 98
+
+BEGIN {
+ # skip tests on 5.6.0 and earlier, plus 5.7.0
+ if (ivers($]) <= ivers(5.6) || ivers($]) == ivers(5.7) ) {
+ skip 'skip: broken utf8 support', 98;
+ exit;
+ }
+ require warnings;
+}
+
+is(Devel::PPPort::UTF8f(42), '[42]');
+is(Devel::PPPort::UTF8f('abc'), '[abc]');
+is(Devel::PPPort::UTF8f("\x{263a}"), "[\x{263a}]");
+
+my $str = "\x{A8}";
+if (ivers($]) >= ivers(5.8)) { eval q{utf8::upgrade($str)} }
+is(Devel::PPPort::UTF8f($str), "[\x{A8}]");
+if (ivers($]) >= ivers(5.8)) { eval q{utf8::downgrade($str)} }
+is(Devel::PPPort::UTF8f($str), "[\x{A8}]");
+
+is(&Devel::PPPort::UTF8_SAFE_SKIP("A", 0), 1);
+is(&Devel::PPPort::UTF8_SAFE_SKIP("A", -1), 0);
+
+is(&Devel::PPPort::isUTF8_CHAR("A", -1), 0);
+is(&Devel::PPPort::isUTF8_CHAR("A", 0), 1);
+is(&Devel::PPPort::isUTF8_CHAR("\x{100}", -1), 0);
+is(&Devel::PPPort::isUTF8_CHAR("\x{100}", 0), 2);
+
+is(&Devel::PPPort::UVCHR_IS_INVARIANT(ord("A")), 1);
+ok(! &Devel::PPPort::UVCHR_IS_INVARIANT(0xb6));
+ok(! &Devel::PPPort::UVCHR_IS_INVARIANT(0x100));
+
+is(&Devel::PPPort::UVCHR_SKIP(ord("A")), 1);
+is(&Devel::PPPort::UVCHR_SKIP(0xb6), 2, "This is a test");
+is(&Devel::PPPort::UVCHR_SKIP(0x3FF), 2);
+is(&Devel::PPPort::UVCHR_SKIP(0x3FFF), 3);
+is(&Devel::PPPort::UVCHR_SKIP(0x3FFFF), 4);
+is(&Devel::PPPort::UVCHR_SKIP(0x3FFFFF), 5);
+is(&Devel::PPPort::UVCHR_SKIP(0x3FFFFFF), ord("A") == 65 ? 5 : 6);
+is(&Devel::PPPort::UVCHR_SKIP(0x4000000), ord("A") == 65 ? 6 : 7);
+if (ord("A") != 65) {
+ skip("Test not valid on EBCDIC", 1)
+}
+else {
+ is(&Devel::PPPort::UVCHR_SKIP(0xFFFFFFFF), 7);
+}
+
+if (ivers($]) < ivers(5.8)) {
+ skip("Perl version too early", 3);
+}
+else {
+ is(&Devel::PPPort::foldEQ_utf8("A\x{100}", 3, 1, "a\x{101}", 3, 1), 1);
+ is(&Devel::PPPort::foldEQ_utf8("A\x{100}", 3, 1, "a\x{102}", 3, 1), 0);
+ is(&Devel::PPPort::foldEQ_utf8("A\x{100}", 3, 1, "b\x{101}", 3, 1), 0);
+}
+
+my $ret = &Devel::PPPort::utf8_to_uvchr("A");
+is($ret->[0], ord("A"));
+is($ret->[1], 1);
+
+$ret = &Devel::PPPort::utf8_to_uvchr("\0");
+is($ret->[0], 0);
+is($ret->[1], 1);
+
+$ret = &Devel::PPPort::utf8_to_uvchr_buf("A", 0);
+is($ret->[0], ord("A"));
+is($ret->[1], 1);
+
+$ret = &Devel::PPPort::utf8_to_uvchr_buf("\0", 0);
+is($ret->[0], 0);
+is($ret->[1], 1);
+
+my @buf_tests = (
+ {
+ input => "A",
+ adjustment => -1,
+ warning => eval "qr/empty/",
+ no_warnings_returned_length => 0,
+ },
+ {
+ input => "\xc4\xc5",
+ adjustment => 0,
+ warning => eval "qr/non-continuation/",
+ no_warnings_returned_length => 1,
+ },
+ {
+ input => "\xc4\x80",
+ adjustment => -1,
+ warning => eval "qr/short|1 byte, need 2/",
+ no_warnings_returned_length => 1,
+ },
+ {
+ input => "\xc0\x81",
+ adjustment => 0,
+ warning => eval "qr/overlong|2 bytes, need 1/",
+ no_warnings_returned_length => 2,
+ },
+ {
+ input => "\xe0\x80\x81",
+ adjustment => 0,
+ warning => eval "qr/overlong|3 bytes, need 1/",
+ no_warnings_returned_length => 3,
+ },
+ {
+ input => "\xf0\x80\x80\x81",
+ adjustment => 0,
+ warning => eval "qr/overlong|4 bytes, need 1/",
+ no_warnings_returned_length => 4,
+ },
+ { # Old algorithm failed to detect this
+ input => "\xff\x80\x90\x90\x90\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf",
+ adjustment => 0,
+ warning => eval "qr/overflow/",
+ no_warnings_returned_length => 13,
+ },
+);
+
+if (ord("A") != 65) { # tests not valid for EBCDIC
+ skip("Perl version too early", 2 + 4 + (scalar @buf_tests * 5));
+}
+else {
+ $ret = &Devel::PPPort::utf8_to_uvchr_buf("\xc4\x80", 0);
+ is($ret->[0], 0x100);
+ is($ret->[1], 2);
+
+ my @warnings;
+ local $SIG{__WARN__} = sub { push @warnings, @_; };
+
+ {
+ use warnings 'utf8';
+ $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
+ is($ret->[0], 0);
+ is($ret->[1], -1);
+
+ no warnings 'utf8';
+ $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
+ is($ret->[0], 0xFFFD);
+ is($ret->[1], 1);
+ }
+
+
+ # An empty input is an assertion failure on debugging builds. It is
+ # deliberately the first test.
+ require Config; import Config;
+ use vars '%Config';
+
+ # VMS doesn't put DEBUGGING in ccflags, and Windows doesn't have
+ # $Config{config_args}. When 5.14 or later can be assumed, use
+ # Config::non_bincompat_options(), but for now we're stuck with this.
+ if ( $Config{ccflags} =~ /-DDEBUGGING/
+ || $^O eq 'VMS' && $Config{config_args} =~ /\bDDEBUGGING\b/)
+ {
+ shift @buf_tests;
+ skip("Test not valid on DEBUGGING builds", 5);
+ }
+
+ my $test;
+ for $test (@buf_tests) {
+ my $input = $test->{'input'};
+ my $adjustment = $test->{'adjustment'};
+ my $display = 'utf8_to_uvchr_buf("';
+ my $i;
+ for ($i = 0; $i < length($input) + $adjustment; $i++) {
+ $display .= sprintf "\\x%02x", ord substr($input, $i, 1);
+ }
+
+ $display .= '")';
+ my $warning = $test->{'warning'};
+
+ undef @warnings;
+ use warnings 'utf8';
+ $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
+ is($ret->[0], 0, "returned value $display; warnings enabled");
+ is($ret->[1], -1, "returned length $display; warnings enabled");
+ my $all_warnings = join "; ", @warnings;
+ my $contains = grep { $_ =~ $warning } $all_warnings;
+ is($contains, 1, $display
+ . "; Got: '$all_warnings', which should contain '$warning'");
+
+ undef @warnings;
+ no warnings 'utf8';
+ $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
+ is($ret->[0], 0xFFFD, "returned value $display; warnings disabled");
+ is($ret->[1], $test->{'no_warnings_returned_length'},
+ "returned length $display; warnings disabled");
+ }
+}
+
+if (ivers($]) ge ivers(5.008)) {
+ BEGIN { if (ivers($]) ge ivers(5.008)) { require utf8; "utf8"->import() } }
+
+ is(Devel::PPPort::sv_len_utf8("aščť"), 4);
+ is(Devel::PPPort::sv_len_utf8_nomg("aščť"), 4);
+
+ my $str = "áíé";
+ utf8::downgrade($str);
+ is(Devel::PPPort::sv_len_utf8($str), 3);
+ utf8::downgrade($str);
+ is(Devel::PPPort::sv_len_utf8_nomg($str), 3);
+ utf8::upgrade($str);
+ is(Devel::PPPort::sv_len_utf8($str), 3);
+ utf8::upgrade($str);
+ is(Devel::PPPort::sv_len_utf8_nomg($str), 3);
+
+ tie my $scalar, 'TieScalarCounter', "é";
+
+ is(tied($scalar)->{fetch}, 0);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8($scalar), 2);
+ is(tied($scalar)->{fetch}, 1);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8($scalar), 3);
+ is(tied($scalar)->{fetch}, 2);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8($scalar), 4);
+ is(tied($scalar)->{fetch}, 3);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8_nomg($scalar), 4);
+ is(tied($scalar)->{fetch}, 3);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8_nomg($scalar), 4);
+ is(tied($scalar)->{fetch}, 3);
+ is(tied($scalar)->{store}, 0);
+} else {
+ skip 'skip: no utf8::downgrade/utf8::upgrade support', 23;
+}
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+ my ($class, $value) = @_;
+ return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+ BEGIN { if (main::ivers($]) ge main::ivers(5.008)) { require utf8; "utf8"->import() } }
+ my ($self) = @_;
+ $self->{fetch}++;
+ return $self->{value} .= "é";
+}
+
+sub STORE {
+ my ($self, $value) = @_;
+ $self->{store}++;
+ $self->{value} = $value;
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv
index bb5f19eaaad..96145e6833e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/uv
@@ -14,17 +14,9 @@
__UNDEFINED__
my_strnlen
SvUOK
-utf8_to_uvchr_buf
-
-=dontwarn
-
-_ppport_utf8_to_uvchr_buf_callee
-_ppport_MIN
=implementation
-#define _ppport_MIN(a,b) (((a) <= (b)) ? (a) : (b))
-
__UNDEFINED__ sv_setuv(sv, uv) \
STMT_START { \
UV TeMpUv = uv; \
@@ -36,15 +28,26 @@ __UNDEFINED__ sv_setuv(sv, uv) \
__UNDEFINED__ newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+__UNDEFINED__ sv_2uv(sv) ({ SV *_sv = (sv); (UV) (SvNOK(_sv) ? SvNV(_sv) : sv_2nv(_sv)); })
+#else
__UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+#endif
+
__UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv))
__UNDEFINED__ SvUVXx(sv) SvUVX(sv)
__UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+__UNDEFINED__ SvUVx(sv) ({ SV *_sv = (sv)); SvUV(_sv); })
+#else
__UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
+#endif
/* Hint: sv_uv
* Always use the SvUVx() macro instead of sv_uv().
*/
+/* Replace sv_uv with SvUVx */
__UNDEFINED__ sv_uv(sv) SvUVx(sv)
#if !defined(SvUOK) && defined(SvIOK_UV)
@@ -57,21 +60,10 @@ __UNDEFINED__ XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_E
__UNDEFINED__ PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
__UNDEFINED__ XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
-#if defined UTF8SKIP
-
-/* Don't use official version because it uses MIN, which may not be available */
-#undef UTF8_SAFE_SKIP
-
-__UNDEFINED__ UTF8_SAFE_SKIP(s, e) ( \
- ((((e) - (s)) <= 0) \
- ? 0 \
- : _ppport_MIN(((e) - (s)), UTF8SKIP(s))))
-#endif
-
#if !defined(my_strnlen)
#if { NEED my_strnlen }
-STRLEN
+Size_t
my_strnlen(const char *str, Size_t maxlen)
{
const char *p = str;
@@ -85,212 +77,9 @@ my_strnlen(const char *str, Size_t maxlen)
#endif
#endif
-#if { VERSION < 5.31.2 }
- /* Versions prior to this accepted things that are now considered
- * malformations, and didn't return -1 on error with warnings enabled
- * */
-# undef utf8_to_uvchr_buf
-#endif
-
-/* This implementation brings modern, generally more restricted standards to
- * utf8_to_uvchr_buf. Some of these are security related, and clearly must
- * be done. But its arguable that the others need not, and hence should not.
- * The reason they're here is that a module that intends to play with the
- * latest perls shoud be able to work the same in all releases. An example is
- * that perl no longer accepts any UV for a code point, but limits them to
- * IV_MAX or below. This is for future internal use of the larger code points.
- * If it turns out that some of these changes are breaking code that isn't
- * intended to work with modern perls, the tighter restrictions could be
- * relaxed. khw thinks this is unlikely, but has been wrong in the past. */
-
-#ifndef utf8_to_uvchr_buf
- /* Choose which underlying implementation to use. At least one must be
- * present or the perl is too early to handle this function */
-# if defined(utf8n_to_uvchr) || defined(utf8_to_uv)
-# if defined(utf8n_to_uvchr) /* This is the preferred implementation */
-# define _ppport_utf8_to_uvchr_buf_callee utf8n_to_uvchr
-# else
-# define _ppport_utf8_to_uvchr_buf_callee utf8_to_uv
-# endif
-
-# endif
-
-#ifdef _ppport_utf8_to_uvchr_buf_callee
-# if { NEED utf8_to_uvchr_buf }
-
-UV
-utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
-{
- UV ret;
- STRLEN curlen;
- bool overflows = 0;
- const U8 *cur_s = s;
- const bool do_warnings = ckWARN_d(WARN_UTF8);
-
- if (send > s) {
- curlen = send - s;
- }
- else {
- assert(0); /* Modern perls die under this circumstance */
- curlen = 0;
- if (! do_warnings) { /* Handle empty here if no warnings needed */
- if (retlen) *retlen = 0;
- return UNICODE_REPLACEMENT;
- }
- }
-
- /* The modern version allows anything that evaluates to a legal UV, but not
- * overlongs nor an empty input */
- ret = _ppport_utf8_to_uvchr_buf_callee(
- s, curlen, retlen, (UTF8_ALLOW_ANYUV
- & ~(UTF8_ALLOW_LONG|UTF8_ALLOW_EMPTY)));
-
- /* But actually, modern versions restrict the UV to being no more than what
- * an IV can hold */
- if (ret > PERL_INT_MAX) {
- overflows = 1;
- }
-
-# if { VERSION < 5.26.0 }
-# ifndef EBCDIC
-
- /* There are bugs in versions earlier than this on non-EBCDIC platforms
- * in which it did not detect all instances of overflow, which could be
- * a security hole. Also, earlier versions did not allow the overflow
- * malformation under any circumstances, and modern ones do. So we
- * need to check here. */
-
- else if (curlen > 0 && *s >= 0xFE) {
-
- /* If the main routine detected overflow, great; it returned 0. But if the
- * input's first byte indicates it could overflow, we need to verify.
- * First, on a 32-bit machine the first byte being at least \xFE
- * automatically is overflow */
- if (sizeof(ret) < 8) {
- overflows = 1;
- }
- else {
- const U8 highest[] = /* 2*63-1 */
- "\xFF\x80\x87\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF\xBF";
- const U8 *cur_h = highest;
-
- for (cur_s = s; cur_s < send; cur_s++, cur_h++) {
- if (UNLIKELY(*cur_s == *cur_h)) {
- continue;
- }
-
- /* If this byte is larger than the corresponding highest UTF-8
- * byte, the sequence overflows; otherwise the byte is less than
- * (as we handled the equality case above), and so the sequence
- * doesn't overflow */
- overflows = *cur_s > *cur_h;
- break;
-
- }
-
- /* Here, either we set the bool and broke out of the loop, or got
- * to the end and all bytes are the same which indicates it doesn't
- * overflow. */
- }
- }
-
-# endif
-# endif /* < 5.26 */
-
- if (UNLIKELY(overflows)) {
- if (! do_warnings) {
- if (retlen) {
- *retlen = _ppport_MIN(*retlen, UTF8SKIP(s));
- *retlen = _ppport_MIN(*retlen, curlen);
- }
- return UNICODE_REPLACEMENT;
- }
- else {
-
- /* On versions that correctly detect overflow, but forbid it
- * always, 0 will be returned, but also a warning will have been
- * raised. Don't repeat it */
- if (ret != 0) {
- /* We use the error message in use from 5.8-5.14 */
- Perl_warner(aTHX_ packWARN(WARN_UTF8),
- "Malformed UTF-8 character (overflow at 0x%" UVxf
- ", byte 0x%02x, after start byte 0x%02x)",
- ret, *cur_s, *s);
- }
- if (retlen) {
- *retlen = (STRLEN) -1;
- }
- return 0;
- }
- }
-
- /* If failed and warnings are off, to emulate the behavior of the real
- * utf8_to_uvchr(), try again, allowing anything. (Note a return of 0 is
- * ok if the input was '\0') */
- if (UNLIKELY(ret == 0 && (curlen == 0 || *s != '\0'))) {
-
- /* If curlen is 0, we already handled the case where warnings are
- * disabled, so this 'if' will be true, and we won't look at the
- * contents of 's' */
- if (do_warnings) {
- *retlen = (STRLEN) -1;
- }
- else {
- ret = _ppport_utf8_to_uvchr_buf_callee(
- s, curlen, retlen, UTF8_ALLOW_ANY);
- /* Override with the REPLACEMENT character, as that is what the
- * modern version of this function returns */
- ret = UNICODE_REPLACEMENT;
-
-# if { VERSION < 5.16.0 }
-
- /* Versions earlier than this don't necessarily return the proper
- * length. It should not extend past the end of string, nor past
- * what the first byte indicates the length is, nor past the
- * continuation characters */
- if (retlen && *retlen >= 0) {
- *retlen = _ppport_MIN(*retlen, curlen);
- *retlen = _ppport_MIN(*retlen, UTF8SKIP(s));
- unsigned int i = 1;
- do {
- if (s[i] < 0x80 || s[i] > 0xBF) {
- *retlen = i;
- break;
- }
- } while (++i < *retlen);
- }
-
-# endif
-
- }
- }
-
- return ret;
-}
-
-# endif
-#endif
-#endif
-
-#if defined(UTF8SKIP) && defined(utf8_to_uvchr_buf)
-#undef utf8_to_uvchr /* Always redefine this unsafe function so that it refuses
- to read past a NUL, making it much less likely to read
- off the end of the buffer. A NUL indicates the start
- of the next character anyway. If the input isn't
- NUL-terminated, the function remains unsafe, as it
- always has been. */
-
-__UNDEFINED__ utf8_to_uvchr(s, lp) \
- ((*(s) == '\0') \
- ? utf8_to_uvchr_buf(s,((s)+1), lp) /* Handle single NUL specially */ \
- : utf8_to_uvchr_buf(s, (s) + my_strnlen((char *) (s), UTF8SKIP(s)), (lp)))
-
-#endif
-
=xsinit
#define NEED_my_strnlen
-#define NEED_utf8_to_uvchr_buf
=xsubs
@@ -353,16 +142,6 @@ XPUSHu()
XSRETURN(1);
STRLEN
-UTF8_SAFE_SKIP(s, adjustment)
- unsigned char * s
- int adjustment
- CODE:
- /* Instead of passing in an 'e' ptr, use the real end, adjusted */
- RETVAL = UTF8_SAFE_SKIP(s, s + UTF8SKIP(s) + adjustment);
- OUTPUT:
- RETVAL
-
-STRLEN
my_strnlen(s, max)
char * s
STRLEN max
@@ -371,169 +150,18 @@ my_strnlen(s, max)
OUTPUT:
RETVAL
-AV *
-utf8_to_uvchr_buf(s, adjustment)
- unsigned char *s
- int adjustment
- PREINIT:
- AV *av;
- STRLEN len;
- CODE:
- av = newAV();
- av_push(av, newSVuv(utf8_to_uvchr_buf(s,
- s + UTF8SKIP(s) + adjustment,
- &len)));
- if (len == (STRLEN) -1) {
- av_push(av, newSViv(-1));
- }
- else {
- av_push(av, newSVuv(len));
- }
- RETVAL = av;
- OUTPUT:
- RETVAL
-
-AV *
-utf8_to_uvchr(s)
- unsigned char *s
- PREINIT:
- AV *av;
- STRLEN len;
- CODE:
- av = newAV();
- av_push(av, newSVuv(utf8_to_uvchr(s, &len)));
- if (len == (STRLEN) -1) {
- av_push(av, newSViv(-1));
- }
- else {
- av_push(av, newSVuv(len));
- }
- RETVAL = av;
- OUTPUT:
- RETVAL
-
-=tests plan => 52
-
-ok(&Devel::PPPort::sv_setuv(42), 42);
-ok(&Devel::PPPort::newSVuv(123), 123);
-ok(&Devel::PPPort::sv_2uv("4711"), 4711);
-ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
-ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
-ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
-ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
-ok(&Devel::PPPort::XSRETURN_UV(), 42);
-ok(&Devel::PPPort::PUSHu(), 42);
-ok(&Devel::PPPort::XPUSHu(), 43);
-ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", 0), 1);
-ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", -1), 0);
-ok(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
-
-my $ret = &Devel::PPPort::utf8_to_uvchr("A");
-ok($ret->[0], ord("A"));
-ok($ret->[1], 1);
-
-$ret = &Devel::PPPort::utf8_to_uvchr("\0");
-ok($ret->[0], 0);
-ok($ret->[1], 1);
-
-$ret = &Devel::PPPort::utf8_to_uvchr_buf("A", 0);
-ok($ret->[0], ord("A"));
-ok($ret->[1], 1);
-
-$ret = &Devel::PPPort::utf8_to_uvchr_buf("\0", 0);
-ok($ret->[0], 0);
-ok($ret->[1], 1);
-
-if (ord("A") != 65) { # tests not valid for EBCDIC
- ok(1, 1) for 1 .. (2 + 4 + (5 * 5));
-}
-else {
- $ret = &Devel::PPPort::utf8_to_uvchr_buf("\xc4\x80", 0);
- ok($ret->[0], 0x100);
- ok($ret->[1], 2);
-
- my @warnings;
- local $SIG{__WARN__} = sub { push @warnings, @_; };
-
- {
- use warnings 'utf8';
- $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
- ok($ret->[0], 0);
- ok($ret->[1], -1);
-
- no warnings;
- $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
- ok($ret->[0], 0xFFFD);
- ok($ret->[1], 1);
- }
-
- my @buf_tests = (
- {
- input => "A",
- adjustment => -1,
- warning => qr/empty/,
- no_warnings_returned_length => 0,
- },
- {
- input => "\xc4\xc5",
- adjustment => 0,
- warning => qr/non-continuation/,
- no_warnings_returned_length => 1,
- },
- {
- input => "\xc4\x80",
- adjustment => -1,
- warning => qr/short|1 byte, need 2/,
- no_warnings_returned_length => 1,
- },
- {
- input => "\xc0\x81",
- adjustment => 0,
- warning => qr/overlong|2 bytes, need 1/,
- no_warnings_returned_length => 2,
- },
- { # Old algorithm supposedly failed to detect this
- input => "\xff\x80\x90\x90\x90\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf",
- adjustment => 0,
- warning => qr/overflow/,
- no_warnings_returned_length => 13,
- },
- );
-
- # An empty input is an assertion failure on debugging builds. It is
- # deliberately the first test.
- require Config; import Config;
- use vars '%Config';
- if ($Config{ccflags} =~ /-DDEBUGGING/) {
- shift @buf_tests;
- ok(1, 1) for 1..5;
- }
-
- for my $test (@buf_tests) {
- my $input = $test->{'input'};
- my $adjustment = $test->{'adjustment'};
- my $display = 'utf8_to_uvchr_buf("';
- for (my $i = 0; $i < length($input) + $adjustment; $i++) {
- $display .= sprintf "\\x%02x", ord substr($input, $i, 1);
- }
-
- $display .= '")';
- my $warning = $test->{'warning'};
-
- undef @warnings;
- use warnings 'utf8';
- $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
- ok($ret->[0], 0, "returned value $display; warnings enabled");
- ok($ret->[1], -1, "returned length $display; warnings enabled");
- my $all_warnings = join "; ", @warnings;
- my $contains = grep { $_ =~ $warning } $all_warnings;
- ok($contains, 1, $display . "; '$all_warnings' contains '$warning'");
-
- undef @warnings;
- no warnings 'utf8';
- $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
- ok($ret->[0], 0xFFFD, "returned value $display; warnings disabled");
- ok($ret->[1], $test->{'no_warnings_returned_length'},
- "returned length $display; warnings disabled");
- }
-}
+=tests plan => 11
+
+BEGIN { require warnings if "$]" > '5.006' }
+
+is(&Devel::PPPort::sv_setuv(42), 42);
+is(&Devel::PPPort::newSVuv(123), 123);
+is(&Devel::PPPort::sv_2uv("4711"), 4711);
+is(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
+is(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
+is(&Devel::PPPort::SvUVx(1735928559), 1735928559);
+is(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
+is(&Devel::PPPort::XSRETURN_UV(), 42);
+is(&Devel::PPPort::PUSHu(), 42);
+is(&Devel::PPPort::XPUSHu(), 43);
+is(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables
index 83dd5e83081..cc984c852b1 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/variables
@@ -18,6 +18,7 @@ PL_DBsingle
PL_DBsub
PL_DBtrace
PL_Sv
+PL_Xpv
PL_bufend
PL_bufptr
PL_compiling
@@ -58,6 +59,7 @@ PL_tainted
PL_tainting
PL_tokenbuf
PL_signals
+PL_mess_sv
PERL_SIGNALS_UNSAFE_FLAG
=implementation
@@ -97,6 +99,7 @@ __NEED_VAR__ U32 PL_signals = D_PPP_PERL_SIGNALS_INIT;
# define PL_DBsub DBsub
# define PL_DBtrace DBtrace
# define PL_Sv Sv
+# define PL_Xpv Xpv
# define PL_bufend bufend
# define PL_bufptr bufptr
# define PL_compiling compiling
@@ -134,13 +137,14 @@ __NEED_VAR__ U32 PL_signals = D_PPP_PERL_SIGNALS_INIT;
# define PL_tainted tainted
# define PL_tainting tainting
# define PL_tokenbuf tokenbuf
+# define PL_mess_sv mess_sv
/* Replace: 0 */
#endif
/* Warning: PL_parser
* For perl versions earlier than 5.9.5, this is an always
* non-NULL dummy. Also, it cannot be dereferenced. Don't
- * use it if you can avoid is and unless you absolutely know
+ * use it if you can avoid it, and unless you absolutely know
* what you're doing.
* If you always check that PL_parser is non-NULL, you can
* define DPPP_PL_parser_NO_DUMMY to avoid the creation of
@@ -438,13 +442,13 @@ ok(Devel::PPPort::compare_PL_signals());
ok(!defined(&Devel::PPPort::PL_sv_undef()));
ok(&Devel::PPPort::PL_sv_yes());
ok(!&Devel::PPPort::PL_sv_no());
-ok(&Devel::PPPort::PL_na("abcd"), 4);
-ok(&Devel::PPPort::PL_Sv(), "mhx");
+is(&Devel::PPPort::PL_na("abcd"), 4);
+is(&Devel::PPPort::PL_Sv(), "mhx");
ok(defined &Devel::PPPort::PL_tokenbuf());
ok("$]" >= 5.009005 || &Devel::PPPort::PL_parser());
ok(&Devel::PPPort::PL_hexdigit() =~ /^[0-9a-zA-Z]+$/);
ok(defined &Devel::PPPort::PL_hints());
-ok(&Devel::PPPort::PL_ppaddr("mhx"), "MHX");
+is(&Devel::PPPort::PL_ppaddr("mhx"), "MHX");
for (&Devel::PPPort::other_variables()) {
ok($_ != 0);
@@ -470,7 +474,7 @@ for (&Devel::PPPort::other_variables()) {
else {
ok(@w == 0);
}
- ok($fail, 0);
+ is($fail, 0);
}
ok(&Devel::PPPort::no_dummy_parser_vars(1) >= ("$]" < 5.009005 ? 1 : 0));
@@ -478,7 +482,7 @@ ok(&Devel::PPPort::no_dummy_parser_vars(1) >= ("$]" < 5.009005 ? 1 : 0));
eval { &Devel::PPPort::no_dummy_parser_vars(0) };
if ("$]" < 5.009005) {
- ok($@, '');
+ is($@, '');
}
else {
if ($@) {
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn
index b4a5695f8ff..32c772ea2ad 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/inc/warn
@@ -159,7 +159,7 @@ ok("$]" >= 5.004 ? $warning =~ /^Perl_warner_nocontext bar:42/ : $warning eq '')
$warning = '';
Devel::PPPort::ckWARN();
-ok($warning, '');
+is($warning, '');
$^W = 1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc
index efa648f81ea..4d34f774990 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppport.fnc
@@ -1,5 +1,7 @@
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
+: !!!! Do NOT edit this file directly! -- Edit devel/mkppport_fnc.pl instead. !!!!
+:
: Perl/Pollution/Portability
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@@ -12,12 +14,87 @@
: modify it under the same terms as Perl itself.
:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-
:
: This file lists all API functions/macros that are provided purely
-: by Devel::PPPort. It is in the same format as the F<embed.fnc> that
-: ships with the Perl source code.
+: by Devel::PPPort, or that are not public. It is in the same format as the
+: F<embed.fnc> that ships with the Perl source code.
:
+: Since these are used only to provide the argument types, it's ok to have the
+: return value be void for some where it's an issues
-Am |void |sv_magic_portable|NN SV* sv|NULLOK SV* obj|int how|NULLOK const char* name \
- |I32 namlen
+Amn|void|aTHXR
+Amn|void|aTHXR_
+md|int|AvFILLp|AV* av
+Amn|void|DEFSV
+Amn|void|dMY_CXT_SV
+Amn|void|dNOOP
+Amn|void|dTHXR
+Amn|void|dXSTARG
+Amn|void|END_EXTERN_C
+Amn|void|EXTERN_C
+Amn|void|GV_NOADD_MASK
+Amn|void|IN_PERL_COMPILETIME
+Amn|void|NOOP
+Amn|void|PERL_BCDVERSION
+Amn|void|Perl_eval_pv
+Amn|void|Perl_eval_sv
+Amn|void|PERL_MAGIC_glob
+Amn|void|PERL_MAGIC_mutex
+Amn|void|PERL_MAGIC_overload
+Amn|void|PERL_MAGIC_overload_elem
+Amn|void|PERL_PV_PRETTY_DUMP
+Amn|void|PERL_PV_PRETTY_NOCLEAR
+Amn|void|PERL_PV_PRETTY_REGPROP
+Amn|void|PERL_SIGNALS_UNSAFE_FLAG
+Amn|void|PERL_UINT_MIN
+Amn|void|PERL_UNUSED_CONTEXT
+Amn|void|PERL_UNUSED_DECL
+Amn|void|PERL_USE_GCC_BRACE_GROUPS
+Amn|void|PL_bufend
+Amn|void|PL_bufptr
+Amn|void|PL_compiling
+Amn|void|PL_copline
+Amn|void|PL_DBsignal
+mnd|SV *|PL_DBsingle
+mnd|GV *|PL_DBsub
+mnd|SV *|PL_DBtrace
+Amn|void|PL_debstash
+Amn|void|PL_diehook
+Amn|void|PL_dirty
+mnd|U8|PL_dowarn
+Amn|void|PL_error_count
+Amn|void|PL_expect
+Amn|void|PL_hexdigit
+Amn|void|PL_hints
+Amn|void|PL_in_my
+Amn|void|PL_in_my_stash
+Amn|void|PL_laststatval
+Amn|void|PL_lex_state
+Amn|void|PL_lex_stuff
+Amn|void|PL_linestr
+Amn|void|PL_mess_sv
+Amn|void|PL_no_modify
+Amn|void|PL_perldb
+Amn|void|PL_ppaddr
+Amn|void|PL_rsfp
+Amn|void|PL_rsfp_filters
+Amn|void|PL_stack_base
+Amn|void|PL_stack_sp
+Amn|void|PL_statcache
+Amn|void|PL_stdingv
+Amn|void|PL_Sv
+Amn|void|PL_sv_arenaroot
+Amn|void|PL_tainted
+Amn|void|PL_tainting
+Amn|void|PL_tokenbuf
+Amn|void|PL_Xpv
+Amn|void|PTRV
+Amn|void|SAVE_DEFSV
+Amn|void|START_EXTERN_C
+Amn|void|SV_CONST_RETURN
+Amn|void|SV_COW_SHARED_HASH_KEYS
+Am|void|sv_magic_portable|NN SV* sv|NULLOK SV* obj|int how|NULLOK const char* name|I32 namlen
+Amn|void|SV_MUTABLE_RETURN
+Amn|void|SV_UTF8_NO_ENCODING
+Amn|void|WARN_ASSERTIONS
+Amn|void|XSprePUSH
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl
index e84f646328f..c73e2b01606 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/ppptools.pl
@@ -2,6 +2,9 @@
#
# ppptools.pl -- various utility functions
#
+# WARNING: This will be called by old perls. You can't use modern constructs
+# in it.
+#
################################################################################
#
# Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
@@ -13,6 +16,8 @@
#
################################################################################
+require './parts/inc/inctools';
+
sub cat_file
{
eval { require File::Spec };
@@ -33,6 +38,18 @@ sub all_files_in_dir
sub parse_todo
{
+ # Creates a hash with the keys being all symbols found in all the files in
+ # the input directory (default 'parts/todo'), and the values being each a
+ # subhash like so:
+ # 'utf8_hop_forward' => {
+ # 'code' => 'U',
+ # 'version' => '5.025007'
+ # },
+ #
+ # The input line that generated that was this:
+ #
+ # utf8_hop_forward # U
+
my $dir = shift || 'parts/todo';
local *TODO;
my %todo;
@@ -40,16 +57,18 @@ sub parse_todo
for $todo (all_files_in_dir($dir)) {
open TODO, $todo or die "cannot open $todo: $!\n";
- my $perl = <TODO>;
- chomp $perl;
+ my $version = <TODO>;
+ chomp $version;
while (<TODO>) {
chomp;
- s/#.*//;
+ s/#(?: (\w)\b)?.*//; # 'code' is optional
+ my $code = $1;
s/^\s+//; s/\s+$//;
/^\s*$/ and next;
/^\w+$/ or die "invalid identifier: $_\n";
- exists $todo{$_} and die "duplicate identifier: $_ ($todo{$_} <=> $perl)\n";
- $todo{$_} = $perl;
+ exists $todo{$_} and die "duplicate identifier: $_ ($todo{$_} <=> $version)\n";
+ $todo{$_}{'version'} = $version;
+ $todo{$_}{'code'} = $code if $code;
}
close TODO;
}
@@ -70,6 +89,7 @@ sub parse_partspec
{
my $file = shift;
my $section = 'implementation';
+
my $vsec = join '|', qw( provides dontwarn implementation
xsubs xsinit xsmisc xshead xsboot tests );
my(%data, %options);
@@ -82,7 +102,9 @@ sub parse_partspec
m!//! && !m!(?:=~|s/).*//! && !m!(?:ht|f)tp(?:s)://!
and warn "$file:$.: warning: potential C++ comment\n";
}
+
/^##/ and next;
+
if (/^=($vsec)(?:\s+(.*))?/) {
$section = $1;
if (defined $2) {
@@ -103,8 +125,14 @@ sub parse_partspec
$data{$_} = join '', @v;
}
- unless (exists $data{provides}) {
- $data{provides} = ($file =~ /(\w+)\.?$/)[0];
+ if (! exists $data{provides}) {
+ if ($file =~ /inctools$/) { # This file is special, it doesn't 'provide'
+ # any API, but has subs to use internally
+ $data{provides} = "";
+ }
+ else {
+ $data{provides} = ($file =~ /(\w+)\.?$/)[0];
+ }
}
$data{provides} = [$data{provides} =~ /(\S+)/g];
@@ -224,7 +252,8 @@ sub ppcond
join " && ", @c;
}
-sub trim_arg
+sub trim_arg # Splits the argument into type and name, returning the
+ # pair: (type, name)
{
my $in = shift;
my $remove = join '|', qw( NN NULLOK VOL );
@@ -232,40 +261,45 @@ sub trim_arg
$in eq '...' and return ($in);
local $_ = $in;
- my $id;
+ my $name; # Work on the name
- s/[*()]/ /g;
- s/\[[^\]]*\]/ /g;
+ s/[*()]/ /g; # Get rid of this punctuation
+ s/ \[ [^\]]* \] / /xg; # Get rid of dimensions
s/\b(?:auto|const|extern|inline|register|static|volatile|restrict)\b//g;
s/\b(?:$remove)\b//;
- s/^\s*//; s/\s*$//;
+ s/^\s+//; s/\s+$//; # No leading, trailing space
- if( /^\b(?:struct|union|enum)\s+\w+(?:\s+(\w+))?$/ ) {
- defined $1 and $id = $1;
+ if( /^\b (?:struct|union|enum) \s+ \w+ (?: \s+ ( \w+ ) )? $/x ) {
+ defined $1 and $name = $1; # Extract the name for one of these declarations
}
else {
if( s/\b(?:char|double|float|int|long|short|signed|unsigned|void)\b//g ) {
- /^\s*(\w+)\s*$/ and $id = $1;
+ /^ \s* (\w+) \s* $/x and $name = $1; # Similarly for these
+ }
+ elsif (/^ \s* " [^"]+ " \s+ (\w+) \s* $/x) { # A literal string (is special)
+ $name = $1;
}
else {
- /^\s*\w+\s+(\w+)\s*$/ and $id = $1;
+ /^ \s* \w+ \s+ (\w+) \s* $/x and $name = $1; # Everything else.
}
}
- $_ = $in;
+ $_ = $in; # Now work on the type.
- defined $id and s/\b$id\b//;
+ # Get rid of the name if we found one
+ defined $name and s/\b$name\b//;
- # these don't matter at all
+ # these don't matter at all; note that const does matter
s/\b(?:auto|extern|inline|register|static|volatile|restrict)\b//g;
s/\b(?:$remove)\b//;
- s/(?=<\*)\s+(?=\*)//g;
- s/\s*(\*+)\s*/ $1 /g;
- s/^\s*//; s/\s*$//;
- s/\s+/ /g;
+ while (s/ \* \s+ \* /**/xg) {} # No spaces within pointer sequences
+ s/ \s* ( \*+ ) \s* / $1 /xg; # Normalize pointer sequences to be surrounded
+ # by a single space
+ s/^\s+//; s/\s+$//; # No leading, trailing spacd
+ s/\s+/ /g; # Collapse multiple space into one
- return ($_, $id);
+ return ($_, $name);
}
sub parse_embed
@@ -306,7 +340,27 @@ sub parse_embed
my @e = split /\s*\|\s*/, $line;
if( @e >= 3 ) {
my($flags, $ret, $name, @args) = @e;
- next if $flags =~ /[DM]/; # Skip entries marked as deprecated or unstable
+
+ # Skip non-name entries, like
+ # PL_parser-E<gt>linestr
+ # which documents a struct entry rather than a function. We retain
+ # all other entries, so that our caller has full information, and
+ # may skip things like non-public functions.
+ next if $flags =~ /N/;
+
+ # M implies m for the purposes of this module.
+ $flags .= 'm' if $flags =~ /M/;
+
+ # An entry marked 'b' is in mathoms, so is effectively deprecated,
+ # as it can be removed at anytime. But if it also has a macro to
+ # implement it, that macro stays when mathoms is removed, so the
+ # non-'Perl_' form isn't deprecated. embed.fnc is supposed to have
+ # already set this up, but make sure.
+ if ($flags =~ /b/ && $flags !~ /m/ && $flags !~ /D/) {
+ warn "Expecting D flag for '$name', since it is b without [Mm]";
+ $flags .= 'D';
+ }
+
if ($name =~ /^[^\W\d]\w*$/) {
for (@args) {
$_ = [trim_arg($_)];
@@ -319,11 +373,7 @@ sub parse_embed
args => \@args,
cond => ppcond(\@pps),
};
- }
- elsif ($name =~ /^[^\W\d]\w*-E<gt>[^\W\d]\w*$/) {
- # silenty ignore entries of the form
- # PL_parser-E<gt>linestr
- # which documents a struct entry rather than a function
+ $func[-1]{'ppport_fnc'} = 1 if $file =~ /ppport\.fnc/;
}
else {
warn "mysterious name [$name] in $file, line $.\n";
@@ -335,71 +385,94 @@ sub parse_embed
close FILE;
}
- return @func;
-}
+ # Here's what two elements of the array look like:
+ # {
+ # 'args' => [
+ # [
+ # 'const nl_item',
+ # 'item'
+ # ]
+ # ],
+ # 'cond' => '(defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H))',
+ # 'flags' => {
+ # 'A' => 1,
+ # 'T' => 1,
+ # 'd' => 1,
+ # 'o' => 1
+ # },
+ # 'name' => 'Perl_langinfo',
+ # 'ret' => 'const char *'
+ # },
+ # {
+ # 'args' => [
+ # [
+ # 'const int',
+ # 'item'
+ # ]
+ # ],
+ # 'cond' => '!(defined(HAS_NL_LANGINFO) && defined(PERL_LANGINFO_H))',
+ # 'flags' => {
+ # 'A' => 1,
+ # 'T' => 1,
+ # 'd' => 1,
+ # 'o' => 1
+ # },
+ # 'name' => 'Perl_langinfo',
+ # 'ret' => 'const char *'
+ # },
-sub make_prototype
-{
- my $f = shift;
- my @args = map { "@$_" } @{$f->{args}};
- my $proto;
- my $pTHX_ = exists $f->{flags}{n} ? "" : "pTHX_ ";
- $proto = "$f->{ret} $f->{name}" . "($pTHX_" . join(', ', @args) . ')';
- return $proto;
+ return @func;
}
-sub format_version
+sub known_but_hard_to_test_for
{
- my $ver = shift;
-
- $ver =~ s/$/000000/;
- my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
-
- $v = int $v;
- $s = int $s;
-
- if ($r < 5 || ($r == 5 && $v < 6)) {
- if ($s % 10) {
- die "invalid version '$ver'\n";
+ # This returns a list of functions/symbols that are in Perl, but the tests
+ # for their existence don't work, usually as a result of them being XS,
+ # and using XS to test. Effectively, any XS code that compiles and works
+ # is exercising most of these XS-related ones.
+ #
+ # The values for the keys are each the version that ppport.h makes them
+ # work on, and were gleaned by manually looking at the code parts/inc/*.
+ # For non-ppport.h, scanprov will automatically figure out the version
+ # they were introduced in.
+
+ my %return;
+
+ for (qw(CLASS dXSI32 items ix pTHX_ RETVAL StructCopy svtype
+ STMT_START STMT_END STR_WITH_LEN THIS XS))
+ {
+ # __MIN_PERL__ is this at the time of this commit. This is the
+ # earliest these have been tested to at the time of the commit, but
+ # likely go back further.
+ $return{$_} = '5.003_07';
+ }
+ for (qw(_pMY_CXT pMY_CXT_)) {
+ $return{$_} = '5.9.0';
+ }
+ for (qw(XopDISABLE XopENABLE XopENTRY XopENTRYCUSTOM XopENTRY_set)) {
+ $return{$_} = '5.13.7';
+ }
+ for (qw(XS_EXTERNAL XS_INTERNAL)) {
+ $return{$_} = '5.15.2';
}
- $s /= 10;
-
- $ver = sprintf "%d.%03d", $r, $v;
- $s > 0 and $ver .= sprintf "_%02d", $s;
-
- return $ver;
- }
- return sprintf "%d.%d.%d", $r, $v, $s;
+ return \%return;
}
-sub parse_version
+sub normalize_prototype # So that they can be compared more easily
{
- my $ver = shift;
-
- if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
- return ($1, $2, $3);
- }
- elsif ($ver !~ /^\d+\.\d{3}(?:_\d{2})?$/) {
- die "cannot parse version '$ver'\n";
- }
-
- $ver =~ s/_//g;
- $ver =~ s/$/000000/;
-
- my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
-
- $v = int $v;
- $s = int $s;
-
- if ($r < 5 || ($r == 5 && $v < 6)) {
- if ($s % 10) {
- die "cannot parse version '$ver'\n";
- }
- $s /= 10;
- }
-
- return ($r, $v, $s);
+ my $proto = shift;
+ $proto =~ s/\s* \* \s* / * /xg;
+ return $proto;
}
+sub make_prototype
+{
+ my $f = shift;
+ my @args = map { "@$_" } @{$f->{args}};
+ my $proto;
+ my $pTHX_ = exists $f->{flags}{T} ? "" : "pTHX_ ";
+ $proto = "$f->{ret} $f->{name}" . "($pTHX_" . join(', ', @args) . ')';
+ return normalize_prototype($proto);
+}
1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5003007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5003007
new file mode 100644
index 00000000000..fc87a0c321e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5003007
@@ -0,0 +1,912 @@
+5.003007
+amagic_call # T
+aTHX # T
+aTHX_ # T
+aTHXR # T
+aTHXR_ # T
+av_clear # T
+av_extend # T
+av_fetch # T
+av_fill # T
+AvFILL # T
+AvFILLp # T
+av_len # T
+av_make # T
+av_pop # T
+av_push # T
+av_shift # T
+av_store # T
+av_tindex # T
+av_top_index # T
+av_undef # T
+av_unshift # T
+ax # T
+BIN # T
+BOM_UTF8 # T
+boolSV # T
+BYTEORDER # T
+call_argv # T
+call_method # T
+call_pv # T
+call_sv # T
+C_ARRAY_END # T
+C_ARRAY_LENGTH # T
+CASTFLAGS # T
+cBOOL # T
+ckWARN # T
+Copy # T
+CopyD # T
+CPPMINUS # T
+CPPSTDIN # T
+croak # T
+croak_memory_wrap # T
+croak_no_modify # T
+croak_sv # T
+croak_xs_usage # T
+cv_clone # T
+cv_const_sv # T
+CvDEPTH # T
+CvGV # T
+CvSTASH # T
+cv_undef # T
+cxinc # T
+dAX # T
+dAXMARK # T
+DEFSV # T
+die # T
+die_sv # T
+dITEMS # T
+dMARK # T
+dNOOP # T
+do_close # T
+do_join # T
+do_open # T
+dORIGMARK # T
+do_sprintf # T
+dounwind # T
+dowantarray # T
+dSP # T
+dTHR # T
+dTHX # T
+dTHXR # T
+dUNDERBAR # T
+dVAR # T
+dXCPT # T
+dXSARGS # T
+dXSTARG # T
+END_EXTERN_C # T
+ENTER # T
+ERRSV # T
+eval_pv # T
+eval_sv # T
+EXTEND # T
+EXTERN_C # T
+filter_add # T
+filter_del # T
+filter_read # T
+free_tmps # T
+FREETMPS # T
+G_ARRAY # T
+G_DISCARD # T
+get_av # T
+get_cv # T
+get_cvn_flags # T
+get_hv # T
+get_sv # T
+G_EVAL # T
+GIMME # T
+G_METHOD # T
+G_NOARGS # T
+gp_free # T
+gp_ref # T
+G_RETHROW # T
+grok_bin # T
+grok_hex # T
+grok_number # T
+GROK_NUMERIC_RADIX # T
+grok_numeric_radix # T
+grok_oct # T
+G_SCALAR # T
+GV_ADD # T
+GV_ADDMULTI # T
+GvAV # T
+gv_AVadd # T
+gv_check # T
+GvCV # T
+gv_efullname # T
+gv_efullname3 # T
+gv_fetchfile # T
+gv_fetchmeth # T
+gv_fetchmethod # T
+gv_fetchpv # T
+gv_fetchpvn_flags # T
+gv_fetchsv # T
+gv_fullname # T
+gv_fullname3 # T
+GvHV # T
+gv_HVadd # T
+gv_init # T
+gv_init_pvn # T
+gv_IOadd # T
+GV_NOADD_MASK # T
+gv_stashpv # T
+gv_stashpvn # T
+gv_stashpvs # T
+gv_stashsv # T
+GvSV # T
+HEf_SVKEY # T
+HeHASH # T
+HeKEY # T
+HeKLEN # T
+HeSVKEY # T
+HeSVKEY_force # T
+HeVAL # T
+hv_clear # T
+hv_delete # T
+hv_delete_ent # T
+hv_exists # T
+hv_exists_ent # T
+hv_fetch # T
+hv_fetch_ent # T
+hv_fetchs # T
+HvFILL # T
+hv_iterinit # T
+hv_iterkey # T
+hv_iterkeysv # T
+hv_iternext # T
+hv_iternextsv # T
+hv_iterval # T
+hv_ksplit # T
+hv_magic # T
+HvNAME # T
+hv_store # T
+hv_store_ent # T
+hv_stores # T
+hv_undef # T
+ibcmp # T
+IN_PERL_COMPILETIME # T
+instr # T
+INT2PTR # T
+INTSIZE # T
+isALNUM # T
+isALNUM_A # T
+isALNUMC # T
+isALNUMC_A # T
+isALNUMC_L1 # T
+isALPHA # T
+isALPHA_A # T
+isALPHA_L1 # T
+isALPHANUMERIC # T
+isALPHANUMERIC_A # T
+isALPHANUMERIC_L1 # T
+isASCII # T
+isASCII_A # T
+isASCII_L1 # T
+isASCII_LC # T
+isASCII_utf8_safe # T
+isASCII_uvchr # T
+isBLANK # T
+isBLANK_A # T
+isBLANK_L1 # T
+isBLANK_LC # T
+isCNTRL # T
+isCNTRL_A # T
+isCNTRL_L1 # T
+isDIGIT # T
+isDIGIT_A # T
+isDIGIT_L1 # T
+isGRAPH # T
+isGRAPH_A # T
+isGRAPH_L1 # T
+isIDCONT # T
+isIDCONT_A # T
+isIDCONT_L1 # T
+isIDFIRST # T
+isIDFIRST_A # T
+isIDFIRST_L1 # T
+isLOWER # T
+isLOWER_A # T
+isLOWER_L1 # T
+IS_NUMBER_GREATER_THAN_UV_MAX # T
+IS_NUMBER_INFINITY # T
+IS_NUMBER_IN_UV # T
+IS_NUMBER_NAN # T
+IS_NUMBER_NEG # T
+IS_NUMBER_NOT_INT # T
+isOCTAL # T
+isOCTAL_A # T
+isOCTAL_L1 # T
+isPRINT # T
+isPRINT_A # T
+isPRINT_L1 # T
+isPSXSPC # T
+isPSXSPC_A # T
+isPSXSPC_L1 # T
+isPUNCT # T
+isPUNCT_A # T
+isPUNCT_L1 # T
+isSPACE # T
+isSPACE_A # T
+isSPACE_L1 # T
+isUPPER # T
+isUPPER_A # T
+isUPPER_L1 # T
+isWORDCHAR # T
+isWORDCHAR_A # T
+isWORDCHAR_L1 # T
+isXDIGIT # T
+isXDIGIT_A # T
+isXDIGIT_L1 # T
+isXDIGIT_LC # T
+IVdf # T
+IVSIZE # T
+IVTYPE # T
+LATIN1_TO_NATIVE # T
+LEAVE # T
+leave_scope # T
+LIKELY # T
+load_module # T
+LONGSIZE # T
+looks_like_number # T
+MARK # T
+memCHRs # T
+memEQ # T
+memEQs # T
+memNE # T
+memNEs # T
+mg_clear # T
+mg_copy # T
+mg_find # T
+mg_findext # T
+mg_free # T
+mg_get # T
+mg_magical # T
+mg_set # T
+moreswitches # T
+Move # T
+MoveD # T
+mPUSHi # T
+mPUSHn # T
+mPUSHp # T
+mPUSHs # T
+mPUSHu # T
+mXPUSHi # T
+mXPUSHn # T
+mXPUSHp # T
+mXPUSHs # T
+mXPUSHu # T
+my_exit # T
+my_pclose # T
+my_popen # T
+my_setenv # T
+my_snprintf # T
+my_sprintf # T
+my_strlcat # T
+my_strlcpy # T
+my_strnlen # T
+NATIVE_TO_LATIN1 # T
+NATIVE_TO_UNI # T
+newANONHASH # T
+newANONLIST # T
+newANONSUB # T
+newASSIGNOP # T
+newAV # T
+newAVREF # T
+newBINOP # T
+newCONDOP # T
+newCONSTSUB # T
+newCVREF # T
+newFORM # T
+newGVgen # T
+newGVOP # T
+newGVREF # T
+newHV # T
+newHVREF # T
+newIO # T
+newLISTOP # T
+newLOGOP # T
+newLOOPEX # T
+newLOOPOP # T
+newNULLLIST # T
+newOP # T
+newPMOP # T
+newPROG # T
+newPVOP # T
+newRANGE # T
+newRV # T
+newRV_inc # T
+newRV_noinc # T
+newSLICEOP # T
+newSTATEOP # T
+newSUB # T
+newSV # T
+newSViv # T
+newSVnv # T
+newSVOP # T
+newSVpv # T
+newSVpvn # T
+newSVpvn_flags # T
+newSVpvn_share # T
+newSVpvn_utf8 # T
+newSVpvs # T
+newSVpvs_flags # T
+newSVpvs_share # T
+newSVREF # T
+newSVrv # T
+newSVsv # T
+newSVsv_flags # T
+newSVsv_nomg # T
+newSV_type # T
+newSVuv # T
+newUNOP # T
+Newx # T
+Newxc # T
+Newxz # T
+ninstr # T
+NOOP # T
+Nullav # T
+Nullch # T
+Nullcv # T
+Nullhv # T
+Nullsv # T
+NVef # T
+NVff # T
+NVgf # T
+NVTYPE # T
+OPf_KIDS # T
+op_free # T
+OpHAS_SIBLING # T
+OpLASTSIB_set # T
+OpMAYBESIB_set # T
+OpMORESIB_set # T
+OPpENTERSUB_AMPER # T
+OpSIBLING # T
+ORIGMARK # T
+OSNAME # T
+pad_alloc # T
+PERL_ABS # T
+perl_alloc # T
+PERL_BCDVERSION # T
+perl_construct # T
+Perl_eval_pv # T
+Perl_eval_sv # T
+perl_free # T
+PERL_HASH # T
+PERL_INT_MAX # T
+PERL_INT_MIN # T
+PerlIO_canset_cnt # T
+PerlIO_exportFILE # T
+PerlIO_fast_gets # T
+PerlIO_fdopen # T
+PerlIO_findFILE # T
+PerlIO_getc # T
+PerlIO_getpos # T
+PerlIO_has_base # T
+PerlIO_has_cntptr # T
+PerlIO_importFILE # T
+PerlIO_open # T
+PerlIO_printf # T
+PerlIO_putc # T
+PerlIO_puts # T
+PerlIO_releaseFILE # T
+PerlIO_reopen # T
+PerlIO_rewind # T
+PerlIO_setpos # T
+PerlIO_stdoutf # T
+PerlIO_ungetc # T
+PerlIO_vprintf # T
+PERL_LOADMOD_DENY # T
+PERL_LOADMOD_IMPORT_OPS # T
+PERL_LOADMOD_NOIMPORT # T
+PERL_LONG_MAX # T
+PERL_LONG_MIN # T
+PERL_MAGIC_arylen # T
+PERL_MAGIC_backref # T
+PERL_MAGIC_bm # T
+PERL_MAGIC_collxfrm # T
+PERL_MAGIC_dbfile # T
+PERL_MAGIC_dbline # T
+PERL_MAGIC_defelem # T
+PERL_MAGIC_env # T
+PERL_MAGIC_envelem # T
+PERL_MAGIC_ext # T
+PERL_MAGIC_fm # T
+PERL_MAGIC_glob # T
+PERL_MAGIC_isa # T
+PERL_MAGIC_isaelem # T
+PERL_MAGIC_mutex # T
+PERL_MAGIC_nkeys # T
+PERL_MAGIC_overload # T
+PERL_MAGIC_overload_elem # T
+PERL_MAGIC_overload_table # T
+PERL_MAGIC_pos # T
+PERL_MAGIC_qr # T
+PERL_MAGIC_regdata # T
+PERL_MAGIC_regdatum # T
+PERL_MAGIC_regex_global # T
+PERL_MAGIC_shared # T
+PERL_MAGIC_shared_scalar # T
+PERL_MAGIC_sig # T
+PERL_MAGIC_sigelem # T
+PERL_MAGIC_substr # T
+PERL_MAGIC_sv # T
+PERL_MAGIC_taint # T
+PERL_MAGIC_tied # T
+PERL_MAGIC_tiedelem # T
+PERL_MAGIC_tiedscalar # T
+PERL_MAGIC_utf8 # T
+PERL_MAGIC_uvar # T
+PERL_MAGIC_uvar_elem # T
+PERL_MAGIC_vec # T
+PERL_MAGIC_vstring # T
+PERL_PV_ESCAPE_ALL # T
+PERL_PV_ESCAPE_FIRSTCHAR # T
+PERL_PV_ESCAPE_NOBACKSLASH # T
+PERL_PV_ESCAPE_NOCLEAR # T
+PERL_PV_ESCAPE_QUOTE # T
+PERL_PV_ESCAPE_RE # T
+PERL_PV_ESCAPE_UNI # T
+PERL_PV_ESCAPE_UNI_DETECT # T
+PERL_PV_PRETTY_DUMP # T
+PERL_PV_PRETTY_ELLIPSES # T
+PERL_PV_PRETTY_LTGT # T
+PERL_PV_PRETTY_NOCLEAR # T
+PERL_PV_PRETTY_QUOTE # T
+PERL_PV_PRETTY_REGPROP # T
+PERL_QUAD_MAX # T
+PERL_QUAD_MIN # T
+PERL_REVISION # T
+perl_run # T
+PERL_SCAN_ALLOW_UNDERSCORES # T
+PERL_SCAN_DISALLOW_PREFIX # T
+PERL_SCAN_GREATER_THAN_UV_MAX # T
+PERL_SCAN_SILENT_ILLDIGIT # T
+PERL_SHORT_MAX # T
+PERL_SHORT_MIN # T
+PERL_SIGNALS_UNSAFE_FLAG # T
+PERL_SUBVERSION # T
+PERL_SYS_INIT # T
+PERL_SYS_TERM # T
+PERL_UCHAR_MAX # T
+PERL_UCHAR_MIN # T
+PERL_UINT_MAX # T
+PERL_UINT_MIN # T
+PERL_ULONG_MAX # T
+PERL_ULONG_MIN # T
+PERL_UNUSED_CONTEXT # T
+PERL_UNUSED_DECL # T
+PERL_UQUAD_MAX # T
+PERL_UQUAD_MIN # T
+PERL_USHORT_MAX # T
+PERL_USHORT_MIN # T
+PERL_VERSION # T
+PL_bufend # T
+PL_bufptr # T
+PL_compiling # T
+PL_copline # T
+PL_curcop # T
+PL_curstash # T
+PL_DBsignal # T
+PL_DBsingle # T
+PL_DBsub # T
+PL_DBtrace # T
+PL_debstash # T
+PL_defgv # T
+PL_diehook # T
+PL_dirty # T
+PL_dowarn # T
+PL_errgv # T
+PL_error_count # T
+PL_expect # T
+PL_hexdigit # T
+PL_hints # T
+PL_in_my # T
+PL_laststatval # T
+PL_lex_state # T
+PL_lex_stuff # T
+PL_linestr # T
+PL_na # T
+PL_no_modify # T
+PL_parser # T
+PL_perldb # T
+PL_perl_destruct_level # T
+PL_ppaddr # T
+PL_rsfp # T
+PL_rsfp_filters # T
+PL_stack_base # T
+PL_stack_sp # T
+PL_statcache # T
+PL_stdingv # T
+PL_Sv # T
+PL_sv_arenaroot # T
+PL_sv_no # T
+PL_sv_undef # T
+PL_sv_yes # T
+PL_tainted # T
+PL_tainting # T
+PL_tokenbuf # T
+PL_Xpv # T
+Poison # T
+PoisonFree # T
+PoisonNew # T
+PoisonWith # T
+POPi # T
+POPl # T
+POPn # T
+POPp # T
+POPs # T
+pop_scope # T
+pregexec # T
+pregfree # T
+PRIVLIB # T
+pTHX # T
+PTR2IV # T
+PTR2NV # T
+PTR2UV # T
+PTRV # T
+PUSHi # T
+PUSHMARK # T
+PUSHmortal # T
+PUSHn # T
+PUSHp # T
+PUSHs # T
+push_scope # T
+PUSHu # T
+PUTBACK # T
+pv_display # T
+pv_escape # T
+pv_pretty # T
+RANDBITS # T
+Renew # T
+Renewc # T
+repeatcpy # T
+REPLACEMENT_CHARACTER_UTF8 # T
+rninstr # T
+Safefree # T
+save_aptr # T
+save_ary # T
+save_clearsv # T
+SAVE_DEFSV # T
+save_delete # T
+save_freepv # T
+save_freesv # T
+save_hash # T
+save_hptr # T
+save_I32 # T
+save_int # T
+save_item # T
+save_list # T
+save_long # T
+save_nogv # T
+save_pptr # T
+savepv # T
+savepvn # T
+save_scalar # T
+save_sptr # T
+savestack_grow # T
+save_svref # T
+SAVETMPS # T
+scan_hex # T
+scan_oct # T
+setdefout # T
+SITELIB # T
+SP # T
+SPAGAIN # T
+ST # T
+stack_grow # T
+START_EXTERN_C # T
+STARTPERL # T
+start_subparse # T
+STDCHAR # T
+strEQ # T
+strGE # T
+strGT # T
+strLE # T
+strLT # T
+strNE # T
+strnEQ # T
+strnNE # T
+sv_2bool # T
+sv_2cv # T
+sv_2io # T
+sv_2iv # T
+sv_2mortal # T
+sv_2pv # T
+sv_2pvbyte # T
+sv_2pvbyte_nolen # T
+sv_2pv_flags # T
+sv_2pv_nolen # T
+sv_2uv # T
+sv_backoff # T
+sv_bless # T
+sv_catpv # T
+sv_catpv_mg # T
+sv_catpvn # T
+sv_catpvn_mg # T
+sv_catpvn_nomg # T
+sv_catpvs # T
+sv_catsv # T
+sv_catsv_mg # T
+sv_catsv_nomg # T
+sv_chop # T
+sv_clear # T
+sv_cmp # T
+SV_CONST_RETURN # T
+SV_COW_DROP_PV # T
+SV_COW_SHARED_HASH_KEYS # T
+SvCUR # T
+SvCUR_set # T
+sv_dec # T
+sv_dump # T
+SvEND # T
+sv_eq # T
+SVf # T
+SVfARG # T
+sv_free # T
+SVf_UTF8 # T
+SvGETMAGIC # T
+sv_gets # T
+SV_GMAGIC # T
+sv_grow # T
+SvGROW # T
+SV_HAS_TRAILING_NUL # T
+SV_IMMEDIATE_UNREF # T
+sv_inc # T
+sv_insert # T
+SvIOK # T
+SvIOK_off # T
+SvIOK_on # T
+SvIOK_only # T
+SvIOKp # T
+sv_isa # T
+sv_isobject # T
+SvIV # T
+SvIV_nomg # T
+SvIV_set # T
+SvIVX # T
+SvIVx # T
+sv_len # T
+SvLEN # T
+SvLEN_set # T
+sv_magic # T
+SvMAGIC_set # T
+sv_mortalcopy # T
+sv_mortalcopy_flags # T
+SV_MUTABLE_RETURN # T
+sv_newmortal # T
+sv_newref # T
+SvNIOK # T
+SvNIOK_off # T
+SvNIOKp # T
+SvNOK # T
+SvNOK_off # T
+SvNOK_on # T
+SvNOK_only # T
+SvNOKp # T
+SV_NOSTEAL # T
+SvNV # T
+SvNV_nomg # T
+SvNV_set # T
+SvNVX # T
+SvNVx # T
+SvOK # T
+SvOOK # T
+SvPOK # T
+SvPOK_off # T
+SvPOK_on # T
+SvPOK_only # T
+SvPOKp # T
+SvPV # T
+SvPVbyte # T
+SvPV_force # T
+SvPV_force_nomg # T
+sv_pvn_force # T
+sv_pvn_force_flags # T
+SvPV_nolen # T
+SvPV_nomg # T
+SvPV_nomg_nolen # T
+SvPV_set # T
+SvPVX # T
+SvPVx # T
+SvREADONLY # T
+SvREADONLY_off # T
+SvREADONLY_on # T
+SvREFCNT # T
+SvREFCNT_dec # T
+SvREFCNT_inc # T
+SvREFCNT_inc_NN # T
+SvREFCNT_inc_simple # T
+SvREFCNT_inc_simple_NN # T
+SvREFCNT_inc_simple_void # T
+SvREFCNT_inc_simple_void_NN # T
+SvREFCNT_inc_void # T
+SvREFCNT_inc_void_NN # T
+sv_reftype # T
+sv_replace # T
+sv_report_used # T
+sv_reset # T
+SvROK # T
+SvROK_off # T
+SvROK_on # T
+SvRV # T
+SvRV_set # T
+SvRX # T
+SvRXOK # T
+sv_setiv # T
+sv_setiv_mg # T
+SvSETMAGIC # T
+sv_setnv # T
+sv_setnv_mg # T
+sv_setpv # T
+sv_setpv_mg # T
+sv_setpvn # T
+sv_setpvn_mg # T
+sv_setpvs # T
+sv_setref_iv # T
+sv_setref_nv # T
+sv_setref_pv # T
+sv_setref_pvn # T
+sv_setsv # T
+SvSetSV # T
+sv_setsv_flags # T
+sv_setsv_mg # T
+sv_setsv_nomg # T
+sv_setuv # T
+sv_setuv_mg # T
+SV_SMAGIC # T
+SvSTASH # T
+SvSTASH_set # T
+SVs_TEMP # T
+SvTAINT # T
+SVt_IV # T
+SVt_NULL # T
+SVt_NV # T
+SVt_PV # T
+SVt_PVAV # T
+SVt_PVCV # T
+SVt_PVFM # T
+SVt_PVGV # T
+SVt_PVHV # T
+SVt_PVIO # T
+SVt_PVIV # T
+SVt_PVLV # T
+SVt_PVMG # T
+SVt_PVNV # T
+SvTRUE # T
+SvTRUE_nomg # T
+SvTRUEx # T
+SvTYPE # T
+sv_unmagic # T
+sv_unmagicext # T
+sv_unref # T
+sv_upgrade # T
+SvUPGRADE # T
+sv_usepvn # T
+sv_usepvn_mg # T
+SvUTF8 # T
+SV_UTF8_NO_ENCODING # T
+sv_uv # T
+SvUV # T
+SvUV_nomg # T
+SvUV_set # T
+SvUVX # T
+SvUVx # T
+SvUVXx # T
+switch_to_global_locale # T
+sync_locale # T
+taint_env # T
+taint_proper # T
+toLOWER # T
+toUPPER # T
+UNDERBAR # T
+UNICODE_REPLACEMENT # T
+UNI_TO_NATIVE # T
+UNLIKELY # T
+unsharepvn # T
+UTF8f # T
+UTF8fARG # T
+UTF8_IS_INVARIANT # T
+UTF8_MAXBYTES_CASE # T
+UVCHR_IS_INVARIANT # T
+UVCHR_SKIP # T
+UVof # T
+UVSIZE # T
+UVTYPE # T
+UVuf # T
+UVxf # T
+vload_module # T
+warn # T
+WARN_ALL # T
+WARN_AMBIGUOUS # T
+WARN_ASSERTIONS # T
+WARN_BAREWORD # T
+WARN_CLOSED # T
+WARN_CLOSURE # T
+WARN_DEBUGGING # T
+WARN_DEPRECATED # T
+WARN_DIGIT # T
+WARN_EXEC # T
+WARN_EXITING # T
+WARN_GLOB # T
+WARN_INPLACE # T
+WARN_INTERNAL # T
+WARN_IO # T
+WARN_LAYER # T
+WARN_MALLOC # T
+WARN_MISC # T
+WARN_NEWLINE # T
+WARN_NUMERIC # T
+WARN_ONCE # T
+WARN_OVERFLOW # T
+WARN_PACK # T
+WARN_PARENTHESIS # T
+WARN_PIPE # T
+WARN_PORTABLE # T
+WARN_PRECEDENCE # T
+WARN_PRINTF # T
+WARN_PROTOTYPE # T
+WARN_QW # T
+WARN_RECURSION # T
+WARN_REDEFINE # T
+WARN_REGEXP # T
+WARN_RESERVED # T
+WARN_SEMICOLON # T
+WARN_SEVERE # T
+WARN_SIGNAL # T
+WARN_SUBSTR # T
+warn_sv # T
+WARN_SYNTAX # T
+WARN_TAINT # T
+WARN_THREADS # T
+WARN_UNINITIALIZED # T
+WARN_UNOPENED # T
+WARN_UNPACK # T
+WARN_UNTIE # T
+WARN_UTF8 # T
+WARN_VOID # T
+whichsig # T
+WIDEST_UTYPE # T
+XCPT_CATCH # T
+XCPT_RETHROW # T
+XCPT_TRY_END # T
+XCPT_TRY_START # T
+XPUSHi # T
+XPUSHmortal # T
+XPUSHn # T
+XPUSHp # T
+XPUSHs # T
+XPUSHu # T
+XSprePUSH # T
+XSRETURN # T
+XSRETURN_EMPTY # T
+XSRETURN_IV # T
+XSRETURN_NO # T
+XSRETURN_NV # T
+XSRETURN_PV # T
+XSRETURN_UNDEF # T
+XSRETURN_UV # T
+XSRETURN_YES # T
+XST_mIV # T
+XST_mNO # T
+XST_mNV # T
+XST_mPV # T
+XST_mUNDEF # T
+XST_mUV # T
+XST_mYES # T
+XS_VERSION # T
+XS_VERSION_BOOTCHECK # T
+Zero # T
+ZeroD # T
+CLASS # X added by devel/scanprov
+dXSI32 # X added by devel/scanprov
+items # X added by devel/scanprov
+ix # X added by devel/scanprov
+pTHX_ # X added by devel/scanprov
+RETVAL # X added by devel/scanprov
+STMT_END # X added by devel/scanprov
+STMT_START # X added by devel/scanprov
+StructCopy # X added by devel/scanprov
+STR_WITH_LEN # X added by devel/scanprov
+svtype # X added by devel/scanprov
+THIS # X added by devel/scanprov
+XS # X added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004000
index ec87e88f115..ec1618841b5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004000
@@ -1,44 +1,63 @@
5.004000
-GIMME_V # E
-G_VOID # E
-HePV # A
-HeSVKEY_set # U
-POPu # E
-SvSetMagicSV # U
-SvSetMagicSV_nosteal # U
-SvSetSV_nosteal # U
-SvTAINTED # U
-SvTAINTED_off # U
-SvTAINTED_on # U
+ARCHNAME # E
block_end # E (Perl_block_end)
block_gimme # U
block_start # E (Perl_block_start)
call_list # U
delimcpy # U
form # U
+GIMME_V # E
gv_autoload4 # U
gv_fetchmethod_autoload # U
+G_VOID # E
+HePV # A
+HeSVKEY_set # U
hv_delayfree_ent # U
hv_free_ent # U
ibcmp_locale # U
+IN_LOCALE # E
+IN_LOCALE_COMPILETIME # E
+IN_LOCALE_RUNTIME # E
intro_my # U
+isALNUM_LC # U
+isALPHA_LC # U
+isALPHANUMERIC_LC # U
+isDIGIT_LC # U
+isIDCONT_LC # U
+isIDFIRST_LC # U
+isLOWER_LC # U
+isPRINT_LC # U
+isSPACE_LC # U
+isUPPER_LC # U
+isWORDCHAR_LC # U
+mess # E (Perl_mess)
+mess_sv # U
my_failure_exit # U
newSVpvf # U
+PERL_USE_GCC_BRACE_GROUPS # E
+PL_mess_sv # E
+POPu # E
rsignal # E
rsignal_state # E
-save_I16 # U
save_gp # U
+save_I16 # U
share_hek # E
-start_subparse # E (Perl_start_subparse)
+SHORTSIZE # E
sv_catpvf # U
sv_catpvf_mg # U
sv_cmp_locale # U
sv_derived_from # U
sv_magic_portable # U
+SvSetMagicSV # U
+SvSetMagicSV_nosteal # U
sv_setpvf # U
sv_setpvf_mg # U
+SvSetSV_nosteal # U
sv_taint # U
sv_tainted # U
+SvTAINTED # U
+SvTAINTED_off # U
+SvTAINTED_on # U
sv_untaint # U
sv_vcatpvf # U
sv_vcatpvf_mg # U
@@ -47,5 +66,6 @@ sv_vsetpvf # U
sv_vsetpvf_mg # U
sv_vsetpvfn # U
toLOWER_LC # U
+vmess # U
vnewSVpvf # U
warner # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004001
new file mode 100644
index 00000000000..299810f32d4
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004001
@@ -0,0 +1 @@
+5.004001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004002
new file mode 100644
index 00000000000..88ea4015a04
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004002
@@ -0,0 +1 @@
+5.004002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004003
new file mode 100644
index 00000000000..42ff9a82896
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004003
@@ -0,0 +1 @@
+5.004003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004004
new file mode 100644
index 00000000000..45a164908ef
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004004
@@ -0,0 +1 @@
+5.004004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004005
new file mode 100644
index 00000000000..fe3666b7e75
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5004005
@@ -0,0 +1,5 @@
+5.004005
+do_binmode # U
+GV_NOINIT # E
+save_aelem # U
+save_helem # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005000
index df29b0291b8..216f5817f6f 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005000
@@ -1,24 +1,27 @@
5.005000
-PL_curpad # E
-PL_modglobal # E
cx_dump # U
debop # U
debprofdump # U
+DOUBLESIZE # E
fbm_compile # E (Perl_fbm_compile)
fbm_instr # E (Perl_fbm_instr)
get_op_descs # U
get_op_names # U
init_stacks # U
+mg_length # U
mg_size # U
newHVhv # U
new_stackinfo # E
+PL_curpad # E
+PL_in_my_stash # E
+PL_modglobal # E
+PTRSIZE # E
regdump # U
regexec_flags # U
regnext # E (Perl_regnext)
runops_debug # U
runops_standard # U
save_iv # U (save_iv)
-save_op # U
sv_iv # U
sv_nv # U
sv_peek # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005001
new file mode 100644
index 00000000000..9eb326efe7e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005001
@@ -0,0 +1 @@
+5.005001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005002
new file mode 100644
index 00000000000..35d08b22f88
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005002
@@ -0,0 +1 @@
+5.005002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005003
new file mode 100644
index 00000000000..fb824cc4d47
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005003
@@ -0,0 +1,4 @@
+5.005003
+get_vtbl # U
+POPpx # E
+save_generic_svref # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005004
new file mode 100644
index 00000000000..6494a6df55f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5005004
@@ -0,0 +1 @@
+5.005004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000
index 2d953314888..7785939ec23 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006000
@@ -1,25 +1,4 @@
5.006000
-DO_UTF8 # U
-PERL_SYS_INIT3 # U
-PL_check # E
-POPul # E
-SvIOK_UV # U
-SvIOK_notUV # U
-SvIOK_only_UV # U
-SvPOK_only_UTF8 # U
-SvPVbyte_nolen # U
-SvPVbytex # U
-SvPVbytex_force # U
-SvPVutf8 # U
-SvPVutf8_force # U
-SvPVutf8_nolen # U
-SvPVutf8x # U
-SvPVutf8x_force # U
-SvUOK # U
-SvUTF8 # U
-SvUTF8_off # U
-SvUTF8_on # U
-UTF8SKIP # U
av_delete # U
av_exists # U
call_atexit # E
@@ -28,6 +7,11 @@ cast_i32 # U (cast_i32)
cast_iv # U (cast_iv)
cast_ulong # U
cast_uv # U (cast_uv)
+ckWARN2 # U
+ckWARN2_d # U
+ckWARN_d # U
+CPPLAST # E
+CPPRUN # E
do_gv_dump # U
do_gvgv_dump # U
do_hv_dump # U
@@ -36,6 +20,7 @@ do_op_dump # U
do_open9 # U
do_pmop_dump # U
do_sv_dump # U
+DO_UTF8 # U
dump_all # U
dump_eval # U
dump_form # U
@@ -46,6 +31,66 @@ dump_vindent # U
get_context # U
get_ppaddr # E
gv_dump # U
+I16SIZE # E
+I16TYPE # E
+I32SIZE # E
+I32TYPE # E
+I8SIZE # E
+I8TYPE # E
+isALNUMC_LC # U
+isALPHA_LC_utf8_safe # U
+isALPHANUMERIC_LC_utf8_safe # U
+isALPHANUMERIC_utf8_safe # U
+isALPHANUMERIC_uvchr # U
+isALPHA_utf8_safe # U
+isALPHA_uvchr # U
+isBLANK_LC_utf8_safe # U
+isBLANK_utf8_safe # U
+isBLANK_uvchr # U
+isCNTRL_LC # U
+isCNTRL_LC_utf8_safe # U
+isCNTRL_utf8_safe # U
+isCNTRL_uvchr # U
+isDIGIT_LC_utf8_safe # U
+isDIGIT_utf8_safe # U
+isDIGIT_uvchr # U
+isGRAPH_LC # U
+isGRAPH_LC_utf8_safe # U
+isGRAPH_utf8_safe # U
+isGRAPH_uvchr # U
+isIDCONT_LC_utf8_safe # U
+isIDCONT_utf8_safe # U
+isIDCONT_uvchr # U
+isIDFIRST_LC_utf8_safe # U
+isIDFIRST_utf8_safe # U
+isIDFIRST_uvchr # U
+isLOWER_LC_utf8_safe # U
+isLOWER_utf8_safe # U
+isLOWER_uvchr # U
+isPRINT_LC_utf8_safe # U
+isPRINT_utf8_safe # U
+isPRINT_uvchr # U
+isPSXSPC_LC_utf8_safe # U
+isPSXSPC_utf8_safe # U
+isPSXSPC_uvchr # U
+isPUNCT_LC # U
+isPUNCT_LC_utf8_safe # U
+isPUNCT_utf8_safe # U
+isPUNCT_uvchr # U
+isSPACE_LC_utf8_safe # U
+isSPACE_utf8_safe # U
+isSPACE_uvchr # U
+isUPPER_LC_utf8_safe # U
+isUPPER_utf8_safe # U
+isUPPER_uvchr # U
+is_utf8_char # U
+isWORDCHAR_LC_utf8_safe # U
+isWORDCHAR_utf8_safe # U
+isWORDCHAR_uvchr # U
+isXDIGIT_LC_utf8_safe # U
+isXDIGIT_utf8_safe # U
+isXDIGIT_uvchr # U
+LSEEKSIZE # E
magic_dump # U
my_atof # U
my_fflush_all # U
@@ -54,46 +99,86 @@ newATTRSUB # U
newXS # E (Perl_newXS)
newXSproto # E
op_dump # U
+OPpEARLY_CV # E
+PERL_EXIT_EXPECTED # E
perl_parse # E (perl_parse)
+PERL_SYS_INIT3 # U
+PL_check # E
+PL_exit_flags # E
+PL_runops # E
pmop_dump # U
-re_intuit_string # U
+POPul # E
reginitcolors # U
require_pv # U (perl_require_pv)
safesyscalloc # U
safesysfree # U
safesysmalloc # U
safesysrealloc # U
-save_I8 # U
save_alloc # U
save_destructor # E (Perl_save_destructor)
save_destructor_x # E
+save_I8 # U
save_re_context # U
save_vptr # U
scan_bin # U
set_context # U
-set_numeric_local # U (perl_set_numeric_local)
-set_numeric_radix # U
-set_numeric_standard # U (perl_set_numeric_standard)
+Strtol # U
+Strtoul # U
str_to_version # U
sv_2pvutf8 # U
sv_2pvutf8_nolen # U
sv_force_normal # U
+SvIOK_notUV # U
+SvIOK_only_UV # U
+SvIOK_UV # U
sv_len_utf8 # U
+SvPOK_only_UTF8 # U
sv_pos_b2u # U
sv_pos_u2b # U
sv_pv # U
sv_pvbyte # U
sv_pvbyten # U
sv_pvbyten_force # U
+SvPVbyte_nolen # U
+SvPVbytex # U
+SvPVbytex_force # U
sv_pvutf8 # U
+SvPVutf8 # U
+SvPVutf8_force # U
sv_pvutf8n # U
sv_pvutf8n_force # U
+SvPVutf8_nolen # U
+SvPVutf8x # U
+SvPVutf8x_force # U
sv_rvweaken # U
+SvUOK # U
+sv_utf8_decode # U
+sv_utf8_downgrade # U
sv_utf8_encode # U
+SvUTF8_off # U
+SvUTF8_on # U
+toFOLD_utf8_safe # U
+toFOLD_uvchr # U
+toLOWER_utf8_safe # U
+toLOWER_uvchr # U
+toTITLE_utf8_safe # U
+toTITLE_uvchr # U
+toUPPER_utf8_safe # U
+toUPPER_uvchr # U
+U16SIZE # E
+U16TYPE # E
+U32SIZE # E
+U32TYPE # E
+U8SIZE # E
+U8TYPE # E
+UTF8_CHK_SKIP # U
utf8_distance # U
utf8_hop # U
+UTF8_MAXBYTES # E
+UTF8_SAFE_SKIP # U
+UTF8_SKIP # U
+UTF8SKIP # U
vcroak # U
vform # U
-vmess # U
vwarn # U
vwarner # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006001
index 67fae3010cb..bb08876cc76 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5006001
@@ -1,8 +1,14 @@
5.006001
-SvGAMAGIC # U
+apply_attrs_string # U
+bytes_to_utf8 # U
gv_efullname4 # U
gv_fullname4 # U
+isPSXSPC_LC # U
+isUTF8_CHAR # U
is_utf8_string # U
+NVSIZE # E
save_generic_pvref # U
-utf16_to_utf8 # E (Perl_utf16_to_utf8)
-utf16_to_utf8_reversed # E (Perl_utf16_to_utf8_reversed)
+SvGAMAGIC # U
+utf8_to_bytes # U
+utf8_to_uvchr # U
+utf8_to_uvchr_buf # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007001
index 50909c3ec22..de1e84e7b5e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007001
@@ -1,18 +1,34 @@
5.007001
-POPpbytex # E
+bytes_from_utf8 # U
despatch_signals # U
do_openn # U
gv_handler # U
+isALNUM_LC_uvchr # U
+isALPHA_LC_uvchr # U
+isCNTRL_LC_uvchr # U
+isDIGIT_LC_uvchr # U
+isGRAPH_LC_uvchr # U
+isIDFIRST_LC_uvchr # U
+isLOWER_LC_uvchr # U
is_lvalue_sub # U
+isPRINT_LC_uvchr # U
+isPUNCT_LC_uvchr # U
+isSPACE_LC_uvchr # U
+isUPPER_LC_uvchr # U
my_popen_list # U
+PerlIO_apply_layers # U
+PerlIO_binmode # U
+PerlIO_debug # U
+POPpbytex # E
+printf_nocontext # U
save_mortalizesv # U
-scan_num # E (Perl_scan_num)
+scan_num # A
sv_force_normal_flags # U
sv_setref_uv # U
sv_unref_flags # U
sv_utf8_upgrade # E (Perl_sv_utf8_upgrade)
+UTF8_CHECK_ONLY # E
utf8_length # U
utf8n_to_uvchr # U
-utf8n_to_uvuni # U
uvchr_to_utf8 # U
-uvuni_to_utf8 # U
+UVXf # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007002
index 40e6b5a6f69..e763ce3c1c3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007002
@@ -1,16 +1,17 @@
5.007002
+atfork_lock # U
+atfork_unlock # U
calloc # U
getcwd_sv # U
init_tm # U
malloc # U
mfree # U
mini_mktime # U
-my_atof2 # U
my_strftime # U
op_null # U
+OSVERS # E
realloc # U
sv_catpvn_flags # U
sv_catsv_flags # U
-sv_setsv_flags # U
sv_utf8_upgrade_flags # U
sv_utf8_upgrade_nomg # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007003
index 89a05a0adcb..164ecfd1bb7 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5007003
@@ -1,7 +1,28 @@
5.007003
+ckWARN3 # U
+ckWARN3_d # U
+ckWARN4 # U
+ckWARN4_d # U
+custom_op_desc # U
+custom_op_name # U
+cx_dup # E (Perl_cx_dup)
+deb # U
+deb_nocontext # U
+debstack # U
+debstackptrs # U
+foldEQ_utf8 # U
+fp_dup # A
+gp_dup # E (Perl_gp_dup)
+gv_fetchmeth_autoload # U
+he_dup # E (Perl_he_dup)
+ibcmp_utf8 # U
+mg_dup # E (Perl_mg_dup)
+my_fork # U
+my_socketpair # U
OP_DESC # U
OP_NAME # U
-PL_peepp # E
+perl_destruct # E (perl_destruct)
+PERL_EXIT_DESTRUCT_END # E
PerlIO_clearerr # U (PerlIO_clearerr)
PerlIO_close # U (PerlIO_close)
PerlIO_eof # U (PerlIO_eof)
@@ -16,40 +37,33 @@ PerlIO_get_ptr # U (PerlIO_get_ptr)
PerlIO_read # U (PerlIO_read)
PerlIO_seek # U (PerlIO_seek)
PerlIO_set_cnt # U (PerlIO_set_cnt)
-PerlIO_set_ptrcnt # U (PerlIO_set_ptrcnt)
PerlIO_setlinebuf # U (PerlIO_setlinebuf)
+PerlIO_set_ptrcnt # U (PerlIO_set_ptrcnt)
PerlIO_stderr # U (PerlIO_stderr)
PerlIO_stdin # U (PerlIO_stdin)
PerlIO_stdout # U (PerlIO_stdout)
PerlIO_tell # U (PerlIO_tell)
PerlIO_unread # U (PerlIO_unread)
PerlIO_write # U (PerlIO_write)
-SvLOCK # U
-SvSHARE # U
-SvUNLOCK # U
-atfork_lock # U
-atfork_unlock # U
-custom_op_desc # U
-custom_op_name # U
-deb # U
-debstack # U
-debstackptrs # U
-gv_fetchmeth_autoload # U
-ibcmp_utf8 # U
-my_fork # U
-my_socketpair # U
-pack_cat # U
-perl_destruct # E (perl_destruct)
+PL_peepp # E
pv_uni_display # U
-save_shared_pvref # U
+rvpv_dup # E
savesharedpv # U
+save_shared_pvref # U
+si_dup # E (Perl_si_dup)
sortsv # U
+ss_dup # E (Perl_ss_dup)
+sv_copypv # U
+sv_dup # E (Perl_sv_dup)
+SvLOCK # U
sv_magicext # U
sv_nolocking # U
sv_nosharing # U
+sv_nounlocking # U
sv_recode_to_utf8 # U
+SvSHARE # U
sv_uni_display # U
+SvUNLOCK # U
unpack_str # U
uvchr_to_utf8_flags # U
-uvuni_to_utf8_flags # U
vdeb # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008000
index e3ee16f6ba2..13cc7f2d877 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008000
@@ -1,3 +1,6 @@
5.008000
HeUTF8 # U
+hv_iternext_flags # U
+HV_ITERNEXT_WANTPLACEHOLDERS # E
+hv_store_flags # U
nothreadhook # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008001
index c600b203f90..97164b791e8 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008001
@@ -1,17 +1,19 @@
5.008001
CvPADLIST # E
-PL_comppad # E
-SvVOK # U
doing_taint # U
find_runcv # U
is_utf8_string_loc # U
packlist # U
pad_add_anon # U
pad_new # E
+pad_setsv # U
+pad_tidy # E
+PL_comppad # E
save_bool # U
savestack_grow_cnt # U
seed # U
sv_cat_decode # U
sv_setpviv # U
sv_setpviv_mg # U
+SvVOK # U
unpackstring # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008008
index f17b19ff4b2..6400d8ef074 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008008
@@ -1 +1,2 @@
5.008008
+__ASSERT_ # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008009
index 129e018f45f..65bf569c152 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5008009
@@ -1 +1,2 @@
5.008009
+hv_assert # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009000
index 28bc85958ec..ecbaf1d3d55 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009000
@@ -1,6 +1,21 @@
5.009000
+_aMY_CXT # E
+aMY_CXT # E
+aMY_CXT_ # E
+dMY_CXT # E
+hek_dup # U
+MY_CXT # E
+MY_CXT_CLONE # E
+MY_CXT_INIT # E
+my_cxt_init # U
new_version # U
+parser_dup # U
+pMY_CXT # E
+regdupe_internal # U
save_set_svflags # U
+SVs_PADSTALE # E
vcmp # U
vnumify # U
vstringify # U
+_pMY_CXT # X added by devel/scanprov
+pMY_CXT_ # X added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009002
index 231f0575880..dd5fe830ef3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009002
@@ -1,6 +1,7 @@
5.009002
-SvPVbyte_force # U
+find_rundefsvoffset # U
op_refcnt_lock # U
op_refcnt_unlock # U
savesvpv # U
+SvPVbyte_force # U
vnormal # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009003
index 5b9c10ab551..529dc08beee 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009003
@@ -2,10 +2,11 @@
av_arylen_p # U
ckwarn # U
ckwarn_d # U
-csighandler # E (Perl_csighandler)
dMULTICALL # E
doref # U
gv_const_sv # U
+GV_NOADD_NOINIT # E
+GV_NOEXPAND # E
hv_eiter_p # U
hv_eiter_set # U
hv_name_set # U
@@ -14,10 +15,13 @@ hv_placeholders_set # U
hv_riter_p # U
hv_riter_set # U
is_utf8_string_loclen # U
+MULTICALL # E
newGIVENOP # U
newSVhek # U
-newWHENOP # U
-pad_compname_type # U
+PERL_MAGIC_arylen_p # E
+PERL_MAGIC_rhash # E
+PERL_MAGIC_symtab # E
+POP_MULTICALL # E
savepvs # U
sortsv_flags # U
vverify # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009004
index 12714addf86..d100ab98492 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009004
@@ -1,7 +1,10 @@
5.009004
-PerlIO_context_layers # U
gv_name_set # U
hv_copy_hints_hv # U
my_vsnprintf # U
+newXS_flags # U
+PerlIO_context_layers # U
+PERL_MAGIC_hints # E
+PERL_MAGIC_hintselem # E
sv_does # U
sv_usepvn_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009005
index 9bc974fc2fd..38949ef8c89 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5009005
@@ -1,22 +1,28 @@
5.009005
+av_create_and_push # U
+av_create_and_unshift_one # U
+CopLABEL # U
gv_fetchfile_flags # U
+lex_start # E (Perl_lex_start)
mro_get_linear_isa # U
mro_method_changed_in # U
my_dirfd # U
+Perl_signbit # U
pregcomp # E (Perl_pregcomp)
+ptr_table_clear # U
ptr_table_fetch # U
ptr_table_free # U
ptr_table_new # U
ptr_table_split # U
ptr_table_store # U
re_compile # U
+regfree_internal # U
reg_named_buff_all # U
reg_named_buff_exists # U
reg_named_buff_fetch # U
reg_named_buff_firstkey # U
reg_named_buff_nextkey # U
reg_named_buff_scalar # U
-regfree_internal # U
savesharedpvn # U
scan_vstring # E (Perl_scan_vstring)
upg_version # E (Perl_upg_version)
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010000
index 737f374ef0f..0778e3e5bed 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010000
@@ -1,6 +1,11 @@
5.010000
hv_common # U
hv_common_key_len # U
+reentrant_free # U
+reentrant_init # U
+reentrant_retry # U
+reentrant_size # U
+START_MY_CXT # E
sv_destroyable # U
sys_init # U
sys_init3 # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010001
index 15f4091cc19..2c80afcf52d 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5010001
@@ -4,7 +4,9 @@ mro_get_private_data # U
mro_register # U
mro_set_mro # U
mro_set_private_data # U
+save_freeop # U (Perl_save_freeop)
save_hints # U
+save_op # U (Perl_save_op)
save_padsv_and_mortalize # U
save_pushi32ptr # U
save_pushptr # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011000
index 805d8b19acd..cbeace07b13 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011000
@@ -1,14 +1,19 @@
5.011000
-Gv_AMupdate # E (Perl_Gv_AMupdate)
-PL_opfreehook # E
-SVt_REGEXP # E
-SvOOK_offset # U
av_iter_p # U
gv_add_by_type # U
+Gv_AMupdate # A
is_ascii_string # U
+is_invariant_string # U
+is_utf8_invariant_string # U
+PL_opfreehook # E
pregfree2 # U
+PUSH_MULTICALL # U
+re_dup_guts # U
save_adelete # U
save_aelem_flags # U
save_hdelete # U
save_helem_flags # U
+SvOOK_offset # U
+SVt_REGEXP # E
sv_utf8_upgrade_flags_grow # U
+WARN_IMPRECISION # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011002
index 910a552fe4f..906e256dced 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011002
@@ -1,2 +1,18 @@
5.011002
+CHARBITS # E
+ENTER_with_name # U
+LEAVE_with_name # U
+lex_bufutf8 # U
+lex_discard_to # U
+lex_grow_linestr # U
+LEX_KEEP_PREVIOUS # E
+lex_next_chunk # U
+lex_peek_unichar # U
+lex_read_space # U
+lex_read_to # U
+lex_read_unichar # U
+lex_stuff_pvn # U
+lex_stuff_sv # U
+LEX_STUFF_UTF8 # E
+lex_unstuff # U
PL_keyword_plugin # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011004
index 86c1fce4f2a..281d71f76fa 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5011004
@@ -1,2 +1,3 @@
5.011004
prescan_version # U
+WARN_ILLEGALPROTO # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013002
index fa6d99b4076..8bf194d2a01 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013002
@@ -1,9 +1,10 @@
5.013002
-SvNV_nomg # U
+clone_params_del # U
+clone_params_new # U
find_rundefsv # U
foldEQ # U
foldEQ_locale # U
-foldEQ_utf8 # U
hv_fill # U
sv_dec_nomg # U
+sv_dup_inc # U
sv_inc_nomg # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013004
index 8aac89eb8d4..20b0810cbe7 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013004
@@ -1 +1,2 @@
5.013004
+XS_APIVERSION_BOOTCHECK # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013005
index dd4730ed7e5..c7b67e1fbd1 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013005
@@ -1,4 +1,4 @@
5.013005
-PL_rpeepp # E
-isOCTAL # U
lex_stuff_pvs # U
+parse_fullstmt # U
+PL_rpeepp # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013006
index 596c1ade2dc..49dbd4354b9 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013006
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013006
@@ -1,12 +1,11 @@
5.013006
-LINKLIST # U
-SvTRUE_nomg # U
ck_entersub_args_list # U
ck_entersub_args_proto # U
ck_entersub_args_proto_or_list # U
cv_get_call_checker # E
cv_set_call_checker # E
-isWORDCHAR # U
+lex_stuff_pv # U
+LINKLIST # U
mg_free_type # U
newSVpv_share # U
op_append_elem # U
@@ -14,7 +13,11 @@ op_append_list # U
op_contextualize # U
op_linklist # U
op_prepend_elem # U
+parse_stmtseq # U
+PERL_MAGIC_checkcall # E
rv2cv_op_cv # U
+RV2CVOPCV_MARK_EARLY # E
+RV2CVOPCV_RETURN_NAME_GV # E
savesharedpvs # U
savesharedsvpv # U
sv_2bool_flags # U
@@ -28,3 +31,4 @@ sv_cmp_locale_flags # U
sv_collxfrm_flags # U
sv_eq_flags # U
sv_setpvs_mg # U
+sv_setref_pvs # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013007
index 2131264e1f1..8b9162e06ee 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013007
@@ -1,14 +1,6 @@
5.013007
-HvENAME # U
-OP_CLASS # U
-XopFLAGS # E
amagic_deref_call # U
bytes_cmp_utf8 # U
-cop_hints_2hv # A
-cop_hints_fetch_pv # U
-cop_hints_fetch_pvn # U
-cop_hints_fetch_pvs # U
-cop_hints_fetch_sv # U
cophh_2hv # E
cophh_copy # E
cophh_delete_pv # E
@@ -20,11 +12,33 @@ cophh_fetch_pvn # E
cophh_fetch_pvs # E
cophh_fetch_sv # E
cophh_free # E
+COPHH_KEY_UTF8 # E
+cophh_new_empty # E
cophh_store_pv # E
cophh_store_pvn # E
cophh_store_pvs # E
cophh_store_sv # E
+cop_hints_2hv # A
+cop_hints_fetch_pv # U
+cop_hints_fetch_pvn # U
+cop_hints_fetch_pvs # U
+cop_hints_fetch_sv # U
custom_op_register # E
-custom_op_xop # E
+dirp_dup # A
+HvENAME # U
newFOROP # A
newWHILEOP # A
+OP_CLASS # U
+op_lvalue # U
+op_scope # U
+parse_barestmt # U
+parse_block # U
+parse_label # U
+PARSE_OPTIONAL # E
+PL_phase # E
+XopFLAGS # E
+XopDISABLE # X added by devel/scanprov
+XopENABLE # X added by devel/scanprov
+XopENTRY # X added by devel/scanprov
+XopENTRYCUSTOM # X added by devel/scanprov
+XopENTRY_set # X added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013008
index 8716748190c..8e95c5d3133 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013008
@@ -1,2 +1,6 @@
5.013008
foldEQ_latin1 # U
+parse_arithexpr # U
+parse_fullexpr # U
+parse_listexpr # U
+parse_termexpr # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013009
index 51160ae344d..45c97250253 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013009
@@ -1 +1,10 @@
5.013009
+PERL_PV_ESCAPE_NONASCII # E
+UTF8_DISALLOW_ILLEGAL_INTERCHANGE # E
+UTF8_DISALLOW_NONCHAR # E
+UTF8_DISALLOW_SUPER # E
+UTF8_DISALLOW_SURROGATE # E
+UTF8_WARN_ILLEGAL_INTERCHANGE # E
+UTF8_WARN_NONCHAR # E
+UTF8_WARN_SUPER # E
+UTF8_WARN_SURROGATE # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013010
index 467ea464b50..2f1a5463579 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013010
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5013010
@@ -1 +1,4 @@
5.013010
+WARN_NONCHAR # E
+WARN_NON_UNICODE # E
+WARN_SURROGATE # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015001
index c886418516e..144926b1244 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015001
@@ -1,4 +1,6 @@
5.015001
+cop_fetch_label # U
+cop_store_label # U
pad_add_name_pv # U
pad_add_name_pvn # U
pad_add_name_pvs # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015002
index 06741283d1d..4e1069b79f4 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015002
@@ -1 +1,3 @@
5.015002
+XS_EXTERNAL # X added by devel/scanprov
+XS_INTERNAL # X added by devel/scanprov
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015003
index 7f33df71289..20e036eee56 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015003
@@ -1 +1,2 @@
5.015003
+GV_ADDMG # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015004
index dd2360db89c..d900cd195e7 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015004
@@ -1,11 +1,10 @@
5.015004
-HvENAMELEN # U
-HvENAMEUTF8 # U
-HvNAMELEN # U
-HvNAMEUTF8 # U
gv_autoload_pv # U
gv_autoload_pvn # U
gv_autoload_sv # U
+gv_fetchmethod_pv_flags # U
+gv_fetchmethod_pvn_flags # U
+gv_fetchmethod_sv_flags # U
gv_fetchmeth_pv # U
gv_fetchmeth_pv_autoload # U
gv_fetchmeth_pvn # U
@@ -14,6 +13,10 @@ gv_fetchmeth_sv # U
gv_fetchmeth_sv_autoload # U
gv_init_pv # U
gv_init_sv # U
+HvENAMELEN # U
+HvENAMEUTF8 # U
+HvNAMELEN # U
+HvNAMEUTF8 # U
newGVgen_flags # U
sv_derived_from_pv # U
sv_derived_from_pvn # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015007
index ce9078968a1..b02b431f32e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015007
@@ -1,8 +1 @@
5.015007
-toLOWER_utf8 # U
-toTITLE_utf8 # U
-toUPPER_utf8 # U
-to_utf8_fold # U
-to_utf8_lower # U
-to_utf8_title # U
-to_utf8_upper # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015009
index 12e4d6de751..238415ae8b8 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5015009
@@ -1,2 +1 @@
5.015009
-utf8_to_uvchr_buf # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016000
index 3bd46b73620..dfc51d57d36 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5016000
@@ -1 +1,3 @@
5.016000
+CopLABEL_len # U
+CopLABEL_len_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017001
index 6c9994352af..a58995e7443 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017001
@@ -1 +1,2 @@
5.017001
+alloccopstash # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017004
index 02021258887..477da4994c4 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017004
@@ -1,5 +1,20 @@
5.017004
-PL_comppad_name # E
-PadlistREFCNT # U
+GV_SUPER # E
newMYSUB # E (Perl_newMYSUB)
newSVpadname # E
+PadARRAY # U
+PadlistARRAY # U
+PadlistMAX # U
+PadlistNAMES # E
+PadlistNAMESARRAY # E
+PadlistNAMESMAX # U
+PadlistREFCNT # U
+PadMAX # U
+PadnameLEN # E
+PadnamelistARRAY # E
+PadnamelistMAX # E
+PadnamePV # E
+PadnameSV # E
+PadnameUTF8 # E
+PL_comppad_name # E
+WARN_EXPERIMENTAL # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017005
index 31dfb1c3838..a827cf53ec4 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017005
@@ -1 +1,2 @@
5.017005
+WARN_EXPERIMENTAL__LEXICAL_SUBS # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017007
index 6d97dffafdd..ecfffd79ece 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017007
@@ -1,2 +1,8 @@
5.017007
+isALNUMC_LC_uvchr # U
+isASCII_LC_uvchr # U
+isBLANK_LC_uvchr # U
+isPSXSPC_LC_uvchr # U
+isWORDCHAR_LC_uvchr # U
+isXDIGIT_LC_uvchr # U
SvREFCNT_dec_NN # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017008
index de67457e79e..009d5d2c1a1 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017008
@@ -1,3 +1,4 @@
5.017008
-isALPHANUMERIC # U
-isIDCONT # U
+isALPHANUMERIC_LC_uvchr # U
+isIDCONT_LC_uvchr # U
+WARN_EXPERIMENTAL__REGEX_SETS # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017009
index fd728270400..1791d3e176a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017009
@@ -1,3 +1 @@
5.017009
-av_tindex # U
-av_top_index # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017011
index 5fcf0516810..478877f2b56 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017011
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5017011
@@ -1 +1,2 @@
5.017011
+WARN_EXPERIMENTAL__SMARTMATCH # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019001
index 803ad9abffb..06927ae6fae 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019001
@@ -1,6 +1,4 @@
5.019001
-re_intuit_start # A
toFOLD # U
-toFOLD_utf8 # U
toLOWER_L1 # U
toTITLE # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019002
index 5af71fbeae6..9fcc71ef9e3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019002
@@ -1,2 +1,2 @@
5.019002
-SVt_INVLIST # E
+G_METHOD_NAMED # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019003
index 4bcc1d17f8c..a6403ca53a0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019003
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019003
@@ -1,2 +1,4 @@
5.019003
+PERL_EXIT_ABORT # E
+PERL_EXIT_WARN # E
sv_pos_b2u_flags # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019004
index a24caa7e92b..8e224b969d7 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019004
@@ -1,3 +1,4 @@
5.019004
+IS_SAFE_SYSCALL # U
is_safe_syscall # U
-uvoffuni_to_utf8_flags # U
+WARN_SYSCALLS # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019005
index 69dcd69aefb..7136de6db8e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019005
@@ -1 +1,2 @@
5.019005
+WARN_EXPERIMENTAL__POSTDEREF # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019009
index d6ccc505670..3c1a79cc454 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5019009
@@ -1 +1,2 @@
5.019009
+WARN_EXPERIMENTAL__SIGNATURES # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021001
index 07868ed191a..bc5a72e991a 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021001
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021001
@@ -1,3 +1,3 @@
5.021001
-isUTF8_CHAR # U
markstack_grow # E (Perl_markstack_grow)
+WARN_EXPERIMENTAL__WIN32_PERLIO # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021002
index abe5ac12465..218c3045826 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021002
@@ -1,3 +1,6 @@
5.021002
grok_number_flags # U
op_sibling_splice # U
+PERL_SCAN_TRAILING # E
+WARN_MISSING # E
+WARN_REDUNDANT # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021003
new file mode 100644
index 00000000000..93ef7dd10e5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021003
@@ -0,0 +1 @@
+5.021003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021004
index 3a62526e13b..4a209c3338e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021004
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021004
@@ -1,5 +1,5 @@
5.021004
+CALL_CHECKER_REQUIRE_GV # E
cv_set_call_checker_flags # U
grok_infnan # U
isinfnan # U
-sync_locale # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021005
index 2a02ad28b68..2e5af874bb1 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021005
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021005
@@ -1,4 +1,10 @@
5.021005
cv_name # A
+CV_NAME_NOTQUAL # E
newMETHOP # U
newMETHOP_named # U
+PERL_MAGIC_debugvar # E
+PERL_MAGIC_lvref # E
+SV_CATBYTES # E
+SV_CATUTF8 # E
+WARN_EXPERIMENTAL__REFALIASING # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021006
index fbefd16d47b..d3f7e99f059 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021006
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021006
@@ -1,3 +1,5 @@
5.021006
+DOUBLEKIND # E
newDEFSVOP # U
op_convert_list # U
+WARN_LOCALE # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021007
index 1aa1e34daf3..485119b6ce9 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021007
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021007
@@ -1,4 +1,12 @@
5.021007
-PadnameUTF8 # E
-is_invariant_string # U
+newPADNAMELIST # U
+newPADNAMEouter # U
+newPADNAMEpvn # U
newUNOP_AUX # E
+padnamelist_fetch # U
+PadnamelistREFCNT # U
+PadnamelistREFCNT_dec # U
+padnamelist_store # U
+PadnameREFCNT # U
+PadnameREFCNT_dec # U
+PADNAMEt_OUTER # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021008
index 06633eebc67..6276dfdae78 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021008
@@ -1 +1,4 @@
5.021008
+sv_get_backrefs # U
+WARN_EXPERIMENTAL__CONST_ATTR # E
+WARN_EXPERIMENTAL__RE_STRICT # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021009
index 7397722a252..22eb7b1991c 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021009
@@ -1 +1,2 @@
5.021009
+WARN_EXPERIMENTAL__BITWISE # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021010
index 821a8fb6294..247b2a7c820 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021010
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5021010
@@ -1,2 +1,5 @@
5.021010
DECLARATION_FOR_LC_NUMERIC_MANIPULATION # E
+RESTORE_LC_NUMERIC # E
+STORE_LC_NUMERIC_FORCE_TO_UNDERLYING # E
+STORE_LC_NUMERIC_SET_TO_NEEDED # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022000
index aca319e5cdd..b378fdd7e44 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022000
@@ -1,2 +1 @@
5.022000
-UVCHR_SKIP # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022002
new file mode 100644
index 00000000000..5a429a18c13
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022002
@@ -0,0 +1 @@
+5.022002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022003
new file mode 100644
index 00000000000..ad46f70f43e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022003
@@ -0,0 +1 @@
+5.022003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022004
new file mode 100644
index 00000000000..3974ff3e079
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5022004
@@ -0,0 +1 @@
+5.022004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023000
index e461a326691..50ed05a7db8 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023000
@@ -1 +1,8 @@
5.023000
+DOUBLEINFBYTES # E
+DOUBLEMANTBITS # E
+DOUBLENANBYTES # E
+LONGDBLINFBYTES # E
+LONGDBLMANTBITS # E
+LONGDBLNANBYTES # E
+NVMANTBITS # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023002
index 2060466c2ad..5f67a83dca3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023002
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023002
@@ -1 +1,4 @@
5.023002
+UTF8_IS_NONCHAR # U
+UTF8_IS_SUPER # A
+UTF8_IS_SURROGATE # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023008
index 91f61649612..938c65b7e67 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023008
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023008
@@ -1,2 +1,18 @@
5.023008
clear_defarray # U
+cx_popblock # U
+cx_popeval # U
+cx_popformat # U
+cx_poploop # U
+cx_popsub # U
+cx_popsub_args # U
+cx_popsub_common # U
+cx_pushblock # U
+cx_pusheval # U
+cx_pushformat # U
+cx_pushloop_for # U
+cx_pushloop_plain # U
+cx_pushsub # U
+cx_topblock # U
+leave_adjust_stacks # U
+savetmps # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023009
index 336b09a3eea..55a21b0b6c0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023009
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5023009
@@ -1,5 +1 @@
5.023009
-toFOLD_uvchr # U
-toLOWER_uvchr # U
-toTITLE_uvchr # U
-toUPPER_uvchr # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024000
index 6a5e2484a10..bcdf8cfc1c0 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024000
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024000
@@ -1,45 +1 @@
5.024000
-BhkDISABLE # E
-BhkENABLE # E
-BhkENTRY_set # E
-MULTICALL # E
-PERL_SYS_TERM # E
-POP_MULTICALL # E
-PUSH_MULTICALL # E
-PadARRAY # E
-PadMAX # E
-PadlistARRAY # E
-PadlistMAX # E
-PadlistNAMES # E
-PadlistNAMESARRAY # E
-PadlistNAMESMAX # E
-PadnameLEN # E
-PadnamePV # E
-PadnameREFCNT # E
-PadnameREFCNT_dec # E
-PadnameSV # E
-PadnamelistARRAY # E
-PadnamelistMAX # E
-PadnamelistREFCNT # E
-PadnamelistREFCNT_dec # E
-RESTORE_LC_NUMERIC # E
-STORE_LC_NUMERIC_FORCE_TO_UNDERLYING # E
-STORE_LC_NUMERIC_SET_TO_NEEDED # E
-XS_APIVERSION_BOOTCHECK # E
-XS_EXTERNAL # E
-XS_INTERNAL # E
-XS_VERSION_BOOTCHECK # E
-XopDISABLE # E
-XopENABLE # E
-XopENTRY # E
-XopENTRYCUSTOM # E
-XopENTRY_set # E
-cophh_new_empty # E
-my_lstat # U (Perl_my_lstat)
-my_stat # U (Perl_my_stat)
-reentrant_free # U
-reentrant_init # U
-reentrant_retry # U
-reentrant_size # U
-ref # U (Perl_ref)
-sv_setref_pvs # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024001
new file mode 100644
index 00000000000..e5a806c61e7
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024001
@@ -0,0 +1 @@
+5.024001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024002
new file mode 100644
index 00000000000..21641ad4695
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024002
@@ -0,0 +1 @@
+5.024002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024003
new file mode 100644
index 00000000000..e7ab7b66240
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024003
@@ -0,0 +1 @@
+5.024003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024004
new file mode 100644
index 00000000000..590396c4b5c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5024004
@@ -0,0 +1 @@
+5.024004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025000
new file mode 100644
index 00000000000..da02bb4f408
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025000
@@ -0,0 +1 @@
+5.025000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025001
new file mode 100644
index 00000000000..398001ba7ac
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025001
@@ -0,0 +1,2 @@
+5.025001
+op_parent # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025002
new file mode 100644
index 00000000000..693dd9e5cd2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025002
@@ -0,0 +1 @@
+5.025002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025003
new file mode 100644
index 00000000000..df0fb4b2e3b
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025003
@@ -0,0 +1,3 @@
+5.025003
+hv_bucket_ratio # U
+WARN_EXPERIMENTAL__DECLARED_REFS # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025004
new file mode 100644
index 00000000000..e7daf26349d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025004
@@ -0,0 +1 @@
+5.025004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025005
new file mode 100644
index 00000000000..ab5b7009907
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025005
@@ -0,0 +1,8 @@
+5.025005
+isC9_STRICT_UTF8_CHAR # U
+isSTRICT_UTF8_CHAR # U
+isUTF8_CHAR_flags # U
+is_utf8_valid_partial_char # U
+is_utf8_valid_partial_char_flags # U
+UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE # E
+UTF8_WARN_ILLEGAL_C9_INTERCHANGE # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025006
new file mode 100644
index 00000000000..2a276f98593
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025006
@@ -0,0 +1,16 @@
+5.025006
+is_c9strict_utf8_string # U
+is_c9strict_utf8_string_loc # U
+is_c9strict_utf8_string_loclen # U
+is_strict_utf8_string # U
+is_strict_utf8_string_loc # U
+is_strict_utf8_string_loclen # U
+is_utf8_fixed_width_buf_flags # U
+is_utf8_fixed_width_buf_loc_flags # U
+is_utf8_fixed_width_buf_loclen_flags # U
+is_utf8_string_flags # U
+is_utf8_string_loc_flags # U
+is_utf8_string_loclen_flags # U
+SvPVCLEAR # U
+sv_setpv_bufsize # U
+utf8n_to_uvchr_error # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025007
new file mode 100644
index 00000000000..e9252189ce5
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025007
@@ -0,0 +1,5 @@
+5.025007
+CLEAR_ERRSV # E
+utf8_hop_back # U
+utf8_hop_forward # U
+utf8_hop_safe # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025008
new file mode 100644
index 00000000000..4ca9b583d71
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025008
@@ -0,0 +1,2 @@
+5.025008
+sv_set_undef # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025009
new file mode 100644
index 00000000000..e62cc8c7b4a
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025009
@@ -0,0 +1,2 @@
+5.025009
+isASCII_LC_utf8_safe # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025010
new file mode 100644
index 00000000000..aec4f5651b8
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025010
@@ -0,0 +1,2 @@
+5.025010
+op_class # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025011
new file mode 100644
index 00000000000..ebbab42d3dd
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025011
@@ -0,0 +1 @@
+5.025011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025012 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025012
new file mode 100644
index 00000000000..c1d9e6324a2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5025012
@@ -0,0 +1 @@
+5.025012
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026000
new file mode 100644
index 00000000000..00a1a0d1e01
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026000
@@ -0,0 +1 @@
+5.026000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026001
new file mode 100644
index 00000000000..f6e8b9ffdcb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026001
@@ -0,0 +1 @@
+5.026001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026002
new file mode 100644
index 00000000000..b3537a4f489
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026002
@@ -0,0 +1 @@
+5.026002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026003
new file mode 100644
index 00000000000..6b87dfd09f9
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5026003
@@ -0,0 +1 @@
+5.026003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027000
new file mode 100644
index 00000000000..fc48745eb82
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027000
@@ -0,0 +1 @@
+5.027000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027001
new file mode 100644
index 00000000000..ca76169a520
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027001
@@ -0,0 +1,3 @@
+5.027001
+bytes_from_utf8_loc # U
+is_utf8_invariant_string_loc # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027002
new file mode 100644
index 00000000000..4e50daeff00
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027002
@@ -0,0 +1,4 @@
+5.027002
+Perl_setlocale # U
+UTF8_DISALLOW_PERL_EXTENDED # E
+UTF8_WARN_PERL_EXTENDED # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027003
new file mode 100644
index 00000000000..18f76920e94
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027003
@@ -0,0 +1,4 @@
+5.027003
+cv_get_call_checker_flags # U
+PL_sv_zero # E
+sv_string_from_errnum # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027004
new file mode 100644
index 00000000000..1ad395ebd04
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027004
@@ -0,0 +1,4 @@
+5.027004
+mg_freeext # U
+Perl_langinfo # U
+sv_rvunweaken # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027005
new file mode 100644
index 00000000000..e36214c4c88
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027005
@@ -0,0 +1 @@
+5.027005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027006
new file mode 100644
index 00000000000..ab5a48e7ed2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027006
@@ -0,0 +1,2 @@
+5.027006
+wrap_keyword_plugin # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027007
new file mode 100644
index 00000000000..457e330ce38
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027007
@@ -0,0 +1,2 @@
+5.027007
+WARN_SHADOW # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027008
new file mode 100644
index 00000000000..d8981f78188
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027008
@@ -0,0 +1,7 @@
+5.027008
+cx_popgiven # U
+cx_popwhen # U
+cx_pushgiven # U
+cx_pushwhen # U
+newWHENOP # U
+WARN_EXPERIMENTAL__SCRIPT_RUN # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027009
new file mode 100644
index 00000000000..c60955752e6
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027009
@@ -0,0 +1,7 @@
+5.027009
+PERL_MAGIC_nonelem # E
+thread_locale_init # U
+thread_locale_term # U
+utf8n_to_uvchr_msgs # U
+uvchr_to_utf8_flags_msgs # U
+WARN_EXPERIMENTAL__ALPHA_ASSERTIONS # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027010
new file mode 100644
index 00000000000..180b065bf67
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027010
@@ -0,0 +1 @@
+5.027010
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027011 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027011
new file mode 100644
index 00000000000..445cdc834df
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5027011
@@ -0,0 +1 @@
+5.027011
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5028000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5028000
new file mode 100644
index 00000000000..83f8de536ed
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5028000
@@ -0,0 +1 @@
+5.028000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5028001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5028001
new file mode 100644
index 00000000000..3a0bfa31909
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5028001
@@ -0,0 +1 @@
+5.028001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029000
new file mode 100644
index 00000000000..8d504294ec2
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029000
@@ -0,0 +1 @@
+5.029000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029001
new file mode 100644
index 00000000000..8c1b1e9fe2e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029001
@@ -0,0 +1 @@
+5.029001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029002
new file mode 100644
index 00000000000..0224de759ff
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029002
@@ -0,0 +1 @@
+5.029002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029003
new file mode 100644
index 00000000000..f426ffcd783
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029003
@@ -0,0 +1 @@
+5.029003
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029004
new file mode 100644
index 00000000000..127df5e5742
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029004
@@ -0,0 +1 @@
+5.029004
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029005
new file mode 100644
index 00000000000..fe975812557
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029005
@@ -0,0 +1 @@
+5.029005
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029006
new file mode 100644
index 00000000000..564c6bef7cf
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029006
@@ -0,0 +1 @@
+5.029006
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029007
new file mode 100644
index 00000000000..360a30eea6d
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029007
@@ -0,0 +1 @@
+5.029007
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029008
new file mode 100644
index 00000000000..79d020cef9e
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029008
@@ -0,0 +1 @@
+5.029008
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029009 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029009
new file mode 100644
index 00000000000..1e765c13edb
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029009
@@ -0,0 +1,4 @@
+5.029009
+WARN_EXPERIMENTAL__PRIVATE_USE # E
+WARN_EXPERIMENTAL__UNIPROP_WILDCARDS # E
+WARN_EXPERIMENTAL__VLB # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029010 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029010
new file mode 100644
index 00000000000..0c029797562
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5029010
@@ -0,0 +1,3 @@
+5.029010
+my_strtod # U
+Strtod # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5030000 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5030000
new file mode 100644
index 00000000000..2860a428511
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5030000
@@ -0,0 +1 @@
+5.030000
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031001 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031001
new file mode 100644
index 00000000000..ebbae0bec5c
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031001
@@ -0,0 +1 @@
+5.031001
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031002 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031002
new file mode 100644
index 00000000000..f334acf9d85
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031002
@@ -0,0 +1 @@
+5.031002
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031003 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031003
new file mode 100644
index 00000000000..acfe51d227f
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031003
@@ -0,0 +1,6 @@
+5.031003
+parse_subsignature # U
+SANE_ERRSV # U
+STORE_LC_NUMERIC_SET_TO_NEEDED_IN # U
+WITH_LC_NUMERIC_SET_TO_NEEDED # E
+WITH_LC_NUMERIC_SET_TO_NEEDED_IN # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031004 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031004
new file mode 100644
index 00000000000..0b6ecca7683
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031004
@@ -0,0 +1,13 @@
+5.031004
+sv_2pvbyte_flags # U
+sv_2pvutf8_flags # U
+SvAMAGIC_off # U
+SvAMAGIC_on # U
+SvPVbyte_nomg # U
+SvPVbyte_or_null # U
+SvPVbyte_or_null_nomg # U
+SvPVutf8_nomg # U
+SvPVutf8_or_null # U
+SvPVutf8_or_null_nomg # U
+sv_utf8_downgrade_flags # U
+sv_utf8_downgrade_nomg # U
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031005 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031005
new file mode 100644
index 00000000000..fc93346e681
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031005
@@ -0,0 +1,23 @@
+5.031005
+gimme_V # U
+isALPHANUMERIC_utf8 # A
+isALPHA_utf8 # A
+isASCII_utf8 # A
+isBLANK_utf8 # A
+isCNTRL_utf8 # A
+isDIGIT_utf8 # A
+isGRAPH_utf8 # A
+isIDCONT_utf8 # A
+isIDFIRST_utf8 # A
+isLOWER_utf8 # A
+isPRINT_utf8 # A
+isPSXSPC_utf8 # A
+isPUNCT_utf8 # A
+isSPACE_utf8 # A
+isUPPER_utf8 # A
+isWORDCHAR_utf8 # A
+isXDIGIT_utf8 # A
+toFOLD_utf8 # A
+toLOWER_utf8 # A
+toTITLE_utf8 # A
+toUPPER_utf8 # A
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031006 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031006
new file mode 100644
index 00000000000..09235699020
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031006
@@ -0,0 +1 @@
+5.031006
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031007 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031007
new file mode 100644
index 00000000000..0cd061b0158
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031007
@@ -0,0 +1,7 @@
+5.031007
+csighandler # E (Perl_csighandler)
+csighandler1 # U
+csighandler3 # E
+perly_sighandler # E
+sv_isa_sv # U
+WARN_EXPERIMENTAL__ISA # E
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031008 b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031008
new file mode 100644
index 00000000000..f24c040a9ca
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/parts/todo/5031008
@@ -0,0 +1 @@
+5.031008
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/01_test.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/01_test.t
new file mode 100644
index 00000000000..0215f9020bc
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/01_test.t
@@ -0,0 +1,57 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/01_test instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+use FindBin ();
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
+
+ sub load {
+ require 'testutil.pl';
+ require 'inctools';
+ }
+
+ if (1) {
+ load();
+ plan(tests => 1);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+BEGIN { $^W = 1; }
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+# This test file is used as target dependency for Makefile
+ok 1;
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t
index 6bf39f10db4..f0212e04513 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/HvNAME.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (4) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,9 +52,9 @@ bootstrap Devel::PPPort;
package main;
-ok(Devel::PPPort::HvNAME_get(\%Devel::PPPort::), 'Devel::PPPort');
+is(Devel::PPPort::HvNAME_get(\%Devel::PPPort::), 'Devel::PPPort');
ok(!defined Devel::PPPort::HvNAME_get({}));
-ok(Devel::PPPort::HvNAMELEN_get(\%Devel::PPPort::), length('Devel::PPPort'));
-ok(Devel::PPPort::HvNAMELEN_get({}), 0);
+is(Devel::PPPort::HvNAMELEN_get(\%Devel::PPPort::), length('Devel::PPPort'));
+is(Devel::PPPort::HvNAMELEN_get({}), 0);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t
index a94bd386c4d..7a7ce396c03 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/MY_CXT.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (3) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t
index 392a0ccb0e3..7da38e25451 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvPV.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (49) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -50,71 +54,71 @@ package main;
my $mhx = "mhx";
-ok(&Devel::PPPort::SvPVbyte($mhx), 3);
+is(&Devel::PPPort::SvPVbyte($mhx), 3);
my $i = 42;
-ok(&Devel::PPPort::SvPV_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_const($mhx), $i++);
-ok(&Devel::PPPort::SvPV_mutable($mhx), $i++);
-ok(&Devel::PPPort::SvPV_flags($mhx), $i++);
-ok(&Devel::PPPort::SvPV_flags_const($mhx), $i++);
-
-ok(&Devel::PPPort::SvPV_flags_const_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_flags_mutable($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_mutable($mhx), $i++);
-
-ok(&Devel::PPPort::SvPV_force_nomg($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_flags($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_flags_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_force_flags_mutable($mhx), $i++);
-
-ok(&Devel::PPPort::SvPV_nolen_const($mhx), $i++);
-ok(&Devel::PPPort::SvPV_nomg($mhx), $i++);
-ok(&Devel::PPPort::SvPV_nomg_const($mhx), $i++);
-ok(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), $i++);
-ok(&Devel::PPPort::SvPV_nomg_nolen($mhx), $i++);
-
-$mhx = 42; ok(&Devel::PPPort::SvPV_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_const($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_mutable($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_flags($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_flags_const($mhx), 2);
-
-$mhx = 42; ok(&Devel::PPPort::SvPV_flags_const_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_flags_mutable($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_mutable($mhx), 2);
-
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_nomg($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_force_flags_mutable($mhx), 2);
-
-$mhx = 42; ok(&Devel::PPPort::SvPV_nolen_const($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_nomg($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_const($mhx), 2);
-$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), 0);
-$mhx = 42; ok(&Devel::PPPort::SvPV_nomg_nolen($mhx), 0);
+is(&Devel::PPPort::SvPV_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_const($mhx), $i++);
+is(&Devel::PPPort::SvPV_mutable($mhx), $i++);
+is(&Devel::PPPort::SvPV_flags($mhx), $i++);
+is(&Devel::PPPort::SvPV_flags_const($mhx), $i++);
+
+is(&Devel::PPPort::SvPV_flags_const_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_flags_mutable($mhx), $i++);
+is(&Devel::PPPort::SvPV_force($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_mutable($mhx), $i++);
+
+is(&Devel::PPPort::SvPV_force_nomg($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_flags($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_flags_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_force_flags_mutable($mhx), $i++);
+
+is(&Devel::PPPort::SvPV_nolen_const($mhx), $i++);
+is(&Devel::PPPort::SvPV_nomg($mhx), $i++);
+is(&Devel::PPPort::SvPV_nomg_const($mhx), $i++);
+is(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), $i++);
+is(&Devel::PPPort::SvPV_nomg_nolen($mhx), $i++);
+
+$mhx = 42; is(&Devel::PPPort::SvPV_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_const($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_mutable($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_flags($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_flags_const($mhx), 2);
+
+$mhx = 42; is(&Devel::PPPort::SvPV_flags_const_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_flags_mutable($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_force($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_mutable($mhx), 2);
+
+$mhx = 42; is(&Devel::PPPort::SvPV_force_nomg($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_nomg_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_flags($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_flags_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_force_flags_mutable($mhx), 2);
+
+$mhx = 42; is(&Devel::PPPort::SvPV_nolen_const($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_nomg($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_nomg_const($mhx), 2);
+$mhx = 42; is(&Devel::PPPort::SvPV_nomg_const_nolen($mhx), 0);
+$mhx = 42; is(&Devel::PPPort::SvPV_nomg_nolen($mhx), 0);
my $str = "";
&Devel::PPPort::SvPV_force($str);
my($s2, $before, $after) = &Devel::PPPort::SvPV_renew($str, 81, "x"x80);
-ok($str, "x"x80);
-ok($s2, "x"x80);
+is($str, "x"x80);
+is($s2, "x"x80);
ok($before < 81);
-ok($after, 81);
+is($after, 81);
$str = "x"x400;
&Devel::PPPort::SvPV_force($str);
($s2, $before, $after) = &Devel::PPPort::SvPV_renew($str, 41, "x"x40);
-ok($str, "x"x40);
-ok($s2, "x"x40);
+is($str, "x"x40);
+is($s2, "x"x40);
ok($before > 41);
-ok($after, 41);
+is($after, 41);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t
index 0b46a51793c..d918e2b18a3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/SvREFCNT.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (14) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t
index 77a7a860db0..821cf01fcce 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/Sv_set.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,24 +23,26 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
- if (5) {
+ if (15) {
load();
- plan(tests => 5);
+ plan(tests => 15);
}
}
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -49,17 +53,59 @@ bootstrap Devel::PPPort;
package main;
my $foo = 5;
-ok(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
-ok(&Devel::PPPort::TestSvPVX_const("mhx"), 43);
-ok(&Devel::PPPort::TestSvPVX_mutable("mhx"), 44);
+is(&Devel::PPPort::TestSvUV_set($foo, 12345), 42);
+is(&Devel::PPPort::TestSvPVX_const("mhx"), 43);
+is(&Devel::PPPort::TestSvPVX_mutable("mhx"), 44);
my $bar = [];
bless $bar, 'foo';
-ok($bar->x(), 'foobar');
+is($bar->x(), 'foobar');
Devel::PPPort::TestSvSTASH_set($bar, 'bar');
-ok($bar->x(), 'hacker');
+is($bar->x(), 'hacker');
+
+ if (ivers($]) != ivers(5.7.2)) {
+ ok(Devel::PPPort::Test_sv_setsv_SV_NOSTEAL());
+ }
+ else {
+ skip("7.2 broken for NOSTEAL", 1);
+ }
+
+ tie my $scalar, 'TieScalarCounter', 'string';
+
+ is tied($scalar)->{fetch}, 0;
+ is tied($scalar)->{store}, 0;
+ my $copy = Devel::PPPort::newSVsv_nomg($scalar);
+ is tied($scalar)->{fetch}, 0;
+ is tied($scalar)->{store}, 0;
+
+ my $fetch = $scalar;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ my $copy2 = Devel::PPPort::newSVsv_nomg($scalar);
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is $copy2, 'string';
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+ my ($class, $value) = @_;
+ return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+ my ($self) = @_;
+ $self->{fetch}++;
+ return $self->{value};
+}
+
+sub STORE {
+ my ($self, $value) = @_;
+ $self->{store}++;
+ $self->{value} = $value;
+}
package foo;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t
index 4d3e80e4c80..c26a5a6ec9c 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/call.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,24 +23,26 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
- if (52) {
+ if (88) {
load();
- plan(tests => 52);
+ plan(tests => 88);
}
}
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,12 +52,6 @@ bootstrap Devel::PPPort;
package main;
-sub eq_array
-{
- my($a, $b) = @_;
- join(':', @$a) eq join(':', @$b);
-}
-
sub f
{
shift;
@@ -98,10 +96,70 @@ for $test (
ok(eq_array( [ &Devel::PPPort::call_sv_G_METHOD('meth', $flags, $obj, @$args) ], $expected));
};
-ok(&Devel::PPPort::eval_pv('f()', 0), 'y');
-ok(&Devel::PPPort::eval_pv('f(qw(a b c))', 0), 'y');
+is(&Devel::PPPort::eval_pv('f()', 0), 'y');
+is(&Devel::PPPort::eval_pv('f(qw(a b c))', 0), 'y');
-ok(!defined $::{'less::'}, 1, "Hadn't loaded less yet");
+is(!defined $::{'less::'}, 1, "Hadn't loaded less yet");
Devel::PPPort::load_module(0, "less", undef);
-ok(defined $::{'less::'}, 1, "Have now loaded less");
+is(defined $::{'less::'}, 1, "Have now loaded less");
+
+ok(eval { Devel::PPPort::eval_pv('die', 0); 1 });
+ok(!eval { Devel::PPPort::eval_pv('die', 1); 1 });
+ok($@ =~ /^Died at \(eval [0-9]+\) line 1\.\n$/);
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('', 0); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('', 1); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('$@ = "string2"', 0); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('$@ = "string2"', 1); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_pv('$@ = "string2"; die "string3"', 0); 1 });
+ok(!eval { $@ = 'string1'; Devel::PPPort::eval_pv('$@ = "string2"; die "string3"', 1); 1 });
+ok($@ =~ /^string3 at \(eval [0-9]+\) line 1\.\n$/);
+ok(!eval { Devel::PPPort::eval_pv('die False->new', 1); 1 }, 'check false value is rethrown');
+
+if ("$]" >= '5.007003' or ("$]" >= '5.006001' and "$]" < '5.007')) {
+ my $hashref = { key => 'value' };
+ is(eval { Devel::PPPort::eval_pv('die $hashref', 1); 1 }, undef, 'check plain hashref is rethrown');
+ is(ref($@), 'HASH', 'check $@ is hashref') and
+ is($@->{key}, 'value', 'check $@ hashref has correct value');
+
+ my $false = False->new;
+ ok(!$false);
+ is(eval { Devel::PPPort::eval_pv('die $false', 1); 1 }, undef, 'check false objects are rethrown');
+ is(ref($@), 'False', 'check that $@ contains False object');
+ is("$@", "$false", 'check we got the expected object');
+} else {
+ skip 'skip: no support for references in $@', 7;
+}
+
+ok(eval { Devel::PPPort::eval_sv('die', 0); 1 });
+ok(!eval { Devel::PPPort::eval_sv('die', &Devel::PPPort::G_RETHROW); 1 });
+ok($@ =~ /^Died at \(eval [0-9]+\) line 1\.\n$/);
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('', 0); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('', &Devel::PPPort::G_RETHROW); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('$@ = "string2"', 0); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('$@ = "string2"', &Devel::PPPort::G_RETHROW); 1 });
+ok(eval { $@ = 'string1'; Devel::PPPort::eval_sv('$@ = "string2"; die "string3"', 0); 1 });
+ok(!eval { $@ = 'string1'; Devel::PPPort::eval_sv('$@ = "string2"; die "string3"', &Devel::PPPort::G_RETHROW); 1 });
+ok($@ =~ /^string3 at \(eval [0-9]+\) line 1\.\n$/);
+ok(!eval { Devel::PPPort::eval_sv('die False->new', &Devel::PPPort::G_RETHROW); 1 }, 'check false value is rethrown');
+
+if ("$]" >= '5.007003' or ("$]" >= '5.006001' and "$]" < '5.007')) {
+ my $hashref = { key => 'value' };
+ is(eval { Devel::PPPort::eval_sv('die $hashref', &Devel::PPPort::G_RETHROW); 1 }, undef, 'check plain hashref is rethrown');
+ is(ref($@), 'HASH', 'check $@ is hashref') and
+ is($@->{key}, 'value', 'check $@ hashref has correct value');
+
+ my $false = False->new;
+ ok(!$false);
+ is(eval { Devel::PPPort::eval_sv('die $false', &Devel::PPPort::G_RETHROW); 1 }, undef, 'check false objects are rethrown');
+ is(ref($@), 'False', 'check that $@ contains False object');
+ is("$@", "$false", 'check we got the expected object');
+} else {
+ skip 'skip: no support for references in $@', 7;
+}
+
+{
+ package False;
+ use overload bool => sub { 0 }, '""' => sub { 'Foo' };
+ sub new { bless {}, shift }
+}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t
index 1a981cbe748..649b45d78eb 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/cop.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,24 +23,26 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
- if (28) {
+ if (8) {
load();
- plan(tests => 28);
+ plan(tests => 8);
}
}
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -54,7 +58,7 @@ my $package;
$package = &Devel::PPPort::CopSTASHPV();
}
print "# $package\n";
-ok($package, "MyPackage");
+is($package, "MyPackage");
my $file = &Devel::PPPort::CopFILE();
print "# $file\n";
@@ -62,10 +66,7 @@ ok($file =~ /cop/i);
BEGIN {
if ("$]" < 5.006000) {
- # Skip
- for (1..28) {
- ok(1, 1);
- }
+ skip("Perl version too early", 8);
exit;
}
}
@@ -102,9 +103,6 @@ for (
) {
my ($sub, $arg, @want) = @$_;
my @got = $sub->($arg);
- ok(@got, @want);
- for (0..$#want) {
- ok($got[$_], $want[$_]);
- }
+ ok(eq_array(\@got, \@want));
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t
index c432df6e69d..09633631fd3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/exception.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (7) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -53,15 +57,15 @@ my $rv;
$Devel::PPPort::exception_caught = undef;
$rv = eval { &Devel::PPPort::exception(0) };
-ok($@, '');
+is($@, '');
ok(defined $rv);
-ok($rv, 42);
-ok($Devel::PPPort::exception_caught, 0);
+is($rv, 42);
+is($Devel::PPPort::exception_caught, 0);
$Devel::PPPort::exception_caught = undef;
$rv = eval { &Devel::PPPort::exception(1) };
-ok($@, "boo\n");
+is($@, "boo\n");
ok(not defined $rv);
-ok($Devel::PPPort::exception_caught, 1);
+is($Devel::PPPort::exception_caught, 1);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t
index a25ede533f5..ef471e09603 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/format.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,24 +23,26 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
- if (1) {
+ if (5) {
load();
- plan(tests => 1);
+ plan(tests => 5);
}
}
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,8 +52,29 @@ bootstrap Devel::PPPort;
package main;
+use Config;
+
+if ("$]" < '5.004') {
+ skip 'skip: No newSVpvf support', 5;
+ exit;
+}
+
my $num = 1.12345678901234567890;
eval { Devel::PPPort::croak_NVgf($num) };
ok($@ =~ /^1.1234567890/);
+is(Devel::PPPort::sprintf_iv(-8), 'XX_-8_XX');
+is(Devel::PPPort::sprintf_uv(15), 'XX_15_XX');
+
+my $ivsize = $Config::Config{ivsize};
+if ($ivsize && ($ivsize == 4 || $ivsize == 8)) {
+ my $ivmax = ($ivsize == 4) ? '2147483647' : '9223372036854775807';
+ my $uvmax = ($ivsize == 4) ? '4294967295' : '18446744073709551615';
+ is(Devel::PPPort::sprintf_ivmax(), $ivmax);
+ is(Devel::PPPort::sprintf_uvmax(), $uvmax);
+}
+else {
+ skip 'skip: unknown ivsize', 2;
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t
index b807ce8ccd6..98c54a4954b 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/grok.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (10) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,15 +52,15 @@ bootstrap Devel::PPPort;
package main;
-ok(&Devel::PPPort::grok_number("42"), 42);
+is(&Devel::PPPort::grok_number("42"), 42);
ok(!defined(&Devel::PPPort::grok_number("A")));
-ok(&Devel::PPPort::grok_bin("10000001"), 129);
-ok(&Devel::PPPort::grok_hex("deadbeef"), 0xdeadbeef);
-ok(&Devel::PPPort::grok_oct("377"), 255);
+is(&Devel::PPPort::grok_bin("10000001"), 129);
+is(&Devel::PPPort::grok_hex("deadbeef"), 0xdeadbeef);
+is(&Devel::PPPort::grok_oct("377"), 255);
-ok(&Devel::PPPort::Perl_grok_number("42"), 42);
+is(&Devel::PPPort::Perl_grok_number("42"), 42);
ok(!defined(&Devel::PPPort::Perl_grok_number("A")));
-ok(&Devel::PPPort::Perl_grok_bin("10000001"), 129);
-ok(&Devel::PPPort::Perl_grok_hex("deadbeef"), 0xdeadbeef);
-ok(&Devel::PPPort::Perl_grok_oct("377"), 255);
+is(&Devel::PPPort::Perl_grok_bin("10000001"), 129);
+is(&Devel::PPPort::Perl_grok_hex("deadbeef"), 0xdeadbeef);
+is(&Devel::PPPort::Perl_grok_oct("377"), 255);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t
index 06dfed1b54c..6e807687986 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/gv.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (7) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,16 +52,16 @@ bootstrap Devel::PPPort;
package main;
-ok(Devel::PPPort::GvSVn(), 1);
+is(Devel::PPPort::GvSVn(), 1);
-ok(Devel::PPPort::isGV_with_GP(), 2);
+is(Devel::PPPort::isGV_with_GP(), 2);
-ok(Devel::PPPort::get_cvn_flags(), 3);
+is(Devel::PPPort::get_cvn_flags(), 3);
-ok(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION);
+is(Devel::PPPort::gv_fetchpvn_flags(), \*Devel::PPPort::VERSION);
-ok(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION);
+is(Devel::PPPort::gv_fetchsv("Devel::PPPort::VERSION"), \*Devel::PPPort::VERSION);
-ok(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check");
+is(Devel::PPPort::gv_init_type("sanity_check", 0, 0), "*main::sanity_check");
ok($::{sanity_check});
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t
index ed1cb2e3ac2..d2dfc7ff1f1 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/limits.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (4) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/locale.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/locale.t
new file mode 100644
index 00000000000..67929c46987
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/locale.t
@@ -0,0 +1,67 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/locale instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+use FindBin ();
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
+
+ sub load {
+ require 'testutil.pl';
+ require 'inctools';
+ }
+
+ if (1) {
+ load();
+ plan(tests => 1);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+BEGIN { $^W = 1; }
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+use Config;
+
+ # We don't know for sure that we are in the global locale for testing. But
+ # if this is unthreaded, it almost certainly is. But Configure can be called
+ # to force POSIX locales on unthreaded systems. If this becomes a problem
+ # this check could be beefed up.
+ if ($Config{usethreads}) {
+ ok(1);
+}
+else {
+ ok(&Devel::PPPort::sync_locale());
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t
index 2f382768288..fd4b499c411 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/mPUSH.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (10) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,15 +52,15 @@ bootstrap Devel::PPPort;
package main;
-ok(join(':', &Devel::PPPort::mPUSHs()), "foo:bar:42");
-ok(join(':', &Devel::PPPort::mPUSHp()), "one:two:three");
-ok(join(':', &Devel::PPPort::mPUSHn()), "0.5:-0.25:0.125");
-ok(join(':', &Devel::PPPort::mPUSHi()), "-1:2:-3");
-ok(join(':', &Devel::PPPort::mPUSHu()), "1:2:3");
-
-ok(join(':', &Devel::PPPort::mXPUSHs()), "foo:bar:42");
-ok(join(':', &Devel::PPPort::mXPUSHp()), "one:two:three");
-ok(join(':', &Devel::PPPort::mXPUSHn()), "0.5:-0.25:0.125");
-ok(join(':', &Devel::PPPort::mXPUSHi()), "-1:2:-3");
-ok(join(':', &Devel::PPPort::mXPUSHu()), "1:2:3");
+is(join(':', &Devel::PPPort::mPUSHs()), "foo:bar:42");
+is(join(':', &Devel::PPPort::mPUSHp()), "one:two:three");
+is(join(':', &Devel::PPPort::mPUSHn()), "0.5:-0.25:0.125");
+is(join(':', &Devel::PPPort::mPUSHi()), "-1:2:-3");
+is(join(':', &Devel::PPPort::mPUSHu()), "1:2:3");
+
+is(join(':', &Devel::PPPort::mXPUSHs()), "foo:bar:42");
+is(join(':', &Devel::PPPort::mXPUSHp()), "one:two:three");
+is(join(':', &Devel::PPPort::mXPUSHn()), "0.5:-0.25:0.125");
+is(join(':', &Devel::PPPort::mXPUSHi()), "-1:2:-3");
+is(join(':', &Devel::PPPort::mXPUSHu()), "1:2:3");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t
index ed74dff717f..471c4853ae7 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/magic.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,24 +23,26 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
- if (23) {
+ if (63) {
load();
- plan(tests => 23);
+ plan(tests => 63);
}
}
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -50,27 +54,27 @@ package main;
# Find proper magic
ok(my $obj1 = Devel::PPPort->new_with_mg());
-ok(Devel::PPPort::as_string($obj1), 'hello');
+is(Devel::PPPort::as_string($obj1), 'hello');
# Find with no magic
my $obj = bless {}, 'Fake::Class';
-ok(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
+is(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
# Find with other magic (not the magic we are looking for)
ok($obj = Devel::PPPort->new_with_other_mg());
-ok(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
+is(Devel::PPPort::as_string($obj), "Sorry, your princess is in another castle.");
# Okay, attempt to remove magic that isn't there
Devel::PPPort::remove_other_magic($obj1);
-ok(Devel::PPPort::as_string($obj1), 'hello');
+is(Devel::PPPort::as_string($obj1), 'hello');
# Remove magic that IS there
Devel::PPPort::remove_null_magic($obj1);
-ok(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
+is(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
# Removing when no magic present
Devel::PPPort::remove_null_magic($obj1);
-ok(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
+is(Devel::PPPort::as_string($obj1), "Sorry, your princess is in another castle.");
use Tie::Hash;
my %h;
@@ -79,34 +83,34 @@ $h{foo} = 'foo';
$h{bar} = '';
&Devel::PPPort::sv_catpv_mg($h{foo}, 'bar');
-ok($h{foo}, 'foobar');
+is($h{foo}, 'foobar');
&Devel::PPPort::sv_catpvn_mg($h{bar}, 'baz');
-ok($h{bar}, 'baz');
+is($h{bar}, 'baz');
&Devel::PPPort::sv_catsv_mg($h{foo}, '42');
-ok($h{foo}, 'foobar42');
+is($h{foo}, 'foobar42');
&Devel::PPPort::sv_setiv_mg($h{bar}, 42);
-ok($h{bar}, 42);
+is($h{bar}, 42);
&Devel::PPPort::sv_setnv_mg($h{PI}, 3.14159);
ok(abs($h{PI} - 3.14159) < 0.01);
&Devel::PPPort::sv_setpv_mg($h{mhx}, 'mhx');
-ok($h{mhx}, 'mhx');
+is($h{mhx}, 'mhx');
&Devel::PPPort::sv_setpvn_mg($h{mhx}, 'Marcus');
-ok($h{mhx}, 'Marcus');
+is($h{mhx}, 'Marcus');
&Devel::PPPort::sv_setsv_mg($h{sv}, 'SV');
-ok($h{sv}, 'SV');
+is($h{sv}, 'SV');
&Devel::PPPort::sv_setuv_mg($h{sv}, 4711);
-ok($h{sv}, 4711);
+is($h{sv}, 4711);
&Devel::PPPort::sv_usepvn_mg($h{sv}, 'Perl');
-ok($h{sv}, 'Perl');
+is($h{sv}, 'Perl');
# v1 is treated as a bareword in older perls...
my $ver = do { local $SIG{'__WARN__'} = sub {}; eval qq[v1.2.0] };
@@ -118,3 +122,108 @@ my $foo = 'bar';
ok(Devel::PPPort::sv_magic_portable($foo));
ok($foo eq 'bar');
+ tie my $scalar, 'TieScalarCounter', 10;
+ my $fetch = $scalar;
+
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is Devel::PPPort::magic_SvIV_nomg($scalar), 10;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is Devel::PPPort::magic_SvUV_nomg($scalar), 10;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is Devel::PPPort::magic_SvNV_nomg($scalar), 10;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ is Devel::PPPort::magic_SvPV_nomg_nolen($scalar), 10;
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+ ok Devel::PPPort::magic_SvTRUE_nomg($scalar);
+ is tied($scalar)->{fetch}, 1;
+ is tied($scalar)->{store}, 0;
+
+ my $object = OverloadedObject->new('string', 5.5, 0);
+
+ is Devel::PPPort::magic_SvIV_nomg($object), 5;
+ is Devel::PPPort::magic_SvUV_nomg($object), 5;
+ is Devel::PPPort::magic_SvNV_nomg($object), 5.5;
+ is Devel::PPPort::magic_SvPV_nomg_nolen($object), 'string';
+ ok !Devel::PPPort::magic_SvTRUE_nomg($object);
+
+tie my $negative, 'TieScalarCounter', -1;
+$fetch = $negative;
+
+is tied($negative)->{fetch}, 1;
+is tied($negative)->{store}, 0;
+is Devel::PPPort::magic_SvIV_nomg($negative), -1;
+if (ivers($]) >= ivers(5.6)) {
+ ok !Devel::PPPort::SVf_IVisUV($negative);
+} else {
+ skip 'SVf_IVisUV is unsupported', 1;
+}
+is tied($negative)->{fetch}, 1;
+is tied($negative)->{store}, 0;
+Devel::PPPort::magic_SvUV_nomg($negative);
+if (ivers($]) >= ivers(5.6)) {
+ ok !Devel::PPPort::SVf_IVisUV($negative);
+} else {
+ skip 'SVf_IVisUV is unsupported', 1;
+}
+is tied($negative)->{fetch}, 1;
+is tied($negative)->{store}, 0;
+
+tie my $big, 'TieScalarCounter', Devel::PPPort::above_IV_MAX();
+$fetch = $big;
+
+is tied($big)->{fetch}, 1;
+is tied($big)->{store}, 0;
+Devel::PPPort::magic_SvIV_nomg($big);
+if (ivers($]) >= ivers(5.6)) {
+ ok Devel::PPPort::SVf_IVisUV($big);
+} else {
+ skip 'SVf_IVisUV is unsupported', 1;
+}
+is tied($big)->{fetch}, 1;
+is tied($big)->{store}, 0;
+is Devel::PPPort::magic_SvUV_nomg($big), Devel::PPPort::above_IV_MAX();
+if (ivers($]) >= ivers(5.6)) {
+ ok Devel::PPPort::SVf_IVisUV($big);
+} else {
+ skip 'SVf_IVisUV is unsupported', 1;
+}
+is tied($big)->{fetch}, 1;
+is tied($big)->{store}, 0;
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+ my ($class, $value) = @_;
+ return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+ my ($self) = @_;
+ $self->{fetch}++;
+ return $self->{value};
+}
+
+sub STORE {
+ my ($self, $value) = @_;
+ $self->{store}++;
+ $self->{value} = $value;
+}
+
+package OverloadedObject;
+
+sub new {
+ my ($class, $str, $num, $bool) = @_;
+ return bless { str => $str, num => $num, bool => $bool }, $class;
+}
+
+use overload
+ '""' => sub { $_[0]->{str} },
+ '0+' => sub { $_[0]->{num} },
+ 'bool' => sub { $_[0]->{bool} },
+ ;
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t
index 74ecb991bcf..45bda3b30d4 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/memory.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (1) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,5 +52,5 @@ bootstrap Devel::PPPort;
package main;
-ok(Devel::PPPort::checkmem(), 6);
+is(Devel::PPPort::checkmem(), 6);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t
index 9a9822ade0d..986d79bf2d6 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/mess.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,24 +23,26 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
- if (93) {
+ if (102) {
load();
- plan(tests => 93);
+ plan(tests => 102);
}
}
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,7 +52,7 @@ bootstrap Devel::PPPort;
package main;
-BEGIN { if ($] lt '5.006') { $^W = 0; } }
+BEGIN { if ("$]" < '5.006') { $^W = 0; } }
my $warn;
my $die;
@@ -62,13 +66,13 @@ my $obj = bless {}, 'Package';
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\xE1\n") };
-ok $@, "\xE1\n";
-ok $die, "\xE1\n";
+is $@, "\xE1\n";
+is $die, "\xE1\n";
undef $die;
ok !defined eval { Devel::PPPort::croak_sv(10) };
-ok $@ =~ /^10 at $0 line /;
-ok $die =~ /^10 at $0 line /;
+ok $@ =~ /^10 at \Q$0\E line /;
+ok $die =~ /^10 at \Q$0\E line /;
undef $die;
$@ = 'should not be visible (1)';
@@ -76,8 +80,8 @@ ok !defined eval {
$@ = 'should not be visible (2)';
Devel::PPPort::croak_sv('');
};
-ok $@ =~ /^ at $0 line /;
-ok $die =~ /^ at $0 line /;
+ok $@ =~ /^ at \Q$0\E line /;
+ok $die =~ /^ at \Q$0\E line /;
undef $die;
$@ = 'should not be visible';
@@ -85,8 +89,8 @@ ok !defined eval {
$@ = 'this must be visible';
Devel::PPPort::croak_sv($@)
};
-ok $@ =~ /^this must be visible at $0 line /;
-ok $die =~ /^this must be visible at $0 line /;
+ok $@ =~ /^this must be visible at \Q$0\E line /;
+ok $die =~ /^this must be visible at \Q$0\E line /;
undef $die;
$@ = 'should not be visible';
@@ -94,125 +98,159 @@ ok !defined eval {
$@ = "this must be visible\n";
Devel::PPPort::croak_sv($@)
};
-ok $@, "this must be visible\n";
-ok $die, "this must be visible\n";
+is $@, "this must be visible\n";
+is $die, "this must be visible\n";
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+ $@ = 'this must be visible';
+ Devel::PPPort::croak_sv_errsv()
+};
+ok $@ =~ /^this must be visible at \Q$0\E line /;
+ok $die =~ /^this must be visible at \Q$0\E line /;
+
+undef $die;
+$@ = 'should not be visible';
+ok !defined eval {
+ $@ = "this must be visible\n";
+ Devel::PPPort::croak_sv_errsv()
+};
+is $@, "this must be visible\n";
+is $die, "this must be visible\n";
+
+undef $die;
+ok !defined eval { Devel::PPPort::croak_sv_with_counter("message\n") };
+is $@, "message\n";
+is Devel::PPPort::get_counter(), 1;
undef $die;
ok !defined eval { Devel::PPPort::croak_sv('') };
-ok $@ =~ /^ at $0 line /;
-ok $die =~ /^ at $0 line /;
+ok $@ =~ /^ at \Q$0\E line /;
+ok $die =~ /^ at \Q$0\E line /;
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\xE1") };
-ok $@ =~ /^\xE1 at $0 line /;
-ok $die =~ /^\xE1 at $0 line /;
+ok $@ =~ /^\xE1 at \Q$0\E line /;
+ok $die =~ /^\xE1 at \Q$0\E line /;
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1") };
-ok $@ =~ /^\xC3\xA1 at $0 line /;
-ok $die =~ /^\xC3\xA1 at $0 line /;
+ok $@ =~ /^\xC3\xA1 at \Q$0\E line /;
+ok $die =~ /^\xC3\xA1 at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv("\xE1\n");
-ok $warn, "\xE1\n";
+is $warn, "\xE1\n";
undef $warn;
Devel::PPPort::warn_sv(10);
-ok $warn =~ /^10 at $0 line /;
+ok $warn =~ /^10 at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv('');
-ok $warn =~ /^ at $0 line /;
+ok $warn =~ /^ at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv("\xE1");
-ok $warn =~ /^\xE1 at $0 line /;
+ok $warn =~ /^\xE1 at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv("\xC3\xA1");
-ok $warn =~ /^\xC3\xA1 at $0 line /;
+ok $warn =~ /^\xC3\xA1 at \Q$0\E line /;
-ok Devel::PPPort::mess_sv("\xE1\n", 0), "\xE1\n";
-ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1\n"}, 1), "\xE1\n";
+is Devel::PPPort::mess_sv("\xE1\n", 0), "\xE1\n";
+is Devel::PPPort::mess_sv(do {my $tmp = "\xE1\n"}, 1), "\xE1\n";
-ok Devel::PPPort::mess_sv(10, 0) =~ /^10 at $0 line /;
-ok Devel::PPPort::mess_sv(do {my $tmp = 10}, 1) =~ /^10 at $0 line /;
+ok Devel::PPPort::mess_sv(10, 0) =~ /^10 at \Q$0\E line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = 10}, 1) =~ /^10 at \Q$0\E line /;
-ok Devel::PPPort::mess_sv('', 0) =~ /^ at $0 line /;
-ok Devel::PPPort::mess_sv(do {my $tmp = ''}, 1) =~ /^ at $0 line /;
+ok Devel::PPPort::mess_sv('', 0) =~ /^ at \Q$0\E line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = ''}, 1) =~ /^ at \Q$0\E line /;
-ok Devel::PPPort::mess_sv("\xE1", 0) =~ /^\xE1 at $0 line /;
-ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1"}, 1) =~ /^\xE1 at $0 line /;
+ok Devel::PPPort::mess_sv("\xE1", 0) =~ /^\xE1 at \Q$0\E line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xE1"}, 1) =~ /^\xE1 at \Q$0\E line /;
-ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ /^\xC3\xA1 at $0 line /;
-ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ /^\xC3\xA1 at $0 line /;
+ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ /^\xC3\xA1 at \Q$0\E line /;
+ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ /^\xC3\xA1 at \Q$0\E line /;
-if ($] ge '5.006') {
- BEGIN { if ($] ge '5.006' && $] lt '5.008') { require utf8; utf8->import(); } }
+if ("$]" >= '5.006') {
+ BEGIN { if ("$]" >= '5.006' && "$]" < '5.008') { require utf8; utf8->import(); } }
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\x{100}\n") };
- ok $@, "\x{100}\n";
- if ($] ne '5.008') {
- ok $die, "\x{100}\n";
+ if ("$]" < '5.007001' || "$]" > '5.007003') {
+ is $@, "\x{100}\n";
} else {
- skip 'skip: broken utf8 support in die hook', 0;
+ skip 'skip: broken utf8 support in die hook', 1;
+ }
+ if ("$]" < '5.007001' || "$]" > '5.008') {
+ is $die, "\x{100}\n";
+ } else {
+ skip 'skip: broken utf8 support in die hook', 1;
}
undef $die;
ok !defined eval { Devel::PPPort::croak_sv("\x{100}") };
- ok $@ =~ /^\x{100} at $0 line /;
- if ($] ne '5.008') {
- ok $die =~ /^\x{100} at $0 line /;
+ if ("$]" < '5.007001' || "$]" > '5.007003') {
+ ok $@ =~ /^\x{100} at \Q$0\E line /;
+ } else {
+ skip 'skip: broken utf8 support in die hook', 1;
+ }
+ if ("$]" < '5.007001' || "$]" > '5.008') {
+ ok $die =~ /^\x{100} at \Q$0\E line /;
} else {
- skip 'skip: broken utf8 support in die hook', 0;
+ skip 'skip: broken utf8 support in die hook', 1;
}
- if ($] ne '5.008') {
+ if ("$]" < '5.007001' || "$]" > '5.008') {
undef $warn;
Devel::PPPort::warn_sv("\x{100}\n");
- ok $warn, "\x{100}\n";
+ is $warn, "\x{100}\n";
undef $warn;
Devel::PPPort::warn_sv("\x{100}");
- ok (my $tmp = $warn) =~ /^\x{100} at $0 line /;
+ ok (my $tmp = $warn) =~ /^\x{100} at \Q$0\E line /;
} else {
- skip 'skip: broken utf8 support in warn hook', 0 for 1..2;
+ skip 'skip: broken utf8 support in warn hook', 2;
}
- ok Devel::PPPort::mess_sv("\x{100}\n", 0), "\x{100}\n";
- ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}\n"}, 1), "\x{100}\n";
+ is Devel::PPPort::mess_sv("\x{100}\n", 0), "\x{100}\n";
+ is Devel::PPPort::mess_sv(do {my $tmp = "\x{100}\n"}, 1), "\x{100}\n";
- ok Devel::PPPort::mess_sv("\x{100}", 0) =~ /^\x{100} at $0 line /;
- ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}"}, 1) =~ /^\x{100} at $0 line /;
+ ok Devel::PPPort::mess_sv("\x{100}", 0) =~ /^\x{100} at \Q$0\E line /;
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\x{100}"}, 1) =~ /^\x{100} at \Q$0\E line /;
} else {
- skip 'skip: no utf8 support', 0 for 1..12;
+ skip 'skip: no utf8 support', 12;
}
if (ord('A') != 65) {
- skip 'skip: no ASCII support', 0 for 1..24;
-} elsif ($] ge '5.008' && $] ne '5.012000') {
+ skip 'skip: no ASCII support', 24;
+} elsif ( "$]" >= '5.008'
+ && "$]" != '5.013000' # Broken in these ranges
+ && ! ("$]" >= '5.011005' && "$]" <= '5.012000'))
+{
undef $die;
ok !defined eval { Devel::PPPort::croak_sv(eval '"\N{U+E1}\n"') };
- ok $@, "\xE1\n";
- ok $die, "\xE1\n";
+ is $@, "\xE1\n";
+ is $die, "\xE1\n";
undef $die;
ok !defined eval { Devel::PPPort::croak_sv(eval '"\N{U+E1}"') };
- ok $@ =~ /^\xE1 at $0 line /;
- ok $die =~ /^\xE1 at $0 line /;
+ ok $@ =~ /^\xE1 at \Q$0\E line /;
+ ok $die =~ /^\xE1 at \Q$0\E line /;
{
undef $die;
my $expect = eval '"\N{U+C3}\N{U+A1}\n"';
ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1\n") };
- ok $@, $expect;
- ok $die, $expect;
+ is $@, $expect;
+ is $die, $expect;
}
{
undef $die;
- my $expect = eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ my $expect = eval 'qr/^\N{U+C3}\N{U+A1} at \Q$0\E line /';
ok !defined eval { Devel::PPPort::croak_sv("\xC3\xA1") };
ok $@ =~ $expect;
ok $die =~ $expect;
@@ -220,36 +258,41 @@ if (ord('A') != 65) {
undef $warn;
Devel::PPPort::warn_sv(eval '"\N{U+E1}\n"');
- ok $warn, "\xE1\n";
+ is $warn, "\xE1\n";
undef $warn;
Devel::PPPort::warn_sv(eval '"\N{U+E1}"');
- ok $warn =~ /^\xE1 at $0 line /;
+ ok $warn =~ /^\xE1 at \Q$0\E line /;
undef $warn;
Devel::PPPort::warn_sv("\xC3\xA1\n");
- ok $warn, eval '"\N{U+C3}\N{U+A1}\n"';
+ is $warn, eval '"\N{U+C3}\N{U+A1}\n"';
undef $warn;
Devel::PPPort::warn_sv("\xC3\xA1");
- ok $warn =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ ok $warn =~ eval 'qr/^\N{U+C3}\N{U+A1} at \Q$0\E line /';
- ok Devel::PPPort::mess_sv(eval('"\N{U+E1}\n"'), 0), eval '"\N{U+E1}\n"';
- ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}\n"'}, 1), eval '"\N{U+E1}\n"';
+ if ("$]" < '5.004') {
+ skip 'skip: no support for mess_sv', 8;
+ }
+ else {
+ is Devel::PPPort::mess_sv(eval('"\N{U+E1}\n"'), 0), eval '"\N{U+E1}\n"';
+ is Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}\n"'}, 1), eval '"\N{U+E1}\n"';
- ok Devel::PPPort::mess_sv(eval('"\N{U+E1}"'), 0) =~ eval 'qr/^\N{U+E1} at $0 line /';
- ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}"'}, 1) =~ eval 'qr/^\N{U+E1} at $0 line /';
+ ok Devel::PPPort::mess_sv(eval('"\N{U+E1}"'), 0) =~ eval 'qr/^\N{U+E1} at \Q$0\E line /';
+ ok Devel::PPPort::mess_sv(do {my $tmp = eval '"\N{U+E1}"'}, 1) =~ eval 'qr/^\N{U+E1} at \Q$0\E line /';
- ok Devel::PPPort::mess_sv("\xC3\xA1\n", 0), eval '"\N{U+C3}\N{U+A1}\n"';
- ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1\n"}, 1), eval '"\N{U+C3}\N{U+A1}\n"';
+ is Devel::PPPort::mess_sv("\xC3\xA1\n", 0), eval '"\N{U+C3}\N{U+A1}\n"';
+ is Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1\n"}, 1), eval '"\N{U+C3}\N{U+A1}\n"';
- ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
- ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ eval 'qr/^\N{U+C3}\N{U+A1} at $0 line /';
+ ok Devel::PPPort::mess_sv("\xC3\xA1", 0) =~ eval 'qr/^\N{U+C3}\N{U+A1} at \Q$0\E line /';
+ ok Devel::PPPort::mess_sv(do {my $tmp = "\xC3\xA1"}, 1) =~ eval 'qr/^\N{U+C3}\N{U+A1} at \Q$0\E line /';
+ }
} else {
- skip 'skip: no support for \N{U+..} syntax', 0 for 1..24;
+ skip 'skip: no support for \N{U+..} syntax', 24;
}
-if ($] ge '5.007003' or ($] ge '5.006001' and $] lt '5.007')) {
+if ("$]" >= '5.007003' or ("$]" >= '5.006001' and "$]" < '5.007')) {
undef $die;
ok !defined eval { Devel::PPPort::croak_sv($scalar_ref) };
ok $@ == $scalar_ref;
@@ -270,15 +313,15 @@ if ($] ge '5.007003' or ($] ge '5.006001' and $] lt '5.007')) {
ok $@ == $obj;
ok $die == $obj;
} else {
- skip 'skip: no support for exceptions', 0 for 1..12;
+ skip 'skip: no support for exceptions', 12;
}
ok !defined eval { Devel::PPPort::croak_no_modify() };
-ok $@ =~ /^Modification of a read-only value attempted at $0 line /;
+ok $@ =~ /^Modification of a read-only value attempted at \Q$0\E line /;
ok !defined eval { Devel::PPPort::croak_memory_wrap() };
-ok $@ =~ /^panic: memory wrap at $0 line /;
+ok $@ =~ /^panic: memory wrap at \Q$0\E line /;
ok !defined eval { Devel::PPPort::croak_xs_usage("params") };
-ok $@ =~ /^Usage: Devel::PPPort::croak_xs_usage\(params\) at $0 line /;
+ok $@ =~ /^Usage: Devel::PPPort::croak_xs_usage\(params\) at \Q$0\E line /;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t
index 7fbd3e9c8f0..6901a19ab9b 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/misc.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,24 +23,26 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
- if (128) {
+ if (26826) {
load();
- plan(tests => 128);
+ plan(tests => 26826);
}
}
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -50,40 +54,40 @@ package main;
use vars qw($my_sv @my_av %my_hv);
-ok(&Devel::PPPort::boolSV(1));
-ok(!&Devel::PPPort::boolSV(0));
+ok(&Devel::PPPort::boolSV(1), "Verify boolSV(1) is true");
+ok(!&Devel::PPPort::boolSV(0), "Verify boolSV(0) is false");
$_ = "Fred";
-ok(&Devel::PPPort::DEFSV(), "Fred");
-ok(&Devel::PPPort::UNDERBAR(), "Fred");
+is(&Devel::PPPort::DEFSV(), "Fred", '$_ is FRED; Verify DEFSV is FRED');
+is(&Devel::PPPort::UNDERBAR(), "Fred", 'And verify UNDERBAR is FRED');
-if ("$]" >= 5.009002 && "$]" < 5.023 && "$]" < 5.023004) {
+if (ivers($]) >= ivers(5.9.2) && ivers($]) < ivers(5.23)) {
eval q{
no warnings "deprecated";
- no if $^V > v5.17.9, warnings => "experimental::lexical_topic";
+ no if $^V >= v5.17.9, warnings => "experimental::lexical_topic";
my $_ = "Tony";
- ok(&Devel::PPPort::DEFSV(), "Fred");
- ok(&Devel::PPPort::UNDERBAR(), "Tony");
+ is(&Devel::PPPort::DEFSV(), "Fred", 'lexical_topic eval: $_ is Tony; Verify DEFSV is Fred');
+ is(&Devel::PPPort::UNDERBAR(), "Tony", 'And verify UNDERBAR is Tony');
};
+ die __FILE__ . __LINE__ . ": $@" if $@;
}
else {
- ok(1);
- ok(1);
+ skip("perl version outside testing range of lexical_topic", 2);
}
my @r = &Devel::PPPort::DEFSV_modify();
-ok(@r == 3);
-ok($r[0], 'Fred');
-ok($r[1], 'DEFSV');
-ok($r[2], 'Fred');
+ok(@r == 3, "Verify got 3 elements");
+is($r[0], 'Fred');
+is($r[1], 'DEFSV');
+is($r[2], 'Fred');
-ok(&Devel::PPPort::DEFSV(), "Fred");
+is(&Devel::PPPort::DEFSV(), "Fred");
eval { 1 };
-ok(!&Devel::PPPort::ERRSV());
+ok(!&Devel::PPPort::ERRSV(), "Verify ERRSV on true is false");
eval { cannot_call_this_one() };
-ok(&Devel::PPPort::ERRSV());
+ok(&Devel::PPPort::ERRSV(), "Verify ERRSV on false is true");
ok(&Devel::PPPort::gv_stashpvn('Devel::PPPort', 0));
ok(!&Devel::PPPort::gv_stashpvn('does::not::exist', 0));
@@ -109,178 +113,387 @@ ok(&Devel::PPPort::get_cv('my_cv', 0));
ok(!&Devel::PPPort::get_cv('not_my_cv', 0));
ok(&Devel::PPPort::get_cv('not_my_cv', 1));
-ok(Devel::PPPort::dXSTARG(42), 43);
-ok(Devel::PPPort::dAXMARK(4711), 4710);
+is(Devel::PPPort::dXSTARG(42), 43);
+is(Devel::PPPort::dAXMARK(4711), 4710);
-ok(Devel::PPPort::prepush(), 42);
+is(Devel::PPPort::prepush(), 42);
-ok(join(':', Devel::PPPort::xsreturn(0)), 'test1');
-ok(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
+is(join(':', Devel::PPPort::xsreturn(0)), 'test1');
+is(join(':', Devel::PPPort::xsreturn(1)), 'test1:test2');
-ok(Devel::PPPort::PERL_ABS(42), 42);
-ok(Devel::PPPort::PERL_ABS(-13), 13);
+is(Devel::PPPort::PERL_ABS(42), 42, "Verify PERL_ABS(42) is 42");
+is(Devel::PPPort::PERL_ABS(-13), 13, "Verify PERL_ABS(-13) is 13");
-ok(Devel::PPPort::SVf(42), "$]" >= 5.004 ? '[42]' : '42');
-ok(Devel::PPPort::SVf('abc'), "$]" >= 5.004 ? '[abc]' : 'abc');
+is(Devel::PPPort::SVf(42), ivers($]) >= ivers(5.4) ? '[42]' : '42');
+is(Devel::PPPort::SVf('abc'), ivers($]) >= ivers(5.4) ? '[abc]' : 'abc');
-ok(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
+is(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
-ok(&Devel::PPPort::ptrtests(), 63);
+is(&Devel::PPPort::ptrtests(), 63);
-ok(&Devel::PPPort::OpSIBLING_tests(), 0);
+is(&Devel::PPPort::OpSIBLING_tests(), 0);
-if ("$]" >= 5.009000) {
+if (ivers($]) >= ivers(5.9)) {
eval q{
- ok(&Devel::PPPort::check_HeUTF8("hello"), "norm");
- ok(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
+ is(&Devel::PPPort::check_HeUTF8("hello"), "norm");
+ is(&Devel::PPPort::check_HeUTF8("\N{U+263a}"), "utf8");
};
} else {
- ok(1, 1);
- ok(1, 1);
+ skip("Too early perl version", 2);
}
@r = &Devel::PPPort::check_c_array();
-ok($r[0], 4);
-ok($r[1], "13");
+is($r[0], 4);
+is($r[1], "13");
ok(!Devel::PPPort::SvRXOK(""));
ok(!Devel::PPPort::SvRXOK(bless [], "Regexp"));
-if ("$]" < 5.005) {
- skip 'no qr// objects in this perl', 0;
- skip 'no qr// objects in this perl', 0;
+if (ivers($]) < ivers(5.5)) {
+ skip 'no qr// objects in this perl', 2;
} else {
my $qr = eval 'qr/./';
- ok(Devel::PPPort::SvRXOK($qr));
+ ok(Devel::PPPort::SvRXOK($qr), "SVRXOK(qr) is true");
ok(Devel::PPPort::SvRXOK(bless $qr, "Surprise"));
}
-ok( Devel::PPPort::test_isBLANK(ord(" ")));
-ok(! Devel::PPPort::test_isBLANK(ord("\n")));
-
-ok( Devel::PPPort::test_isBLANK_A(ord("\t")));
-ok(! Devel::PPPort::test_isBLANK_A(ord("\r")));
-
-ok( Devel::PPPort::test_isUPPER(ord("A")));
-ok(! Devel::PPPort::test_isUPPER(ord("a")));
-
-ok( Devel::PPPort::test_isUPPER_A(ord("Z")));
-
-# One of these two is uppercase in EBCDIC; the other in Latin1, but neither are
-# ASCII uppercase.
-ok(! Devel::PPPort::test_isUPPER_A(ord(0xDC)));
-ok(! Devel::PPPort::test_isUPPER_A(ord(0xFC)));
-
-ok( Devel::PPPort::test_isLOWER(ord("b")));
-ok(! Devel::PPPort::test_isLOWER(ord("B")));
-
-ok( Devel::PPPort::test_isLOWER_A(ord("y")));
-
-# One of these two is lowercase in EBCDIC; the other in Latin1, but neither are
-# ASCII lowercase.
-ok(! Devel::PPPort::test_isLOWER_A(ord(0xDC)));
-ok(! Devel::PPPort::test_isLOWER_A(ord(0xFC)));
-
-ok( Devel::PPPort::test_isALPHA(ord("C")));
-ok(! Devel::PPPort::test_isALPHA(ord("1")));
-
-ok( Devel::PPPort::test_isALPHA_A(ord("x")));
-ok(! Devel::PPPort::test_isALPHA_A(0xDC));
-
-ok( Devel::PPPort::test_isWORDCHAR(ord("_")));
-ok(! Devel::PPPort::test_isWORDCHAR(ord("@")));
-
-ok( Devel::PPPort::test_isWORDCHAR_A(ord("2")));
-ok(! Devel::PPPort::test_isWORDCHAR_A(0xFC));
-
-ok( Devel::PPPort::test_isALPHANUMERIC(ord("4")));
-ok(! Devel::PPPort::test_isALPHANUMERIC(ord("_")));
-
-ok( Devel::PPPort::test_isALPHANUMERIC_A(ord("l")));
-ok(! Devel::PPPort::test_isALPHANUMERIC_A(0xDC));
-
-ok( Devel::PPPort::test_isALNUM(ord("c")));
-ok(! Devel::PPPort::test_isALNUM(ord("}")));
-
-ok( Devel::PPPort::test_isALNUM_A(ord("5")));
-ok(! Devel::PPPort::test_isALNUM_A(0xFC));
-
-ok( Devel::PPPort::test_isDIGIT(ord("6")));
-ok(! Devel::PPPort::test_isDIGIT(ord("_")));
-
-ok( Devel::PPPort::test_isDIGIT_A(ord("7")));
-ok(! Devel::PPPort::test_isDIGIT_A(0xDC));
-
-ok( Devel::PPPort::test_isOCTAL(ord("7")));
-ok(! Devel::PPPort::test_isOCTAL(ord("8")));
-
-ok( Devel::PPPort::test_isOCTAL_A(ord("0")));
-ok(! Devel::PPPort::test_isOCTAL_A(ord("9")));
-
-ok( Devel::PPPort::test_isIDFIRST(ord("D")));
-ok(! Devel::PPPort::test_isIDFIRST(ord("1")));
-
-ok( Devel::PPPort::test_isIDFIRST_A(ord("_")));
-ok(! Devel::PPPort::test_isIDFIRST_A(0xFC));
-
-ok( Devel::PPPort::test_isIDCONT(ord("e")));
-ok(! Devel::PPPort::test_isIDCONT(ord("@")));
-
-ok( Devel::PPPort::test_isIDCONT_A(ord("2")));
-ok(! Devel::PPPort::test_isIDCONT_A(0xDC));
-
-ok( Devel::PPPort::test_isSPACE(ord(" ")));
-ok(! Devel::PPPort::test_isSPACE(ord("_")));
+ok( Devel::PPPort::NATIVE_TO_LATIN1(0xB6) == 0xB6);
+ok( Devel::PPPort::NATIVE_TO_LATIN1(0x1) == 0x1);
+ok( Devel::PPPort::NATIVE_TO_LATIN1(ord("A")) == 0x41);
+ok( Devel::PPPort::NATIVE_TO_LATIN1(ord("0")) == 0x30);
-ok( Devel::PPPort::test_isSPACE_A(ord("\cK")));
-ok(! Devel::PPPort::test_isSPACE_A(ord("F")));
-
-# This stresses the edge for ASCII machines, but happens to work on EBCDIC as
-# well
-ok( Devel::PPPort::test_isASCII(0x7F));
-ok(! Devel::PPPort::test_isASCII(0x80));
-
-ok( Devel::PPPort::test_isASCII_A(ord("9")));
-
-# B6 is the PARAGRAPH SIGN in ASCII and EBCDIC
-ok(! Devel::PPPort::test_isASCII_A(0xB6));
-
-ok( Devel::PPPort::test_isCNTRL(ord("\e")));
-ok(! Devel::PPPort::test_isCNTRL(ord(" ")));
-
-ok( Devel::PPPort::test_isCNTRL_A(ord("\a")));
-ok(! Devel::PPPort::test_isCNTRL_A(0xB6));
-
-ok( Devel::PPPort::test_isPRINT(ord(" ")));
-ok(! Devel::PPPort::test_isPRINT(ord("\n")));
-
-ok( Devel::PPPort::test_isPRINT_A(ord("G")));
-ok(! Devel::PPPort::test_isPRINT_A(0xB6));
-
-ok( Devel::PPPort::test_isGRAPH(ord("h")));
-ok(! Devel::PPPort::test_isGRAPH(ord(" ")));
-
-ok( Devel::PPPort::test_isGRAPH_A(ord("i")));
-ok(! Devel::PPPort::test_isGRAPH_A(0xB6));
-
-ok( Devel::PPPort::test_isPUNCT(ord("#")));
-ok(! Devel::PPPort::test_isPUNCT(ord(" ")));
+ok( Devel::PPPort::LATIN1_TO_NATIVE(0xB6) == 0xB6, "Verify LATIN1_TO_NATIVE(0xB6) is 0xB6");
+if (ord("A") == 65) {
+ ok( Devel::PPPort::LATIN1_TO_NATIVE(0x41) == 0x41);
+ ok( Devel::PPPort::LATIN1_TO_NATIVE(0x30) == 0x30);
+}
+else {
+ ok( Devel::PPPort::LATIN1_TO_NATIVE(0x41) == 0xC1);
+ ok( Devel::PPPort::LATIN1_TO_NATIVE(0x30) == 0xF0);
+}
-ok( Devel::PPPort::test_isPUNCT_A(ord("*")));
-ok(! Devel::PPPort::test_isPUNCT_A(0xB6));
+ok( Devel::PPPort::isALNUMC_L1(ord("5")));
+ok( Devel::PPPort::isALNUMC_L1(0xFC));
+ok(! Devel::PPPort::isALNUMC_L1(0xB6));
+
+ok( Devel::PPPort::isOCTAL(ord("7")), "Verify '7' is OCTAL");
+ok(! Devel::PPPort::isOCTAL(ord("8")), "Verify '8' isn't OCTAL");
+
+ok( Devel::PPPort::isOCTAL_A(ord("0")), "Verify '0' is OCTAL_A");
+ok(! Devel::PPPort::isOCTAL_A(ord("9")), "Verify '9' isn't OCTAL_A");
+
+ok( Devel::PPPort::isOCTAL_L1(ord("2")), "Verify '2' is OCTAL_L1");
+ok(! Devel::PPPort::isOCTAL_L1(ord("8")), "Verify '8' isn't OCTAL_L1");
+
+my $way_too_early_msg = 'UTF-8 not implemented on this perl';
+
+# For the other properties, we test every code point from 0.255, and a
+# smattering of higher ones. First populate a hash with keys like '65:ALPHA'
+# to indicate that the code point there is alphabetic
+my $i;
+my %types;
+for $i (0x41..0x5A, 0x61..0x7A, 0xAA, 0xB5, 0xBA, 0xC0..0xD6, 0xD8..0xF6,
+ 0xF8..0x101)
+{
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:ALPHA"} = 1;
+ $types{"$native:ALPHANUMERIC"} = 1;
+ $types{"$native:IDFIRST"} = 1;
+ $types{"$native:IDCONT"} = 1;
+ $types{"$native:PRINT"} = 1;
+ $types{"$native:WORDCHAR"} = 1;
+}
+for $i (0x30..0x39, 0x660, 0xFF19) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:ALPHANUMERIC"} = 1;
+ $types{"$native:DIGIT"} = 1;
+ $types{"$native:IDCONT"} = 1;
+ $types{"$native:WORDCHAR"} = 1;
+ $types{"$native:GRAPH"} = 1;
+ $types{"$native:PRINT"} = 1;
+ $types{"$native:XDIGIT"} = 1 if $i < 255 || ($i >= 0xFF10 && $i <= 0xFF19);
+}
-ok( Devel::PPPort::test_isXDIGIT(ord("A")));
-ok(! Devel::PPPort::test_isXDIGIT(ord("_")));
+for $i (0..0x7F) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:ASCII"} = 1;
+}
+for $i (0..0x1f, 0x7F..0x9F) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:CNTRL"} = 1;
+}
+for $i (0x21..0x7E, 0xA1..0x101, 0x660) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:GRAPH"} = 1;
+ $types{"$native:PRINT"} = 1;
+}
+for $i (0x09, 0x20, 0xA0) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:BLANK"} = 1;
+ $types{"$native:SPACE"} = 1;
+ $types{"$native:PSXSPC"} = 1;
+ $types{"$native:PRINT"} = 1 if $i > 0x09;
+}
+for $i (0x09..0x0D, 0x85, 0x2029) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:SPACE"} = 1;
+ $types{"$native:PSXSPC"} = 1;
+}
+for $i (0x41..0x5A, 0xC0..0xD6, 0xD8..0xDE, 0x100) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:UPPER"} = 1;
+ $types{"$native:XDIGIT"} = 1 if $i < 0x47;
+}
+for $i (0x61..0x7A, 0xAA, 0xB5, 0xBA, 0xDF..0xF6, 0xF8..0xFF, 0x101) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:LOWER"} = 1;
+ $types{"$native:XDIGIT"} = 1 if $i < 0x67;
+}
+for $i (0x21..0x2F, 0x3A..0x40, 0x5B..0x60, 0x7B..0x7E, 0xB6, 0xA1, 0xA7, 0xAB,
+ 0xB7, 0xBB, 0xBF, 0x5BE)
+{
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ $types{"$native:PUNCT"} = 1;
+ $types{"$native:GRAPH"} = 1;
+ $types{"$native:PRINT"} = 1;
+}
-ok( Devel::PPPort::test_isXDIGIT_A(ord("9")));
-ok(! Devel::PPPort::test_isXDIGIT_A(0xDC));
+$i = ord('_');
+$types{"$i:WORDCHAR"} = 1;
+$types{"$i:IDFIRST"} = 1;
+$types{"$i:IDCONT"} = 1;
+
+# Now find all the unique code points included above.
+my %code_points_to_test;
+my $key;
+for $key (keys %types) {
+ $key =~ s/:.*//;
+ $code_points_to_test{$key} = 1;
+}
-ok( Devel::PPPort::test_isPSXSPC(ord(" ")));
-ok(! Devel::PPPort::test_isPSXSPC(ord("k")));
+# And test each one
+for $i (sort { $a <=> $b } keys %code_points_to_test) {
+ my $native = Devel::PPPort::LATIN1_TO_NATIVE($i);
+ my $hex = sprintf("0x%02X", $native);
+
+ # And for each code point test each of the classes
+ my $class;
+ for $class (qw(ALPHA ALPHANUMERIC ASCII BLANK CNTRL DIGIT GRAPH IDCONT
+ IDFIRST LOWER PRINT PSXSPC PUNCT SPACE UPPER WORDCHAR
+ XDIGIT))
+ {
+ if ($i < 256) { # For the ones that can fit in a byte, test each of
+ # three macros.
+ my $suffix;
+ for $suffix ("", "_A", "_L1", "_uvchr") {
+ my $should_be = ($i > 0x7F && $suffix !~ /_(uvchr|L1)/)
+ ? 0 # Fail on non-ASCII unless unicode
+ : ($types{"$native:$class"} || 0);
+ if (ivers($]) < ivers(5.6) && $suffix eq '_uvchr') {
+ skip("No UTF-8 on this perl", 1);
+ next;
+ }
+
+ my $eval_string = "Devel::PPPort::is${class}$suffix($hex)";
+ local $SIG{__WARN__} = sub {};
+ my $is = eval $eval_string || 0;
+ die "eval 'For $i: $eval_string' gave $@" if $@;
+ is($is, $should_be, "'$eval_string'");
+ }
+ }
+
+ # For all code points, test the '_utf8' macros
+ my $sub_fcn;
+ for $sub_fcn ("", "_LC") {
+ my $skip = "";
+ if (ivers($]) < ivers(5.6)) {
+ $skip = $way_too_early_msg;
+ }
+ elsif (ivers($]) < ivers(5.7) && $native > 255) {
+ $skip = "Perls earlier than 5.7 give wrong answers for above Latin1 code points";
+ }
+ elsif (ivers($]) <= ivers(5.11.3) && $native == 0x2029 && ($class eq 'PRINT' || $class eq 'GRAPH')) {
+ $skip = "Perls earlier than 5.11.3 considered high space characters as isPRINT and isGRAPH";
+ }
+ elsif ($sub_fcn eq '_LC' && $i < 256) {
+ $skip = "Testing of code points whose results depend on locale is skipped ";
+ }
+ my $fcn = "Devel::PPPort::is${class}${sub_fcn}_utf8_safe";
+ my $utf8;
+
+ if ($skip) {
+ skip $skip, 1;
+ }
+ else {
+ $utf8 = quotemeta Devel::PPPort::uvchr_to_utf8($native);
+ my $should_be = $types{"$native:$class"} || 0;
+ my $eval_string = "$fcn(\"$utf8\", 0)";
+ local $SIG{__WARN__} = sub {};
+ my $is = eval $eval_string || 0;
+ die "eval 'For $i, $eval_string' gave $@" if $@;
+ is($is, $should_be, sprintf("For U+%04X '%s'", $native, $eval_string));
+ }
+
+ # And for the high code points, test that a too short malformation (the
+ # -1) causes it to fail
+ if ($i > 255) {
+ if ($skip) {
+ skip $skip, 1;
+ }
+ elsif (ivers($]) >= ivers(5.25.9)) {
+ skip("Prints an annoying error message that khw doesn't know how to easily suppress", 1);
+ }
+ else {
+ my $eval_string = "$fcn(\"$utf8\", -1)";
+ local $SIG{__WARN__} = sub {};
+ my $is = eval "$eval_string" || 0;
+ die "eval '$eval_string' gave $@" if $@;
+ is($is, 0, sprintf("For U+%04X '%s'", $native, $eval_string));
+ }
+ }
+ }
+ }
+}
-ok( Devel::PPPort::test_isPSXSPC_A(ord("\cK")));
-ok(! Devel::PPPort::test_isPSXSPC_A(0xFC));
+my %case_changing = ( 'LOWER' => [ [ ord('A'), ord('a') ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xC0),
+ Devel::PPPort::LATIN1_TO_NATIVE(0xE0) ],
+ [ 0x100, 0x101 ],
+ ],
+ 'FOLD' => [ [ ord('C'), ord('c') ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xC0),
+ Devel::PPPort::LATIN1_TO_NATIVE(0xE0) ],
+ [ 0x104, 0x105 ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
+ 'ss' ],
+ ],
+ 'UPPER' => [ [ ord('a'), ord('A'), ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xE0),
+ Devel::PPPort::LATIN1_TO_NATIVE(0xC0) ],
+ [ 0x101, 0x100 ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
+ 'SS' ],
+ ],
+ 'TITLE' => [ [ ord('c'), ord('C'), ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xE2),
+ Devel::PPPort::LATIN1_TO_NATIVE(0xC2) ],
+ [ 0x103, 0x102 ],
+ [ Devel::PPPort::LATIN1_TO_NATIVE(0xDF),
+ 'Ss' ],
+ ],
+ );
+
+my $name;
+for $name (keys %case_changing) {
+ my @code_points_to_test = @{$case_changing{$name}};
+ my $unchanged;
+ for $unchanged (@code_points_to_test) {
+ my @pair = @$unchanged;
+ my $original = $pair[0];
+ my $changed = $pair[1];
+ my $utf8_changed = $changed;
+ my $is_cp = $utf8_changed =~ /^\d+$/;
+ my $should_be_bytes;
+ if (ivers($]) >= ivers(5.6)) {
+ if ($is_cp) {
+ $utf8_changed = Devel::PPPort::uvchr_to_utf8($changed);
+ $should_be_bytes = Devel::PPPort::UTF8_SAFE_SKIP($utf8_changed, 0);
+ }
+ else {
+ die("Test currently doesn't work for non-ASCII multi-char case changes") if eval '$utf8_changed =~ /[[:^ascii:]]/';
+ $should_be_bytes = length $utf8_changed;
+ }
+ }
+
+ my $fcn = "to${name}_uvchr";
+ my $skip = "";
+
+ if (ivers($]) < ivers(5.6)) {
+ $skip = $way_too_early_msg;
+ }
+ elsif (! $is_cp) {
+ $skip = "Can't do uvchr on a multi-char string";
+ }
+ if ($skip) {
+ skip $skip, 4;
+ }
+ else {
+ if ($is_cp) {
+ $utf8_changed = Devel::PPPort::uvchr_to_utf8($changed);
+ $should_be_bytes = Devel::PPPort::UTF8_SAFE_SKIP($utf8_changed, 0);
+ }
+ else {
+ my $non_ascii_re = (ivers($]) >= ivers(5.6)) ? '[[:^ascii:]]' : '[^\x00-\x7F]';
+ die("Test currently doesn't work for non-ASCII multi-char case changes") if eval '$utf8_changed =~ /$non_ascii_re/';
+ $should_be_bytes = length $utf8_changed;
+ }
+
+ my $ret = eval "Devel::PPPort::$fcn($original)";
+ my $fail = $@; # Have to save $@, as it gets destroyed
+ is ($fail, "", "$fcn($original) didn't fail");
+ my $first = (ivers($]) != ivers(5.6))
+ ? substr($utf8_changed, 0, 1)
+ : $utf8_changed, 0, 1;
+ is($ret->[0], ord $first,
+ "ord of $fcn($original) is $changed");
+ is($ret->[1], $utf8_changed,
+ "UTF-8 of of $fcn($original) is correct");
+ is($ret->[2], $should_be_bytes,
+ "Length of $fcn($original) is $should_be_bytes");
+ }
+
+ my $truncate;
+ for $truncate (0..2) {
+ my $skip;
+ if (ivers($]) < ivers(5.6)) {
+ $skip = $way_too_early_msg;
+ }
+ elsif (! $is_cp && ivers($]) < ivers(5.7.3)) {
+ $skip = "Multi-character case change not implemented until 5.7.3";
+ }
+ elsif ($truncate == 2 && ivers($]) > ivers(5.25.8)) {
+ $skip = "Zero length inputs cause assertion failure; test dies in modern perls";
+ }
+ elsif ($truncate > 0 && length $changed > 1) {
+ $skip = "Don't test shortened multi-char case changes";
+ }
+ elsif ($truncate > 0 && Devel::PPPort::UVCHR_IS_INVARIANT($original)) {
+ $skip = "Don't try to test shortened single bytes";
+ }
+ if ($skip) {
+ skip $skip, 4;
+ }
+ else {
+ my $fcn = "to${name}_utf8_safe";
+ my $utf8 = quotemeta Devel::PPPort::uvchr_to_utf8($original);
+ my $real_truncate = ($truncate < 2)
+ ? $truncate : $should_be_bytes;
+ my $eval_string = "Devel::PPPort::$fcn(\"$utf8\", $real_truncate)";
+ my $ret = eval "no warnings; $eval_string" || 0;
+ my $fail = $@; # Have to save $@, as it gets destroyed
+ if ($truncate == 0) {
+ is ($fail, "", "Didn't fail on full length input");
+ my $first = (ivers($]) != ivers(5.6))
+ ? substr($utf8_changed, 0, 1)
+ : $utf8_changed, 0, 1;
+ is($ret->[0], ord $first,
+ "ord of $fcn($original) is $changed");
+ is($ret->[1], $utf8_changed,
+ "UTF-8 of of $fcn($original) is correct");
+ is($ret->[2], $should_be_bytes,
+ "Length of $fcn($original) is $should_be_bytes");
+ }
+ else {
+ is ($fail, eval 'qr/Malformed UTF-8 character/',
+ "Gave appropriate error for short char: $original");
+ skip("Expected failure means remaining tests for"
+ . " this aren't relevant", 3);
+ }
+ }
+ }
+ }
+}
-ok(&Devel::PPPort::av_top_index([1,2,3]), 2);
-ok(&Devel::PPPort::av_tindex([1,2,3,4]), 3);
+is(&Devel::PPPort::av_top_index([1,2,3]), 2);
+is(&Devel::PPPort::av_tindex([1,2,3,4]), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t
index cb207a4587f..f279875d459 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newCONSTSUB.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (3) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -49,11 +53,11 @@ bootstrap Devel::PPPort;
package main;
&Devel::PPPort::call_newCONSTSUB_1();
-ok(&Devel::PPPort::test_value_1(), 1);
+is(&Devel::PPPort::test_value_1(), 1);
&Devel::PPPort::call_newCONSTSUB_2();
-ok(&Devel::PPPort::test_value_2(), 2);
+is(&Devel::PPPort::test_value_2(), 2);
&Devel::PPPort::call_newCONSTSUB_3();
-ok(&Devel::PPPort::test_value_3(), 3);
+is(&Devel::PPPort::test_value_3(), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t
index 731a62b1f65..211cdd617e2 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newRV.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (2) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,6 +52,6 @@ bootstrap Devel::PPPort;
package main;
-ok(&Devel::PPPort::newRV_inc_REFCNT, 1);
-ok(&Devel::PPPort::newRV_noinc_REFCNT, 1);
+is(&Devel::PPPort::newRV_inc_REFCNT, 1);
+is(&Devel::PPPort::newRV_noinc_REFCNT, 1);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t
index 1b3233e5ce7..1f82d4a721e 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSV_type.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (1) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,5 +52,5 @@ bootstrap Devel::PPPort;
package main;
-ok(Devel::PPPort::newSV_type(), 4);
+is(Devel::PPPort::newSV_type(), 4);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t
index e9fee35179d..a0a54e085cb 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/newSVpv.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (15) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -50,29 +54,29 @@ package main;
my @s = &Devel::PPPort::newSVpvn();
ok(@s == 5);
-ok($s[0], "test");
-ok($s[1], "te");
-ok($s[2], "");
+is($s[0], "test");
+is($s[1], "te");
+is($s[2], "");
ok(!defined($s[3]));
ok(!defined($s[4]));
@s = &Devel::PPPort::newSVpvn_flags();
ok(@s == 5);
-ok($s[0], "test");
-ok($s[1], "te");
-ok($s[2], "");
+is($s[0], "test");
+is($s[1], "te");
+is($s[2], "");
ok(!defined($s[3]));
ok(!defined($s[4]));
@s = &Devel::PPPort::newSVpvn_utf8();
ok(@s == 1);
-ok($s[0], "test");
+is($s[0], "test");
if ("$]" >= 5.008001) {
require utf8;
ok(utf8::is_utf8($s[0]));
}
else {
- skip("skip: no is_utf8()", 0);
+ skip("skip: no is_utf8()", 1);
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t
index c1a35b20a00..73173b4b9fc 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/podtest.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (0) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -59,11 +63,11 @@ else {
# Try loading Test::Pod
eval q{
use Test::Pod;
- $Test::Pod::VERSION >= 0.95
+ $Test::Pod::VERSION >= 1.41
or die "Test::Pod version only $Test::Pod::VERSION";
import Test::Pod tests => scalar @pods;
};
- $reason = 'Test::Pod >= 0.95 required' if $@;
+ $reason = 'Test::Pod >= 1.41 required' if $@;
}
if ($reason) {
@@ -74,7 +78,7 @@ if ($reason) {
for (@pods) {
print "# checking $_\n";
if ($reason) {
- skip("skip: $reason", 0);
+ skip("skip: $reason", 1);
}
else {
pod_file_ok($_);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t
index af2db3f43ae..70a1b4437bf 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/ppphtest.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (238) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -50,9 +54,7 @@ package main;
BEGIN {
if ($ENV{'SKIP_SLOW_TESTS'}) {
- for (1 .. 238) {
- skip("skip: SKIP_SLOW_TESTS", 0);
- }
+ skip("skip: SKIP_SLOW_TESTS", 238);
exit 0;
}
}
@@ -96,7 +98,7 @@ END {
ok(&Devel::PPPort::WriteFile("ppport.h"));
# Check GetFileContents()
-ok(-e "ppport.h", 1);
+is(-e "ppport.h", 1);
my $data;
@@ -106,8 +108,8 @@ while(<F>) {
}
close(F);
-ok(Devel::PPPort::GetFileContents("ppport.h"), $data);
-ok(Devel::PPPort::GetFileContents(), $data);
+is(Devel::PPPort::GetFileContents("ppport.h"), $data);
+is(Devel::PPPort::GetFileContents(), $data);
sub comment
{
@@ -205,7 +207,7 @@ for $t (@tests) {
$err =~ s/^/# *** /mg;
print "# *** ERROR ***\n$err\n";
}
- ok($@, '');
+ is($@, '');
for (keys %{$t->{files}}) {
unlink $_ or die "unlink('$_'): $!\n";
@@ -251,8 +253,8 @@ ok($o =~ /^This is.*ppport.*\d+\.\d+(?:_?\d+)?\.$/);
$o = ppport(qw(--nochanges));
ok($o =~ /^Scanning.*test\.xs/mi);
ok($o =~ /Analyzing.*test\.xs/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
-ok(matches($o, 'Analyzing', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, 'Analyzing', 'm'), 1);
ok($o =~ /Uses Perl_newSViv instead of newSViv/);
$o = ppport(qw(--quiet --nochanges));
@@ -269,7 +271,7 @@ Perl_newSViv();
my $o = ppport(qw(--copy=a));
ok($o =~ /^Scanning.*MyExt\.xs/mi);
ok($o =~ /Analyzing.*MyExt\.xs/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
ok($o =~ /^Needs to include.*ppport\.h/m);
ok($o !~ /^Uses grok_bin/m);
ok($o !~ /^Uses newSVpv/m);
@@ -281,7 +283,7 @@ ok(eq_files('MyExt.xsa', 'MyExt.ra'));
$o = ppport(qw(--copy=b --cplusplus));
ok($o =~ /^Scanning.*MyExt\.xs/mi);
ok($o =~ /Analyzing.*MyExt\.xs/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
ok($o =~ /^Needs to include.*ppport\.h/m);
ok($o !~ /^Uses grok_bin/m);
ok($o !~ /^Uses newSVpv/m);
@@ -387,7 +389,6 @@ ok($o =~ /^\s*$/);
---------------------------- file1.xs -----------------------------------------
#define NEED_newCONSTSUB
-#define NEED_sv_2pv_flags
#define NEED_PL_parser
#include "ppport.h"
@@ -404,7 +405,7 @@ mXPUSHp(foo);
my $o = ppport(qw(--nochanges));
ok($o =~ /^Scanning.*FooBar\.xs/mi);
ok($o =~ /Analyzing.*FooBar\.xs/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
ok($o !~ /^Looks good/m);
ok($o =~ /^Uses grok_bin/m);
@@ -424,7 +425,7 @@ ok($o =~ /Analyzing.*second\.h/mi);
ok($o =~ /^Scanning.*sub.*third\.c/mi);
ok($o =~ /Analyzing.*sub.*third\.c/mi);
ok($o !~ /^Scanning.*foobar/mi);
-ok(matches($o, '^Scanning', 'm'), 3);
+is(matches($o, '^Scanning', 'm'), 3);
---------------------------- First.xs -----------------------------------------
@@ -460,9 +461,9 @@ for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {
ok($o =~ /^Scanning.*\Q$_\E/mi);
ok($o =~ /Analyzing.*\Q$_\E/i);
}
-ok(matches($o, '^Scanning', 'm'), 6);
+is(matches($o, '^Scanning', 'm'), 6);
-ok(matches($o, '^Writing copy of', 'm'), 5);
+is(matches($o, '^Writing copy of', 'm'), 5);
ok(!-e "mod5.cf");
for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {
@@ -559,7 +560,6 @@ call_pv();
#define NEED_eval_pv_GLOBAL
#define NEED_grok_hex
#define NEED_newCONSTSUB_GLOBAL
-#define NEED_sv_2pv_flags_GLOBAL
#include "ppport.h"
newCONSTSUB();
@@ -672,7 +672,7 @@ SvPVutf8_force();
my $o = ppport(qw(--nochanges));
ok($o !~ /potentially required change/);
-ok(matches($o, '^Looks good', 'm'), 2);
+is(matches($o, '^Looks good', 'm'), 2);
---------------------------- FooBar.xs ----------------------------------------
@@ -695,20 +695,20 @@ call_pv();
my $o = ppport(qw(--api-info=INT2PTR));
my %found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
-ok(scalar keys %found, 1);
+is(scalar keys %found, 1, "found 1 key");
ok(exists $found{INT2PTR});
-ok(matches($o, '^Supported at least starting from perl-5\.6\.0\.', 'm'), 1);
-ok(matches($o, '^Support by .*ppport.* provided back to perl-5\.003\.', 'm'), 1);
+is(matches($o, '^Supported at least since perl-5\.6\.0', 'm'), 1, "INT2PTR supported without ppport.h to 5.6.0");
+is(matches($o, '^ppport.h additionally provides support at least back to perl-5\.003', 'm'), 1, "INT2PTR supported with ppport.h to 5.003");
$o = ppport(qw(--api-info=Zero));
%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
-ok(scalar keys %found, 1);
+is(scalar keys %found, 1, "found 1 key");
ok(exists $found{Zero});
-ok(matches($o, '^No portability information available\.', 'm'), 1);
+is(matches($o, '^Supported at least since perl-5.003', 'm'), 1, "Zero supported to 5.003");
$o = ppport(qw(--api-info=/Zero/));
%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
-ok(scalar keys %found, 2);
+is(scalar keys %found, 2, "found 2 keys");
ok(exists $found{Zero});
ok(exists $found{ZeroD});
@@ -725,32 +725,32 @@ for (@o) {
$p{$name} = defined $flags ? { map { ($_ => 1) } $flags =~ /(\w+)/g } : '';
}
ok(@o > 100);
-ok($fail, 0);
+is($fail, 0);
ok(exists $p{call_pv});
ok(not ref $p{call_pv});
ok(exists $p{grok_bin});
-ok(ref $p{grok_bin}, 'HASH');
-ok(scalar keys %{$p{grok_bin}}, 2);
+is(ref $p{grok_bin}, 'HASH');
+is(scalar keys %{$p{grok_bin}}, 2);
ok($p{grok_bin}{explicit});
ok($p{grok_bin}{depend});
ok(exists $p{gv_stashpvn});
-ok(ref $p{gv_stashpvn}, 'HASH');
-ok(scalar keys %{$p{gv_stashpvn}}, 2);
+is(ref $p{gv_stashpvn}, 'HASH');
+is(scalar keys %{$p{gv_stashpvn}}, 2);
ok($p{gv_stashpvn}{depend});
ok($p{gv_stashpvn}{hint});
ok(exists $p{sv_catpvf_mg});
-ok(ref $p{sv_catpvf_mg}, 'HASH');
-ok(scalar keys %{$p{sv_catpvf_mg}}, 2);
+is(ref $p{sv_catpvf_mg}, 'HASH');
+is(scalar keys %{$p{sv_catpvf_mg}}, 2);
ok($p{sv_catpvf_mg}{explicit});
ok($p{sv_catpvf_mg}{depend});
ok(exists $p{PL_signals});
-ok(ref $p{PL_signals}, 'HASH');
-ok(scalar keys %{$p{PL_signals}}, 1);
+is(ref $p{PL_signals}, 'HASH');
+is(scalar keys %{$p{PL_signals}}, 1);
ok($p{PL_signals}{explicit});
===============================================================================
@@ -766,13 +766,13 @@ for (@o) {
$p{$name} = $ver;
}
ok(@o > 100);
-ok($fail, 0);
+is($fail, 0);
ok(exists $p{utf8_distance});
-ok($p{utf8_distance}, '5.6.0');
+is($p{utf8_distance}, '5.6.0');
ok(exists $p{save_generic_svref});
-ok($p{save_generic_svref}, '5.005_03');
+is($p{save_generic_svref}, '5.005_03');
===============================================================================
@@ -781,17 +781,17 @@ ok($p{save_generic_svref}, '5.005_03');
my $o = ppport(qw(--nochanges));
ok($o =~ /^Scanning.*foo\.cpp/mi);
ok($o =~ /Analyzing.*foo\.cpp/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
-ok(matches($o, 'Analyzing', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, 'Analyzing', 'm'), 1);
$o = ppport(qw(--nochanges foo.cpp foo.o Makefile.PL));
ok($o =~ /Skipping the following files \(use --nofilter to avoid this\):/m);
-ok(matches($o, '^\|\s+foo\.o', 'mi'), 1);
-ok(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
+is(matches($o, '^\|\s+foo\.o', 'mi'), 1);
+is(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
ok($o =~ /^Scanning.*foo\.cpp/mi);
ok($o =~ /Analyzing.*foo\.cpp/mi);
-ok(matches($o, '^Scanning', 'm'), 1);
-ok(matches($o, 'Analyzing', 'm'), 1);
+is(matches($o, '^Scanning', 'm'), 1);
+is(matches($o, 'Analyzing', 'm'), 1);
$o = ppport(qw(--nochanges --nofilter foo.cpp foo.o Makefile.PL));
ok($o =~ /^Scanning.*foo\.cpp/mi);
@@ -800,8 +800,8 @@ ok($o =~ /^Scanning.*foo\.o/mi);
ok($o =~ /Analyzing.*foo\.o/mi);
ok($o =~ /^Scanning.*Makefile/mi);
ok($o =~ /Analyzing.*Makefile/mi);
-ok(matches($o, '^Scanning', 'm'), 3);
-ok(matches($o, 'Analyzing', 'm'), 3);
+is(matches($o, '^Scanning', 'm'), 3);
+is(matches($o, 'Analyzing', 'm'), 3);
---------------------------- foo.cpp ------------------------------------------
@@ -916,8 +916,6 @@ for (qw(file.xs)) {
---------------------------- file.xs -----------------------------------------
-#define NEED_sv_2pv_flags
-#define NEED_vnewSVpvf
#define NEED_warner
#include "ppport.h"
Perl_croak_nocontext("foo");
@@ -931,8 +929,6 @@ warner("foo");
---------------------------- file.xsr -----------------------------------------
-#define NEED_sv_2pv_flags
-#define NEED_vnewSVpvf
#define NEED_warner
#include "ppport.h"
Perl_croak_nocontext("foo");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t
index f79a15aa58b..d887eeac576 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/pv_tools.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (13) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -56,21 +60,29 @@ ok($uni ? "$]" >= 5.006 : "$]" < 5.008);
my @r;
@r = &Devel::PPPort::pv_pretty();
-ok($r[0], $r[1]);
-ok($r[0], "foobarbaz");
-ok($r[2], $r[3]);
-ok($r[2], '<leftpv_p\retty\nright>');
-ok($r[4], $r[5]);
-skip(ord("A") != 65 ? "Skip for non-ASCII platform" : 0,
- $r[4], $uni ? 'N\375 Batter\355' : 'N\303\275 Batter\303');
-ok($r[6], $r[7]);
-skip(ord("A") != 65 ? "Skip for non-ASCII platform" : 0,
- $r[6], $uni ? '\301g\346tis Byrju...' : '\303\201g\303\246t...');
+is($r[0], $r[1]);
+is($r[0], "foobarbaz");
+is($r[2], $r[3]);
+is($r[2], '<leftpv_p\retty\nright>');
+is($r[4], $r[5]);
+if(ord("A") == 65) {
+ is($r[4], $uni ? 'N\375 Batter\355' : 'N\303\275 Batter\303');
+}
+else {
+ skip("Skip for non-ASCII platform");
+}
+is($r[6], $r[7]);
+if(ord("A") == 65) {
+ is($r[6], $uni ? '\301g\346tis Byrju...' : '\303\201g\303\246t...');
+}
+else {
+ skip("Skip for non-ASCII platform");
+}
@r = &Devel::PPPort::pv_display();
-ok($r[0], $r[1]);
-ok($r[0], '"foob\0rbaz"\0');
-ok($r[2], $r[3]);
+is($r[0], $r[1]);
+is($r[0], '"foob\0rbaz"\0');
+is($r[2], $r[3]);
ok($r[2] eq '"pv_di"...\0' ||
$r[2] eq '"pv_d"...\0'); # some perl implementations are broken... :(
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t
index ff4d3e05860..7b96bb531d3 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/pvs.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (12) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -50,24 +54,24 @@ package main;
my $x = 'foo';
-ok(Devel::PPPort::newSVpvs(), "newSVpvs");
-ok(Devel::PPPort::newSVpvs_flags(), "newSVpvs_flags");
-ok(Devel::PPPort::newSVpvs_share(), 3);
+is(Devel::PPPort::newSVpvs(), "newSVpvs");
+is(Devel::PPPort::newSVpvs_flags(), "newSVpvs_flags");
+is(Devel::PPPort::newSVpvs_share(), 3);
Devel::PPPort::sv_catpvs($x);
-ok($x, "foosv_catpvs");
+is($x, "foosv_catpvs");
Devel::PPPort::sv_setpvs($x);
-ok($x, "sv_setpvs");
+is($x, "sv_setpvs");
my %h = ('hv_fetchs' => 42);
Devel::PPPort::hv_stores(\%h, 4711);
-ok(scalar keys %h, 2);
+is(scalar keys %h, 2);
ok(exists $h{'hv_stores'});
-ok($h{'hv_stores'}, 4711);
-ok(Devel::PPPort::hv_fetchs(\%h), 42);
-ok(Devel::PPPort::gv_fetchpvs(), \*Devel::PPPort::VERSION);
-ok(Devel::PPPort::gv_stashpvs(), \%Devel::PPPort::);
+is($h{'hv_stores'}, 4711);
+is(Devel::PPPort::hv_fetchs(\%h), 42);
+is(Devel::PPPort::gv_fetchpvs(), \*Devel::PPPort::VERSION);
+is(Devel::PPPort::gv_stashpvs(), \%Devel::PPPort::);
-ok(Devel::PPPort::get_cvs(), 3);
+is(Devel::PPPort::get_cvs(), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t
index eac79c6ca8a..c705b18bef4 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/shared_pv.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (1) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,5 +52,5 @@ bootstrap Devel::PPPort;
package main;
-ok(&Devel::PPPort::newSVpvn_share(), 6);
+is(&Devel::PPPort::newSVpvn_share(), 6);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t
index 0b90004d9ec..5e6bb33a6be 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/snprintf.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (2) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -49,6 +53,6 @@ bootstrap Devel::PPPort;
package main;
my($l, $s) = Devel::PPPort::my_snprintf();
-ok($l, 8);
-ok($s, "foobar42");
+is($l, 8);
+is($s, "foobar42");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t
index 8b0d51fc917..51a42b08c19 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/sprintf.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (2) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -49,6 +53,6 @@ bootstrap Devel::PPPort;
package main;
my($l, $s) = Devel::PPPort::my_sprintf();
-ok($l, 8);
-ok($s, "foobar42");
+is($l, 8);
+is($s, "foobar42");
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t
index c8175472de1..dee840c3606 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/strlfuncs.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (13) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -60,6 +64,6 @@ my @r = Devel::PPPort::my_strlfunc();
ok(@e == @r);
for (0 .. $#e) {
- ok($r[$_], $e[$_]);
+ is($r[$_], $e[$_]);
}
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t
index 40919863a84..3ab10c96172 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/sv_xpvf.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (9) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -54,25 +58,25 @@ tie %h, 'Tie::StdHash';
$h{foo} = 'foo-';
$h{bar} = '';
-ok(&Devel::PPPort::vnewSVpvf(), "$]" >= 5.004 ? 'Perl-42' : '%s-%d');
-ok(&Devel::PPPort::sv_vcatpvf('1-2-3-'), "$]" >= 5.004 ? '1-2-3-Perl-42' : '1-2-3-%s-%d');
-ok(&Devel::PPPort::sv_vsetpvf('1-2-3-'), "$]" >= 5.004 ? 'Perl-42' : '%s-%d');
+is(&Devel::PPPort::vnewSVpvf(), "$]" >= 5.004 ? 'Perl-42' : '%s-%d');
+is(&Devel::PPPort::sv_vcatpvf('1-2-3-'), "$]" >= 5.004 ? '1-2-3-Perl-42' : '1-2-3-%s-%d');
+is(&Devel::PPPort::sv_vsetpvf('1-2-3-'), "$]" >= 5.004 ? 'Perl-42' : '%s-%d');
&Devel::PPPort::sv_catpvf_mg($h{foo});
-ok($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42' : 'foo-');
+is($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42' : 'foo-');
&Devel::PPPort::Perl_sv_catpvf_mg($h{foo});
-ok($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42-Perl-43' : 'foo-');
+is($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42-Perl-43' : 'foo-');
&Devel::PPPort::sv_catpvf_mg_nocontext($h{foo});
-ok($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42-Perl-43-Perl-44' : 'foo-');
+is($h{foo}, "$]" >= 5.004 ? 'foo-Perl-42-Perl-43-Perl-44' : 'foo-');
&Devel::PPPort::sv_setpvf_mg($h{bar});
-ok($h{bar}, "$]" >= 5.004 ? 'mhx-42' : '');
+is($h{bar}, "$]" >= 5.004 ? 'mhx-42' : '');
&Devel::PPPort::Perl_sv_setpvf_mg($h{bar});
-ok($h{bar}, "$]" >= 5.004 ? 'foo-43' : '');
+is($h{bar}, "$]" >= 5.004 ? 'foo-43' : '');
&Devel::PPPort::sv_setpvf_mg_nocontext($h{bar});
-ok($h{bar}, "$]" >= 5.004 ? 'bar-44' : '');
+is($h{bar}, "$]" >= 5.004 ? 'bar-44' : '');
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl b/gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl
index 4fc7d667a6b..981b659b3cb 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/testutil.pl
@@ -1,48 +1,455 @@
-{
- my $__ntest;
- my $__total;
-
- sub plan {
- @_ == 2 or die "usage: plan(tests => count)";
- my $what = shift;
- $what eq 'tests' or die "cannot plan anything but tests";
- $__total = shift;
- defined $__total && $__total > 0 or die "need a positive number of tests";
- print "1..$__total\n";
- }
+#
+# t/test.pl - most of Test::More functionality without the fuss
- sub skip {
- my $reason = shift;
- ++$__ntest;
- print "ok $__ntest # skip: $reason\n"
- }
- sub ok ($;$$) {
- local($\,$,);
- my $ok = 0;
- my $result = shift;
- if (@_ == 0) {
- $ok = $result;
+# NOTE:
+#
+# Do not rely on features found only in more modern Perls here, as some CPAN
+# distributions copy this file and must operate on older Perls. Similarly, keep
+# things, simple as this may be run under fairly broken circumstances. For
+# example, increment ($x++) has a certain amount of cleverness for things like
+#
+# $x = 'zz';
+# $x++; # $x eq 'aaa';
+#
+# This stands more chance of breaking than just a simple
+#
+# $x = $x + 1
+#
+# In this file, we use the latter "Baby Perl" approach, and increment
+# will be worked over by t/op/inc.t
+
+$| = 1;
+$Level = 1;
+my $test = 1;
+my $planned;
+my $noplan;
+
+# Fatalize warnings, so that we don't introduce new warnings. But on early
+# perls the burden of avoiding warnings becomes too large, and someone still
+# trying to use such outmoded versions should be willing to accept warnings in
+# our test suite.
+$SIG{__WARN__} = sub { die "Fatalized: $_[0]" } if $] ge "5.6.0";
+
+# This defines ASCII/UTF-8 vs EBCDIC/UTF-EBCDIC
+$::IS_ASCII = ord 'A' == 65;
+
+$TODO = 0;
+$NO_ENDING = 0;
+$Tests_Are_Passing = 1;
+
+# Use this instead of print to avoid interference while testing globals.
+sub _print {
+ local($\, $", $,) = (undef, ' ', '') if "$]" >= 5.004;
+ print STDOUT @_;
+}
+
+sub _print_stderr {
+ local($\, $", $,) = (undef, ' ', '') if "$]" >= 5.004;
+ print STDERR @_;
+}
+
+sub plan {
+ my $n;
+ if (@_ == 1) {
+ $n = shift;
+ if ($n eq 'no_plan') {
+ undef $n;
+ $noplan = 1;
+ }
} else {
- $expected = shift;
- if (!defined $expected) {
- $ok = !defined $result;
- } elsif (!defined $result) {
- $ok = 0;
- } elsif (ref($expected) eq 'Regexp') {
- die "using regular expression objects is not backwards compatible";
- } else {
- $ok = $result eq $expected;
- }
+ my %plan = @_;
+ $plan{skip_all} and skip_all($plan{skip_all});
+ $n = $plan{tests};
}
- ++$__ntest;
- if ($ok) {
- print "ok $__ntest\n"
+ _print "1..$n\n" unless $noplan;
+ $planned = $n;
+}
+
+
+# Set the plan at the end. See Test::More::done_testing.
+sub done_testing {
+ my $n = $test - 1;
+ $n = shift if @_;
+
+ _print "1..$n\n";
+ $planned = $n;
+}
+
+
+END {
+ my $ran = $test - 1;
+ if (!$NO_ENDING) {
+ if (defined $planned && $planned != $ran) {
+ _print_stderr
+ "# Looks like you planned $planned tests but ran $ran.\n";
+ } elsif ($noplan) {
+ _print "1..$ran\n";
+ }
+ }
+}
+
+sub _diag {
+ return unless @_;
+ my @mess = _comment(@_);
+ $TODO ? _print(@mess) : _print_stderr(@mess);
+}
+
+# Use this instead of "print STDERR" when outputting failure diagnostic
+# messages
+sub diag {
+ _diag(@_);
+}
+
+# Use this instead of "print" when outputting informational messages
+sub note {
+ return unless @_;
+ _print( _comment(@_) );
+}
+
+sub _comment {
+ return map { /^#/ ? "$_\n" : "# $_\n" }
+ map { split /\n/ } @_;
+}
+
+sub _have_dynamic_extension {
+ my $extension = shift;
+ unless (eval {require Config; 1}) {
+ warn "test.pl had problems loading Config: $@";
+ return 1;
+ }
+ $extension =~ s!::!/!g;
+ return 1 if ($Config::Config{extensions} =~ /\b$extension\b/);
+}
+
+sub skip_all {
+ if (@_) {
+ _print "1..0 # Skip @_\n";
+ } else {
+ _print "1..0\n";
+ }
+ exit(0);
+}
+
+sub BAIL_OUT {
+ my ($reason) = @_;
+ _print("Bail out! $reason\n");
+ exit 255;
+}
+
+sub _ok {
+ my ($pass, $where, $name, @mess) = @_;
+ # Do not try to microoptimize by factoring out the "not ".
+ # VMS will avenge.
+ my $out;
+ if ($name) {
+ # escape out '#' or it will interfere with '# skip' and such
+ $name =~ s/#/\\#/g;
+ $out = $pass ? "ok $test - $name" : "not ok $test - $name";
+ } else {
+ $out = $pass ? "ok $test" : "not ok $test";
+ }
+
+ if ($TODO) {
+ $out = $out . " # TODO $TODO";
+ } else {
+ $Tests_Are_Passing = 0 unless $pass;
+ }
+
+ _print "$out\n";
+
+ if ($pass) {
+ note @mess; # Ensure that the message is properly escaped.
}
else {
- print "not ok $__ntest\n"
+ my $msg = "# Failed test $test - ";
+ $msg.= "$name " if $name;
+ $msg .= "$where\n";
+ _diag $msg;
+ _diag @mess;
}
+
+ $test = $test + 1; # don't use ++
+
+ return $pass;
+}
+
+sub _where {
+ my @caller = caller($Level);
+ return "at $caller[1] line $caller[2]";
+}
+
+sub ok ($@) {
+ my ($pass, $name, @mess) = @_;
+ _ok($pass, _where(), $name, @mess);
+}
+
+sub _q {
+ my $x = shift;
+ return 'undef' unless defined $x;
+ my $q = $x;
+ $q =~ s/\\/\\\\/g;
+ $q =~ s/'/\\'/g;
+ return "'$q'";
+}
+
+sub _qq {
+ my $x = shift;
+ return defined $x ? '"' . display ($x) . '"' : 'undef';
+};
+
+# Support pre-5.10 Perls, for the benefit of CPAN dists that copy this file.
+# Note that chr(90) exists in both ASCII ("Z") and EBCDIC ("!").
+my $chars_template = defined(eval { pack "W*", 90 }) ? "W*" : defined(eval { pack "U*", 90 }) ? "U*" : "C*";
+eval 'sub re::is_regexp { ref($_[0]) eq "Regexp" }'
+ if !defined &re::is_regexp;
+
+# keys are the codes \n etc map to, values are 2 char strings such as \n
+my %backslash_escape;
+my $x;
+foreach $x (split //, 'nrtfa\\\'"') {
+ $backslash_escape{ord eval "\"\\$x\""} = "\\$x";
+}
+# A way to display scalars containing control characters and Unicode.
+# Trying to avoid setting $_, or relying on local $_ to work.
+sub display {
+ my @result;
+ my $x;
+ foreach $x (@_) {
+ if (defined $x and not ref $x) {
+ my $y = '';
+ my $c;
+ foreach $c (unpack($chars_template, $x)) {
+ if ($c > 255) {
+ $y = $y . sprintf "\\x{%x}", $c;
+ } elsif ($backslash_escape{$c}) {
+ $y = $y . $backslash_escape{$c};
+ } elsif ($c < ord " ") {
+ # Use octal for characters with small ordinals that are
+ # traditionally expressed as octal: the controls below
+ # space, which on EBCDIC are almost all the controls, but
+ # on ASCII don't include DEL nor the C1 controls.
+ $y = $y . sprintf "\\%03o", $c;
+ } elsif ($::IS_ASCII && $c <= ord('~')) {
+ $y = $y . chr $c;
+ } elsif ( ! $::IS_ASCII
+ && eval 'chr $c =~ /[^[:^print:][:^ascii:]]/')
+ # The pattern above is equivalent (by de Morgan's
+ # laws) to:
+ # $z =~ /(?[ [:print:] & [:ascii:] ])/
+ # or, $z is an ascii printable character
+ # The /a modifier doesn't go back so far.
+ {
+ $y = $y . chr $c;
+ }
+ elsif ($@) { # Should only be an error on platforms too
+ # early to have the [:posix:] syntax, which
+ # also should be ASCII ones
+ die __FILE__ . __LINE__
+ . ": Unexpected non-ASCII platform; $@";
+ }
+ else {
+ $y = $y . sprintf "\\x%02X", $c;
+ }
+ }
+ $x = $y;
+ }
+ return $x unless wantarray;
+ push @result, $x;
+ }
+ return @result;
+}
+
+sub is ($$@) {
+ my ($got, $expected, $name, @mess) = @_;
+
+ my $pass;
+ if( !defined $got || !defined $expected ) {
+ # undef only matches undef
+ $pass = !defined $got && !defined $expected;
+ }
+ else {
+ $pass = $got eq $expected;
+ }
+
+ unless ($pass) {
+ unshift(@mess, "# got "._qq($got)."\n",
+ "# expected "._qq($expected)."\n");
+ }
+ _ok($pass, _where(), $name, @mess);
+}
+
+sub isnt ($$@) {
+ my ($got, $isnt, $name, @mess) = @_;
+
+ my $pass;
+ if( !defined $got || !defined $isnt ) {
+ # undef only matches undef
+ $pass = defined $got || defined $isnt;
+ }
+ else {
+ $pass = $got ne $isnt;
+ }
+
+ unless( $pass ) {
+ unshift(@mess, "# it should not be "._qq($got)."\n",
+ "# but it is.\n");
+ }
+ _ok($pass, _where(), $name, @mess);
+}
+
+sub cmp_ok ($$$@) {
+ my($got, $type, $expected, $name, @mess) = @_;
+
+ my $pass;
+ {
+ local $^W = 0;
+ local($@,$!); # don't interfere with $@
+ # eval() sometimes resets $!
+ $pass = eval "\$got $type \$expected";
+ }
+ unless ($pass) {
+ # It seems Irix long doubles can have 2147483648 and 2147483648
+ # that stringify to the same thing but are actually numerically
+ # different. Display the numbers if $type isn't a string operator,
+ # and the numbers are stringwise the same.
+ # (all string operators have alphabetic names, so tr/a-z// is true)
+ # This will also show numbers for some unneeded cases, but will
+ # definitely be helpful for things such as == and <= that fail
+ if ($got eq $expected and $type !~ tr/a-z//) {
+ unshift @mess, "# $got - $expected = " . ($got - $expected) . "\n";
+ }
+ unshift(@mess, "# got "._qq($got)."\n",
+ "# expected $type "._qq($expected)."\n");
+ }
+ _ok($pass, _where(), $name, @mess);
+}
+
+# Check that $got is within $range of $expected
+# if $range is 0, then check it's exact
+# else if $expected is 0, then $range is an absolute value
+# otherwise $range is a fractional error.
+# Here $range must be numeric, >= 0
+# Non numeric ranges might be a useful future extension. (eg %)
+sub within ($$$@) {
+ my ($got, $expected, $range, $name, @mess) = @_;
+ my $pass;
+ if (!defined $got or !defined $expected or !defined $range) {
+ # This is a fail, but doesn't need extra diagnostics
+ } elsif ($got !~ tr/0-9// or $expected !~ tr/0-9// or $range !~ tr/0-9//) {
+ # This is a fail
+ unshift @mess, "# got, expected and range must be numeric\n";
+ } elsif ($range < 0) {
+ # This is also a fail
+ unshift @mess, "# range must not be negative\n";
+ } elsif ($range == 0) {
+ # Within 0 is ==
+ $pass = $got == $expected;
+ } elsif ($expected == 0) {
+ # If expected is 0, treat range as absolute
+ $pass = ($got <= $range) && ($got >= - $range);
+ } else {
+ my $diff = $got - $expected;
+ $pass = abs ($diff / $expected) < $range;
+ }
+ unless ($pass) {
+ if ($got eq $expected) {
+ unshift @mess, "# $got - $expected = " . ($got - $expected) . "\n";
+ }
+ unshift@mess, "# got "._qq($got)."\n",
+ "# expected "._qq($expected)." (within "._qq($range).")\n";
+ }
+ _ok($pass, _where(), $name, @mess);
+}
+
+sub pass {
+ _ok(1, '', @_);
+}
+
+sub fail {
+ _ok(0, _where(), @_);
+}
+
+sub curr_test {
+ $test = shift if @_;
+ return $test;
+}
+
+sub next_test {
+ my $retval = $test;
+ $test = $test + 1; # don't use ++
+ $retval;
+}
+
+# Note: can't pass multipart messages since we try to
+# be compatible with Test::More::skip().
+sub skip {
+ my $why = shift;
+ my $n = @_ ? shift : 1;
+ my $bad_swap;
+ my $both_zero;
+ {
+ local $^W = 0;
+ $bad_swap = $why > 0 && $n == 0;
+ $both_zero = $why == 0 && $n == 0;
+ }
+ if ($bad_swap || $both_zero || @_) {
+ my $arg = "'$why', '$n'";
+ if (@_) {
+ $arg .= join(", ", '', map { qq['$_'] } @_);
+ }
+ die qq[$0: expected skip(why, count), got skip($arg)\n];
+ }
+ for (1..$n) {
+ _print "ok $test # skip $why\n";
+ $test = $test + 1;
+ }
+ local $^W = 0;
+ #last SKIP;
+}
+
+sub eq_array {
+ my ($ra, $rb) = @_;
+ return 0 unless $#$ra == $#$rb;
+ my $i;
+ for $i (0..$#$ra) {
+ next if !defined $ra->[$i] && !defined $rb->[$i];
+ return 0 if !defined $ra->[$i];
+ return 0 if !defined $rb->[$i];
+ return 0 unless $ra->[$i] eq $rb->[$i];
+ }
+ return 1;
+}
+
+sub eq_hash {
+ my ($orig, $suspect) = @_;
+ my $fail;
+ while (my ($key, $value) = each %$suspect) {
+ # Force a hash recompute if this perl's internals can cache the hash key.
+ $key = "" . $key;
+ if (exists $orig->{$key}) {
+ if (
+ defined $orig->{$key} != defined $value
+ || (defined $value && $orig->{$key} ne $value)
+ ) {
+ _print "# key ", _qq($key), " was ", _qq($orig->{$key}),
+ " now ", _qq($value), "\n";
+ $fail = 1;
+ }
+ } else {
+ _print "# key ", _qq($key), " is ", _qq($value),
+ ", not in original.\n";
+ $fail = 1;
+ }
+ }
+ foreach (keys %$orig) {
+ # Force a hash recompute if this perl's internals can cache the hash key.
+ $_ = "" . $_;
+ next if (exists $suspect->{$_});
+ _print "# key ", _qq($_), " was ", _qq($orig->{$_}), " now missing.\n";
+ $fail = 1;
}
+ !$fail;
}
1;
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t
index a1c8caa5c87..0e16cc719c5 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/threads.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (2) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,7 +52,7 @@ bootstrap Devel::PPPort;
package main;
-ok(&Devel::PPPort::no_THX_arg("42"), 43);
+is(&Devel::PPPort::no_THX_arg("42"), 43);
eval { &Devel::PPPort::with_THX_arg("yes\n"); };
ok($@ =~ /^yes/);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/utf8.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/utf8.t
new file mode 100644
index 00000000000..12a593e2032
--- /dev/null
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/utf8.t
@@ -0,0 +1,300 @@
+################################################################################
+#
+# !!!!! Do NOT edit this file directly! !!!!!
+#
+# Edit mktests.PL and/or parts/inc/utf8 instead.
+#
+# This file was automatically generated from the definition files in the
+# parts/inc/ subdirectory by mktests.PL. To learn more about how all this
+# works, please read the F<HACKERS> file that came with this distribution.
+#
+################################################################################
+
+use FindBin ();
+
+BEGIN {
+ if ($ENV{'PERL_CORE'}) {
+ chdir 't' if -d 't';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
+ require Config; import Config;
+ use vars '%Config';
+ if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
+ print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
+ exit 0;
+ }
+ }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
+
+ sub load {
+ require 'testutil.pl';
+ require 'inctools';
+ }
+
+ if (98) {
+ load();
+ plan(tests => 98);
+ }
+}
+
+use Devel::PPPort;
+use strict;
+BEGIN { $^W = 1; }
+
+package Devel::PPPort;
+use vars '@ISA';
+require DynaLoader;
+@ISA = qw(DynaLoader);
+bootstrap Devel::PPPort;
+
+package main;
+
+BEGIN {
+ # skip tests on 5.6.0 and earlier, plus 5.7.0
+ if (ivers($]) <= ivers(5.6) || ivers($]) == ivers(5.7) ) {
+ skip 'skip: broken utf8 support', 98;
+ exit;
+ }
+ require warnings;
+}
+
+is(Devel::PPPort::UTF8f(42), '[42]');
+is(Devel::PPPort::UTF8f('abc'), '[abc]');
+is(Devel::PPPort::UTF8f("\x{263a}"), "[\x{263a}]");
+
+my $str = "\x{A8}";
+if (ivers($]) >= ivers(5.8)) { eval q{utf8::upgrade($str)} }
+is(Devel::PPPort::UTF8f($str), "[\x{A8}]");
+if (ivers($]) >= ivers(5.8)) { eval q{utf8::downgrade($str)} }
+is(Devel::PPPort::UTF8f($str), "[\x{A8}]");
+
+is(&Devel::PPPort::UTF8_SAFE_SKIP("A", 0), 1);
+is(&Devel::PPPort::UTF8_SAFE_SKIP("A", -1), 0);
+
+is(&Devel::PPPort::isUTF8_CHAR("A", -1), 0);
+is(&Devel::PPPort::isUTF8_CHAR("A", 0), 1);
+is(&Devel::PPPort::isUTF8_CHAR("\x{100}", -1), 0);
+is(&Devel::PPPort::isUTF8_CHAR("\x{100}", 0), 2);
+
+is(&Devel::PPPort::UVCHR_IS_INVARIANT(ord("A")), 1);
+ok(! &Devel::PPPort::UVCHR_IS_INVARIANT(0xb6));
+ok(! &Devel::PPPort::UVCHR_IS_INVARIANT(0x100));
+
+is(&Devel::PPPort::UVCHR_SKIP(ord("A")), 1);
+is(&Devel::PPPort::UVCHR_SKIP(0xb6), 2, "This is a test");
+is(&Devel::PPPort::UVCHR_SKIP(0x3FF), 2);
+is(&Devel::PPPort::UVCHR_SKIP(0x3FFF), 3);
+is(&Devel::PPPort::UVCHR_SKIP(0x3FFFF), 4);
+is(&Devel::PPPort::UVCHR_SKIP(0x3FFFFF), 5);
+is(&Devel::PPPort::UVCHR_SKIP(0x3FFFFFF), ord("A") == 65 ? 5 : 6);
+is(&Devel::PPPort::UVCHR_SKIP(0x4000000), ord("A") == 65 ? 6 : 7);
+if (ord("A") != 65) {
+ skip("Test not valid on EBCDIC", 1)
+}
+else {
+ is(&Devel::PPPort::UVCHR_SKIP(0xFFFFFFFF), 7);
+}
+
+if (ivers($]) < ivers(5.8)) {
+ skip("Perl version too early", 3);
+}
+else {
+ is(&Devel::PPPort::foldEQ_utf8("A\x{100}", 3, 1, "a\x{101}", 3, 1), 1);
+ is(&Devel::PPPort::foldEQ_utf8("A\x{100}", 3, 1, "a\x{102}", 3, 1), 0);
+ is(&Devel::PPPort::foldEQ_utf8("A\x{100}", 3, 1, "b\x{101}", 3, 1), 0);
+}
+
+my $ret = &Devel::PPPort::utf8_to_uvchr("A");
+is($ret->[0], ord("A"));
+is($ret->[1], 1);
+
+$ret = &Devel::PPPort::utf8_to_uvchr("\0");
+is($ret->[0], 0);
+is($ret->[1], 1);
+
+$ret = &Devel::PPPort::utf8_to_uvchr_buf("A", 0);
+is($ret->[0], ord("A"));
+is($ret->[1], 1);
+
+$ret = &Devel::PPPort::utf8_to_uvchr_buf("\0", 0);
+is($ret->[0], 0);
+is($ret->[1], 1);
+
+my @buf_tests = (
+ {
+ input => "A",
+ adjustment => -1,
+ warning => eval "qr/empty/",
+ no_warnings_returned_length => 0,
+ },
+ {
+ input => "\xc4\xc5",
+ adjustment => 0,
+ warning => eval "qr/non-continuation/",
+ no_warnings_returned_length => 1,
+ },
+ {
+ input => "\xc4\x80",
+ adjustment => -1,
+ warning => eval "qr/short|1 byte, need 2/",
+ no_warnings_returned_length => 1,
+ },
+ {
+ input => "\xc0\x81",
+ adjustment => 0,
+ warning => eval "qr/overlong|2 bytes, need 1/",
+ no_warnings_returned_length => 2,
+ },
+ {
+ input => "\xe0\x80\x81",
+ adjustment => 0,
+ warning => eval "qr/overlong|3 bytes, need 1/",
+ no_warnings_returned_length => 3,
+ },
+ {
+ input => "\xf0\x80\x80\x81",
+ adjustment => 0,
+ warning => eval "qr/overlong|4 bytes, need 1/",
+ no_warnings_returned_length => 4,
+ },
+ { # Old algorithm failed to detect this
+ input => "\xff\x80\x90\x90\x90\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf",
+ adjustment => 0,
+ warning => eval "qr/overflow/",
+ no_warnings_returned_length => 13,
+ },
+);
+
+if (ord("A") != 65) { # tests not valid for EBCDIC
+ skip("Perl version too early", 2 + 4 + (scalar @buf_tests * 5));
+}
+else {
+ $ret = &Devel::PPPort::utf8_to_uvchr_buf("\xc4\x80", 0);
+ is($ret->[0], 0x100);
+ is($ret->[1], 2);
+
+ my @warnings;
+ local $SIG{__WARN__} = sub { push @warnings, @_; };
+
+ {
+ use warnings 'utf8';
+ $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
+ is($ret->[0], 0);
+ is($ret->[1], -1);
+
+ no warnings 'utf8';
+ $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
+ is($ret->[0], 0xFFFD);
+ is($ret->[1], 1);
+ }
+
+
+ # An empty input is an assertion failure on debugging builds. It is
+ # deliberately the first test.
+ require Config; import Config;
+ use vars '%Config';
+
+ # VMS doesn't put DEBUGGING in ccflags, and Windows doesn't have
+ # $Config{config_args}. When 5.14 or later can be assumed, use
+ # Config::non_bincompat_options(), but for now we're stuck with this.
+ if ( $Config{ccflags} =~ /-DDEBUGGING/
+ || $^O eq 'VMS' && $Config{config_args} =~ /\bDDEBUGGING\b/)
+ {
+ shift @buf_tests;
+ skip("Test not valid on DEBUGGING builds", 5);
+ }
+
+ my $test;
+ for $test (@buf_tests) {
+ my $input = $test->{'input'};
+ my $adjustment = $test->{'adjustment'};
+ my $display = 'utf8_to_uvchr_buf("';
+ my $i;
+ for ($i = 0; $i < length($input) + $adjustment; $i++) {
+ $display .= sprintf "\\x%02x", ord substr($input, $i, 1);
+ }
+
+ $display .= '")';
+ my $warning = $test->{'warning'};
+
+ undef @warnings;
+ use warnings 'utf8';
+ $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
+ is($ret->[0], 0, "returned value $display; warnings enabled");
+ is($ret->[1], -1, "returned length $display; warnings enabled");
+ my $all_warnings = join "; ", @warnings;
+ my $contains = grep { $_ =~ $warning } $all_warnings;
+ is($contains, 1, $display
+ . "; Got: '$all_warnings', which should contain '$warning'");
+
+ undef @warnings;
+ no warnings 'utf8';
+ $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
+ is($ret->[0], 0xFFFD, "returned value $display; warnings disabled");
+ is($ret->[1], $test->{'no_warnings_returned_length'},
+ "returned length $display; warnings disabled");
+ }
+}
+
+if (ivers($]) ge ivers(5.008)) {
+ BEGIN { if (ivers($]) ge ivers(5.008)) { require utf8; "utf8"->import() } }
+
+ is(Devel::PPPort::sv_len_utf8("aščť"), 4);
+ is(Devel::PPPort::sv_len_utf8_nomg("aščť"), 4);
+
+ my $str = "áíé";
+ utf8::downgrade($str);
+ is(Devel::PPPort::sv_len_utf8($str), 3);
+ utf8::downgrade($str);
+ is(Devel::PPPort::sv_len_utf8_nomg($str), 3);
+ utf8::upgrade($str);
+ is(Devel::PPPort::sv_len_utf8($str), 3);
+ utf8::upgrade($str);
+ is(Devel::PPPort::sv_len_utf8_nomg($str), 3);
+
+ tie my $scalar, 'TieScalarCounter', "é";
+
+ is(tied($scalar)->{fetch}, 0);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8($scalar), 2);
+ is(tied($scalar)->{fetch}, 1);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8($scalar), 3);
+ is(tied($scalar)->{fetch}, 2);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8($scalar), 4);
+ is(tied($scalar)->{fetch}, 3);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8_nomg($scalar), 4);
+ is(tied($scalar)->{fetch}, 3);
+ is(tied($scalar)->{store}, 0);
+ is(Devel::PPPort::sv_len_utf8_nomg($scalar), 4);
+ is(tied($scalar)->{fetch}, 3);
+ is(tied($scalar)->{store}, 0);
+} else {
+ skip 'skip: no utf8::downgrade/utf8::upgrade support', 23;
+}
+
+package TieScalarCounter;
+
+sub TIESCALAR {
+ my ($class, $value) = @_;
+ return bless { fetch => 0, store => 0, value => $value }, $class;
+}
+
+sub FETCH {
+ BEGIN { if (main::ivers($]) ge main::ivers(5.008)) { require utf8; "utf8"->import() } }
+ my ($self) = @_;
+ $self->{fetch}++;
+ return $self->{value} .= "é";
+}
+
+sub STORE {
+ my ($self, $value) = @_;
+ $self->{store}++;
+ $self->{value} = $value;
+}
+
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t
index 7f5d78b9e40..e915cfd0bce 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/uv.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,24 +23,26 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
- if (52) {
+ if (11) {
load();
- plan(tests => 52);
+ plan(tests => 11);
}
}
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -48,127 +52,17 @@ bootstrap Devel::PPPort;
package main;
-ok(&Devel::PPPort::sv_setuv(42), 42);
-ok(&Devel::PPPort::newSVuv(123), 123);
-ok(&Devel::PPPort::sv_2uv("4711"), 4711);
-ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
-ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
-ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
-ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
-ok(&Devel::PPPort::XSRETURN_UV(), 42);
-ok(&Devel::PPPort::PUSHu(), 42);
-ok(&Devel::PPPort::XPUSHu(), 43);
-ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", 0), 1);
-ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", -1), 0);
-ok(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
-
-my $ret = &Devel::PPPort::utf8_to_uvchr("A");
-ok($ret->[0], ord("A"));
-ok($ret->[1], 1);
-
-$ret = &Devel::PPPort::utf8_to_uvchr("\0");
-ok($ret->[0], 0);
-ok($ret->[1], 1);
-
-$ret = &Devel::PPPort::utf8_to_uvchr_buf("A", 0);
-ok($ret->[0], ord("A"));
-ok($ret->[1], 1);
-
-$ret = &Devel::PPPort::utf8_to_uvchr_buf("\0", 0);
-ok($ret->[0], 0);
-ok($ret->[1], 1);
-
-if (ord("A") != 65) { # tests not valid for EBCDIC
- ok(1, 1) for 1 .. (2 + 4 + (5 * 5));
-}
-else {
- $ret = &Devel::PPPort::utf8_to_uvchr_buf("\xc4\x80", 0);
- ok($ret->[0], 0x100);
- ok($ret->[1], 2);
-
- my @warnings;
- local $SIG{__WARN__} = sub { push @warnings, @_; };
-
- {
- use warnings 'utf8';
- $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
- ok($ret->[0], 0);
- ok($ret->[1], -1);
-
- no warnings;
- $ret = &Devel::PPPort::utf8_to_uvchr("\xe0\0\x80");
- ok($ret->[0], 0xFFFD);
- ok($ret->[1], 1);
- }
-
- my @buf_tests = (
- {
- input => "A",
- adjustment => -1,
- warning => qr/empty/,
- no_warnings_returned_length => 0,
- },
- {
- input => "\xc4\xc5",
- adjustment => 0,
- warning => qr/non-continuation/,
- no_warnings_returned_length => 1,
- },
- {
- input => "\xc4\x80",
- adjustment => -1,
- warning => qr/short|1 byte, need 2/,
- no_warnings_returned_length => 1,
- },
- {
- input => "\xc0\x81",
- adjustment => 0,
- warning => qr/overlong|2 bytes, need 1/,
- no_warnings_returned_length => 2,
- },
- { # Old algorithm supposedly failed to detect this
- input => "\xff\x80\x90\x90\x90\xbf\xbf\xbf\xbf\xbf\xbf\xbf\xbf",
- adjustment => 0,
- warning => qr/overflow/,
- no_warnings_returned_length => 13,
- },
- );
-
- # An empty input is an assertion failure on debugging builds. It is
- # deliberately the first test.
- require Config; import Config;
- use vars '%Config';
- if ($Config{ccflags} =~ /-DDEBUGGING/) {
- shift @buf_tests;
- ok(1, 1) for 1..5;
- }
-
- for my $test (@buf_tests) {
- my $input = $test->{'input'};
- my $adjustment = $test->{'adjustment'};
- my $display = 'utf8_to_uvchr_buf("';
- for (my $i = 0; $i < length($input) + $adjustment; $i++) {
- $display .= sprintf "\\x%02x", ord substr($input, $i, 1);
- }
-
- $display .= '")';
- my $warning = $test->{'warning'};
-
- undef @warnings;
- use warnings 'utf8';
- $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
- ok($ret->[0], 0, "returned value $display; warnings enabled");
- ok($ret->[1], -1, "returned length $display; warnings enabled");
- my $all_warnings = join "; ", @warnings;
- my $contains = grep { $_ =~ $warning } $all_warnings;
- ok($contains, 1, $display . "; '$all_warnings' contains '$warning'");
-
- undef @warnings;
- no warnings 'utf8';
- $ret = &Devel::PPPort::utf8_to_uvchr_buf($input, $adjustment);
- ok($ret->[0], 0xFFFD, "returned value $display; warnings disabled");
- ok($ret->[1], $test->{'no_warnings_returned_length'},
- "returned length $display; warnings disabled");
- }
-}
+BEGIN { require warnings if "$]" > '5.006' }
+
+is(&Devel::PPPort::sv_setuv(42), 42);
+is(&Devel::PPPort::newSVuv(123), 123);
+is(&Devel::PPPort::sv_2uv("4711"), 4711);
+is(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
+is(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
+is(&Devel::PPPort::SvUVx(1735928559), 1735928559);
+is(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
+is(&Devel::PPPort::XSRETURN_UV(), 42);
+is(&Devel::PPPort::PUSHu(), 42);
+is(&Devel::PPPort::XPUSHu(), 43);
+is(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t
index 55da5a80250..fb836f1be40 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/variables.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (52) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -53,13 +57,13 @@ ok(Devel::PPPort::compare_PL_signals());
ok(!defined(&Devel::PPPort::PL_sv_undef()));
ok(&Devel::PPPort::PL_sv_yes());
ok(!&Devel::PPPort::PL_sv_no());
-ok(&Devel::PPPort::PL_na("abcd"), 4);
-ok(&Devel::PPPort::PL_Sv(), "mhx");
+is(&Devel::PPPort::PL_na("abcd"), 4);
+is(&Devel::PPPort::PL_Sv(), "mhx");
ok(defined &Devel::PPPort::PL_tokenbuf());
ok("$]" >= 5.009005 || &Devel::PPPort::PL_parser());
ok(&Devel::PPPort::PL_hexdigit() =~ /^[0-9a-zA-Z]+$/);
ok(defined &Devel::PPPort::PL_hints());
-ok(&Devel::PPPort::PL_ppaddr("mhx"), "MHX");
+is(&Devel::PPPort::PL_ppaddr("mhx"), "MHX");
for (&Devel::PPPort::other_variables()) {
ok($_ != 0);
@@ -85,7 +89,7 @@ for (&Devel::PPPort::other_variables()) {
else {
ok(@w == 0);
}
- ok($fail, 0);
+ is($fail, 0);
}
ok(&Devel::PPPort::no_dummy_parser_vars(1) >= ("$]" < 5.009005 ? 1 : 0));
@@ -93,7 +97,7 @@ ok(&Devel::PPPort::no_dummy_parser_vars(1) >= ("$]" < 5.009005 ? 1 : 0));
eval { &Devel::PPPort::no_dummy_parser_vars(0) };
if ("$]" < 5.009005) {
- ok($@, '');
+ is($@, '');
}
else {
if ($@) {
diff --git a/gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t b/gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t
index 33900e9e068..734332a25a6 100644
--- a/gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t
+++ b/gnu/usr.bin/perl/dist/Devel-PPPort/t/warn.t
@@ -10,10 +10,12 @@
#
################################################################################
+use FindBin ();
+
BEGIN {
if ($ENV{'PERL_CORE'}) {
chdir 't' if -d 't';
- @INC = ('../lib', '../ext/Devel-PPPort/t') if -d '../lib' && -d '../ext';
+ unshift @INC, '../lib' if -d '../lib' && -d '../ext';
require Config; import Config;
use vars '%Config';
if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
@@ -21,13 +23,15 @@ BEGIN {
exit 0;
}
}
- else {
- unshift @INC, 't';
- }
+
+ use lib "$FindBin::Bin";
+ use lib "$FindBin::Bin/../parts/inc";
+
+ die qq[Cannot find "$FindBin::Bin/../parts/inc"] unless -d "$FindBin::Bin/../parts/inc";
sub load {
- eval "use Test";
- require 'testutil.pl' if $@;
+ require 'testutil.pl';
+ require 'inctools';
}
if (5) {
@@ -38,7 +42,7 @@ BEGIN {
use Devel::PPPort;
use strict;
-$^W = 1;
+BEGIN { $^W = 1; }
package Devel::PPPort;
use vars '@ISA';
@@ -68,7 +72,7 @@ ok("$]" >= 5.004 ? $warning =~ /^Perl_warner_nocontext bar:42/ : $warning eq '')
$warning = '';
Devel::PPPort::ckWARN();
-ok($warning, '');
+is($warning, '');
$^W = 1;