]> code.delx.au - gnu-emacs/commitdiff
* src/lisp.h (XSAVE_POINTER, XSAVE_INTEGER): Change to allow extraction
authorDmitry Antipov <dmantipov@yandex.ru>
Tue, 15 Jan 2013 09:22:25 +0000 (13:22 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Tue, 15 Jan 2013 09:22:25 +0000 (13:22 +0400)
from any Lisp_Save_Value slot.  Add type checking.
* src/alloc.c, src/dired.c, src/editfns.c, src/fileio.c, src/ftfont.c:
* src/gtkutil.c, src/keymap.c, src/lread.c, src/nsterm.h, src/nsmenu.c:
* src/xfns.c, src/xmenu.c, src/xselect.c: All users changed.
* admin/coccinelle/xsave.cocci: Semantic patch to adjust users of
XSAVE_POINTER and XSAVE_INTEGER macros.

18 files changed:
admin/ChangeLog
admin/coccinelle/xsave.cocci [new file with mode: 0644]
src/ChangeLog
src/alloc.c
src/dired.c
src/editfns.c
src/fileio.c
src/font.c
src/ftfont.c
src/gtkutil.c
src/keymap.c
src/lisp.h
src/lread.c
src/nsmenu.m
src/nsterm.h
src/xfns.c
src/xmenu.c
src/xselect.c

index 7d77becb5220d8883e37f76be9b1f4dda017ec6e..5da0bf0c67dd273daeef153e9eaeed098ca7ead3 100644 (file)
@@ -1,3 +1,8 @@
+2013-01-15  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       * coccinelle/xsave.cocci: Semantic patch to adjust users of
+       XSAVE_POINTER and XSAVE_INTEGER macros.
+
 2013-01-03  Glenn Morris  <rgm@gnu.org>
 
        * check-doc-strings: Update for CVS->bzr, moved lispref/ directory.
diff --git a/admin/coccinelle/xsave.cocci b/admin/coccinelle/xsave.cocci
new file mode 100644 (file)
index 0000000..5172bb5
--- /dev/null
@@ -0,0 +1,11 @@
+// Adjust users of XSAVE_POINTER and XSAVE_INTEGER.
+@@
+expression E;
+@@
+(
+- XSAVE_POINTER (E)
++ XSAVE_POINTER (E, 0)
+|
+- XSAVE_INTEGER (E)
++ XSAVE_INTEGER (E, 1)
+)
index 34c137a35c68c05a7df40ddd172f0f55a020fa94..289aed3608889f6fa2a75b1266d41098bbd32ca7 100644 (file)
@@ -1,3 +1,11 @@
+2013-01-15  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       * lisp.h (XSAVE_POINTER, XSAVE_INTEGER): Change to allow
+       extraction from any Lisp_Save_Value slot.  Add type checking.
+       * alloc.c, dired.c, editfns.c, fileio.c, ftfont.c, gtkutil.c:
+       * keymap.c, lread.c, nsterm.h, nsmenu.c, xfns.c, xmenu.c:
+       * xselect.c: All users changed.
+
 2013-01-15  Dmitry Antipov  <dmantipov@yandex.ru>
 
        Some convenient bits to deal with Lisp_Save_Values.
index e1cb97163ce199e3229d34fd7b884797af031869..b83b621bc7df0ea567c9a380efe8162a5c9e1aa0 100644 (file)
@@ -3420,7 +3420,7 @@ make_save_value (void *pointer, ptrdiff_t integer)
 void
 free_save_value (Lisp_Object save)
 {
-  xfree (XSAVE_POINTER (save));
+  xfree (XSAVE_POINTER (save, 0));
   free_misc (save);
 }
 
index 8483721401ad6d839ea35ba7bde345bad03d1878..3dca9d24f67844001f145e81895314a758af65b1 100644 (file)
@@ -78,7 +78,7 @@ directory_files_internal_w32_unwind (Lisp_Object arg)
 static Lisp_Object
 directory_files_internal_unwind (Lisp_Object dh)
 {
-  DIR *d = XSAVE_POINTER (dh);
+  DIR *d = XSAVE_POINTER (dh, 0);
   block_input ();
   closedir (d);
   unblock_input ();
index 3fe085caac8de48c77010eb48623244e2a025c93..8910b66e4d33243aeac3d7ae541ae03ec62b8c82 100644 (file)
@@ -4254,7 +4254,7 @@ usage: (format STRING &rest OBJECTS)  */)
            memcpy (buf, initial_buffer, used);
          }
        else
