In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/42037ad6a00723dfac1ddfb747c39cf563f1fab4?hp=ae6bdd37b100ecaba3f858c0375997681062d5b6>

- Log -----------------------------------------------------------------
commit 42037ad6a00723dfac1ddfb747c39cf563f1fab4
Author: Steve Hay <[email protected]>
Date:   Mon Oct 15 08:35:59 2012 +0100

    Bump $Win32CORE::VERSION following commit 35f601d964

M       ext/Win32CORE/Win32CORE.pm

commit 35f601d964ee4d1402116250f95cdafa9dfc4a29
Author: Daniel Dragan <[email protected]>
Date:   Mon Oct 8 21:00:06 2012 -0400

    have Win32CORE use ALIAS/XSANY
    
    Using XSANY in addition to a struct of strings, saved 650 bytes (.rdata
    and .text combined, 32bit/MS VC2K3/O1) from the previous implementation of
    Win32CORE. Instead of encoding pointers or relative pointer sized offsets
    to string literals, use unsigned chars. Instead of creating new XSUB C
    function stubs, one per forwarded sub, use the ALIAS/XSANY feature and
    have only 1 XSUB which has many names. If a length aware version of newXS
    is ever added to perl, the sub names's lengths already are available. See
    also commit eff5b9d539e for something similar to this commit.

M       ext/Win32CORE/Win32CORE.c
-----------------------------------------------------------------------

Summary of changes:
 ext/Win32CORE/Win32CORE.c  |  138 +++++++++++++++++++++++++++-----------------
 ext/Win32CORE/Win32CORE.pm |    2 +-
 2 files changed, 86 insertions(+), 54 deletions(-)

diff --git a/ext/Win32CORE/Win32CORE.c b/ext/Win32CORE/Win32CORE.c
index 943ca86..22f6adf 100644
--- a/ext/Win32CORE/Win32CORE.c
+++ b/ext/Win32CORE/Win32CORE.c
@@ -21,11 +21,15 @@
 #include "perl.h"
 #include "XSUB.h"
 
-static void
-forward(pTHX_ const char *function)
-{
+
+XS(w32_CORE_all){
     dXSARGS;
     DWORD err = GetLastError();
+    /* capture the XSANY value before Perl_load_module, the CV's any member 
will
+     * be overwritten by Perl_load_module and subsequent newXSes or pure perl
+     * subs
+     */
+    const char *function  = (const char *) XSANY.any_ptr;
     Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpvn("Win32",5), 
newSVnv(0.27));
     SetLastError(err);
     SPAGAIN;
@@ -33,35 +37,6 @@ forward(pTHX_ const char *function)
     call_pv(function, GIMME_V);
 }
 
