summaryrefslogtreecommitdiff
path: root/src/lj_clib.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-01-26 02:31:19 +0100
committerMike Pall <mike>2011-01-26 02:31:19 +0100
commit1b75ec22c86259deaa02644fca5a096b432e145b (patch)
tree5d9ee055ba559aa0a48fcfe8f8bf1389659f93a9 /src/lj_clib.c
parented6c895ae56288b6982d1651c4ea638452c9e99b (diff)
downloadluajit2-1b75ec22c86259deaa02644fca5a096b432e145b.tar.gz
FFI: Add symbol name redirection.
This works like the GCC extension, e.g.: FILE *fopen(const char *fn, const char *mode) __asm__("" "fopen64");
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)
}
#endif
+/* Get redirected or mangled external symbol. */
+static const char *clib_extsym(CTState *cts, CType *ct, GCstr *name)
+{
+ if (ct->sib) {
+ CType *ctf = ctype_get(cts, ct->sib);
+ if (ctype_isxattrib(ctf->info, CTA_REDIR))
+ return strdata(gco2str(gcref(ctf->name)));
+ }
+ return strdata(name);
+}
+
/* Index a C library by name. */
TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)
{
@@ -260,7 +271,8 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)
else
setnumV(tv, (lua_Number)(int32_t)ct->size);
} else {
- void *p = clib_getsym(cl, strdata(name));
+ const char *sym = clib_extsym(cts, ct, name);
+ void *p = clib_getsym(cl, sym);
GCcdata *cd;
lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info));
#if LJ_TARGET_X86 && LJ_ABI_WIN
@@ -269,8 +281,8 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)
CTInfo cconv = ctype_cconv(ct->info);
if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) {
CTSize sz = clib_func_argsize(cts, ct);
- const char *sym = lj_str_pushf(L,
- cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", strdata(name), sz);
+ sym = lj_str_pushf(L, cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d",
+ sym, sz);
L->top--;
p = clib_getsym(cl, sym);
}