Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PATCH] fix -DNO_MATHOMS build, mathomed syms were not removed from perldll.def #16502

Closed
p5pRT opened this issue Apr 11, 2018 · 10 comments
Closed

[PATCH] fix -DNO_MATHOMS build, mathomed syms were not removed from perldll.def #16502

p5pRT opened this issue Apr 11, 2018 · 10 comments

Comments

@p5pRT
Copy link

@p5pRT p5pRT commented Apr 11, 2018

Migrated from rt.perl.org#133098 (status was 'resolved')

Searchable as RT133098$

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Apr 11, 2018

From @bulk88

Created by @bulk88

See attached patch. This probably should go into 5.28 but I'm not 100%
sure because of timing and some risk of leaving out a symbol/CPAN
breakage, but I'll guess I'm the only person in the world who compiles
-DNO_MATHOMS since nobody else noticed the problem in 2 yrs, so if a
symbol is left out that shouldn't have been, oh well, the feature was
broken in the last stable anyway. Better than waiting a year. Backport
too since its been broken since 5.25.0-5.25.1.

See also
https://www.nntp.perl.org/group/perl.perl5.porters/2018/04/msg250381.html

Perl Info
---
Flags:
              category=core
              severity=low
---
Site configuration information for perl 5.27.9:

Configured by Administrator at Tue Jan 30 20:34:30 2018.

Summary of my perl5 (revision 5 version 27 subversion 9) configuration:

            Platform:
              osname=MSWin32
              osvers=5.2.3790
              archname=MSWin32-x86-multi-thread
              uname=''
              config_args='undef'
              hint=recommended
              useposix=true
              d_sigaction=undef
              useithreads=define
              usemultiplicity=define
              use64bitint=undef
              use64bitall=undef
              uselongdouble=undef
              usemymalloc=n
              default_inc_excludes_dot=define
              bincompat5005=undef
            Compiler:
              cc='cl'
              ccflags ='-nologo -GF -W3 -O1 -MD -Zi -DNDEBUG -GL -DWIN32
-D_CONSOLE -DNO_STRICT -D_CRT_SECURE_NO_DEPRECATE
-D_CRT_NONSTDC_NO_DEPRECATE  -DPERL_TEXTMODE_SCRIPTS
-DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DWIN32_NO_REGISTRY'
              optimize='-O1 -MD -Zi -DNDEBUG -GL'
              cppflags='-DWIN32'
              ccversion='15.00.30729.01'
              gccversion=''
              gccosandvers=''
              intsize=4
              longsize=4
              ptrsize=4
              doublesize=8
              byteorder=1234
              doublekind=3
              d_longlong=undef
              longlongsize=8
              d_longdbl=define
              longdblsize=8
              longdblkind=0
              ivtype='long'
              ivsize=4
              nvtype='double'
              nvsize=8
              Off_t='__int64'
              lseeksize=8
              alignbytes=8
              prototype=define
            Linker and Libraries:
              ld='link'
              ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf -ltcg
-libpath:"c:\perl\lib\CORE"        -machine:x86'
              libpth="C:\Program Files (x86)\Microsoft Visual Studio
9.0\VC\lib"
              libs=oldnames.lib kernel32.lib user32.lib gdi32.lib
winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib
odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
              perllibs=oldnames.lib kernel32.lib user32.lib gdi32.lib
winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib
odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib
              libc=msvcrt.lib
              so=dll
              useshrplib=true
              libperl=perl527.lib
              gnulibc_version=''
            Dynamic Linking:
              dlsrc=dl_win32.xs
              dlext=dll
              d_dlsymun=undef
              ccdlflags=' '
              cccdlflags=' '
              lddlflags='-dll -nologo -nodefaultlib -debug -opt:ref,icf 
-ltcg
              -libpath:"c:\perl\lib\CORE"        -machine:x86'


---
@INC for perl 5.27.9:
              lib
              C:/p527/srcnew/lib

---
Environment for perl 5.27.9:
              CYGWIN=tty
              HOME (unset)
              LANG (unset)
              LANGUAGE (unset)
              LD_LIBRARY_PATH=/usr/lib/x86:/usr/X11R6/lib
              LOGDIR (unset)
              PATH=C:\WINDOWS\system32;C:\Program Files (x86)\Microsoft
Visual
Studio 9.0\VC\BIN;C:\Program Files\Microsoft
SDKs\Windows\v6.0A\bin;C:\Perl\bin;C:\WINDOWS;C:\Program Files
(x86)\Microsoft Visual Studio 9.0\Common7\IDE;C:\Program Files
(x86)\Git\bin;C:\sp3220\c\bin;
              PERL_BADLANG (unset)
              SHELL (unset)


@p5pRT
Copy link
Author

@p5pRT p5pRT commented Apr 11, 2018

From @bulk88

0001-fix-DNO_MATHOMS-build-mathomed-syms-were-not-removed.patch
From 73c42cf023b73b93bf69d2e2238507f345049dba Mon Sep 17 00:00:00 2001
From: Daniel Dragan <bulk88@hotmail.com>
Date: Wed, 11 Apr 2018 02:15:18 -0400
Subject: [PATCH] fix -DNO_MATHOMS build, mathomed syms were not removed from
 perldll.def

Commit 3f1866a8f6 assumed "A" flag means a function can't be mathomed. Not
true. Many funcs were listed in embed.fnc as "A" yet were in mathoms.c.
This caused a missing symbol link failure on Win32 with -DNO_MATHOMS,
since the "A" mathomed funcs were now put into perlldll.def while
previously they were parsed out of mathoms.c by makedef.pl. Revise the
logic so "b" means instant removal from the export list on a no mathoms
build.

embed.fnc "b" flag adds were generated from a missing symbol list from my
linker, some funcs not in my build/platform config might need to be "b"
flagged in future. Some funcs like ASCII_TO_NEED were already marked "b"
but still being by mistake exported because they were also "A".

sv_2bool, sv_eq and sv_collxfrm also needed a "p" flag or a Perl_-less
symbol was declared in proto.h. sv_2bool and sv_collxfrm also failed
porting/args_assert.t so add those macros to mathoms.c
---
 embed.fnc  | 170 ++++++++++++++++++++++++++++-----------------------------
 embed.h    | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 makedef.pl |   4 +-
 mathoms.c  |   2 +
 proto.h    | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 5 files changed, 430 insertions(+), 90 deletions(-)

diff --git a/embed.fnc b/embed.fnc
index f8e3414..63f8ae0 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -358,8 +358,8 @@ 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|...
-Afnp	|int	|fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
-Afnp	|int	|printf_nocontext|NN const char *format|...
+Abfnp	|int	|fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
+Abfnp	|int	|printf_nocontext|NN const char *format|...
 #endif
 : Used in pp.c
 p	|SV *	|core_prototype	|NULLOK SV *sv|NN const char *name \
@@ -418,7 +418,7 @@ Ap	|void	|dounwind	|I32 cxix
 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
-Ap	|int	|do_binmode	|NN PerlIO *fp|int iotype|int mode
+Abp	|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
@@ -462,7 +462,7 @@ Ap	|void	|do_join	|NN SV *sv|NN SV *delim|NN SV **mark|NN SV **sp
 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 \
 				|int rawmode|int rawperm|NULLOK PerlIO* supplied_fp
-Ap	|bool	|do_open9	|NN GV *gv|NN const char *name|I32 len|int as_raw \
+Abp	|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
@@ -589,7 +589,7 @@ 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
-Ap	|void	|gv_efullname	|NN SV* sv|NN const GV* gv
+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
 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
@@ -619,7 +619,7 @@ ApM	|GV*	|gv_fetchmethod_pv_flags|NN HV* stash|NN const char* name \
 ApM	|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
-Ap	|void	|gv_fullname	|NN SV* sv|NN const GV* gv
+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
 Ap	|void	|gv_fullname4	|NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
 : Used in scope.c
@@ -745,28 +745,28 @@ 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
-ADMpR	|U32	|to_uni_upper_lc|U32 c
-ADMpR	|U32	|to_uni_title_lc|U32 c
-ADMpR	|U32	|to_uni_lower_lc|U32 c
-ADMpR	|bool	|is_uni_alnum	|UV c
-ADMpR	|bool	|is_uni_alnumc	|UV c
-ADMpR	|bool	|is_uni_idfirst	|UV c
-ADMpR	|bool	|is_uni_alpha	|UV c
-ADMpPR	|bool	|is_uni_ascii	|UV c
-ADMpPR	|bool	|is_uni_blank	|UV c
-ADMpPR	|bool	|is_uni_space	|UV c
-ADMpPR	|bool	|is_uni_cntrl	|UV c
-ADMpR	|bool	|is_uni_graph	|UV c
-ADMpR	|bool	|is_uni_digit	|UV c
-ADMpR	|bool	|is_uni_upper	|UV c
-ADMpR	|bool	|is_uni_lower	|UV c
-ADMpR	|bool	|is_uni_print	|UV c
-ADMpR	|bool	|is_uni_punct	|UV c
-ADMpPR	|bool	|is_uni_xdigit	|UV c
+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
-ADMpR	|bool	|isIDFIRST_lazy	|NN const char* p
-ADMpR	|bool	|isALNUM_lazy	|NN const char* p
+AbDMpR	|bool	|isIDFIRST_lazy	|NN const char* p
+AbDMpR	|bool	|isALNUM_lazy	|NN const char* p
 #ifdef PERL_IN_UTF8_C
 snR	|U8	|to_lower_latin1|const U8 c|NULLOK U8 *p|NULLOK STRLEN *lenp  \
 		|const char dummy
