FFI: Fix symbol resolving error messages on Windows.

This commit is contained in:
Mike Pall 2012-03-31 22:20:03 +02:00
parent 03275ba7fc
commit 407cc5e9ec

View File

@ -228,7 +228,6 @@ static void clib_unloadlib(CLibrary *cl)
static void *clib_getsym(CLibrary *cl, const char *name) static void *clib_getsym(CLibrary *cl, const char *name)
{ {
void *p = NULL; void *p = NULL;
DWORD oldwerr = GetLastError();
if (cl->handle == CLIB_DEFHANDLE) { /* Search default libraries. */ if (cl->handle == CLIB_DEFHANDLE) { /* Search default libraries. */
MSize i; MSize i;
for (i = 0; i < CLIB_HANDLE_MAX; i++) { for (i = 0; i < CLIB_HANDLE_MAX; i++) {
@ -257,7 +256,6 @@ static void *clib_getsym(CLibrary *cl, const char *name)
} else { } else {
p = (void *)GetProcAddress((HINSTANCE)cl->handle, name); p = (void *)GetProcAddress((HINSTANCE)cl->handle, name);
} }
SetLastError(oldwerr);
return p; return p;
} }
@ -340,6 +338,9 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)
setintV(tv, (int32_t)ct->size); setintV(tv, (int32_t)ct->size);
} else { } else {
const char *sym = clib_extsym(cts, ct, name); const char *sym = clib_extsym(cts, ct, name);
#if LJ_TARGET_WINDOWS
DWORD oldwerr = GetLastError();
#endif
void *p = clib_getsym(cl, sym); void *p = clib_getsym(cl, sym);
GCcdata *cd; GCcdata *cd;
lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info)); lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info));
@ -349,15 +350,19 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)
CTInfo cconv = ctype_cconv(ct->info); CTInfo cconv = ctype_cconv(ct->info);
if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) {
CTSize sz = clib_func_argsize(cts, ct); CTSize sz = clib_func_argsize(cts, ct);
sym = lj_str_pushf(L, cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", const char *symd = lj_str_pushf(L,
cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d",
sym, sz); sym, sz);
L->top--; L->top--;
p = clib_getsym(cl, sym); p = clib_getsym(cl, symd);
} }
} }
#endif #endif
if (!p) if (!p)
clib_error(L, "cannot resolve symbol " LUA_QS ": %s", strdata(name)); clib_error(L, "cannot resolve symbol " LUA_QS ": %s", sym);
#if LJ_TARGET_WINDOWS
SetLastError(oldwerr);
#endif
cd = lj_cdata_new(cts, id, CTSIZE_PTR); cd = lj_cdata_new(cts, id, CTSIZE_PTR);
*(void **)cdataptr(cd) = p; *(void **)cdataptr(cd) = p;
setcdataV(L, tv, cd); setcdataV(L, tv, cd);