]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
FFI: Show address pointed to for tostring(pointer).
authorMike Pall <mike>
Tue, 7 Jun 2011 18:57:32 +0000 (20:57 +0200)
committerMike Pall <mike>
Tue, 7 Jun 2011 18:57:32 +0000 (20:57 +0200)
src/lib_ffi.c
src/lj_str.c

index 0f8d50136345674098b7d88e6c727405a0146fc5..99f04aab24737c58609da7379fffc9f1fa828308 100644 (file)
@@ -268,9 +268,10 @@ LJLIB_CF(ffi_meta___tostring)
   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)) {
@@ -286,9 +287,13 @@ LJLIB_CF(ffi_meta___tostring)
       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;
index 516acefe1c384d33705b4858cd64805ae41af93d..a5d894e0d168aed77c4b1db447a24e485cd0db8b 100644 (file)
@@ -361,8 +361,8 @@ const char *lj_str_pushvf(lua_State *L, const char *fmt, va_list argp)
       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';