@@ -785,23 +785,23 @@ p	|UV	|_to_upper_title_latin1|const U8 c|NN U8 *p|NN STRLEN *lenp|const char S_o
 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
-ADMpR	|bool	|is_uni_alnum_lc|UV c
-ADMpR	|bool	|is_uni_alnumc_lc|UV c
-ADMpR	|bool	|is_uni_idfirst_lc|UV c
+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
-ADMpR	|bool	|is_uni_alpha_lc|UV c
-ADMpPR	|bool	|is_uni_ascii_lc|UV c
-ADMpPR	|bool	|is_uni_space_lc|UV c
-ADMpPR	|bool	|is_uni_blank_lc|UV c
-ADMpPR	|bool	|is_uni_cntrl_lc|UV c
-ADMpR	|bool	|is_uni_graph_lc|UV c
-ADMpR	|bool	|is_uni_digit_lc|UV c
-ADMpR	|bool	|is_uni_upper_lc|UV c
-ADMpR	|bool	|is_uni_lower_lc|UV c
-ADMpR	|bool	|is_uni_print_lc|UV c
-ADMpR	|bool	|is_uni_punct_lc|UV c
-ADMpPR	|bool	|is_uni_xdigit_lc|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		    \
 		|STRLEN len
 AnidR	|bool	|is_utf8_invariant_string_loc|NN const U8* const s	    \
@@ -820,7 +820,7 @@ AmnpdRP	|bool	|is_invariant_string|NN const U8* const s|STRLEN len
 EXnidR	|bool	|is_utf8_non_invariant_string|NN const U8* const s	    \
 		|STRLEN len
 #endif
-AnpdD	|STRLEN	|is_utf8_char	|NN const U8 *s
+AbnpdD	|STRLEN	|is_utf8_char	|NN const U8 *s
 Abmnpd	|STRLEN	|is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end
 AnmdpR	|bool	|is_utf8_string	|NN const U8 *s|STRLEN len
 AnidR	|bool	|is_utf8_string_flags					    \
@@ -868,10 +868,10 @@ AMpR	|bool	|_is_utf8_FOO|U8 classnum|NN const U8 * const p		    \
 		|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
-ADMpR	|bool	|is_utf8_alnum	|NN const U8 *p
-ADMpR	|bool	|is_utf8_alnumc	|NN const U8 *p
-ADMpR	|bool	|is_utf8_idfirst|NN const U8 *p
-ADMpR	|bool	|is_utf8_xidfirst|NN const U8 *p
+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
@@ -880,25 +880,25 @@ AMpR	|bool	|_is_utf8_perl_idcont_with_len|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
-ADMpR	|bool	|is_utf8_idcont	|NN const U8 *p
-ADMpR	|bool	|is_utf8_xidcont	|NN const U8 *p
-ADMpR	|bool	|is_utf8_alpha	|NN const U8 *p
-ADMpR	|bool	|is_utf8_ascii	|NN const U8 *p
-ADMpR	|bool	|is_utf8_blank	|NN const U8 *p
-ADMpR	|bool	|is_utf8_space	|NN const U8 *p
-ADMpR	|bool	|is_utf8_perl_space	|NN const U8 *p
-ADMpR	|bool	|is_utf8_perl_word	|NN const U8 *p
-ADMpR	|bool	|is_utf8_cntrl	|NN const U8 *p
-ADMpR	|bool	|is_utf8_digit	|NN const U8 *p
-ADMpR	|bool	|is_utf8_posix_digit	|NN const U8 *p
-ADMpR	|bool	|is_utf8_graph	|NN const U8 *p
-ADMpR	|bool	|is_utf8_upper	|NN const U8 *p
-ADMpR	|bool	|is_utf8_lower	|NN const U8 *p
-ADMpR	|bool	|is_utf8_print	|NN const U8 *p
-ADMpR	|bool	|is_utf8_punct	|NN const U8 *p
-ADMpR	|bool	|is_utf8_xdigit	|NN const U8 *p
+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
-ADMpR	|bool	|is_utf8_mark	|NN const U8 *p
+AbDMpR	|bool	|is_utf8_mark	|NN const U8 *p
 #if defined(PERL_CORE) || defined(PERL_EXT)
 EXdpR	|bool	|isSCRIPT_RUN	|NN const U8 *s|NN const U8 *send   \
 				|const bool utf8_target
@@ -1306,7 +1306,7 @@ Ando	|const char*|Perl_langinfo|const nl_item item
 Ando	|const char*|Perl_langinfo|const int item
 #endif
 ApOM	|int	|init_i18nl10n	|int printwarn
-ApOM	|int	|init_i18nl14n	|int printwarn
+AbpOM	|int	|init_i18nl14n	|int printwarn
 p	|char*	|my_strerror	|const int errnum
 Xpn	|void	|_warn_problematic_locale
 Xp	|void	|set_numeric_underlying
@@ -1317,7 +1317,7 @@ Apdn	|bool	|sync_locale
 ApMn	|void	|thread_locale_init
 ApMn	|void	|thread_locale_term
 ApdO	|void	|require_pv	|NN const char* pv
-Apd	|void	|pack_cat	|NN SV *cat|NN const char *pat|NN const char *patend \
+Abpd	|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)
@@ -1459,10 +1459,10 @@ Ap	|void	|save_I8	|NN I8* bytep
 Ap	|void	|save_int	|NN int* intp
 Ap	|void	|save_item	|NN SV* item
 Ap	|void	|save_iv	|NN IV *ivp
-Ap	|void	|save_list	|NN SV** sarg|I32 maxsarg
-Ap	|void	|save_long	|NN long* longp
+Abp	|void	|save_list	|NN SV** sarg|I32 maxsarg
+Abp	|void	|save_long	|NN long* longp
 Apmb	|void	|save_mortalizesv|NN SV* sv
-Ap	|void	|save_nogv	|NN GV* gv
+Abp	|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
@@ -1516,7 +1516,7 @@ 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
-Amd	|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
@@ -1534,15 +1534,15 @@ 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
-Ap	|char*	|sv_pvn_nomg	|NN SV* sv|NULLOK STRLEN* lp
+Abp	|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
-Apd	|IV	|sv_iv		|NN SV* sv
-Apd	|UV	|sv_uv		|NN SV* sv
-Apd	|NV	|sv_nv		|NN SV* sv
-Apd	|char*	|sv_pvn		|NN SV *sv|NN STRLEN *lp
-Apd	|char*	|sv_pvutf8n	|NN SV *sv|NN STRLEN *lp
-Apd	|char*	|sv_pvbyten	|NN SV *sv|NN STRLEN *lp
+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
 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 \
@@ -1578,7 +1578,7 @@ Aopd	|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)
-Amd	|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
@@ -1595,7 +1595,7 @@ 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
-Amd	|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
@@ -1826,7 +1826,7 @@ pn	|bool	|translate_substr_offsets|STRLEN curlen|IV pos1_iv \
 #if defined(UNLINK_ALL_VERSIONS)
 Ap	|I32	|unlnk		|NN const char* f
 #endif
-Apd	|SSize_t|unpack_str	|NN const char *pat|NN const char *patend|NN const char *s \
+Abpd	|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 \
@@ -1856,9 +1856,9 @@ AMnp	|U8*	|bytes_from_utf8_loc|NN const U8 *s			    \
 				    |NN bool *is_utf8p			    \
 				    |NULLOK const U8 ** first_unconverted
 ApMd	|U8*	|bytes_to_utf8	|NN const U8 *s|NN STRLEN *lenp
-ApdD	|UV	|utf8_to_uvchr	|NN const U8 *s|NULLOK STRLEN *retlen
-ApdD	|UV	|utf8_to_uvuni	|NN const U8 *s|NULLOK STRLEN *retlen
-ApMD	|UV	|valid_utf8_to_uvuni	|NN const U8 *s|NULLOK STRLEN *retlen
+AbpdD	|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
@@ -2095,8 +2095,8 @@ Ap	|void	|sys_intern_dup	|NN struct interp_intern* src|NN struct interp_intern*
 #endif
 
 Amop	|const XOP *	|custom_op_xop	|NN const OP *o
