aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-03-31 22:20:03 +0200
committerMike Pall <mike>2012-03-31 22:23:46 +0200
commit407cc5e9ec5b68ac3e0e81d846f755bdd25c117f (patch)
treec28af0d5e7f99dc2dd44b6ad08be3705d7c7cd34 /src
parent03275ba7fcbde3f930e214ffe0fa5a73b3804da2 (diff)
downloadluajit-407cc5e9ec5b68ac3e0e81d846f755bdd25c117f.tar.gz
luajit-407cc5e9ec5b68ac3e0e81d846f755bdd25c117f.tar.bz2
luajit-407cc5e9ec5b68ac3e0e81d846f755bdd25c117f.zip
FFI: Fix symbol resolving error messages on Windows.
Diffstat (limited to 'src')
-rw-r--r--src/lj_clib.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/lj_clib.c b/src/lj_clib.c
index 6470c768..3023b735 100644
--- a/src/lj_clib.c
+++ b/src/lj_clib.c
@@ -228,7 +228,6 @@ static void clib_unloadlib(CLibrary *cl)
228static void *clib_getsym(CLibrary *cl, const char *name) 228static void *clib_getsym(CLibrary *cl, const char *name)
229{ 229{
230 void *p = NULL; 230 void *p = NULL;
231 DWORD oldwerr = GetLastError();
232 if (cl->handle == CLIB_DEFHANDLE) { /* Search default libraries. */ 231 if (cl->handle == CLIB_DEFHANDLE) { /* Search default libraries. */
233 MSize i; 232 MSize i;
234 for (i = 0; i < CLIB_HANDLE_MAX; i++) { 233 for (i = 0; i < CLIB_HANDLE_MAX; i++) {
@@ -257,7 +256,6 @@ static void *clib_getsym(CLibrary *cl, const char *name)
257 } else { 256 } else {
258 p = (void *)GetProcAddress((HINSTANCE)cl->handle, name); 257 p = (void *)GetProcAddress((HINSTANCE)cl->handle, name);
259 } 258 }
260 SetLastError(oldwerr);
261 return p; 259 return p;
262} 260}
263 261
@@ -340,6 +338,9 @@ TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)
340 setintV(tv, (int32_t)ct->size); 338 setintV(tv, (int32_t)ct->size);
341 } else { 339 } else {
342 const char *sym = clib_extsym(cts, ct, name); 340 const char *sym = clib_extsym(cts, ct, name);
341#if LJ_TARGET_WINDOWS
342 DWORD oldwerr = GetLastError();
343#endif
343 void *p = clib_getsym(cl, sym); 344 void *p = clib_getsym(cl, sym);
344 GCcdata *cd; 345 GCcdata *cd;
345 lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info)); 346 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)
349 CTInfo cconv = ctype_cconv(ct->info); 350 CTInfo cconv = ctype_cconv(ct->info);
350 if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) { 351 if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) {
351 CTSize sz = clib_func_argsize(cts, ct); 352 CTSize sz = clib_func_argsize(cts, ct);
352 sym = lj_str_pushf(L, cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d", 353 const char *symd = lj_str_pushf(L,
353 sym, sz); 354 cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d",
355 sym, sz);
354 L->top--; 356 L->top--;
355 p = clib_getsym(cl, sym); 357 p = clib_getsym(cl, symd);
356 } 358 }
357 } 359 }
358#endif 360#endif
359 if (!p) 361 if (!p)
360 clib_error(L, "cannot resolve symbol " LUA_QS ": %s", strdata(name)); 362 clib_error(L, "cannot resolve symbol " LUA_QS ": %s", sym);
363#if LJ_TARGET_WINDOWS
364 SetLastError(oldwerr);
365#endif
361 cd = lj_cdata_new(cts, id, CTSIZE_PTR); 366 cd = lj_cdata_new(cts, id, CTSIZE_PTR);
362 *(void **)cdataptr(cd) = p; 367 *(void **)cdataptr(cd) = p;
363 setcdataV(L, tv, cd); 368 setcdataV(L, tv, cd);