-#define FORWARD(function) XS(w32_##function){ forward(aTHX_ 
"Win32::"#function); }
-FORWARD(GetCwd)
-FORWARD(SetCwd)
-FORWARD(GetNextAvailDrive)
-FORWARD(GetLastError)
-FORWARD(SetLastError)
-FORWARD(LoginName)
-FORWARD(NodeName)
-FORWARD(DomainName)
-FORWARD(FsType)
-FORWARD(GetOSVersion)
-FORWARD(IsWinNT)
-FORWARD(IsWin95)
-FORWARD(FormatMessage)
-FORWARD(Spawn)
-FORWARD(GetTickCount)
-FORWARD(GetShortPathName)
-FORWARD(GetFullPathName)
-FORWARD(GetLongPathName)
-FORWARD(CopyFile)
-FORWARD(Sleep)
-
-/* Don't forward Win32::SetChildShowWindow().  It accesses the internal 
variable
- * w32_showwindow in thread_intern and is therefore not implemented in 
Win32.xs.
- */
-/* FORWARD(SetChildShowWindow) */
-
-#undef FORWARD
-
 XS_EXTERNAL(boot_Win32CORE)
 {
     /* This function only exists because writemain.SH, lib/ExtUtils/Embed.pm
@@ -79,27 +54,84 @@ init_Win32CORE(pTHX)
      * is not yet fully initialized, so don't do anything fancy in here.
      */
 
-    char *file = __FILE__;
+    static const struct {
+       char Win32__GetCwd [sizeof("Win32::GetCwd")];
+       char Win32__SetCwd [sizeof("Win32::SetCwd")];
+       char Win32__GetNextAvailDrive [sizeof("Win32::GetNextAvailDrive")];
+       char Win32__GetLastError [sizeof("Win32::GetLastError")];
+       char Win32__SetLastError [sizeof("Win32::SetLastError")];
+       char Win32__LoginName [sizeof("Win32::LoginName")];
+       char Win32__NodeName [sizeof("Win32::NodeName")];
+       char Win32__DomainName [sizeof("Win32::DomainName")];
+       char Win32__FsType [sizeof("Win32::FsType")];
+       char Win32__GetOSVersion [sizeof("Win32::GetOSVersion")];
+       char Win32__IsWinNT [sizeof("Win32::IsWinNT")];
+       char Win32__IsWin95 [sizeof("Win32::IsWin95")];
+       char Win32__FormatMessage [sizeof("Win32::FormatMessage")];
+       char Win32__Spawn [sizeof("Win32::Spawn")];
+       char Win32__GetTickCount [sizeof("Win32::GetTickCount")];
+       char Win32__GetShortPathName [sizeof("Win32::GetShortPathName")];
+       char Win32__GetFullPathName [sizeof("Win32::GetFullPathName")];
+       char Win32__GetLongPathName [sizeof("Win32::GetLongPathName")];
+       char Win32__CopyFile [sizeof("Win32::CopyFile")];
+       char Win32__Sleep [sizeof("Win32::Sleep")];
+    } fnname_table = {
+       "Win32::GetCwd",
+       "Win32::SetCwd",
+       "Win32::GetNextAvailDrive",
+       "Win32::GetLastError",
+       "Win32::SetLastError",
+       "Win32::LoginName",
+       "Win32::NodeName",
+       "Win32::DomainName",
+       "Win32::FsType",
+       "Win32::GetOSVersion",
+       "Win32::IsWinNT",
+       "Win32::IsWin95",
+       "Win32::FormatMessage",
+       "Win32::Spawn",
+       "Win32::GetTickCount",
+       "Win32::GetShortPathName",
+       "Win32::GetFullPathName",
+       "Win32::GetLongPathName",
+       "Win32::CopyFile",
+       "Win32::Sleep"
+    };
+
+    static const unsigned char fnname_lens [] = {
+       sizeof("Win32::GetCwd"),
+       sizeof("Win32::SetCwd"),
+       sizeof("Win32::GetNextAvailDrive"),
+       sizeof("Win32::GetLastError"),
+       sizeof("Win32::SetLastError"),
+       sizeof("Win32::LoginName"),
+       sizeof("Win32::NodeName"),
+       sizeof("Win32::DomainName"),
+       sizeof("Win32::FsType"),
+       sizeof("Win32::GetOSVersion"),
+       sizeof("Win32::IsWinNT"),
+       sizeof("Win32::IsWin95"),
+       sizeof("Win32::FormatMessage"),
+       sizeof("Win32::Spawn"),
+       sizeof("Win32::GetTickCount"),
+       sizeof("Win32::GetShortPathName"),
+       sizeof("Win32::GetFullPathName"),
+       sizeof("Win32::GetLongPathName"),
+       sizeof("Win32::CopyFile"),
+       sizeof("Win32::Sleep")
+    };
+    const unsigned char * len = (const unsigned char *)&fnname_lens;
+    const char * function = (char *)&fnname_table;
+    while (function < (char *)&fnname_table + sizeof(fnname_table)) {
+       const char * const file = __FILE__;
+       CV * const cv = newXS(function, w32_CORE_all, file);
+       XSANY.any_ptr = (void *)function;
+       function += *len++;
+    }
 
-    newXS("Win32::GetCwd", w32_GetCwd, file);
-    newXS("Win32::SetCwd", w32_SetCwd, file);
-    newXS("Win32::GetNextAvailDrive", w32_GetNextAvailDrive, file);
-    newXS("Win32::GetLastError", w32_GetLastError, file);
-    newXS("Win32::SetLastError", w32_SetLastError, file);
-    newXS("Win32::LoginName", w32_LoginName, file);
-    newXS("Win32::NodeName", w32_NodeName, file);
-    newXS("Win32::DomainName", w32_DomainName, file);
-    newXS("Win32::FsType", w32_FsType, file);
-    newXS("Win32::GetOSVersion", w32_GetOSVersion, file);
-    newXS("Win32::IsWinNT", w32_IsWinNT, file);
-    newXS("Win32::IsWin95", w32_IsWin95, file);
-    newXS("Win32::FormatMessage", w32_FormatMessage, file);
-    newXS("Win32::Spawn", w32_Spawn, file);
-    newXS("Win32::GetTickCount", w32_GetTickCount, file);
-    newXS("Win32::GetShortPathName", w32_GetShortPathName, file);
-    newXS("Win32::GetFullPathName", w32_GetFullPathName, file);
-    newXS("Win32::GetLongPathName", w32_GetLongPathName, file);
-    newXS("Win32::CopyFile", w32_CopyFile, file);
-    newXS("Win32::Sleep", w32_Sleep, file);
+
+    /* Don't forward Win32::SetChildShowWindow().  It accesses the internal 
variable
+     * w32_showwindow in thread_intern and is therefore not implemented in 
Win32.xs.
+     */
     /* newXS("Win32::SetChildShowWindow", w32_SetChildShowWindow, file); */
 }
diff --git a/ext/Win32CORE/Win32CORE.pm b/ext/Win32CORE/Win32CORE.pm
index f89bfab..1ea847b 100644
--- a/ext/Win32CORE/Win32CORE.pm
+++ b/ext/Win32CORE/Win32CORE.pm
@@ -1,6 +1,6 @@
 package Win32CORE;
 
-$VERSION = '0.03';
+$VERSION = '0.04';
 
 # There is no reason to load this module explicitly.  It will be
 # initialized using xs_init() when the interpreter is constructed.

--
Perl5 Master Repository

Reply via email to