diff options
Diffstat (limited to 'src/lj_clib.c')
-rw-r--r-- | src/lj_clib.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/lj_clib.c b/src/lj_clib.c index 4a81bb7d..e2d349fd 100644 --- a/src/lj_clib.c +++ b/src/lj_clib.c | |||
@@ -242,6 +242,17 @@ static CTSize clib_func_argsize(CTState *cts, CType *ct) | |||
242 | } | 242 | } |
243 | #endif | 243 | #endif |
244 | 244 | ||
245 | /* Get redirected or mangled external symbol. */ | ||
246 | static const char *clib_extsym(CTState *cts, CType *ct, GCstr *name) | ||
247 | { | ||
248 | if (ct->sib) { | ||
249 | CType *ctf = ctype_get(cts, ct->sib); | ||
250 | if (ctype_isxattrib(ctf->info, CTA_REDIR)) | ||
251 | return strdata(gco2str(gcref(ctf->name))); | ||
252 | } | ||
253 | return strdata(name); | ||
254 | } | ||
255 | |||
245 | /* Index a C library by name. */ | 256 | /* Index a C library by name. */ |
246 | TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name) | 257 | TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name) |
247 | { | 258 | { |
@@ -260,7 +271,8 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name) | |||
260 | else | 271 | else |
261 | setnumV(tv, (lua_Number)(int32_t)ct->size); | 272 | setnumV(tv, (lua_Number)(int32_t)ct->size); |
262 | } else { | 273 | } else { |
263 | void *p = clib_getsym(cl, strdata(name)); | 274 | const char *sym = clib_extsym(cts, ct, name); |
275 | void *p = clib_getsym(cl, sym); | ||
264 | GCcdata *cd; | 276 | GCcdata *cd; |
265 | lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info)); | 277 | lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info)); |
266 | #if LJ_TARGET_X86 && LJ_ABI_WIN | 278 | #if LJ_TARGET_X86 && LJ_ABI_WIN |
@@ -269,8 +281,8 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name) | |||
269 | CTInfo cconv = ctype_cconv(ct->info); | 281 | CTInfo cconv = ctype_cconv(ct->info); |
270 | if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { | 282 | if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { |
271 | CTSize sz = clib_func_argsize(cts, ct); | 283 | CTSize sz = clib_func_argsize(cts, ct); |
272 | const char *sym = lj_str_pushf(L, | 284 | sym = lj_str_pushf(L, cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", |
273 | cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", strdata(name), sz); | 285 | sym, sz); |
274 | L->top--; | 286 | L->top--; |
275 | p = clib_getsym(cl, sym); | 287 | p = clib_getsym(cl, sym); |
276 | } | 288 | } |