-         XSAVE_POINTER (buf_save_value) = buf = xrealloc (buf, bufsize);
+         XSAVE_POINTER (buf_save_value, 0) = buf = xrealloc (buf, bufsize);
 
        p = buf + used;
       }
index d468576d63907672af42f3c7357a0b5a6568c00c..8c194a56fc82453ece11cc7dce57a04d5d87d25c 100644 (file)
@@ -5507,7 +5507,7 @@ static Lisp_Object
 do_auto_save_unwind (Lisp_Object arg)  /* used as unwind-protect function */
 
 {
-  FILE *stream = XSAVE_POINTER (arg);
+  FILE *stream = XSAVE_POINTER (arg, 0);
   auto_saving = 0;
   if (stream != NULL)
     {
index c41534281474d4aa0a8c596f6a52bf068343d3be..89931f6ec763358c3ffb3bd2029c2781d94a4ddd 100644 (file)
@@ -1857,7 +1857,7 @@ otf_open (Lisp_Object file)
   OTF *otf;
 
   if (! NILP (val))
-    otf = XSAVE_POINTER (XCDR (val));
+    otf = XSAVE_POINTER (XCDR (val), 0);
   else
     {
       otf = STRINGP (file) ? OTF_open (SSDATA (file)) : NULL;
index 1d7678bfe09de02605d0ce8cb089e07f9a1f3dc2..5bf91832c7ccaf2e6568c80a74566354e22a8f7a 100644 (file)
@@ -400,7 +400,7 @@ ftfont_lookup_cache (Lisp_Object key, enum ftfont_cache_for cache_for)
   else
     {
       val = XCDR (cache);
-      cache_data = XSAVE_POINTER (val);
+      cache_data = XSAVE_POINTER (val, 0);
     }
 
   if (cache_for == FTFONT_CACHE_FOR_ENTITY)
@@ -466,7 +466,7 @@ ftfont_get_fc_charset (Lisp_Object entity)
 
   cache = ftfont_lookup_cache (entity, FTFONT_CACHE_FOR_CHARSET);
   val = XCDR (cache);
-  cache_data = XSAVE_POINTER (val);
+  cache_data = XSAVE_POINTER (val, 0);
   return cache_data->fc_charset;
 }
 
@@ -1198,9 +1198,9 @@ ftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size)
   filename = XCAR (val);
   idx = XCDR (val);
   val = XCDR (cache);
-  cache_data = XSAVE_POINTER (XCDR (cache));
+  cache_data = XSAVE_POINTER (XCDR (cache), 0);
   ft_face = cache_data->ft_face;
-  if (XSAVE_INTEGER (val) > 0)
+  if (XSAVE_INTEGER (val, 1) > 0)
     {
       /* FT_Face in this cache is already used by the different size.  */
       if (FT_New_Size (ft_face, &ft_size) != 0)
@@ -1211,13 +1211,13 @@ ftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size)
          return Qnil;
        }
     }
-  XSAVE_INTEGER (val)++;
+  XSAVE_INTEGER (val, 1)++;
   size = XINT (AREF (entity, FONT_SIZE_INDEX));
   if (size == 0)
     size = pixel_size;
   if (FT_Set_Pixel_Sizes (ft_face, size, size) != 0)
     {
-      if (XSAVE_INTEGER (val) == 0)
+      if (XSAVE_INTEGER (val, 1) == 0)
        FT_Done_Face (ft_face);
       return Qnil;
     }
@@ -1326,10 +1326,10 @@ ftfont_close (FRAME_PTR f, struct font *font)
   cache = ftfont_lookup_cache (val, FTFONT_CACHE_FOR_FACE);
   eassert (CONSP (cache));
   val = XCDR (cache);