-ApR	|const char *	|custom_op_name	|NN const OP *o
-ApR	|const char *	|custom_op_desc	|NN const OP *o
+AbpR	|const char *	|custom_op_name	|NN const OP *o
+AbpR	|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 \
 			|NN const XOP *xop
diff --git a/embed.h b/embed.h
index a44df43..b13344e 100644
--- a/embed.h
+++ b/embed.h
@@ -98,8 +98,12 @@
 #define croak_no_modify		Perl_croak_no_modify
 #define croak_sv(a)		Perl_croak_sv(aTHX_ a)
 #define croak_xs_usage		Perl_croak_xs_usage
+#ifndef NO_MATHOMS
 #define custom_op_desc(a)	Perl_custom_op_desc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define custom_op_name(a)	Perl_custom_op_name(aTHX_ a)
+#endif
 #define cv_clone(a)		Perl_cv_clone(aTHX_ a)
 #define cv_const_sv		Perl_cv_const_sv
 #define cv_get_call_checker(a,b,c)	Perl_cv_get_call_checker(aTHX_ a,b,c)
@@ -123,7 +127,9 @@
 #define die			Perl_die
 #endif
 #define die_sv(a)		Perl_die_sv(aTHX_ a)
+#ifndef NO_MATHOMS
 #define do_binmode(a,b,c)	Perl_do_binmode(aTHX_ a,b,c)
+#endif
 #define do_close(a,b)		Perl_do_close(aTHX_ a,b)
 #define do_gv_dump(a,b,c,d)	Perl_do_gv_dump(aTHX_ a,b,c,d)
 #define do_gvgv_dump(a,b,c,d)	Perl_do_gvgv_dump(aTHX_ a,b,c,d)
@@ -131,7 +137,9 @@
 #define do_join(a,b,c,d)	Perl_do_join(aTHX_ a,b,c,d)
 #define do_magic_dump(a,b,c,d,e,f,g)	Perl_do_magic_dump(aTHX_ a,b,c,d,e,f,g)
 #define do_op_dump(a,b,c)	Perl_do_op_dump(aTHX_ a,b,c)
+#ifndef NO_MATHOMS
 #define do_open9(a,b,c,d,e,f,g,h,i)	Perl_do_open9(aTHX_ a,b,c,d,e,f,g,h,i)
+#endif
 #define do_openn(a,b,c,d,e,f,g,h,i)	Perl_do_openn(aTHX_ a,b,c,d,e,f,g,h,i)
 #define do_pmop_dump(a,b,c)	Perl_do_pmop_dump(aTHX_ a,b,c)
 #define do_sprintf(a,b,c)	Perl_do_sprintf(aTHX_ a,b,c)
@@ -193,7 +201,9 @@
 #define gv_check(a)		Perl_gv_check(aTHX_ a)
 #define gv_const_sv(a)		Perl_gv_const_sv(aTHX_ a)
 #define gv_dump(a)		Perl_gv_dump(aTHX_ a)
+#ifndef NO_MATHOMS
 #define gv_efullname(a,b)	Perl_gv_efullname(aTHX_ a,b)
+#endif
 #define gv_efullname4(a,b,c,d)	Perl_gv_efullname4(aTHX_ a,b,c,d)
 #define gv_fetchfile(a)		Perl_gv_fetchfile(aTHX_ a)
 #define gv_fetchfile_flags(a,b,c)	Perl_gv_fetchfile_flags(aTHX_ a,b,c)
@@ -210,7 +220,9 @@
 #define gv_fetchpv(a,b,c)	Perl_gv_fetchpv(aTHX_ a,b,c)
 #define gv_fetchpvn_flags(a,b,c,d)	Perl_gv_fetchpvn_flags(aTHX_ a,b,c,d)
 #define gv_fetchsv(a,b,c)	Perl_gv_fetchsv(aTHX_ a,b,c)
+#ifndef NO_MATHOMS
 #define gv_fullname(a,b)	Perl_gv_fullname(aTHX_ a,b)
+#endif
 #define gv_fullname4(a,b,c,d)	Perl_gv_fullname4(aTHX_ a,b,c,d)
 #define gv_handler(a,b)		Perl_gv_handler(aTHX_ a,b)
 #define gv_init_pv(a,b,c,d)	Perl_gv_init_pv(aTHX_ a,b,c,d)
@@ -239,75 +251,187 @@
 #define hv_rand_set(a,b)	Perl_hv_rand_set(aTHX_ a,b)
 #define hv_scalar(a)		Perl_hv_scalar(aTHX_ a)
 #define init_i18nl10n(a)	Perl_init_i18nl10n(aTHX_ a)
+#ifndef NO_MATHOMS
 #define init_i18nl14n(a)	Perl_init_i18nl14n(aTHX_ a)
+#endif
 #define init_stacks()		Perl_init_stacks(aTHX)
 #define init_tm(a)		Perl_init_tm(aTHX_ a)
 #define intro_my()		Perl_intro_my(aTHX)
+#ifndef NO_MATHOMS
 #define isALNUM_lazy(a)		Perl_isALNUM_lazy(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define isIDFIRST_lazy(a)	Perl_isIDFIRST_lazy(aTHX_ a)
+#endif
 #define is_c9strict_utf8_string_loclen	S_is_c9strict_utf8_string_loclen
 #define is_lvalue_sub()		Perl_is_lvalue_sub(aTHX)
 #define is_safe_syscall(a,b,c,d)	S_is_safe_syscall(aTHX_ a,b,c,d)
 #define is_strict_utf8_string_loclen	S_is_strict_utf8_string_loclen
+#ifndef NO_MATHOMS
 #define is_uni_alnum(a)		Perl_is_uni_alnum(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_alnum_lc(a)	Perl_is_uni_alnum_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_alnumc(a)	Perl_is_uni_alnumc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_alnumc_lc(a)	Perl_is_uni_alnumc_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_alpha(a)		Perl_is_uni_alpha(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_alpha_lc(a)	Perl_is_uni_alpha_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_ascii(a)		Perl_is_uni_ascii(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_ascii_lc(a)	Perl_is_uni_ascii_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_blank(a)		Perl_is_uni_blank(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_blank_lc(a)	Perl_is_uni_blank_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_cntrl(a)		Perl_is_uni_cntrl(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_cntrl_lc(a)	Perl_is_uni_cntrl_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_digit(a)		Perl_is_uni_digit(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_digit_lc(a)	Perl_is_uni_digit_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_graph(a)		Perl_is_uni_graph(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_graph_lc(a)	Perl_is_uni_graph_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_idfirst(a)	Perl_is_uni_idfirst(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_idfirst_lc(a)	Perl_is_uni_idfirst_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_lower(a)		Perl_is_uni_lower(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_lower_lc(a)	Perl_is_uni_lower_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_print(a)		Perl_is_uni_print(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_print_lc(a)	Perl_is_uni_print_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_punct(a)		Perl_is_uni_punct(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_punct_lc(a)	Perl_is_uni_punct_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_space(a)		Perl_is_uni_space(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_space_lc(a)	Perl_is_uni_space_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_upper(a)		Perl_is_uni_upper(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_upper_lc(a)	Perl_is_uni_upper_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_xdigit(a)	Perl_is_uni_xdigit(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_uni_xdigit_lc(a)	Perl_is_uni_xdigit_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_alnum(a)	Perl_is_utf8_alnum(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_alnumc(a)	Perl_is_utf8_alnumc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_alpha(a)	Perl_is_utf8_alpha(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_ascii(a)	Perl_is_utf8_ascii(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_blank(a)	Perl_is_utf8_blank(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_char		Perl_is_utf8_char
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_cntrl(a)	Perl_is_utf8_cntrl(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_digit(a)	Perl_is_utf8_digit(aTHX_ a)
+#endif
 #define is_utf8_fixed_width_buf_loclen_flags	S_is_utf8_fixed_width_buf_loclen_flags
+#ifndef NO_MATHOMS
 #define is_utf8_graph(a)	Perl_is_utf8_graph(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_idcont(a)	Perl_is_utf8_idcont(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_idfirst(a)	Perl_is_utf8_idfirst(aTHX_ a)
+#endif
 #define is_utf8_invariant_string_loc	S_is_utf8_invariant_string_loc
+#ifndef NO_MATHOMS
 #define is_utf8_lower(a)	Perl_is_utf8_lower(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_mark(a)		Perl_is_utf8_mark(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_perl_space(a)	Perl_is_utf8_perl_space(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_perl_word(a)	Perl_is_utf8_perl_word(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_posix_digit(a)	Perl_is_utf8_posix_digit(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_print(a)	Perl_is_utf8_print(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_punct(a)	Perl_is_utf8_punct(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_space(a)	Perl_is_utf8_space(aTHX_ a)
+#endif
 #define is_utf8_string_flags	S_is_utf8_string_flags
 #define is_utf8_string_loclen	Perl_is_utf8_string_loclen
 #define is_utf8_string_loclen_flags	S_is_utf8_string_loclen_flags
+#ifndef NO_MATHOMS
 #define is_utf8_upper(a)	Perl_is_utf8_upper(aTHX_ a)
+#endif
 #define is_utf8_valid_partial_char_flags	S_is_utf8_valid_partial_char_flags
+#ifndef NO_MATHOMS
 #define is_utf8_xdigit(a)	Perl_is_utf8_xdigit(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_xidcont(a)	Perl_is_utf8_xidcont(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define is_utf8_xidfirst(a)	Perl_is_utf8_xidfirst(aTHX_ a)
+#endif
 #define isinfnan		Perl_isinfnan
 #define leave_adjust_stacks(a,b,c,d)	Perl_leave_adjust_stacks(aTHX_ a,b,c,d)
 #define leave_scope(a)		Perl_leave_scope(aTHX_ a)
@@ -442,7 +566,9 @@
 #define op_refcnt_unlock()	Perl_op_refcnt_unlock(aTHX)
 #define op_scope(a)		Perl_op_scope(aTHX_ a)
 #define op_sibling_splice	Perl_op_sibling_splice
+#ifndef NO_MATHOMS
 #define pack_cat(a,b,c,d,e,f,g)	Perl_pack_cat(aTHX_ a,b,c,d,e,f,g)
+#endif
 #define packlist(a,b,c,d,e)	Perl_packlist(aTHX_ a,b,c,d,e)
 #define pad_add_anon(a,b)	Perl_pad_add_anon(aTHX_ a,b)
 #define pad_add_name_pv(a,b,c,d)	Perl_pad_add_name_pv(aTHX_ a,b,c,d)
@@ -541,9 +667,15 @@
 #define save_int(a)		Perl_save_int(aTHX_ a)
 #define save_item(a)		Perl_save_item(aTHX_ a)
 #define save_iv(a)		Perl_save_iv(aTHX_ a)
+#ifndef NO_MATHOMS
 #define save_list(a,b)		Perl_save_list(aTHX_ a,b)
+#endif
+#ifndef NO_MATHOMS
 #define save_long(a)		Perl_save_long(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define save_nogv(a)		Perl_save_nogv(aTHX_ a)
+#endif
 #define save_padsv_and_mortalize(a)	Perl_save_padsv_and_mortalize(aTHX_ a)
 #define save_pptr(a)		Perl_save_pptr(aTHX_ a)
 #define save_pushi32ptr(a,b,c)	Perl_save_pushi32ptr(aTHX_ a,b,c)
@@ -629,7 +761,9 @@
 #define sv_insert_flags(a,b,c,d,e,f)	Perl_sv_insert_flags(aTHX_ a,b,c,d,e,f)
 #define sv_isa(a,b)		Perl_sv_isa(aTHX_ a,b)
 #define sv_isobject(a)		Perl_sv_isobject(aTHX_ a)
+#ifndef NO_MATHOMS
 #define sv_iv(a)		Perl_sv_iv(aTHX_ a)
+#endif
 #define sv_len(a)		Perl_sv_len(aTHX_ a)
 #define sv_len_utf8(a)		Perl_sv_len_utf8(aTHX_ a)
 #define sv_magic(a,b,c,d,e)	Perl_sv_magic(aTHX_ a,b,c,d,e)
@@ -640,18 +774,28 @@
 #ifndef NO_MATHOMS
 #define sv_nounlocking(a)	Perl_sv_nounlocking(aTHX_ a)
 #endif
+#ifndef NO_MATHOMS
 #define sv_nv(a)		Perl_sv_nv(aTHX_ a)
+#endif
 #define sv_peek(a)		Perl_sv_peek(aTHX_ a)
 #define sv_pos_b2u(a,b)		Perl_sv_pos_b2u(aTHX_ a,b)
 #define sv_pos_b2u_flags(a,b,c)	Perl_sv_pos_b2u_flags(aTHX_ a,b,c)
 #define sv_pos_u2b(a,b,c)	Perl_sv_pos_u2b(aTHX_ a,b,c)
 #define sv_pos_u2b_flags(a,b,c,d)	Perl_sv_pos_u2b_flags(aTHX_ a,b,c,d)
+#ifndef NO_MATHOMS
 #define sv_pvbyten(a,b)		Perl_sv_pvbyten(aTHX_ a,b)
+#endif
 #define sv_pvbyten_force(a,b)	Perl_sv_pvbyten_force(aTHX_ a,b)
+#ifndef NO_MATHOMS
 #define sv_pvn(a,b)		Perl_sv_pvn(aTHX_ a,b)
+#endif
 #define sv_pvn_force_flags(a,b,c)	Perl_sv_pvn_force_flags(aTHX_ a,b,c)
+#ifndef NO_MATHOMS
 #define sv_pvn_nomg(a,b)	Perl_sv_pvn_nomg(aTHX_ a,b)
+#endif
+#ifndef NO_MATHOMS
 #define sv_pvutf8n(a,b)		Perl_sv_pvutf8n(aTHX_ a,b)
+#endif
 #define sv_pvutf8n_force(a,b)	Perl_sv_pvutf8n_force(aTHX_ a,b)
 #define sv_recode_to_utf8(a,b)	Perl_sv_recode_to_utf8(aTHX_ a,b)
 #define sv_ref(a,b,c)		Perl_sv_ref(aTHX_ a,b,c)
@@ -704,7 +848,9 @@
 #define sv_utf8_downgrade(a,b)	Perl_sv_utf8_downgrade(aTHX_ a,b)
 #define sv_utf8_encode(a)	Perl_sv_utf8_encode(aTHX_ a)
 #define sv_utf8_upgrade_flags_grow(a,b,c)	Perl_sv_utf8_upgrade_flags_grow(aTHX_ a,b,c)
+#ifndef NO_MATHOMS
 #define sv_uv(a)		Perl_sv_uv(aTHX_ a)
+#endif
 #define sv_vcatpvf(a,b,c)	Perl_sv_vcatpvf(aTHX_ a,b,c)
 #define sv_vcatpvf_mg(a,b,c)	Perl_sv_vcatpvf_mg(aTHX_ a,b,c)
 #define sv_vcatpvfn(a,b,c,d,e,f,g)	Perl_sv_vcatpvfn(aTHX_ a,b,c,d,e,f,g)
@@ -719,12 +865,20 @@
 #define thread_locale_init	Perl_thread_locale_init
 #define thread_locale_term	Perl_thread_locale_term
 #define to_uni_lower(a,b,c)	Perl_to_uni_lower(aTHX_ a,b,c)
+#ifndef NO_MATHOMS
 #define to_uni_lower_lc(a)	Perl_to_uni_lower_lc(aTHX_ a)
+#endif
 #define to_uni_title(a,b,c)	Perl_to_uni_title(aTHX_ a,b,c)
+#ifndef NO_MATHOMS
 #define to_uni_title_lc(a)	Perl_to_uni_title_lc(aTHX_ a)
+#endif
 #define to_uni_upper(a,b,c)	Perl_to_uni_upper(aTHX_ a,b,c)
+#ifndef NO_MATHOMS
 #define to_uni_upper_lc(a)	Perl_to_uni_upper_lc(aTHX_ a)
+#endif
+#ifndef NO_MATHOMS
 #define unpack_str(a,b,c,d,e,f,g,h)	Perl_unpack_str(aTHX_ a,b,c,d,e,f,g,h)
+#endif
 #define unpackstring(a,b,c,d,e)	Perl_unpackstring(aTHX_ a,b,c,d,e)
 #define unsharepvn(a,b,c)	Perl_unsharepvn(aTHX_ a,b,c)
 #define upg_version(a,b)	Perl_upg_version(aTHX_ a,b)
@@ -735,8 +889,12 @@
 #define utf8_hop_safe		Perl_utf8_hop_safe
 #define utf8_length(a,b)	Perl_utf8_length(aTHX_ a,b)
 #define utf8_to_bytes(a,b)	Perl_utf8_to_bytes(aTHX_ a,b)
+#ifndef NO_MATHOMS
 #define utf8_to_uvchr(a,b)	Perl_utf8_to_uvchr(aTHX_ a,b)
+#endif
+#ifndef NO_MATHOMS
 #define utf8_to_uvuni(a,b)	Perl_utf8_to_uvuni(aTHX_ a,b)
+#endif
 #define utf8_to_uvuni_buf(a,b,c)	Perl_utf8_to_uvuni_buf(aTHX_ a,b,c)
 #define utf8n_to_uvchr_msgs(a,b,c,d,e,f)	Perl_utf8n_to_uvchr_msgs(aTHX_ a,b,c,d,e,f)
 #define utf8n_to_uvuni(a,b,c,d)	Perl_utf8n_to_uvuni(aTHX_ a,b,c,d)
@@ -744,7 +902,9 @@
 #define uvuni_to_utf8(a,b)	Perl_uvuni_to_utf8(aTHX_ a,b)
 #define uvuni_to_utf8_flags(a,b,c)	Perl_uvuni_to_utf8_flags(aTHX_ a,b,c)
 #define valid_utf8_to_uvchr	Perl_valid_utf8_to_uvchr
+#ifndef NO_MATHOMS
 #define valid_utf8_to_uvuni(a,b)	Perl_valid_utf8_to_uvuni(aTHX_ a,b)
+#endif
 #define vcmp(a,b)		Perl_vcmp(aTHX_ a,b)
 #define vcroak(a,b)		Perl_vcroak(aTHX_ a,b)
 #define vdeb(a,b)		Perl_vdeb(aTHX_ a,b)
@@ -834,11 +994,15 @@
 #define deb_nocontext		Perl_deb_nocontext
 #define die_nocontext		Perl_die_nocontext
 #define form_nocontext		Perl_form_nocontext
+#ifndef NO_MATHOMS
 #define fprintf_nocontext	Perl_fprintf_nocontext
+#endif
 #define load_module_nocontext	Perl_load_module_nocontext
 #define mess_nocontext		Perl_mess_nocontext
 #define newSVpvf_nocontext	Perl_newSVpvf_nocontext
+#ifndef NO_MATHOMS
 #define printf_nocontext	Perl_printf_nocontext
+#endif
 #define sv_catpvf_mg_nocontext	Perl_sv_catpvf_mg_nocontext
 #define sv_catpvf_nocontext	Perl_sv_catpvf_nocontext
 #define sv_setpvf_mg_nocontext	Perl_sv_setpvf_mg_nocontext
diff --git a/makedef.pl b/makedef.pl
index f2beb94..daf6b40 100644
--- a/makedef.pl
+++ b/makedef.pl
@@ -731,12 +731,12 @@ unless ($define{'USE_QUADMATH'}) {
 {
     my %seen;
     my ($embed) = setup_embed($ARGS{TARG_DIR});
+    my $excludedre = $define{'NO_MATHOMS'} ? qr/[xmib]/ : qr/[xmi]/;
 
     foreach (@$embed) {
 	my ($flags, $retval, $func, @args) = @$_;
 	next unless $func;
-	if (   ($flags =~ /[AX]/ && $flags !~ /[xmi]/)
-            || ($flags =~ /b/ && ! $define{'NO_MATHOMS'}))
+	if ($flags =~ /[AX]/ && $flags !~ $excludedre)
         {
 	    # public API, so export
 
diff --git a/mathoms.c b/mathoms.c
index 295d8c4..ab8fffd 100644
--- a/mathoms.c
+++ b/mathoms.c
@@ -1081,6 +1081,7 @@ Perl_sv_eq(pTHX_ SV *sv1, SV *sv2)
 char *
 Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp)
 {
+    PERL_ARGS_ASSERT_SV_COLLXFRM;
     return sv_collxfrm_flags(sv, nxp, SV_GMAGIC);
 }
 
@@ -1100,6 +1101,7 @@ Perl_mem_collxfrm(pTHX_ const char *input_string, STRLEN len, STRLEN *xlen)
 bool
 Perl_sv_2bool(pTHX_ SV *const sv)
 {
+    PERL_ARGS_ASSERT_SV_2BOOL;
     return sv_2bool_flags(sv, SV_GMAGIC);
 }
 
diff --git a/proto.h b/proto.h
index 8ec63d7..4f76e60 100644
--- a/proto.h
+++ b/proto.h
@@ -639,20 +639,24 @@ PERL_CALLCONV_NO_RET void	Perl_croak_xs_usage(const CV *const cv, const char *co
 	assert(cv); assert(params)
 
 PERL_CALLCONV regexp_engine const *	Perl_current_re_engine(pTHX);
+#ifndef NO_MATHOMS
 PERL_CALLCONV const char *	Perl_custom_op_desc(pTHX_ const OP *o)
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CUSTOM_OP_DESC	\
 	assert(o)
+#endif
 
 PERL_CALLCONV XOPRETANY	Perl_custom_op_get_field(pTHX_ const OP *o, const xop_flags_enum field)
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CUSTOM_OP_GET_FIELD	\
 	assert(o)
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV const char *	Perl_custom_op_name(pTHX_ const OP *o)
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_CUSTOM_OP_NAME	\
 	assert(o)
+#endif
 
 PERL_CALLCONV void	Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr, const XOP *xop);
 #define PERL_ARGS_ASSERT_CUSTOM_OP_REGISTER	\
@@ -757,9 +761,11 @@ PERL_CALLCONV bool	Perl_do_aexec(pTHX_ SV* really, SV** mark, SV** sp);
 PERL_CALLCONV bool	Perl_do_aexec5(pTHX_ SV* really, SV** mark, SV** sp, int fd, int do_report);
 #define PERL_ARGS_ASSERT_DO_AEXEC5	\
 	assert(mark); assert(sp)
+#ifndef NO_MATHOMS
 PERL_CALLCONV int	Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode);
 #define PERL_ARGS_ASSERT_DO_BINMODE	\
 	assert(fp)
+#endif
 PERL_CALLCONV bool	Perl_do_close(pTHX_ GV* gv, bool not_implicit);
 PERL_CALLCONV void	Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full);
 #define PERL_ARGS_ASSERT_DO_DUMP_PAD	\
@@ -798,9 +804,11 @@ PERL_CALLCONV bool	Perl_do_open(pTHX_ GV* gv, const char* name, I32 len, int as_
 PERL_CALLCONV bool	Perl_do_open6(pTHX_ GV *gv, const char *oname, STRLEN len, PerlIO *supplied_fp, SV **svp, U32 num);
 #define PERL_ARGS_ASSERT_DO_OPEN6	\
 	assert(gv); assert(oname)
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_do_open9(pTHX_ GV *gv, const char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num);
 #define PERL_ARGS_ASSERT_DO_OPEN9	\
 	assert(gv); assert(name); assert(svs)
+#endif
 PERL_CALLCONV bool	Perl_do_open_raw(pTHX_ GV *gv, const char *oname, STRLEN len, int rawmode, int rawperm, Stat_t *statbufp);
 #define PERL_ARGS_ASSERT_DO_OPEN_RAW	\
 	assert(gv); assert(oname)
@@ -1080,9 +1088,11 @@ PERL_CALLCONV SV*	Perl_gv_const_sv(pTHX_ GV* gv)
 	assert(gv)
 
 PERL_CALLCONV void	Perl_gv_dump(pTHX_ GV* gv);
+#ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_gv_efullname(pTHX_ SV* sv, const GV* gv);
 #define PERL_ARGS_ASSERT_GV_EFULLNAME	\
 	assert(sv); assert(gv)
+#endif
 #ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_gv_efullname3(pTHX_ SV* sv, const GV* gv, const char* prefix);
 #define PERL_ARGS_ASSERT_GV_EFULLNAME3	\
@@ -1143,9 +1153,11 @@ PERL_CALLCONV GV*	Perl_gv_fetchpvn_flags(pTHX_ const char* name, STRLEN len, I32
 PERL_CALLCONV GV*	Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, const svtype sv_type);
 #define PERL_ARGS_ASSERT_GV_FETCHSV	\
 	assert(name)
+#ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_gv_fullname(pTHX_ SV* sv, const GV* gv);
 #define PERL_ARGS_ASSERT_GV_FULLNAME	\
 	assert(sv); assert(gv)
+#endif
 #ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_gv_fullname3(pTHX_ SV* sv, const GV* gv, const char* prefix);
 #define PERL_ARGS_ASSERT_GV_FULLNAME3	\
@@ -1369,7 +1381,9 @@ PERL_CALLCONV void	Perl_init_constants(pTHX);
 PERL_CALLCONV void	Perl_init_dbargs(pTHX);
 PERL_CALLCONV void	Perl_init_debugger(pTHX);
 PERL_CALLCONV int	Perl_init_i18nl10n(pTHX_ int printwarn);
+#ifndef NO_MATHOMS
 PERL_CALLCONV int	Perl_init_i18nl14n(pTHX_ int printwarn);
+#endif
 PERL_CALLCONV void	Perl_init_named_cv(pTHX_ CV *cv, OP *nameop);
 #define PERL_ARGS_ASSERT_INIT_NAMED_CV	\
 	assert(cv); assert(nameop)
@@ -1392,17 +1406,21 @@ PERL_CALLCONV OP*	Perl_invert(pTHX_ OP* cmd)
 PERL_CALLCONV bool	Perl_io_close(pTHX_ IO* io, GV *gv, bool not_implicit, bool warn_on_fail);
 #define PERL_ARGS_ASSERT_IO_CLOSE	\
 	assert(io)
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_isALNUM_lazy(pTHX_ const char* p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_ISALNUM_LAZY	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_isIDFIRST_lazy(pTHX_ const char* p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_ISIDFIRST_LAZY	\
 	assert(p)
+#endif
 
 /* PERL_CALLCONV bool	Perl_is_ascii_string(const U8* const s, STRLEN len)
 			__attribute__warn_unused_result__
@@ -1440,187 +1458,263 @@ PERL_STATIC_INLINE bool	S_is_strict_utf8_string_loclen(const U8 *s, STRLEN len,
 #define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING_LOCLEN	\
 	assert(s)
 #endif
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_alnum(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_alnum_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_alnumc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_alnumc_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_alpha(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_alpha_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_ascii(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_ascii_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_blank(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_blank_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_cntrl(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_cntrl_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_digit(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_digit_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_graph(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_graph_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_idfirst(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_idfirst_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_lower(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_lower_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_print(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_print_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_punct(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_punct_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_space(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_space_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_upper(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_upper_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_xdigit(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_uni_xdigit_lc(pTHX_ UV c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__
 			__attribute__pure__;
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_alnum(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_ALNUM	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_alnumc(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_ALNUMC	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_alpha(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_ALPHA	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_ascii(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_ASCII	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_blank(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_BLANK	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV STRLEN	Perl_is_utf8_char(const U8 *s)
 			__attribute__deprecated__;
 #define PERL_ARGS_ASSERT_IS_UTF8_CHAR	\
 	assert(s)
+#endif
 
 #ifndef NO_MATHOMS
 PERL_CALLCONV STRLEN	Perl_is_utf8_char_buf(const U8 *buf, const U8 *buf_end);
 #define PERL_ARGS_ASSERT_IS_UTF8_CHAR_BUF	\
 	assert(buf); assert(buf_end)
 #endif
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_cntrl(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_CNTRL	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_digit(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_DIGIT	\
 	assert(p)
+#endif
 
 /* PERL_CALLCONV bool	is_utf8_fixed_width_buf_flags(const U8 * const s, STRLEN len, const U32 flags); */
 /* PERL_CALLCONV bool	is_utf8_fixed_width_buf_loc_flags(const U8 * const s, STRLEN len, const U8 **ep, const U32 flags); */
@@ -1629,23 +1723,29 @@ PERL_STATIC_INLINE bool	S_is_utf8_fixed_width_buf_loclen_flags(const U8 * const
 #define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_LOCLEN_FLAGS	\
 	assert(s)
 #endif
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_graph(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_GRAPH	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_idcont(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_IDCONT	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_idfirst(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_IDFIRST	\
 	assert(p)
+#endif
 
 /* PERL_CALLCONV bool	is_utf8_invariant_string(const U8* const s, STRLEN len)
 			__attribute__warn_unused_result__; */
@@ -1657,53 +1757,69 @@ PERL_STATIC_INLINE bool	S_is_utf8_invariant_string_loc(const U8* const s, STRLEN
 	assert(s)
 #endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_lower(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_LOWER	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_mark(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_MARK	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_perl_space(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_PERL_SPACE	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_perl_word(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_PERL_WORD	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_posix_digit(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_POSIX_DIGIT	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_print(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_PRINT	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_punct(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_PUNCT	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_space(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_SPACE	\
 	assert(p)
+#endif
 
 /* PERL_CALLCONV bool	Perl_is_utf8_string(const U8 *s, STRLEN len)
 			__attribute__warn_unused_result__; */
@@ -1731,11 +1847,13 @@ PERL_STATIC_INLINE bool	S_is_utf8_string_loclen_flags(const U8 *s, STRLEN len, c
 #define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN_FLAGS	\
 	assert(s)
 #endif
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_upper(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_UPPER	\
 	assert(p)
+#endif
 
 /* PERL_CALLCONV bool	is_utf8_valid_partial_char(const U8 * const s, const U8 * const e)
 			__attribute__warn_unused_result__
@@ -1748,23 +1866,29 @@ PERL_STATIC_INLINE bool	S_is_utf8_valid_partial_char_flags(const U8 * const s, c
 	assert(s); assert(e)
 #endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_xdigit(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_XDIGIT	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_xidcont(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_XIDCONT	\
 	assert(p)
+#endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV bool	Perl_is_utf8_xidfirst(pTHX_ const U8 *p)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_XIDFIRST	\
 	assert(p)
+#endif
 
 PERL_CALLCONV bool	Perl_isinfnan(NV nv)
 			__attribute__warn_unused_result__
@@ -2465,9 +2589,11 @@ PERL_CALLCONV OP*	Perl_op_unscope(pTHX_ OP* o);
 PERL_CALLCONV void	Perl_optimize_optree(pTHX_ OP* o);
 #define PERL_ARGS_ASSERT_OPTIMIZE_OPTREE	\
 	assert(o)
+#ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_pack_cat(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags);
 #define PERL_ARGS_ASSERT_PACK_CAT	\
 	assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist); assert(next_in_list)
+#endif
 PERL_CALLCONV void	Perl_package(pTHX_ OP* o);
 #define PERL_ARGS_ASSERT_PACKAGE	\
 	assert(o)
@@ -2844,20 +2970,26 @@ PERL_CALLCONV void	Perl_save_item(pTHX_ SV* item);
 PERL_CALLCONV void	Perl_save_iv(pTHX_ IV *ivp);
 #define PERL_ARGS_ASSERT_SAVE_IV	\
 	assert(ivp)
+#ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_save_list(pTHX_ SV** sarg, I32 maxsarg);
 #define PERL_ARGS_ASSERT_SAVE_LIST	\
 	assert(sarg)
+#endif
+#ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_save_long(pTHX_ long* longp);
 #define PERL_ARGS_ASSERT_SAVE_LONG	\
 	assert(longp)
+#endif
 #ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_save_mortalizesv(pTHX_ SV* sv);
 #define PERL_ARGS_ASSERT_SAVE_MORTALIZESV	\
 	assert(sv)
 #endif
+#ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_save_nogv(pTHX_ GV* gv);
 #define PERL_ARGS_ASSERT_SAVE_NOGV	\
 	assert(gv)
+#endif
 #ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_save_op(pTHX);
 #endif
@@ -2983,7 +3115,11 @@ PERL_CALLCONV NV	Perl_str_to_version(pTHX_ SV *sv)
 PERL_CALLCONV void	Perl_sub_crush_depth(pTHX_ CV* cv);
 #define PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH	\
 	assert(cv)
-/* PERL_CALLCONV bool	sv_2bool(pTHX_ SV *const sv); */
+#ifndef NO_MATHOMS
+PERL_CALLCONV bool	Perl_sv_2bool(pTHX_ SV *const sv);
+#define PERL_ARGS_ASSERT_SV_2BOOL	\
+	assert(sv)
+#endif
 PERL_CALLCONV bool	Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags);
 #define PERL_ARGS_ASSERT_SV_2BOOL_FLAGS	\
 	assert(sv)
@@ -3173,7 +3309,9 @@ PERL_CALLCONV bool	Perl_sv_does_sv(pTHX_ SV* sv, SV* namesv, U32 flags)
 	assert(sv); assert(namesv)
 
 PERL_CALLCONV void	Perl_sv_dump(pTHX_ SV* sv);
-/* PERL_CALLCONV I32	sv_eq(pTHX_ SV* sv1, SV* sv2); */
+#ifndef NO_MATHOMS
+PERL_CALLCONV I32	Perl_sv_eq(pTHX_ SV* sv1, SV* sv2);
+#endif
 PERL_CALLCONV I32	Perl_sv_eq_flags(pTHX_ SV* sv1, SV* sv2, const U32 flags);
 #ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_sv_force_normal(pTHX_ SV *sv);
@@ -3211,9 +3349,11 @@ PERL_CALLCONV int	Perl_sv_isa(pTHX_ SV* sv, const char *const name);
 #define PERL_ARGS_ASSERT_SV_ISA	\
 	assert(name)
 PERL_CALLCONV int	Perl_sv_isobject(pTHX_ SV* sv);
+#ifndef NO_MATHOMS
 PERL_CALLCONV IV	Perl_sv_iv(pTHX_ SV* sv);
 #define PERL_ARGS_ASSERT_SV_IV	\
 	assert(sv)
+#endif
 PERL_CALLCONV STRLEN	Perl_sv_len(pTHX_ SV *const sv);
 PERL_CALLCONV STRLEN	Perl_sv_len_utf8(pTHX_ SV *const sv);
 PERL_CALLCONV STRLEN	Perl_sv_len_utf8_nomg(pTHX_ SV *const sv);
@@ -3247,9 +3387,11 @@ PERL_CALLCONV void	Perl_sv_nosharing(pTHX_ SV *sv);
 #ifndef NO_MATHOMS
 PERL_CALLCONV void	Perl_sv_nounlocking(pTHX_ SV *sv);
 #endif
+#ifndef NO_MATHOMS
 PERL_CALLCONV NV	Perl_sv_nv(pTHX_ SV* sv);
 #define PERL_ARGS_ASSERT_SV_NV	\
 	assert(sv)
+#endif
 #ifndef PERL_NO_INLINE_FUNCTIONS
 PERL_STATIC_INLINE bool	S_sv_only_taint_gmagic(SV *sv);
 #define PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC	\
@@ -3282,15 +3424,19 @@ PERL_CALLCONV char*	Perl_sv_pvbyte(pTHX_ SV *sv)
 	assert(sv)
 #endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV char*	Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp);
 #define PERL_ARGS_ASSERT_SV_PVBYTEN	\
 	assert(sv); assert(lp)
+#endif
 PERL_CALLCONV char*	Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp);
 #define PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE	\
 	assert(sv)
+#ifndef NO_MATHOMS
 PERL_CALLCONV char*	Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp);
 #define PERL_ARGS_ASSERT_SV_PVN	\
 	assert(sv); assert(lp)
+#endif
 #ifndef NO_MATHOMS
 PERL_CALLCONV char*	Perl_sv_pvn_force(pTHX_ SV* sv, STRLEN* lp);
 #define PERL_ARGS_ASSERT_SV_PVN_FORCE	\
@@ -3299,9 +3445,11 @@ PERL_CALLCONV char*	Perl_sv_pvn_force(pTHX_ SV* sv, STRLEN* lp);
 PERL_CALLCONV char*	Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags);
 #define PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS	\
 	assert(sv)
+#ifndef NO_MATHOMS
 PERL_CALLCONV char*	Perl_sv_pvn_nomg(pTHX_ SV* sv, STRLEN* lp);
 #define PERL_ARGS_ASSERT_SV_PVN_NOMG	\
 	assert(sv)
+#endif
 #ifndef NO_MATHOMS
 PERL_CALLCONV char*	Perl_sv_pvutf8(pTHX_ SV *sv)
 			__attribute__warn_unused_result__;
@@ -3309,9 +3457,11 @@ PERL_CALLCONV char*	Perl_sv_pvutf8(pTHX_ SV *sv)
 	assert(sv)
 #endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV char*	Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp);
 #define PERL_ARGS_ASSERT_SV_PVUTF8N	\
 	assert(sv); assert(lp)
+#endif
 PERL_CALLCONV char*	Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp);
 #define PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE	\
 	assert(sv)
@@ -3494,9 +3644,11 @@ PERL_CALLCONV STRLEN	Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV *const sv, const I
 #define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW	\
 	assert(sv)
 /* PERL_CALLCONV STRLEN	sv_utf8_upgrade_nomg(pTHX_ SV *sv); */
+#ifndef NO_MATHOMS
 PERL_CALLCONV UV	Perl_sv_uv(pTHX_ SV* sv);
 #define PERL_ARGS_ASSERT_SV_UV	\
 	assert(sv)
+#endif
 PERL_CALLCONV void	Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args);
 #define PERL_ARGS_ASSERT_SV_VCATPVF	\
 	assert(sv); assert(pat)
@@ -3549,23 +3701,29 @@ PERL_CALLCONV SSize_t	Perl_tmps_grow_p(pTHX_ SSize_t ix);
 PERL_CALLCONV UV	Perl_to_uni_lower(pTHX_ UV c, U8 *p, STRLEN *lenp);
 #define PERL_ARGS_ASSERT_TO_UNI_LOWER	\
 	assert(p); assert(lenp)
+#ifndef NO_MATHOMS
 PERL_CALLCONV U32	Perl_to_uni_lower_lc(pTHX_ U32 c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
 PERL_CALLCONV UV	Perl_to_uni_title(pTHX_ UV c, U8 *p, STRLEN *lenp);
 #define PERL_ARGS_ASSERT_TO_UNI_TITLE	\
 	assert(p); assert(lenp)
+#ifndef NO_MATHOMS
 PERL_CALLCONV U32	Perl_to_uni_title_lc(pTHX_ U32 c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
 PERL_CALLCONV UV	Perl_to_uni_upper(pTHX_ UV c, U8 *p, STRLEN *lenp);
 #define PERL_ARGS_ASSERT_TO_UNI_UPPER	\
 	assert(p); assert(lenp)
+#ifndef NO_MATHOMS
 PERL_CALLCONV U32	Perl_to_uni_upper_lc(pTHX_ U32 c)
 			__attribute__deprecated__
 			__attribute__warn_unused_result__;
+#endif
 
 #ifndef NO_MATHOMS
 PERL_CALLCONV UV	Perl_to_utf8_fold(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
@@ -3597,9 +3755,11 @@ PERL_CALLCONV UV	Perl_to_utf8_upper(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
 
 PERL_CALLCONV bool	Perl_try_amagic_bin(pTHX_ int method, int flags);
 PERL_CALLCONV bool	Perl_try_amagic_un(pTHX_ int method, int flags);
+#ifndef NO_MATHOMS
 PERL_CALLCONV SSize_t	Perl_unpack_str(pTHX_ const char *pat, const char *patend, const char *s, const char *strbeg, const char *strend, char **new_s, I32 ocnt, U32 flags);
 #define PERL_ARGS_ASSERT_UNPACK_STR	\
 	assert(pat); assert(patend); assert(s); assert(strend)
+#endif
 PERL_CALLCONV SSize_t	Perl_unpackstring(pTHX_ const char *pat, const char *patend, const char *s, const char *strend, U32 flags);
 #define PERL_ARGS_ASSERT_UNPACKSTRING	\
 	assert(pat); assert(patend); assert(s); assert(strend)
@@ -3657,18 +3817,22 @@ PERL_CALLCONV STRLEN	Perl_utf8_length(pTHX_ const U8* s, const U8 *e)
 PERL_CALLCONV U8*	Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *lenp);
 #define PERL_ARGS_ASSERT_UTF8_TO_BYTES	\
 	assert(s); assert(lenp)
+#ifndef NO_MATHOMS
 PERL_CALLCONV UV	Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen)
 			__attribute__deprecated__;
 #define PERL_ARGS_ASSERT_UTF8_TO_UVCHR	\
 	assert(s)
+#endif
 
 PERL_CALLCONV UV	Perl_utf8_to_uvchr_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen);
 #define PERL_ARGS_ASSERT_UTF8_TO_UVCHR_BUF	\
 	assert(s); assert(send)
+#ifndef NO_MATHOMS
 PERL_CALLCONV UV	Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
 			__attribute__deprecated__;
 #define PERL_ARGS_ASSERT_UTF8_TO_UVUNI	\
 	assert(s)
+#endif
 
 PERL_CALLCONV UV	Perl_utf8_to_uvuni_buf(pTHX_ const U8 *s, const U8 *send, STRLEN *retlen)
 			__attribute__deprecated__;
@@ -3712,10 +3876,12 @@ PERL_STATIC_INLINE UV	Perl_valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen)
 	assert(s)
 #endif
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV UV	Perl_valid_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
 			__attribute__deprecated__;
 #define PERL_ARGS_ASSERT_VALID_UTF8_TO_UVUNI	\
 	assert(s)
+#endif
 
 PERL_CALLCONV bool	Perl_validate_proto(pTHX_ SV *name, SV *proto, bool warn, bool curstash);
 #define PERL_ARGS_ASSERT_VALIDATE_PROTO	\
@@ -4480,10 +4646,12 @@ PERL_CALLCONV char*	Perl_form_nocontext(const char* pat, ...)
 #define PERL_ARGS_ASSERT_FORM_NOCONTEXT	\
 	assert(pat)
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV int	Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
 			__attribute__format__(__printf__,2,3);
 #define PERL_ARGS_ASSERT_FPRINTF_NOCONTEXT	\
 	assert(stream); assert(format)
+#endif
 
 PERL_CALLCONV void	Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...);
 #define PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT	\
@@ -4498,10 +4666,12 @@ PERL_CALLCONV SV*	Perl_newSVpvf_nocontext(const char *const pat, ...)
 #define PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT	\
 	assert(pat)
 
+#ifndef NO_MATHOMS
 PERL_CALLCONV int	Perl_printf_nocontext(const char *format, ...)
 			__attribute__format__(__printf__,1,2);
 #define PERL_ARGS_ASSERT_PRINTF_NOCONTEXT	\
 	assert(format)
+#endif
 
 PERL_CALLCONV void	Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
 			__attribute__format__(__printf__,2,3);
@@ -6236,7 +6406,11 @@ PERL_CALLCONV char*	Perl_mem_collxfrm(pTHX_ const char* input_string, STRLEN len
 #define PERL_ARGS_ASSERT_MEM_COLLXFRM	\
 	assert(input_string); assert(xlen)
 #endif
-/* PERL_CALLCONV char*	sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp); */
+#ifndef NO_MATHOMS
+PERL_CALLCONV char*	Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp);
+#define PERL_ARGS_ASSERT_SV_COLLXFRM	\
+	assert(sv); assert(nxp)
+#endif
 PERL_CALLCONV char*	Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, I32 const flags);
 #define PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS	\
 	assert(sv); assert(nxp)
-- 
2.5.0.windows.1

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Apr 12, 2018

From @khwilliamson

On 04/11/2018 12​:31 AM, bulk88 (via RT) wrote​:

# New Ticket Created by bulk88
# Please include the string​: [perl #133098]
# in the subject line of all future correspondence about this issue.
# <URL​: https://rt-archive.perl.org/perl5/Ticket/Display.html?id=133098 >

This is a bug report for perl from bulk88@​hotmail.com,
generated with the help of perlbug 1.41 running under perl 5.27.9.

-----------------------------------------------------------------
[Please describe your issue here]

See attached patch. This probably should go into 5.28 but I'm not 100%
sure because of timing and some risk of leaving out a symbol/CPAN
breakage, but I'll guess I'm the only person in the world who compiles
-DNO_MATHOMS since nobody else noticed the problem in 2 yrs, so if a
symbol is left out that shouldn't have been, oh well, the feature was
broken in the last stable anyway. Better than waiting a year. Backport
too since its been broken since 5.25.0-5.25.1.

See also
https://www.nntp.perl.org/group/perl.perl5.porters/2018/04/msg250381.html

My default mode of compiling is -DNO_MATHOMS, so that I would find any
breakage. But I just use the default options on Windows dromedary, so
wouldn't see it there.

AIX has long had warnings like this​:
ld​: 0711-319 WARNING​: Exported symbol not defined​: ASCII_TO_NEED

which I never thought was high enough priority to investigate. But this
ticket explains it.

I tried your patch on Linux, and surprisingly to me, it generated test
failures

# Failed test 1 in t/pv_tools.t at line 54
# Test 7 got​: "N\\375 Batter\\355" (t/pv_tools.t at line 64)
# Expected​: "N\\303\\275 Batter\\303"
# Test 9 got​: "\\301g\\346tis Byrju..." (t/pv_tools.t at line 67)
# Expected​: "\\303\\201g\\303\\246t..."

which I haven't investigated.

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Apr 12, 2018

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Apr 12, 2018

From @bulk88

On Wed, 11 Apr 2018 21​:02​:03 -0700, public@​khwilliamson.com wrote​:

My default mode of compiling is -DNO_MATHOMS, so that I would find any
breakage. But I just use the default options on Windows dromedary, so
wouldn't see it there.

AIX has long had warnings like this​:
ld​: 0711-319 WARNING​: Exported symbol not defined​: ASCII_TO_NEED

which I never thought was high enough priority to investigate. But this
ticket explains it.

I tried your patch on Linux, and surprisingly to me, it generated test
failures

# Failed test 1 in t/pv_tools.t at line 54
# Test 7 got​: "N\\375 Batter\\355" (t/pv_tools.t at line 64)
# Expected​: "N\\303\\275 Batter\\303"
# Test 9 got​: "\\301g\\346tis Byrju..." (t/pv_tools.t at line 67)
# Expected​: "\\303\\201g\\303\\246t..."

which I haven't investigated.

I also get test failures in ../dist/Devel-PPPort/t/pv_tools.t


C​:\perl521\srcnew\win32>cd ..\t & perl harness -v ../dist/Devel-PPPort/t/pv_to
ols.t & cd ..\win32
../dist/Devel-PPPort/t/pv_tools.t ..
1..13
# Running under perl version 5.027011 for MSWin32
# Current time local​: Thu Apr 12 07​:41​:46 2018
# Current time GMT​: Thu Apr 12 11​:41​:46 2018
# Using Test.pm version 1.31
# Failed test 1 in t/pv_tools.t at line 54
not ok 1
# Test 7 got​: "N\\375 Batter\\355" (t/pv_tools.t at line 64)
ok 2# Expected​: "N\\303\\275 Batter\\303"

ok 3
# Test 9 got​: "\\301g\\346tis Byrju..." (t/pv_tools.t at line 67)
ok 4
# Expected​: "\\303\\201g\\303\\246t..."
ok 5
ok 6
not ok 7
ok 8
not ok 9
ok 10
ok 11
ok 12
ok 13
Failed 3/13 subtests

Test Summary Report


../dist/Devel-PPPort/t/pv_tools.t (Wstat​: 0 Tests​: 13 Failed​: 3)
  Failed tests​: 1, 7, 9
Files=1, Tests=13, 0 wallclock secs ( 0.02 usr + 0.00 sys = 0.02 CPU)
Result​: FAIL

C​:\perl521\srcnew\win32>


--
bulk88 ~ bulk88 at hotmail.com

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Apr 12, 2018

From @bulk88

First test failure,


void
pv_escape_can_unicode()
  PPCODE​:
#if defined(is_utf8_string) && defined(utf8_to_uvchr)
  XSRETURN_YES;
#else
  XSRETURN_NO;
#endif



my $uni = &Devel​::PPPort​::pv_escape_can_unicode();

# sanity check
ok($uni ? $] >= 5.006 : $] < 5.008);


Since CPP macro utf8_to_uvchr is now undefined because of -DNO_MATHOMS and embed.h, while before I think the macro was defined to the Perl_utf8_to_uvchr, but nothing ever in core referenced the C symbol so it all linked together even tho the func isn't defined anywhere.

So thats the first test fail.

utf8_to_uvchr was moved to mathoms.c in 5.21.1 https://perl5.git.perl.org/perl.git/commitdiff/f2645549e6a4bfca055b5fd1932da462df424921

utf8_to_uvchr was supposedly added in 5.7.1.

ppport uses utf8_to_uvchr as part of its pv_escape replacement https​://perl5.git.perl.org/perl.git/blob/5f6af817add6d2df3603e0e94b6eb27ba5fb3970​:/dist/Devel-PPPort/parts/inc/pv_tools#l74 but native pv_escape was added in 5.9.4 supposedly, so 5.21.1 and up that deprecated/removed utf8_to_uvchr() in -DNO_MATHOMS will never run into a link failure because they will always use native pv_escape and not the ppport.h fill in. The native pv_escape uses utf8_to_uvchr_buf() instead of utf8_to_uvchr() https​://perl5.git.perl.org/perl.git/blob/5f6af817add6d2df3603e0e94b6eb27ba5fb3970​:/dump.c#l166 since https://perl5.git.perl.org/perl.git/commitdiff/4b88fb76efce8c436e63b907c9842345d4fa77c7 in 5.15.9

If I add a ! op to dist/Devel-PPPort/t/pv_tools.t


my $uni = &Devel​::PPPort​::pv_escape_can_unicode();
$uni = ! $uni;

# sanity check
ok($uni ? $] >= 5.006 : $] < 5.008);


