move dMY_CXT in dlutils.c closer to first use
authorDaniel Dragan <bulk88@hotmail.com>
Fri, 10 Oct 2014 20:11:25 +0000 (16:11 -0400)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 10 Oct 2014 21:52:14 +0000 (14:52 -0700)
By computing dMY_CXT right before its first and usually last use, my_cxt
pointer doesn't need to be carried across function calls in SaveError. This
frees a C stack auto and/or register from being saved and restored in
SaveError. On VC 2003 32 bits -O1 threaded, the machine code size in bytes
dropped from 0x72 to 0x70 after this patch.

ext/DynaLoader/dlutils.c

index ffcd109..70703b1 100644 (file)
@@ -132,7 +132,6 @@ dl_generic_private_init(pTHX)       /* called by dl_*.xs dl_private_init() */
 static void
 SaveError(pTHX_ const char* pat, ...)
 {
-    dMY_CXT;
     va_list args;
     SV *msv;
     const char *message;
@@ -147,9 +146,12 @@ SaveError(pTHX_ const char* pat, ...)
     message = SvPV(msv,len);
     len++;             /* include terminating null char */
 
+    {
+       dMY_CXT;
     /* Copy message into dl_last_error (including terminating null char) */
-    sv_setpvn(MY_CXT.x_dl_last_error, message, len) ;
-    DLDEBUG(2,PerlIO_printf(Perl_debug_log, "DynaLoader: stored error msg '%s'\n",dl_last_error));
+       sv_setpvn(MY_CXT.x_dl_last_error, message, len) ;
+       DLDEBUG(2,PerlIO_printf(Perl_debug_log, "DynaLoader: stored error msg '%s'\n",dl_last_error));
+    }
 }
 #endif