-  (XSAVE_INTEGER (val))--;
-  if (XSAVE_INTEGER (val) == 0)
+  XSAVE_INTEGER (val, 1)--;
+  if (XSAVE_INTEGER (val, 1) == 0)
     {
-      struct ftfont_cache_data *cache_data = XSAVE_POINTER (val);
+      struct ftfont_cache_data *cache_data = XSAVE_POINTER (val, 0);
 
       FT_Done_Face (cache_data->ft_face);
 #ifdef HAVE_LIBOTF
index 259e0e971fd3eec5f0b979944dcf267da91073e6..f045deacd3308519d915a63c3606dcc54b8dd13e 100644 (file)
@@ -1650,7 +1650,7 @@ xg_dialog_response_cb (GtkDialog *w,
 static Lisp_Object
 pop_down_dialog (Lisp_Object arg)
 {
-  struct xg_dialog_data *dd = XSAVE_POINTER (arg);
+  struct xg_dialog_data *dd = XSAVE_POINTER (arg, 0);
 
   block_input ();
   if (dd->w) gtk_widget_destroy (dd->w);
index 82c9e980221a6ee7b5d10d47eacd080bea3e276b..f64c8d5a84830834f4b7eb1d8920fcc6f89a0cd8 100644 (file)
@@ -565,14 +565,14 @@ map_keymap_char_table_item (Lisp_Object args, Lisp_Object key, Lisp_Object val)
 {
   if (!NILP (val))
     {
-      map_keymap_function_t fun = XSAVE_POINTER (XCAR (args));
+      map_keymap_function_t fun = XSAVE_POINTER (XCAR (args), 0);
       args = XCDR (args);
       /* If the key is a range, make a copy since map_char_table modifies
         it in place.  */
       if (CONSP (key))
        key = Fcons (XCAR (key), XCDR (key));
       map_keymap_item (fun, XCDR (args), key, val,
-                      XSAVE_POINTER (XCAR (args)));
+                      XSAVE_POINTER (XCAR (args), 0));
     }
 }
 
index ac7346c5386af3b73297980098dbe3a35914d200..1ff8f83270bfc5c59ee0e282e76777a93e7099f2 100644 (file)
@@ -1413,15 +1413,21 @@ struct Lisp_Save_Value
     } data[4];
   };
 
-/* Compatibility macro to set and extract saved pointer.  */
+/* Macro to set and extract Nth saved pointer.  Type
+   checking is ugly because it's used as an lvalue.  */
 
