aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2011-06-11 18:30:22 +0200
committerMike Pall <mike>2011-06-11 18:30:22 +0200
commit287de611a209ed0e76be8623968106a2a9f13901 (patch)
tree991112e86c06349f6432aca228a734ed42a9e86a
parenta58eb604f43d688057ae94f09738863c61a0e5d6 (diff)
downloadluajit-287de611a209ed0e76be8623968106a2a9f13901.tar.gz
luajit-287de611a209ed0e76be8623968106a2a9f13901.tar.bz2
luajit-287de611a209ed0e76be8623968106a2a9f13901.zip
FFI: Support __tostring metamethod for pointers to structs, too.
-rw-r--r--src/lib_ffi.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 99f04aab..582e9bf7 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -273,7 +273,9 @@ LJLIB_CF(ffi_meta___tostring)
273 msg = "ctype<%s>"; 273 msg = "ctype<%s>";
274 id = *(CTypeID *)p; 274 id = *(CTypeID *)p;
275 } else { 275 } else {
276 CType *ct = ctype_raw(ctype_cts(L), id); 276 CTState *cts = ctype_cts(L);
277 CType *ct = ctype_raw(cts, id);
278 if (ctype_isref(ct->info)) ct = ctype_rawchild(cts, ct);
277 if (ctype_iscomplex(ct->info)) { 279 if (ctype_iscomplex(ct->info)) {
278 setstrV(L, L->top-1, lj_ctype_repr_complex(L, cdataptr(cd), ct->size)); 280 setstrV(L, L->top-1, lj_ctype_repr_complex(L, cdataptr(cd), ct->size));
279 goto checkgc; 281 goto checkgc;
@@ -281,16 +283,19 @@ LJLIB_CF(ffi_meta___tostring)
281 setstrV(L, L->top-1, lj_ctype_repr_int64(L, *(uint64_t *)cdataptr(cd), 283 setstrV(L, L->top-1, lj_ctype_repr_int64(L, *(uint64_t *)cdataptr(cd),
282 (ct->info & CTF_UNSIGNED))); 284 (ct->info & CTF_UNSIGNED)));
283 goto checkgc; 285 goto checkgc;
284 } else if (ctype_isstruct(ct->info) || ctype_isvector(ct->info)) {
285 /* Handle ctype __tostring metamethod. */
286 CTState *cts = ctype_cts(L);
287 cTValue *tv = lj_ctype_meta(cts, id, MM_tostring);
288 if (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)) { 286 } else if (ctype_isfunc(ct->info)) {
293 p = *(void **)p; 287 p = *(void **)p;
288 } else {
289 if (ctype_isptr(ct->info)) {
290 p = cdata_getptr(p, ct->size);
291 ct = ctype_rawchild(cts, ct);
292 }
293 if (ctype_isstruct(ct->info) || ctype_isvector(ct->info)) {
294 /* Handle ctype __tostring metamethod. */
295 cTValue *tv = lj_ctype_meta(cts, ctype_typeid(cts, ct), MM_tostring);
296 if (tv)
297 return lj_meta_tailcall(L, tv);
298 }
294 } 299 }
295 } 300 }
296 lj_str_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), p); 301 lj_str_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), p);