[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs-25 da8c7ca 2/3: Port better to FreeBSD’s dlfunc vs
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] emacs-25 da8c7ca 2/3: Port better to FreeBSD’s dlfunc vs dlsym |
Date: |
Tue, 24 Nov 2015 03:01:56 +0000 |
branch: emacs-25
commit da8c7ca2647d2e111a415f59c6b59053a19bdb61
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
Port better to FreeBSD’s dlfunc vs dlsym
This avoids warnings when converting between void * and
function pointers, which strict C11 does not allow.
* configure.ac (dlfunc): Check for existence.
* src/dynlib.c (dlfunc) [!HAVE_DLFUNC]: New macro.
(dynlib_func): New function.
* src/dynlib.h (dynlib_function_ptr, dynlib_func): New decls.
* src/emacs-module.c (Fmodule_load): Use dynlib_func, not
dynlib_sym, for function pointers.
---
configure.ac | 5 +++++
src/dynlib.c | 10 ++++++++++
src/dynlib.h | 2 ++
src/emacs-module.c | 5 +++--
4 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index d5638bf..b2fa1ed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3316,6 +3316,11 @@ if test "${with_modules}" != "no"; then
if test "${HAVE_MODULES}" = no; then
AC_MSG_ERROR([Dynamic modules are not supported on your system])
+ else
+ SAVE_LIBS=$LIBS
+ LIBS="$LIBS $LIBMODULES"
+ AC_CHECK_FUNCS([dlfunc])
+ LIBS=$SAVE_LIBS
fi
fi
diff --git a/src/dynlib.c b/src/dynlib.c
index 47ffb41..a41bed8 100644
--- a/src/dynlib.c
+++ b/src/dynlib.c
@@ -206,3 +206,13 @@ dynlib_close (dynlib_handle_ptr h)
#error "No dynamic loading for this system"
#endif
+
+#if !HAVE_DLFUNC
+# define dlfunc dynlib_sym
+#endif
+
+dynlib_function_ptr
+dynlib_func (dynlib_handle_ptr h, const char *sym)
+{
+ return (dynlib_function_ptr) dlfunc (h, sym);
+}
diff --git a/src/dynlib.h b/src/dynlib.h
index 1282c4f..1c19b5d 100644
--- a/src/dynlib.h
+++ b/src/dynlib.h
@@ -25,6 +25,8 @@ along with GNU Emacs. If not, see
<http://www.gnu.org/licenses/>. */
typedef void *dynlib_handle_ptr;
dynlib_handle_ptr dynlib_open (const char *path);
void *dynlib_sym (dynlib_handle_ptr h, const char *sym);
+typedef struct dynlib_function_ptr_nonce *(*dynlib_function_ptr) (void);
+dynlib_function_ptr dynlib_func (dynlib_handle_ptr h, const char *sym);
bool dynlib_addr (void *ptr, const char **path, const char **sym);
const char *dynlib_error (void);
int dynlib_close (dynlib_handle_ptr h);
diff --git a/src/emacs-module.c b/src/emacs-module.c
index 1a5e253..209f99b 100644
--- a/src/emacs-module.c
+++ b/src/emacs-module.c
@@ -710,7 +710,7 @@ DEFUN ("module-load", Fmodule_load, Smodule_load, 1, 1, 0,
if (!gpl_sym)
error ("Module %s is not GPL compatible", SDATA (file));
- module_init = (emacs_init_function) dynlib_sym (handle, "emacs_module_init");
+ module_init = (emacs_init_function) dynlib_func (handle,
"emacs_module_init");
if (!module_init)
error ("Module %s does not have an init function.", SDATA (file));
@@ -937,7 +937,8 @@ allocate_emacs_value (emacs_env *env, struct
emacs_value_storage *storage,
/* Mark all objects allocated from local environments so that they
don't get garbage-collected. */
-void mark_modules (void)
+void
+mark_modules (void)
{
for (Lisp_Object tem = Vmodule_environments; CONSP (tem); tem = XCDR (tem))
{