the rest of the tests pass.

So who is at fault? ppport or p5p for deprecating utf8_to_uvchr()?

We cud stick an

#ifndef utf8_to_uvchr
# define utf8_to_uvchr(a,b) Perl_utf8_to_uvchr(aTHX_ a,b)
#endif

to counteract

#ifndef NO_MATHOMS
#define utf8_to_uvchr(a,b) Perl_utf8_to_uvchr(aTHX_ a,b)
#endif

in the perl headers somewhere, or change

https://perl5.git.perl.org/perl.git/blob/5f6af817add6d2df3603e0e94b6eb27ba5fb3970:/dist/Devel-PPPort/parts/inc/pv_tools#l206


void
pv_escape_can_unicode()
  PPCODE​:
#if defined(is_utf8_string) && (defined(utf8_to_uvchr) || defined(utf8_to_uvchr_buf))
  XSRETURN_YES;
#else
  XSRETURN_NO;
#endif


--
bulk88 ~ bulk88 at hotmail.com

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Apr 15, 2018

From @khwilliamson

I think its best to add safety as far back as possible, so I would want to define utf8_to_uvchr_buf in ppport.h in terms of plain utf8_to_uvchr, as they differ mainly in that the _buf version has better malformation checking. But alas, I could not get ppport stuff to work. So doing that change has to be deferred.

So, in the meantime, I merely moved utf8_to_uvchr() away from mathoms.c, so it will always be defined. Commit 7723e00 did that.

Then the patch for this ticket works, and was pushed as
1545ba5
--
Karl Williamson

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Apr 15, 2018

@khwilliamson - Status changed from 'open' to 'pending release'

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Jun 23, 2018

From @khwilliamson

Thank you for filing this report. You have helped make Perl better.

With the release yesterday of Perl 5.28.0, this and 185 other issues have been
resolved.

Perl 5.28.0 may be downloaded via​:
https://metacpan.org/release/XSAWYERX/perl-5.28.0

If you find that the problem persists, feel free to reopen this ticket.

@p5pRT
Copy link
Author

@p5pRT p5pRT commented Jun 23, 2018

@khwilliamson - Status changed from 'pending release' to 'resolved'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant