This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Make PL_uudmap a constant global. Remove the run time initialisation
authorNicholas Clark <nick@ccl4.org>
Tue, 24 Apr 2007 23:10:05 +0000 (23:10 +0000)
committerNicholas Clark <nick@ccl4.org>
Tue, 24 Apr 2007 23:10:05 +0000 (23:10 +0000)
code, and instead use it to generate a header at perl build time.
By removing uudmap from the interpreter structure we save 256 bytes
per child thread.

p4raw-id: //depot/perl@31059

MANIFEST
Makefile.SH
embedvar.h
intrpvar.h
perl.h
perlapi.h
pp_pack.c
sv.c
vms/descrip_mms.template
win32/Makefile
win32/makefile.mk

index d19974e..6c0959e 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1270,6 +1270,7 @@ ext/XS/Typemap/Typemap.xs XS::Typemap extension
 fakesdio.h                     stdio in terms of PerlIO
 fakethr.h                      Fake threads header
 form.h                         Public declarations for formats
 fakesdio.h                     stdio in terms of PerlIO
 fakethr.h                      Fake threads header
 form.h                         Public declarations for formats
+generate_uudmap.c              Generate uudmap.h, the uuencode decoding map
 genpacksizetables.pl           Generate the size tables for pack/unpack
 globals.c                      File to declare global symbols (for shared library)
 global.sym                     Symbols that need hiding when embedded
 genpacksizetables.pl           Generate the size tables for pack/unpack
 globals.c                      File to declare global symbols (for shared library)
 global.sym                     Symbols that need hiding when embedded
index 5d51410..3d8cae0 100644 (file)
@@ -483,6 +483,14 @@ opmini.c: op.c
 opmini\$(OBJ_EXT): opmini.c
        \$(CCCMD) \$(PLDLFLAGS) $DPERL_EXTERNAL_GLOB opmini.c
 
 opmini\$(OBJ_EXT): opmini.c
        \$(CCCMD) \$(PLDLFLAGS) $DPERL_EXTERNAL_GLOB opmini.c
 
+globals\$(OBJ_EXT): uudmap.h
+
+uudmap.h: generate_uudmap\$(EXE_EXT)
+       ./generate_uudmap\$(EXE_EXT) >uudmap.h
+
+generate_uudmap\$(EXE_EXT): generate_uudmap\$(OBJ_EXT)
+       \$(CC) -o generate_uudmap \$(LDFLAGS) generate_uudmap\$(OBJ_EXT) \$(libs)
+
 !GROK!THIS!
 $spitshell >>Makefile <<'!NO!SUBS!'
 miniperlmain$(OBJ_EXT): miniperlmain.c patchlevel.h
 !GROK!THIS!
 $spitshell >>Makefile <<'!NO!SUBS!'
 miniperlmain$(OBJ_EXT): miniperlmain.c patchlevel.h
@@ -1048,7 +1056,7 @@ veryclean:        _verycleaner _mopup _clobber
 
 # Do not 'make _mopup' directly.
 _mopup:
 
 # Do not 'make _mopup' directly.
 _mopup:
-       rm -f *$(OBJ_EXT) *$(LIB_EXT) all perlmain.c opmini.c
+       rm -f *$(OBJ_EXT) *$(LIB_EXT) all perlmain.c opmini.c uudmap.h generate_uudmap$(EXE_EXT)
        -rmdir .depending
        -@test -f extra.pods && rm -f `cat extra.pods`
        -@test -f vms/README_vms.pod && rm -f vms/README_vms.pod
        -rmdir .depending
        -@test -f extra.pods && rm -f `cat extra.pods`
        -@test -f vms/README_vms.pod && rm -f vms/README_vms.pod
index 9c53978..e55941a 100644 (file)
 #define PL_utf8_xdigit         (vTHX->Iutf8_xdigit)
 #define PL_utf8cache           (vTHX->Iutf8cache)
 #define PL_utf8locale          (vTHX->Iutf8locale)
 #define PL_utf8_xdigit         (vTHX->Iutf8_xdigit)
 #define PL_utf8cache           (vTHX->Iutf8cache)
 #define PL_utf8locale          (vTHX->Iutf8locale)
