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); |
