New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[PATCH 8-10/11] DynaLoader 1.33 various #14587
Comments
From @rurbanThis is a bug report for perl from rurban@cpanel.net, 3 DynaLoader patches: DynaLoader/dl_*.xs: Define all PERL_IN_DL_*_XS markers extend t/DynaLoader.t to be run from basedir also. This simplifies testing Flags: Site configuration information for perl 5.21.9: Configured by rurban at Sun Feb 22 17:14:55 CET 2015. Summary of my perl5 (revision 5 version 21 subversion 9) configuration: Locally applied patches: @INC for perl 5.21.9: Environment for perl 5.21.9: |
From @rurban0001-DynaLoader-1.33-dl_find_symbol-add-3rd-optional-argu.patchFrom 55bd87dd771088846624e0f790443631d23ef09e Mon Sep 17 00:00:00 2001
From: Reini Urban <rurban@cpanel.net>
Date: Thu, 12 Mar 2015 23:45:51 +0100
Subject: [PATCH 1/4] DynaLoader 1.33 dl_find_symbol add 3rd optional argument
On Darwin DynaLoader::bootstrap tries dl_find_symbol first with libhandle 0,
to see if the shlib with the symbol is already loaded, e.g. with libc.
We do not want to store the dl_last_error information for this mostly
failing probe, so add an optional ign_err=0 argument.
Similar for dl_find_symbol_anywhere, which is expected to fail for all librefs.
Also support dl_last_error on symbian, as on all other platforms.
---
ext/DynaLoader/DynaLoader_pm.PL | 6 +++---
ext/DynaLoader/dl_aix.xs | 12 +++++++-----
ext/DynaLoader/dl_dllload.xs | 7 ++++---
ext/DynaLoader/dl_dlopen.xs | 13 ++++++++-----
ext/DynaLoader/dl_dyld.xs | 10 ++++++----
ext/DynaLoader/dl_freemint.xs | 10 ++++++----
ext/DynaLoader/dl_hpux.xs | 5 +++--
ext/DynaLoader/dl_symbian.xs | 15 +++++++++------
ext/DynaLoader/dl_vms.xs | 5 +++--
ext/DynaLoader/dl_win32.xs | 12 ++++++------
10 files changed, 55 insertions(+), 40 deletions(-)
diff --git ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/DynaLoader_pm.PL
index 45dd6d3..bc8e6bb 100644
--- ext/DynaLoader/DynaLoader_pm.PL
+++ ext/DynaLoader/DynaLoader_pm.PL
@@ -85,7 +85,7 @@ package DynaLoader;
# Tim.Bunce@ig.co.uk, August 1994
BEGIN {
- $VERSION = '1.32';
+ $VERSION = '1.33';
}
use Config;
@@ -372,7 +372,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>>
@@ -543,7 +543,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 ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_aix.xs
index 137af19..c95d6c5 100644
--- ext/DynaLoader/dl_aix.xs
+++ 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 ext/DynaLoader/dl_dllload.xs ext/DynaLoader/dl_dllload.xs
index aac2f7b..838245d 100644
--- ext/DynaLoader/dl_dllload.xs
+++ 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 ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_dlopen.xs
index 3dce1ef..2ff9019 100644
--- ext/DynaLoader/dl_dlopen.xs
+++ 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
*
*/
@@ -216,9 +217,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:
@@ -231,10 +233,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 ext/DynaLoader/dl_dyld.xs ext/DynaLoader/dl_dyld.xs
index 7822878..45361ed 100644
--- ext/DynaLoader/dl_dyld.xs
+++ 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 ext/DynaLoader/dl_freemint.xs ext/DynaLoader/dl_freemint.xs
index 9ecafa0..9f37257 100644
--- ext/DynaLoader/dl_freemint.xs
+++ 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 ext/DynaLoader/dl_hpux.xs ext/DynaLoader/dl_hpux.xs
index 0ed0173..82cee54 100644
--- ext/DynaLoader/dl_hpux.xs
+++ 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 ext/DynaLoader/dl_symbian.xs ext/DynaLoader/dl_symbian.xs
index 562b034..d75bb81 100644
--- ext/DynaLoader/dl_symbian.xs
+++ 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 ext/DynaLoader/dl_vms.xs ext/DynaLoader/dl_vms.xs
index ca8d54f..1a17793 100644
--- ext/DynaLoader/dl_vms.xs
+++ 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 ext/DynaLoader/dl_win32.xs ext/DynaLoader/dl_win32.xs
index 605b63f..e916f7e 100644
--- ext/DynaLoader/dl_win32.xs
+++ 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);
--
2.1.4
|
From @rurban0002-DynaLoader-dl_-.xs-Define-all-PERL_IN_DL_-_XS-marker.patchFrom 8a6ad40879464caa88483a9b9a703a69a95519b6 Mon Sep 17 00:00:00 2001
From: Reini Urban <rurban@cpanel.net>
Date: Sat, 14 Mar 2015 10:04:53 +0100
Subject: [PATCH 2/4] DynaLoader/dl_*.xs: Define all PERL_IN_DL_*_XS markers
On Symbian harmonize with the rest.
---
ext/DynaLoader/dl_aix.xs | 1 +
ext/DynaLoader/dl_dllload.xs | 1 +
ext/DynaLoader/dl_dyld.xs | 1 +
ext/DynaLoader/dl_freemint.xs | 1 +
ext/DynaLoader/dl_none.xs | 1 +
ext/DynaLoader/dl_symbian.xs | 2 +-
ext/DynaLoader/dl_vms.xs | 1 +
ext/DynaLoader/dl_win32.xs | 1 +
symbian/symbian_proto.h | 2 +-
9 files changed, 9 insertions(+), 2 deletions(-)
diff --git ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_aix.xs
index c95d6c5..8e7d8ac 100644
--- ext/DynaLoader/dl_aix.xs
+++ ext/DynaLoader/dl_aix.xs
@@ -13,6 +13,7 @@
#define PERLIO_NOT_STDIO 0
#define PERL_EXT
+#define PERL_IN_DL_AIX_XS
/*
* On AIX 4.3 and above the emulation layer is not needed any more, and
diff --git ext/DynaLoader/dl_dllload.xs ext/DynaLoader/dl_dllload.xs
index 838245d..84484d6 100644
--- ext/DynaLoader/dl_dllload.xs
+++ ext/DynaLoader/dl_dllload.xs
@@ -86,6 +86,7 @@
#define PERL_EXT
#include "EXTERN.h"
+#define PERL_IN_DL_DLLLOAD_XS
#include "perl.h"
#include "XSUB.h"
diff --git ext/DynaLoader/dl_dyld.xs ext/DynaLoader/dl_dyld.xs
index 45361ed..38a3840 100644
--- ext/DynaLoader/dl_dyld.xs
+++ ext/DynaLoader/dl_dyld.xs
@@ -41,6 +41,7 @@ been tested on NeXT platforms.
#define PERL_EXT
#include "EXTERN.h"
+#define PERL_IN_DL_DYLD_XS
#include "perl.h"
#include "XSUB.h"
diff --git ext/DynaLoader/dl_freemint.xs ext/DynaLoader/dl_freemint.xs
index 9f37257..e932a42 100644
--- ext/DynaLoader/dl_freemint.xs
+++ ext/DynaLoader/dl_freemint.xs
@@ -39,6 +39,7 @@
#define PERL_EXT
#include "EXTERN.h"
+#define PERL_IN_DL_FREEMINT_XS
#include "perl.h"
#include "XSUB.h"
diff --git ext/DynaLoader/dl_none.xs ext/DynaLoader/dl_none.xs
index 2914177..d2cb2bc 100644
--- ext/DynaLoader/dl_none.xs
+++ ext/DynaLoader/dl_none.xs
@@ -5,6 +5,7 @@
#define PERL_EXT
#include "EXTERN.h"
+#define PERL_IN_DL_NONE_XS
#include "perl.h"
#include "XSUB.h"
diff --git ext/DynaLoader/dl_symbian.xs ext/DynaLoader/dl_symbian.xs
index d75bb81..3d3c038 100644
--- ext/DynaLoader/dl_symbian.xs
+++ ext/DynaLoader/dl_symbian.xs
@@ -25,8 +25,8 @@
* only after that the Perl ones. Otherwise you will get a lot
* trouble because of Symbian's New(), Copy(), etc definitions. */
-#define DL_SYMBIAN_XS
#define PERL_EXT
+#define PERL_IN_DL_SYMBIAN_XS
#include "EXTERN.h"
#include "perl.h"
diff --git ext/DynaLoader/dl_vms.xs ext/DynaLoader/dl_vms.xs
index 1a17793..6a32fc1 100644
--- ext/DynaLoader/dl_vms.xs
+++ ext/DynaLoader/dl_vms.xs
@@ -47,6 +47,7 @@
#define PERL_EXT
#include "EXTERN.h"
+#define PERL_IN_DL_VMS_XS
#include "perl.h"
#include "XSUB.h"
diff --git ext/DynaLoader/dl_win32.xs ext/DynaLoader/dl_win32.xs
index e916f7e..b5104d8 100644
--- ext/DynaLoader/dl_win32.xs
+++ ext/DynaLoader/dl_win32.xs
@@ -26,6 +26,7 @@ calls.
#define PERL_NO_GET_CONTEXT
#define PERL_EXT
+#define PERL_IN_DL_WIN32_XS
#include "EXTERN.h"
#include "perl.h"
diff --git symbian/symbian_proto.h symbian/symbian_proto.h
index d289fb4..7226663 100644
--- symbian/symbian_proto.h
+++ symbian/symbian_proto.h
@@ -17,7 +17,7 @@
/* We can't include the <string.h> unconditionally
* since it has prototypes conflicting with the gcc builtins. */
extern void *memchr(const void *s, int c, size_t n);
-#ifndef DL_SYMBIAN_XS
+#ifndef PERL_IN_DL_SYMBIAN_XS
/* dl_symbian.xs needs to see the C++ prototype of memset() instead */
extern void *memset(void *s, int c, size_t n);
extern size_t strlen(const char *s);
--
2.1.4
|
From @rurban0003-DynaLoader-extend-t-DynaLoader.t-to-be-run-from-base.patchFrom 02674f4e5b1d20cca57193b2f7246a8461e6818a Mon Sep 17 00:00:00 2001
From: Reini Urban <rurban@cpanel.net>
Date: Wed, 11 Mar 2015 18:11:53 +0100
Subject: [PATCH 3/4] DynaLoader: extend t/DynaLoader.t to be run from basedir
also
This simplifies testing from core.
---
ext/DynaLoader/t/DynaLoader.t | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git ext/DynaLoader/t/DynaLoader.t ext/DynaLoader/t/DynaLoader.t
index 3ac8d08..31cb4e4 100644
--- ext/DynaLoader/t/DynaLoader.t
+++ ext/DynaLoader/t/DynaLoader.t
@@ -2,7 +2,12 @@
use strict;
use Config;
-require '../../t/test.pl';
+push @INC, '.';
+if (-f 't/test.pl') {
+ require 't/test.pl';
+} else {
+ require '../../t/test.pl';
+}
my %modules;
--
2.1.4
|
From @tonycozOn Sat Mar 14 03:56:00 2015, rurban@cpanel.net wrote:
This patch breaks the build on Win32, presumably because of this: --- ext/DynaLoader/dl_win32.xs void Tony |
The RT System itself - Status changed from 'new' to 'open' |
From @rurbanOn 03/30/2015 01:38 AM, Tony Cook via RT wrote:
Good catch. I didn't test win32 and symbian. |
From @rurban0001-DynaLoader-1.33-dl_find_symbol-add-3rd-optional-argu.patchFrom 55bd87dd771088846624e0f790443631d23ef09e Mon Sep 17 00:00:00 2001
From: Reini Urban <rurban@cpanel.net>
Date: Thu, 12 Mar 2015 23:45:51 +0100
Subject: [PATCH 01/37] DynaLoader 1.33 dl_find_symbol add 3rd optional
argument
On Darwin DynaLoader::bootstrap tries dl_find_symbol first with libhandle 0,
to see if the shlib with the symbol is already loaded, e.g. with libc.
We do not want to store the dl_last_error information for this mostly
failing probe, so add an optional ign_err=0 argument.
Similar for dl_find_symbol_anywhere, which is expected to fail for all librefs.
Also support dl_last_error on symbian, as on all other platforms.
---
ext/DynaLoader/DynaLoader_pm.PL | 6 +++---
ext/DynaLoader/dl_aix.xs | 12 +++++++-----
ext/DynaLoader/dl_dllload.xs | 7 ++++---
ext/DynaLoader/dl_dlopen.xs | 13 ++++++++-----
ext/DynaLoader/dl_dyld.xs | 10 ++++++----
ext/DynaLoader/dl_freemint.xs | 10 ++++++----
ext/DynaLoader/dl_hpux.xs | 5 +++--
ext/DynaLoader/dl_symbian.xs | 15 +++++++++------
ext/DynaLoader/dl_vms.xs | 5 +++--
ext/DynaLoader/dl_win32.xs | 12 ++++++------
10 files changed, 55 insertions(+), 40 deletions(-)
diff --git ext/DynaLoader/DynaLoader_pm.PL ext/DynaLoader/DynaLoader_pm.PL
index 45dd6d3..bc8e6bb 100644
--- ext/DynaLoader/DynaLoader_pm.PL
+++ ext/DynaLoader/DynaLoader_pm.PL
@@ -85,7 +85,7 @@ package DynaLoader;
# Tim.Bunce@ig.co.uk, August 1994
BEGIN {
- $VERSION = '1.32';
+ $VERSION = '1.33';
}
use Config;
@@ -372,7 +372,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>>
@@ -543,7 +543,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 ext/DynaLoader/dl_aix.xs ext/DynaLoader/dl_aix.xs
index 137af19..c95d6c5 100644
--- ext/DynaLoader/dl_aix.xs
+++ 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 ext/DynaLoader/dl_dllload.xs ext/DynaLoader/dl_dllload.xs
index aac2f7b..838245d 100644
--- ext/DynaLoader/dl_dllload.xs
+++ 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 ext/DynaLoader/dl_dlopen.xs ext/DynaLoader/dl_dlopen.xs
index 3dce1ef..2ff9019 100644
--- ext/DynaLoader/dl_dlopen.xs
+++ 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
*
*/
@@ -216,9 +217,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:
@@ -231,10 +233,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 ext/DynaLoader/dl_dyld.xs ext/DynaLoader/dl_dyld.xs
index 7822878..45361ed 100644
--- ext/DynaLoader/dl_dyld.xs
+++ 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 ext/DynaLoader/dl_freemint.xs ext/DynaLoader/dl_freemint.xs
index 9ecafa0..9f37257 100644
--- ext/DynaLoader/dl_freemint.xs
+++ 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 ext/DynaLoader/dl_hpux.xs ext/DynaLoader/dl_hpux.xs
index 0ed0173..82cee54 100644
--- ext/DynaLoader/dl_hpux.xs
+++ 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 ext/DynaLoader/dl_symbian.xs ext/DynaLoader/dl_symbian.xs
index 562b034..d75bb81 100644
--- ext/DynaLoader/dl_symbian.xs
+++ 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 ext/DynaLoader/dl_vms.xs ext/DynaLoader/dl_vms.xs
index ca8d54f..1a17793 100644
--- ext/DynaLoader/dl_vms.xs
+++ 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 ext/DynaLoader/dl_win32.xs ext/DynaLoader/dl_win32.xs
index 605b63f..e916f7e 100644
--- ext/DynaLoader/dl_win32.xs
+++ 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);
--
2.1.4
|
From @bulk88I think this patch is poorly thought out. It is adding args to every platform, when this is strictly a problem on 1 OS (darwin). Why not hard code dl_find_symbol on darwin to NOT save the error if libhandle is 0 in C? -- |
From @rurbanOn 06/10/2015 07:52 AM, bulk88 via RT wrote:
It's not poorly thought out. But the problem is that this is a documented API call, so I had to add It's only a very tiny performance win, so I don't care that much though. -- Working towards a true Modern Perl. |
From @tonycozOn Sun Jun 14 10:29:32 2015, rurban@cpanel.net wrote:
Despite bulk88's argument I'm inclined to apply it. One issue is, you've modified dl_find_symbol() to SaveError() the string that was originally printed to the debug log. Unfortunately that original code is wrong - h->error is only set in dlopen(), and even there it always seems to set it to KErrNone. I tried looking for Symbian API documentation to see if there was a usable error code that could be displayed, but unfortunately I couldn't find any documentation, Symbian seems to be dead and buried. Tony |
From @jhiIf Symbian breaks, that would be good news in the sense that it would not be dead, then. So go ahead in that regard. (Even though I did the Symbian port... ages ago... I no more have any access, nor I know of any who has/cares. Symbian was opensourced at some point, I think, but it seemed not to slow the disappearance. Kind of like PalmOS these days.) |
From @tonycozOn Fri Apr 03 02:59:37 2015, rurban@cpanel.net wrote:
The updated patch didn't fix those. With fixes, applied as fd46a70, d96ba2c, 6d0927b. I originally missed the bad symbian XS, which is fixed in fdfd5e4. Tony |
@tonycoz - Status changed from 'open' to 'resolved' |
Migrated from rt.perl.org#124068 (status was 'resolved')
Searchable as RT124068$
The text was updated successfully, but these errors were encountered: