X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=win32%2Fdl_win32.xs;h=69910dd53906e7fd42f0f0d828fed2a651261acf;hb=0a7c7f4fca760548390159c148b40caeb4e5a91d;hp=b9d4c14bd3ae85b96ced66f1c0429d83dc787db5;hpb=e3b8966e2a0e0357b86674327ee528dbb5f122a6;p=p5sagit%2Fp5-mst-13.2.git diff --git a/win32/dl_win32.xs b/win32/dl_win32.xs index b9d4c14..69910dd 100644 --- a/win32/dl_win32.xs +++ b/win32/dl_win32.xs @@ -24,21 +24,39 @@ calls. #include #include +#define PERL_NO_GET_CONTEXT + #include "EXTERN.h" #include "perl.h" - -#ifdef PERL_OBJECT -#define NO_XSLOCKS -#endif /* PERL_OBJECT */ +#include "win32.h" #include "XSUB.h" +typedef struct { + SV * x_error_sv; +} my_cxtx_t; /* this *must* be named my_cxtx_t */ + +#define DL_CXT_EXTRA /* ask for dl_cxtx to be defined in dlutils.c */ #include "dlutils.c" /* SaveError() etc */ +#define dl_error_sv (dl_cxtx.x_error_sv) + +static char * +OS_Error_String(pTHX) +{ + dMY_CXT; + DWORD err = GetLastError(); + STRLEN len; + if (!dl_error_sv) + dl_error_sv = newSVpvn("",0); + PerlProc_GetOSError(dl_error_sv,err); + return SvPV(dl_error_sv,len); +} + static void -dl_private_init(CPERLarg) +dl_private_init(pTHX) { - (void)dl_generic_private_init(THIS); + (void)dl_generic_private_init(aTHX); } /* @@ -80,7 +98,7 @@ dl_static_linked(char *filename) MODULE = DynaLoader PACKAGE = DynaLoader BOOT: - (void)dl_private_init(THIS); + (void)dl_private_init(aTHX); void * dl_load_file(filename,flags=0) @@ -88,31 +106,35 @@ dl_load_file(filename,flags=0) int flags PREINIT: CODE: - DLDEBUG(1,PerlIO_printf(PerlIO_stderr(),"dl_load_file(%s):\n", filename)); - if (dl_static_linked(filename) == 0) - RETVAL = (void*) LoadLibraryEx(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ) ; + { + DLDEBUG(1,PerlIO_printf(Perl_debug_log,"dl_load_file(%s):\n", filename)); + if (dl_static_linked(filename) == 0) { + RETVAL = PerlProc_DynaLoad(filename); + } else RETVAL = (void*) GetModuleHandle(NULL); - DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," libref=%x\n", RETVAL)); + DLDEBUG(2,PerlIO_printf(Perl_debug_log," libref=%x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL) - SaveError(THIS_ "%d",GetLastError()) ; + SaveError(aTHX_ "load_file:%s", + OS_Error_String(aTHX)) ; else sv_setiv( ST(0), (IV)RETVAL); - + } void * dl_find_symbol(libhandle, symbolname) void * libhandle char * symbolname CODE: - DLDEBUG(2,PerlIO_printf(PerlIO_stderr(),"dl_find_symbol(handle=%x, symbol=%s)\n", + DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_find_symbol(handle=%x, symbol=%s)\n", libhandle, symbolname)); RETVAL = (void*) GetProcAddress((HINSTANCE) libhandle, symbolname); - DLDEBUG(2,PerlIO_printf(PerlIO_stderr()," symbolref = %x\n", RETVAL)); + DLDEBUG(2,PerlIO_printf(Perl_debug_log," symbolref = %x\n", RETVAL)); ST(0) = sv_newmortal() ; if (RETVAL == NULL) - SaveError(THIS_ "%d",GetLastError()) ; + SaveError(aTHX_ "find_symbol:%s", + OS_Error_String(aTHX)) ; else sv_setiv( ST(0), (IV)RETVAL); @@ -131,15 +153,18 @@ dl_install_xsub(perl_name, symref, filename="$Package") void * symref char * filename CODE: - DLDEBUG(2,PerlIO_printf(PerlIO_stderr(),"dl_install_xsub(name=%s, symref=%x)\n", + DLDEBUG(2,PerlIO_printf(Perl_debug_log,"dl_install_xsub(name=%s, symref=%x)\n", perl_name, symref)); - ST(0)=sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)(CV* _CPERLarg))symref, filename))); + ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name, + (void(*)(pTHX_ CV *))symref, + filename))); char * dl_error() CODE: - RETVAL = LastError ; + dMY_CXT; + RETVAL = dl_last_error; OUTPUT: RETVAL