aboutsummaryrefslogtreecommitdiff
path: root/src/lj_clib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_clib.c')
-rw-r--r--src/lj_clib.c18
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. */
246static 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. */
246TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name) 257TValue *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 }