diff options
author | Mike Pall <mike> | 2012-03-31 22:20:03 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-03-31 22:23:46 +0200 |
commit | 407cc5e9ec5b68ac3e0e81d846f755bdd25c117f (patch) | |
tree | c28af0d5e7f99dc2dd44b6ad08be3705d7c7cd34 /src | |
parent | 03275ba7fcbde3f930e214ffe0fa5a73b3804da2 (diff) | |
download | luajit-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.c | 17 |
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) | |||
228 | static void *clib_getsym(CLibrary *cl, const char *name) | 228 | static 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); |