-#define XSAVE_POINTER(obj) XSAVE_VALUE (obj)->data[0].pointer
+#define XSAVE_POINTER(obj, n)                                  \
+  XSAVE_VALUE (obj)->data[(eassert (XSAVE_VALUE (obj)->type    \
+    ## n == SAVE_POINTER), n)].pointer
 
 /* Likewise for the saved integer.  */
 
-#define XSAVE_INTEGER(obj) XSAVE_VALUE (obj)->data[1].integer
+#define XSAVE_INTEGER(obj, n)                                  \
+  XSAVE_VALUE (obj)->data[(eassert (XSAVE_VALUE (obj)->type    \
+    ## n == SAVE_INTEGER), n)].integer
 
-/* Macro to extract Nth saved object.  */
+/* Macro to extract Nth saved object.  This is never used as
+   an lvalue, so we can do more convenient type checking.  */
 
 #define XSAVE_OBJECT(obj, n)                                   \
   (eassert (XSAVE_VALUE (obj)->type ## n == SAVE_OBJECT),      \
index ced690a77b062732d04cfe983f49e9d1db3a5ab5..a01cf099b493d028703436ddae2c30e9f60ebdd3 100644 (file)
@@ -1357,7 +1357,7 @@ Return t if the file exists and loads successfully.  */)
 static Lisp_Object
 load_unwind (Lisp_Object arg)  /* Used as unwind-protect function in load.  */
 {
-  FILE *stream = XSAVE_POINTER (arg);
+  FILE *stream = XSAVE_POINTER (arg, 0);
   if (stream != NULL)
     {
       block_input ();
index 3e6fa54b0477941615fc75cdae0e7e5256e32dba..b0369e76a277487a7c1a2f55c56581b8c9d272aa 100644 (file)
@@ -1347,7 +1347,7 @@ struct Popdown_data
 static Lisp_Object
 pop_down_menu (Lisp_Object arg)
 {
-  struct Popdown_data *unwind_data = XSAVE_POINTER (arg);
+  struct Popdown_data *unwind_data = XSAVE_POINTER (arg, 0);
 
   block_input ();
   if (popup_activated_flag)
index 7732e6d27cc60bed75fb83060697f0dea208097d..0cf4aa60d08562309bd83bc4761b97133a6f1e7b 100644 (file)
@@ -675,9 +675,9 @@ struct x_output
 #define FRAME_FONT(f) ((f)->output_data.ns->font)
 
 #ifdef __OBJC__
-#define XNS_SCROLL_BAR(vec) ((id) XSAVE_POINTER (vec))
+#define XNS_SCROLL_BAR(vec) ((id) XSAVE_POINTER (vec, 0))
 #else
-#define XNS_SCROLL_BAR(vec) XSAVE_POINTER (vec)
+#define XNS_SCROLL_BAR(vec) XSAVE_POINTER (vec, 0)
 #endif
 
 /* Compute pixel size for vertical scroll bars */
index fe99d36f9f44633073cc40cb50967072df362728..65148d1c9e1295649fa0db4d7d69f10b43e4f67e 100644 (file)
@@ -5292,7 +5292,7 @@ file_dialog_unmap_cb (Widget widget, XtPointer client_data, XtPointer call_data)
 static Lisp_Object
 clean_up_file_dialog (Lisp_Object arg)
 {
-  Widget dialog = XSAVE_POINTER (arg);
+  Widget dialog = XSAVE_POINTER (arg, 0);
 
   /* Clean up.  */
   block_input ();
index 6d880993d19b957bc95236e240624ce18653c6af..56a3783127eec84a3a4dbd6e6282551bb980c06e 100644 (file)
@@ -1413,7 +1413,7 @@ pop_down_menu (Lisp_Object arg)
 {
   popup_activated_flag = 0;
   block_input ();
-  gtk_widget_destroy (GTK_WIDGET (XSAVE_POINTER (arg)));
+  gtk_widget_destroy (GTK_WIDGET (XSAVE_POINTER (arg, 0)));
   unblock_input ();
   return Qnil;
 }
@@ -1610,7 +1610,7 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv,
 static Lisp_Object
 cleanup_widget_value_tree (Lisp_Object arg)
 {
-  free_menubar_widget_value_tree (XSAVE_POINTER (arg));
+  free_menubar_widget_value_tree (XSAVE_POINTER (arg, 0));
   return Qnil;
 }
 
@@ -2236,8 +2236,8 @@ menu_help_callback (char const *help_string, int pane, int item)
 static Lisp_Object
 pop_down_menu (Lisp_Object arg)
 {
-  FRAME_PTR f = XSAVE_POINTER (Fcar (arg));
-  XMenu *menu = XSAVE_POINTER (Fcdr (arg));
+  FRAME_PTR f = XSAVE_POINTER (Fcar (arg), 0);
+  XMenu *menu = XSAVE_POINTER (Fcdr (arg), 0);
 
   block_input ();
 #ifndef MSDOS
index 9abfb2931f8c04c0ee754935f41924a6fce17bfa..b7cdf70ff7753d8d81c484d58f9e2ffef2cce083 100644 (file)
@@ -1120,7 +1120,7 @@ unexpect_property_change (struct prop_location *location)
 static Lisp_Object
 wait_for_property_change_unwind (Lisp_Object loc)
 {
-  struct prop_location *location = XSAVE_POINTER (loc);
+  struct prop_location *location = XSAVE_POINTER (loc, 0);
 
   unexpect_property_change (location);
   if (location == property_change_reply_object)