diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/DynaLoader/DynaLoader_pm.PL | 4 | ||||
-rw-r--r-- | ext/DynaLoader/dl_aix.xs | 12 | ||||
-rw-r--r-- | ext/DynaLoader/dl_dllload.xs | 7 | ||||
-rw-r--r-- | ext/DynaLoader/dl_dlopen.xs | 13 | ||||
-rw-r--r-- | ext/DynaLoader/dl_dyld.xs | 10 | ||||
-rw-r--r-- | ext/DynaLoader/dl_freemint.xs | 10 | ||||
-rw-r--r-- | ext/DynaLoader/dl_hpux.xs | 5 | ||||
-rw-r--r-- | ext/DynaLoader/dl_symbian.xs | 15 | ||||
-rw-r--r-- | ext/DynaLoader/dl_vms.xs | 5 | ||||
-rw-r--r-- | ext/DynaLoader/dl_win32.xs | 12 |
10 files changed, 54 insertions, 39 deletions
diff --git a/ext/DynaLoader/DynaLoader_pm.PL b/ext/DynaLoader/DynaLoader_pm.PL index 376b03c252..5166cc4c31 100644 --- a/ext/DynaLoader/DynaLoader_pm.PL +++ b/ext/DynaLoader/DynaLoader_pm.PL @@ -376,7 +376,7 @@ sub bootstrap { my $boot_symbol_ref; <<$^O-eq-darwin>> - if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) { + if ($boot_symbol_ref = dl_find_symbol(0, $bootname, 1)) { goto boot; #extension library has already been loaded, e.g. darwin } <</$^O-eq-darwin>> @@ -545,7 +545,7 @@ sub dl_find_symbol_anywhere my $sym = shift; my $libref; foreach $libref (@dl_librefs) { - my $symref = dl_find_symbol($libref,$sym); + my $symref = dl_find_symbol($libref,$sym,1); return $symref if $symref; } return undef; diff --git a/ext/DynaLoader/dl_aix.xs b/ext/DynaLoader/dl_aix.xs index 137af19d4d..c95d6c581d 100644 --- a/ext/DynaLoader/dl_aix.xs +++ b/ext/DynaLoader/dl_aix.xs @@ -721,9 +721,10 @@ dl_unload_file(libref) RETVAL void -dl_find_symbol(libhandle, symbolname) +dl_find_symbol(libhandle, symbolname, ign_err=0) void * libhandle char * symbolname + int ign_err PREINIT: void *retv; CODE: @@ -731,10 +732,11 @@ dl_find_symbol(libhandle, symbolname) libhandle, symbolname)); retv = dlsym(libhandle, symbolname); DLDEBUG(2,PerlIO_printf(Perl_debug_log, " symbolref = %x\n", retv)); - ST(0) = sv_newmortal() ; - if (retv == NULL) - SaveError(aTHX_ "%s",dlerror()) ; - else + ST(0) = sv_newmortal(); + if (retv == NULL) { + if (!ign_err) + SaveError(aTHX_ "%s", dlerror()); + } else sv_setiv( ST(0), PTR2IV(retv)); diff --git a/ext/DynaLoader/dl_dllload.xs b/ext/DynaLoader/dl_dllload.xs index aac2f7bd76..838245d70f 100644 --- a/ext/DynaLoader/dl_dllload.xs +++ b/ext/DynaLoader/dl_dllload.xs @@ -141,9 +141,10 @@ dl_unload_file(libref) void -dl_find_symbol(libhandle, symbolname) +dl_find_symbol(libhandle, symbolname, ign_err=0) void * libhandle char * symbolname + int ign_err PREINIT: void *retv; PPCODE: @@ -154,9 +155,9 @@ dl_find_symbol(libhandle, symbolname) retv = dllqueryvar(libhandle, symbolname); DLDEBUG(2, PerlIO_printf(Perl_debug_log, " symbolref = %lx\n", (unsigned long) retv)); - ST(0) = sv_newmortal() ; + ST(0) = sv_newmortal(); if (retv == NULL) - SaveError(aTHX_ "%s",strerror(errno)) ; + if (!ign_err) SaveError(aTHX_ "%s", strerror(errno)); else sv_setiv( ST(0), PTR2IV(retv)); XSRETURN(1); diff --git a/ext/DynaLoader/dl_dlopen.xs b/ext/DynaLoader/dl_dlopen.xs index d4fea890f8..172da13ce7 100644 --- a/ext/DynaLoader/dl_dlopen.xs +++ b/ext/DynaLoader/dl_dlopen.xs @@ -12,6 +12,7 @@ * basic FreeBSD support, removed ClearError * 29th February 2000 - Alan Burlison: Added functionality to close dlopen'd * files when the interpreter exits + * 2015-03-12 - rurban: Added optional 3rd dl_find_symbol argument * */ @@ -217,9 +218,10 @@ dl_unload_file(libref) void -dl_find_symbol(libhandle, symbolname) +dl_find_symbol(libhandle, symbolname, ign_err=0) void * libhandle char * symbolname + int ign_err PREINIT: void *sym; CODE: @@ -232,10 +234,11 @@ dl_find_symbol(libhandle, symbolname) sym = dlsym(libhandle, symbolname); DLDEBUG(2, PerlIO_printf(Perl_debug_log, " symbolref = %lx\n", (unsigned long) sym)); - ST(0) = sv_newmortal() ; - if (sym == NULL) - SaveError(aTHX_ "%s",dlerror()) ; - else + ST(0) = sv_newmortal(); + if (sym == NULL) { + if (!ign_err) + SaveError(aTHX_ "%s", dlerror()); + } else sv_setiv( ST(0), PTR2IV(sym)); diff --git a/ext/DynaLoader/dl_dyld.xs b/ext/DynaLoader/dl_dyld.xs index 7822878518..45361ed858 100644 --- a/ext/DynaLoader/dl_dyld.xs +++ b/ext/DynaLoader/dl_dyld.xs @@ -174,9 +174,10 @@ dl_load_file(filename, flags=0) void * -dl_find_symbol(libhandle, symbolname) +dl_find_symbol(libhandle, symbolname, ign_err=0) void * libhandle char * symbolname + int ign_err CODE: symbolname = Perl_form_nocontext("_%s", symbolname); DLDEBUG(2, PerlIO_printf(Perl_debug_log, @@ -186,9 +187,10 @@ dl_find_symbol(libhandle, symbolname) DLDEBUG(2, PerlIO_printf(Perl_debug_log, " symbolref = %lx\n", (unsigned long) RETVAL)); ST(0) = sv_newmortal() ; - if (RETVAL == NULL) - SaveError(aTHX_ "%s",dlerror()) ; - else + if (RETVAL == NULL) { + if (!ign_err) + SaveError(aTHX_ "%s",dlerror()) ; + } else sv_setiv( ST(0), PTR2IV(RETVAL) ); diff --git a/ext/DynaLoader/dl_freemint.xs b/ext/DynaLoader/dl_freemint.xs index 9ecafa03c7..9f37257006 100644 --- a/ext/DynaLoader/dl_freemint.xs +++ b/ext/DynaLoader/dl_freemint.xs @@ -144,9 +144,10 @@ haverror: void -dl_find_symbol(libhandle, symbolname) +dl_find_symbol(libhandle, symbolname, ign_err=0) void * libhandle char * symbolname + int ign_err PREINIT: void *retv; CODE: @@ -155,9 +156,10 @@ dl_find_symbol(libhandle, symbolname) retv = (void *)dld_get_func(symbolname); DLDEBUG(2,PerlIO_printf(Perl_debug_log, " symbolref = %x\n", (unsigned int)retv)); ST(0) = sv_newmortal() ; - if (retv == NULL) - SaveError(aTHX_ "dl_find_symbol: Unable to find '%s' symbol", symbolname) ; - else + if (retv == NULL) { + if (!ign_err) + SaveError(aTHX_ "dl_find_symbol: Unable to find '%s' symbol", symbolname) ; + } else sv_setiv(ST(0), PTR2IV(retv)); XSRETURN(1); diff --git a/ext/DynaLoader/dl_hpux.xs b/ext/DynaLoader/dl_hpux.xs index 0ed0173e82..82cee5430d 100644 --- a/ext/DynaLoader/dl_hpux.xs +++ b/ext/DynaLoader/dl_hpux.xs @@ -118,9 +118,10 @@ dl_unload_file(libref) void -dl_find_symbol(libhandle, symbolname) +dl_find_symbol(libhandle, symbolname, ign_err=0) void * libhandle char * symbolname + int ign_err PREINIT: shl_t obj = (shl_t) libhandle; void *symaddr = NULL; @@ -145,7 +146,7 @@ dl_find_symbol(libhandle, symbolname) } if (status == -1) { - SaveError(aTHX_ "%s",(errno) ? Strerror(errno) : "Symbol not found") ; + if (!ign_err) SaveError(aTHX_ "%s",(errno) ? Strerror(errno) : "Symbol not found") ; } else { sv_setiv( ST(0), PTR2IV(symaddr) ); } diff --git a/ext/DynaLoader/dl_symbian.xs b/ext/DynaLoader/dl_symbian.xs index 562b034c04..d75bb8195d 100644 --- a/ext/DynaLoader/dl_symbian.xs +++ b/ext/DynaLoader/dl_symbian.xs @@ -163,8 +163,8 @@ dl_load_file(filename, flags=0) if (h && h->error == KErrNone) sv_setiv(ST(0), PTR2IV(h)); else - PerlIO_printf(Perl_debug_log, "(dl_load_file %s %d)", - filename, h ? h->error : -1); + SaveError(aTHX_ "(dl_load_file %s %d)" + filename, h ? h->error : -1); } @@ -178,20 +178,23 @@ dl_unload_file(libhandle) void -dl_find_symbol(libhandle, symbolname) + dl_find_symbol(libhandle, symbolname, ign_err=0) void * libhandle char * symbolname + int ign_err PREINIT: void *sym; CODE: PerlSymbianLibHandle* h = (PerlSymbianLibHandle*)libhandle; sym = dlsym(libhandle, symbolname); ST(0) = sv_newmortal(); - if (sym) + if (sym) { sv_setiv(ST(0), PTR2IV(sym)); - else - PerlIO_printf(Perl_debug_log, "(dl_find_symbol %s %d)", + } else { + if (!ign_err) + SaveError(aTHX_ "(dl_find_symbol %s %d)", symbolname, h ? h->error : -1); + } void diff --git a/ext/DynaLoader/dl_vms.xs b/ext/DynaLoader/dl_vms.xs index ca8d54f6d2..1a17793a52 100644 --- a/ext/DynaLoader/dl_vms.xs +++ b/ext/DynaLoader/dl_vms.xs @@ -301,9 +301,10 @@ dl_load_file(filename, flags=0) void -dl_find_symbol(librefptr,symname) +dl_find_symbol(librefptr,symname,ign_err=0) void * librefptr SV * symname + int ign_err PREINIT: struct libref thislib = *((struct libref *)librefptr); struct dsc$descriptor_s @@ -321,7 +322,7 @@ dl_find_symbol(librefptr,symname) DLDEBUG(2,PerlIO_printf(Perl_debug_log, "\tentry point is %d\n", (unsigned long int) entry)); if (!(sts & 1)) { - dl_set_error(sts,0); + if (!ign_err) dl_set_error(sts,0); ST(0) = &PL_sv_undef; } else ST(0) = sv_2mortal(newSViv(PTR2IV(entry))); diff --git a/ext/DynaLoader/dl_win32.xs b/ext/DynaLoader/dl_win32.xs index 605b63fda3..2177b3b231 100644 --- a/ext/DynaLoader/dl_win32.xs +++ b/ext/DynaLoader/dl_win32.xs @@ -157,9 +157,10 @@ dl_unload_file(libref) RETVAL void -dl_find_symbol(libhandle, symbolname) +dl_find_symbol(libhandle, symbolname, ign_err=0) void * libhandle char * symbolname + int ign_err PREINIT: void *retv; CODE: @@ -167,11 +168,10 @@ dl_find_symbol(libhandle, symbolname) libhandle, symbolname)); retv = (void*) GetProcAddress((HINSTANCE) libhandle, symbolname); DLDEBUG(2,PerlIO_printf(Perl_debug_log," symbolref = %x\n", retv)); - ST(0) = sv_newmortal() ; - if (retv == NULL) - SaveError(aTHX_ "find_symbol:%s", - OS_Error_String(aTHX)) ; - else + ST(0) = sv_newmortal(); + if (retv == NULL) { + if (!ign_err) SaveError(aTHX_ "find_symbol:%s", OS_Error_String(aTHX)); + } else sv_setiv( ST(0), (IV)retv); |