aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-07-02 11:09:46 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-07-02 11:09:46 -0300
commit781219dbe16fc327f5b828e1ff6fa45ec3265cba (patch)
tree2dfec8c7e051d41f436278df976ca2e5e0303704
parentd71fbc3175d3f1f9dff89edc3f04cd20447fe091 (diff)
downloadlua-781219dbe16fc327f5b828e1ff6fa45ec3265cba.tar.gz
lua-781219dbe16fc327f5b828e1ff6fa45ec3265cba.tar.bz2
lua-781219dbe16fc327f5b828e1ff6fa45ec3265cba.zip
Small changes in casts from void* to functions
Macro moved to llimits.h, and casts from void* to lua_CFunction first go through 'voidf' (a pointer to a function from void to void), a kind of void* for functions.
-rw-r--r--llimits.h20
-rw-r--r--loadlib.c28
2 files changed, 26 insertions, 22 deletions
diff --git a/llimits.h b/llimits.h
index 57e7bed7..0f3a8ecd 100644
--- a/llimits.h
+++ b/llimits.h
@@ -153,6 +153,26 @@ typedef LUAI_UACINT l_uacInt;
153 153
154 154
155/* 155/*
156** Special type equivalent to '(void*)' for functions (to suppress some
157** warnings when converting function pointers)
158*/
159typedef void (*voidf)(void);
160
161
162/*
163** Macro to convert pointer-to-void* to pointer-to-function. This cast
164** is undefined according to ISO C, but POSIX assumes that it works.
165** (The '__extension__' in gnu compilers is only to avoid warnings.)
166*/
167#if defined(__GNUC__)
168#define cast_func(p) (__extension__ (voidf)(p))
169#else
170#define cast_func(p) ((voidf)(p))
171#endif
172
173
174
175/*
156** non-return type 176** non-return type
157*/ 177*/
158#if !defined(l_noret) 178#if !defined(l_noret)
diff --git a/loadlib.c b/loadlib.c
index 45db3b72..84f56ea6 100644
--- a/loadlib.c
+++ b/loadlib.c
@@ -59,11 +59,8 @@ static const char *const CLIBS = "_CLIBS";
59#define setprogdir(L) ((void)0) 59#define setprogdir(L) ((void)0)
60 60
61 61
62/* 62/* cast void* to a Lua function */
63** Special type equivalent to '(void*)' for functions in gcc 63#define cast_Lfunc(p) cast(lua_CFunction, cast_func(p))
64** (to suppress warnings when converting function pointers)
65*/
66typedef void (*voidf)(void);
67 64
68 65
69/* 66/*
@@ -96,26 +93,13 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym);
96#if defined(LUA_USE_DLOPEN) /* { */ 93#if defined(LUA_USE_DLOPEN) /* { */
97/* 94/*
98** {======================================================================== 95** {========================================================================
99** This is an implementation of loadlib based on the dlfcn interface. 96** This is an implementation of loadlib based on the dlfcn interface,
100** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, 97** which is available in all POSIX systems.
101** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least
102** as an emulation layer on top of native functions.
103** ========================================================================= 98** =========================================================================
104*/ 99*/
105 100
106#include <dlfcn.h> 101#include <dlfcn.h>
107 102
108/*
109** Macro to convert pointer-to-void* to pointer-to-function. This cast
110** is undefined according to ISO C, but POSIX assumes that it works.
111** (The '__extension__' in gnu compilers is only to avoid warnings.)
112*/
113#if defined(__GNUC__)
114#define cast_func(p) (__extension__ (lua_CFunction)(p))
115#else
116#define cast_func(p) ((lua_CFunction)(p))
117#endif
118
119 103
120static void lsys_unloadlib (void *lib) { 104static void lsys_unloadlib (void *lib) {
121 dlclose(lib); 105 dlclose(lib);
@@ -131,7 +115,7 @@ static void *lsys_load (lua_State *L, const char *path, int seeglb) {
131 115
132 116
133static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { 117static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
134 lua_CFunction f = cast_func(dlsym(lib, sym)); 118 lua_CFunction f = cast_Lfunc(dlsym(lib, sym));
135 if (l_unlikely(f == NULL)) 119 if (l_unlikely(f == NULL))
136 lua_pushstring(L, dlerror()); 120 lua_pushstring(L, dlerror());
137 return f; 121 return f;
@@ -207,7 +191,7 @@ static void *lsys_load (lua_State *L, const char *path, int seeglb) {
207 191
208 192
209static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { 193static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {
210 lua_CFunction f = (lua_CFunction)(voidf)GetProcAddress((HMODULE)lib, sym); 194 lua_CFunction f = cast_Lfunc(GetProcAddress((HMODULE)lib, sym));
211 if (f == NULL) pusherror(L); 195 if (f == NULL) pusherror(L);
212 return f; 196 return f;
213} 197}