GCcdata *cd = ffi_checkcdata(L, 1);
const char *msg = "cdata<%s>: %p";
CTypeID id = cd->typeid;
+ void *p = cdataptr(cd);
if (id == CTID_CTYPEID) {
msg = "ctype<%s>";
- id = *(CTypeID *)cdataptr(cd);
+ id = *(CTypeID *)p;
} else {
CType *ct = ctype_raw(ctype_cts(L), id);
if (ctype_iscomplex(ct->info)) {
cTValue *tv = lj_ctype_meta(cts, id, MM_tostring);
if (tv)
return lj_meta_tailcall(L, tv);
+ } else if (ctype_isptr(ct->info)) {
+ p = cdata_getptr(p, ct->size);
+ } else if (ctype_isfunc(ct->info)) {
+ p = *(void **)p;
}
}
- lj_str_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), cdataptr(cd));
+ lj_str_pushf(L, msg, strdata(lj_ctype_repr(L, id, NULL)), p);
checkgc:
lj_gc_check(L);
return 1;
ptrdiff_t p = (ptrdiff_t)(va_arg(argp, void *));
ptrdiff_t i, lasti = 2+FMTP_CHARS;
#if LJ_64
- if ((p >> 32) == 0) /* Shorten output for true 32 bit pointers. */
- lasti = 2+2*4;
+ /* Shorten output for 64 bit pointers. */
+ lasti = 2+2*4+((p >> 32) ? 2+2*(lj_fls((uint32_t)(p >> 32))>>3) : 0);
#endif
buf[0] = '0';
buf[1] = 'x';