]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix emacs-module-tests on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Mon, 5 Jun 2017 16:16:04 +0000 (19:16 +0300)
committerEli Zaretskii <eliz@gnu.org>
Mon, 5 Jun 2017 16:16:04 +0000 (19:16 +0300)
* src/print.c (print_vectorlike): Make sure module function's
address prints with a leading "0x".  This fixes emacs-module-tests
on MS-Windows.  Fix whitespace.
* src/dynlib.c (dynlib_addr): Remove unused variable.  Update
commentary.

src/dynlib.c
src/print.c

index 79e98b0f288b1bc550d61db1465abd62d6b308d9..47ba5e3d91b33495b66abf29a12b13d8e5f93e46 100644 (file)
@@ -126,7 +126,6 @@ void
 dynlib_addr (void *addr, const char **fname, const char **symname)
 {
   static char dll_filename[MAX_UTF8_PATH];
-  static char addr_str[22];
   static GetModuleHandleExA_Proc s_pfn_Get_Module_HandleExA = NULL;
   char *dll_fn = NULL;
   HMODULE hm_kernel32 = NULL;
@@ -216,8 +215,9 @@ dynlib_addr (void *addr, const char **fname, const char **symname)
      of the module functions will be unexported, and probably even
      static, which means the symbols can be obtained only if we link
      against libbfd (and the DLL can be stripped anyway).  So we just
-     show the address and the file name; they can use that with
-     addr2line or GDB to recover the symbolic name.  */
+     show the address and the file name (see print_vectorlike in
+     print.c); they can use that with addr2line or GDB to recover the
+     symbolic name.  */
   *symname = NULL;
 }
 
index 76ae10fe13240a5ef7f1f0ac7ca91f7acc29c0be..aaec5b04956be8aca4dd1526c57413707ed8002b 100644 (file)
@@ -1701,31 +1701,36 @@ print_vectorlike (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag,
 #ifdef HAVE_MODULES
     case PVEC_MODULE_FUNCTION:
       {
-        print_c_string ("#<module function ", printcharfun);
-        void *ptr = XMODULE_FUNCTION (obj)->subr;
-        const char *file = NULL;
-        const char *symbol = NULL;
-        dynlib_addr (ptr, &file, &symbol);
-
-        if (symbol == NULL)
-          {
-            print_c_string ("at ", printcharfun);
-            enum { pointer_bufsize = sizeof ptr * 16 / CHAR_BIT + 2 + 1 };
-            char buffer[pointer_bufsize];
-            int needed = snprintf (buffer, sizeof buffer, "%p", ptr);
-            eassert (needed <= sizeof buffer);
-            print_c_string (buffer, printcharfun);
-          }
-        else
-          print_c_string (symbol, printcharfun);
-
-        if (file != NULL)
-          {
-            print_c_string (" from ", printcharfun);
-            print_c_string (file, printcharfun);
-          }
-
-        printchar ('>', printcharfun);
+       print_c_string ("#<module function ", printcharfun);
+       void *ptr = XMODULE_FUNCTION (obj)->subr;
+       const char *file = NULL;
+       const char *symbol = NULL;
+       dynlib_addr (ptr, &file, &symbol);
+
+       if (symbol == NULL)
+         {
+           print_c_string ("at ", printcharfun);
+           enum { pointer_bufsize = sizeof ptr * 16 / CHAR_BIT + 2 + 1 };
+           char buffer[pointer_bufsize];
+           int needed = snprintf (buffer, sizeof buffer, "%p", ptr);
+           const char p0x[] = "0x";
+           eassert (needed <= sizeof buffer);
+           /* ANSI C doesn't guarantee that %p produces a string that
+              begins with a "0x".  */
+           if (c_strncasecmp (buffer, p0x, sizeof (p0x) - 1) != 0)
+             print_c_string (p0x, printcharfun);
+           print_c_string (buffer, printcharfun);
+         }
+       else
+         print_c_string (symbol, printcharfun);
+
+       if (file != NULL)
+         {
+           print_c_string (" from ", printcharfun);
+           print_c_string (file, printcharfun);
+         }
+
+       printchar ('>', printcharfun);
       }
       break;
 #endif