-#define PL_uudmap              (vTHX->Iuudmap)
 #define PL_warnhook            (vTHX->Iwarnhook)
 #define PL_xmlfp               (vTHX->Ixmlfp)
 
 #define PL_warnhook            (vTHX->Iwarnhook)
 #define PL_xmlfp               (vTHX->Ixmlfp)
 
 #define PL_Iutf8_xdigit                PL_utf8_xdigit
 #define PL_Iutf8cache          PL_utf8cache
 #define PL_Iutf8locale         PL_utf8locale
 #define PL_Iutf8_xdigit                PL_utf8_xdigit
 #define PL_Iutf8cache          PL_utf8cache
 #define PL_Iutf8locale         PL_utf8locale
-#define PL_Iuudmap             PL_uudmap
 #define PL_Iwarnhook           PL_warnhook
 #define PL_Ixmlfp              PL_xmlfp
 
 #define PL_Iwarnhook           PL_warnhook
 #define PL_Ixmlfp              PL_xmlfp
 
index 751784c..4c56f9b 100644 (file)
@@ -391,7 +391,6 @@ PERLVARI(Iglob_index,       int,    0)
 
 PERLVAR(Iparser,       yy_parser *)    /* current parser state */
 
 
 PERLVAR(Iparser,       yy_parser *)    /* current parser state */
 
-PERLVARA(Iuudmap,256,  char)
 PERLVAR(Ibitcount,     char *)
 
 PERLVAR(Ipsig_ptr, SV**)
 PERLVAR(Ibitcount,     char *)
 
 PERLVAR(Ipsig_ptr, SV**)
diff --git a/perl.h b/perl.h
index b22a3f7..51155f0 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -4058,11 +4058,14 @@ EXTCONST char PL_memory_wrap[]
 EXTCONST char PL_uuemap[65]
   INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
 
 EXTCONST char PL_uuemap[65]
   INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
 
-
 #ifdef DOINIT
 #ifdef DOINIT
+EXTCONST char PL_uudmap[256] =
+#include "uudmap.h"
+;
 EXTCONST char* const PL_sig_name[] = { SIG_NAME };
 EXTCONST int         PL_sig_num[]  = { SIG_NUM };
 #else
 EXTCONST char* const PL_sig_name[] = { SIG_NAME };
 EXTCONST int         PL_sig_num[]  = { SIG_NUM };
 #else
+EXTCONST char PL_uudmap[256];
 EXTCONST char* const PL_sig_name[];
 EXTCONST int         PL_sig_num[];
 #endif
 EXTCONST char* const PL_sig_name[];
 EXTCONST int         PL_sig_num[];
 #endif
index 11eabbc..177257a 100644 (file)
--- a/perlapi.h
+++ b/perlapi.h
@@ -632,8 +632,6 @@ END_EXTERN_C
 #define PL_utf8cache           (*Perl_Iutf8cache_ptr(aTHX))
 #undef  PL_utf8locale
 #define PL_utf8locale          (*Perl_Iutf8locale_ptr(aTHX))
 #define PL_utf8cache           (*Perl_Iutf8cache_ptr(aTHX))
 #undef  PL_utf8locale
 #define PL_utf8locale          (*Perl_Iutf8locale_ptr(aTHX))
-#undef  PL_uudmap
-#define PL_uudmap              (*Perl_Iuudmap_ptr(aTHX))
 #undef  PL_warnhook
 #define PL_warnhook            (*Perl_Iwarnhook_ptr(aTHX))
 #undef  PL_xmlfp
 #undef  PL_warnhook
 #define PL_warnhook            (*Perl_Iwarnhook_ptr(aTHX))
 #undef  PL_xmlfp
index 8e49932..7aa95a9 100644 (file)
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -2082,22 +2082,6 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c
            break;
 #endif
        case 'u':
            break;
 #endif
        case 'u':
