diff options
Diffstat (limited to 'src/lib_ffi.c')
-rw-r--r-- | src/lib_ffi.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c index 0f8d5013..99f04aab 100644 --- a/src/lib_ffi.c +++ b/src/lib_ffi.c | |||
@@ -268,9 +268,10 @@ LJLIB_CF(ffi_meta___tostring) | |||
268 | GCcdata *cd = ffi_checkcdata(L, 1); | 268 | GCcdata *cd = ffi_checkcdata(L, 1); |
269 | const char *msg = "cdata<%s>: %p"; | 269 | const char *msg = "cdata<%s>: %p"; |
270 | CTypeID id = cd->typeid; | 270 | CTypeID id = cd->typeid; |
271 | void *p = cdataptr(cd); | ||
271 | if (id == CTID_CTYPEID) { | 272 | if (id == CTID_CTYPEID) { |
272 | msg = "ctype<%s>"; | 273 | msg = "ctype<%s>"; |
273 | id = *(CTypeID *)cdataptr(cd); | 274 | id = *(CTypeID *)p; |
274 | } else { | 275 | } else { |
275 | CType *ct = ctype_raw(ctype_cts(L), id); | 276 | CType *ct = ctype_raw(ctype_cts(L), id); |
276 | if (ctype_iscomplex(ct->info)) { | 277 | if (ctype_iscomplex(ct->info)) { |
@@ -286,9 +287,13 @@ LJLIB_CF(ffi_meta___tostring) | |||
286 | cTValue *tv = lj_ctype_meta(cts, id, MM_tostring); | 287 | cTValue *tv = lj_ctype_meta(cts, id, MM_tostring); |
287 | if (tv) | 288 | if (tv) |
288 | return lj_meta_tailcall(L, tv); | 289 | return lj_meta_tailcall(L, tv); |
290 | } else if (ctype_isptr(ct->info)) { | ||
291 | p = cdata_getptr(p, ct->size); | ||
292 | } else if (ctype_isfunc(ct->info)) { | ||
293 | p = *(void **)p; | ||
289 | } | 294 | } |
290 | } | 295 | } |
291 | lj_str_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), cdataptr(cd)); | 296 | lj_str_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), p); |
292 | checkgc: | 297 | checkgc: |
293 | lj_gc_check(L); | 298 | lj_gc_check(L); |
294 | return 1; | 299 | return 1; |