-           /* MKS:
-            * Initialise the decode mapping.  By using a table driven
-             * algorithm, the code will be character-set independent
-             * (and just as fast as doing character arithmetic)
-             */
-            if (PL_uudmap[(U8)'M'] == 0) {
-               size_t i;
-
-               for (i = 0; i < sizeof(PL_uuemap); ++i)
-                    PL_uudmap[(U8)PL_uuemap[i]] = i;
-                /*
-                 * Because ' ' and '`' map to the same value,
-                 * we need to decode them both the same.
-                 */
-                PL_uudmap[(U8)' '] = 0;
-            }
            {
                 const STRLEN l = (STRLEN) (strend - s) * 3 / 4;
                sv = sv_2mortal(newSV(l));
            {
                 const STRLEN l = (STRLEN) (strend - s) * 3 / 4;
                sv = sv_2mortal(newSV(l));
diff --git a/sv.c b/sv.c
index c49f478..879aec9 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -11322,7 +11322,6 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags,
 
     PL_glob_index      = proto_perl->Iglob_index;
     PL_srand_called    = proto_perl->Isrand_called;
 
     PL_glob_index      = proto_perl->Iglob_index;
     PL_srand_called    = proto_perl->Isrand_called;
-    PL_uudmap[(U32) 'M']       = 0;    /* reinits on demand */
     PL_bitcount                = NULL; /* reinits on demand */
 
     if (proto_perl->Ipsig_pend) {
     PL_bitcount                = NULL; /* reinits on demand */
 
     if (proto_perl->Ipsig_pend) {
index ee831e6..2602bb9 100644 (file)
@@ -464,6 +464,14 @@ $(DBG)perl$(E) : perlmain$(O), $(DBG)perlshr$(E), $(MINIPERL_EXE)
 $(DBG)perlshr$(E) : $(DBG)libperl$(OLB) $(extobj) $(DBG)perlshr_xtras.ts
        Link $(LINKFLAGS)/Share=$(MMS$TARGET) $(extobj) []$(DBG)perlshr_bld.opt/Option, perlshr_attr.opt/Option
 
 $(DBG)perlshr$(E) : $(DBG)libperl$(OLB) $(extobj) $(DBG)perlshr_xtras.ts
        Link $(LINKFLAGS)/Share=$(MMS$TARGET) $(extobj) []$(DBG)perlshr_bld.opt/Option, perlshr_attr.opt/Option
 
+globals$(O): uudmap.h
+
+uudmap.h: generate_uudmap.exe
+       MCR generate_uudmap.exe >uudmap.h
+
+generate_uudmap.exe: generate_uudmap$(O)
+       Link $(LINKFLAGS)/NoDebug/Trace/NoMap/NoFull/NoCross/Exe=$(MMS$TARGET) generate_uudmap$(O) $(CRTLOPTS)
+
 # The following files are built in one go by gen_shrfls.pl:
 #  perlshr_attr.opt, $(DBG)perlshr_bld.opt - VAX and AXP
 #  perlshr_gbl*.mar, perlshr_gbl*$(O) - VAX only
 # The following files are built in one go by gen_shrfls.pl:
 #  perlshr_attr.opt, $(DBG)perlshr_bld.opt - VAX and AXP
 #  perlshr_gbl*.mar, perlshr_gbl*$(O) - VAX only
@@ -1748,6 +1756,9 @@ tidy : cleanlis
        - If F$Search("vmsish.h;-1").nes."" Then Purge/NoConfirm/Log vmsish.h
        - If F$Search("vms.c;-1")   .nes."" Then Purge/NoConfirm/Log vms.c
        - If F$Search("perlmain.c;-1")   .nes."" Then Purge/NoConfirm/Log perlmain.c
        - If F$Search("vmsish.h;-1").nes."" Then Purge/NoConfirm/Log vmsish.h
        - If F$Search("vms.c;-1")   .nes."" Then Purge/NoConfirm/Log vms.c
        - If F$Search("perlmain.c;-1")   .nes."" Then Purge/NoConfirm/Log perlmain.c
+       - If F$Search("uudmap.h;-1")   .nes."" Then Purge/NoConfirm/Log uudmap.h
+       - If F$Search("generate_uudmap.exe;-1")   .nes."" Then Purge/NoConfirm/Log generate_uudmap.exe
+       - If F$Search("generate_uudmap$(O);-1")   .nes."" Then Purge/NoConfirm/Log generate_uudmap$(O)
        - If F$Search("Perlshr_Gbl*.Mar;-1")   .nes."" Then Purge/NoConfirm/Log Perlshr_Gbl*.Mar
        - If F$Search("[.ext.DynaLoader]dl_vms$(O);-1").nes."" Then Purge/NoConfirm/Log [.ext.DynaLoader]dl_vms$(O)
        - If F$Search("[.ext.DynaLoader]dl_vms.c;-1").nes."" Then Purge/NoConfirm/Log [.ext.DynaLoader]dl_vms.c
        - If F$Search("Perlshr_Gbl*.Mar;-1")   .nes."" Then Purge/NoConfirm/Log Perlshr_Gbl*.Mar
        - If F$Search("[.ext.DynaLoader]dl_vms$(O);-1").nes."" Then Purge/NoConfirm/Log [.ext.DynaLoader]dl_vms$(O)
        - If F$Search("[.ext.DynaLoader]dl_vms.c;-1").nes."" Then Purge/NoConfirm/Log [.ext.DynaLoader]dl_vms.c
index d654fae..f189cc8 100644 (file)
@@ -957,6 +957,15 @@ $(X2P) : $(MINIPERL) $(X2P_OBJ)
 <<
        $(EMBED_EXE_MANI)
 
 <<
        $(EMBED_EXE_MANI)
 
+globals$(o) : uudmap.h
+
+uudmap.h: generate_uudmap.exe
+       generate_uudmap >uudmap.h
+
+generate_uudmap.exe : generate_uudmap$(o)
+       $(LINK32) -subsystem:console -out:$@ @<<
+               $(LINK_FLAGS) $(LIBFILES) generate_uudmap$(o)
+
 perlmain.c : runperl.c
        copy runperl.c perlmain.c
 
 perlmain.c : runperl.c
        copy runperl.c perlmain.c
 
@@ -1274,6 +1283,7 @@ _clean :
        -@$(DEL) $(PERLSTATICLIB)
        -@$(DEL) $(PERLDLL)
        -@$(DEL) $(CORE_OBJ)
        -@$(DEL) $(PERLSTATICLIB)
        -@$(DEL) $(PERLDLL)
        -@$(DEL) $(CORE_OBJ)
+       -@$(DEL) generate_uudmap.exe generate_uudmap$(o) uudmap.h
        -if exist $(MINIDIR) rmdir /s /q $(MINIDIR)
        -if exist $(UNIDATADIR1) rmdir /s /q $(UNIDATADIR1)
        -if exist $(UNIDATADIR2) rmdir /s /q $(UNIDATADIR2)
        -if exist $(MINIDIR) rmdir /s /q $(MINIDIR)
        -if exist $(UNIDATADIR1) rmdir /s /q $(UNIDATADIR1)
        -if exist $(UNIDATADIR2) rmdir /s /q $(UNIDATADIR2)
index d632b16..069e883 100644 (file)
@@ -1266,6 +1266,23 @@ $(X2P) : $(MINIPERL) $(X2P_OBJ)
        $(EMBED_EXE_MANI)
 .ENDIF
 
        $(EMBED_EXE_MANI)
 .ENDIF
 
+globals$(o) : uudmap.h
+
+uudmap.h: generate_uudmap.exe
+       generate_uudmap >uudmap.h
+
+generate_uudmap.exe : generate_uudmap$(o)
+.IF "$(CCTYPE)" == "BORLAND"
+       $(LINK32) -Tpe -ap $(BLINK_FLAGS) \
+           @$(mktmp c0x32$(o) generate_uudmap$(o),$(@:s,\,$B,),,$(LIBFILES),)
+.ELIF "$(CCTYPE)" == "GCC"
+       $(LINK32) -v -o $@ $(BLINK_FLAGS) \
+           $(mktmp $(LKPRE) generate_uudmap$(o) $(LIBFILES) $(LKPOST))
+.ELSE
+       $(LINK32) -subsystem:console -out:$@ $(BLINK_FLAGS) \
+           @$(mktmp $(LIBFILES) generate_uudmap$(o))
+.ENDIF
+
 perlmain.c : runperl.c
        copy runperl.c perlmain.c
 
 perlmain.c : runperl.c
        copy runperl.c perlmain.c
 
@@ -1605,6 +1622,7 @@ _clean :
        -@erase $(PERLSTATICLIB)
        -@erase $(PERLDLL)
        -@erase $(CORE_OBJ)
        -@erase $(PERLSTATICLIB)
        -@erase $(PERLDLL)
        -@erase $(CORE_OBJ)
+       -@erase generate_uudmap.exe generate_uudmap$(o) uudmap.h
        -if exist $(MINIDIR) rmdir /s /q $(MINIDIR)
        -if exist $(UNIDATADIR1) rmdir /s /q $(UNIDATADIR1)
        -if exist $(UNIDATADIR2) rmdir /s /q $(UNIDATADIR2)
        -if exist $(MINIDIR) rmdir /s /q $(MINIDIR)
        -if exist $(UNIDATADIR1) rmdir /s /q $(UNIDATADIR1)
        -if exist $(UNIDATADIR2) rmdir /s /q $(UNIDATADIR2)