From 2b30549c493d7b67fa92c2b4bcd2bd2e55210ae1 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Tue, 15 Jan 2013 13:22:25 +0400 Subject: [PATCH] * src/lisp.h (XSAVE_POINTER, XSAVE_INTEGER): Change to allow extraction 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. --- admin/ChangeLog | 5 +++++ admin/coccinelle/xsave.cocci | 11 +++++++++++ src/ChangeLog | 8 ++++++++ src/alloc.c | 2 +- src/dired.c | 2 +- src/editfns.c | 2 +- src/fileio.c | 2 +- src/font.c | 2 +- src/ftfont.c | 18 +++++++++--------- src/gtkutil.c | 2 +- src/keymap.c | 4 ++-- src/lisp.h | 14 ++++++++++---- src/lread.c | 2 +- src/nsmenu.m | 2 +- src/nsterm.h | 4 ++-- src/xfns.c | 2 +- src/xmenu.c | 8 ++++---- src/xselect.c | 2 +- 18 files changed, 61 insertions(+), 31 deletions(-) create mode 100644 admin/coccinelle/xsave.cocci diff --git a/admin/ChangeLog b/admin/ChangeLog index 7d77becb52..5da0bf0c67 100644 --- a/admin/ChangeLog +++ b/admin/ChangeLog @@ -1,3 +1,8 @@ +2013-01-15 Dmitry Antipov + + * coccinelle/xsave.cocci: Semantic patch to adjust users of + XSAVE_POINTER and XSAVE_INTEGER macros. + 2013-01-03 Glenn Morris * 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 index 0000000000..5172bb55b3 --- /dev/null +++ b/admin/coccinelle/xsave.cocci @@ -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) +) diff --git a/src/ChangeLog b/src/ChangeLog index 34c137a35c..289aed3608 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2013-01-15 Dmitry Antipov + + * 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 Some convenient bits to deal with Lisp_Save_Values. diff --git a/src/alloc.c b/src/alloc.c index e1cb97163c..b83b621bc7 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -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); } diff --git a/src/dired.c b/src/dired.c index 8483721401..3dca9d24f6 100644 --- a/src/dired.c +++ b/src/dired.c @@ -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 (); diff --git a/src/editfns.c b/src/editfns.c index 3fe085caac..8910b66e4d 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -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; } diff --git a/src/fileio.c b/src/fileio.c index d468576d63..8c194a56fc 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -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) { diff --git a/src/font.c b/src/font.c index c415342814..89931f6ec7 100644 --- a/src/font.c +++ b/src/font.c @@ -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; diff --git a/src/ftfont.c b/src/ftfont.c index 1d7678bfe0..5bf91832c7 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -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 diff --git a/src/gtkutil.c b/src/gtkutil.c index 259e0e971f..f045deacd3 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -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); diff --git a/src/keymap.c b/src/keymap.c index 82c9e98022..f64c8d5a84 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -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)); } } diff --git a/src/lisp.h b/src/lisp.h index ac7346c538..1ff8f83270 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -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), \ diff --git a/src/lread.c b/src/lread.c index ced690a77b..a01cf099b4 100644 --- a/src/lread.c +++ b/src/lread.c @@ -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 (); diff --git a/src/nsmenu.m b/src/nsmenu.m index 3e6fa54b04..b0369e76a2 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -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) diff --git a/src/nsterm.h b/src/nsterm.h index 7732e6d27c..0cf4aa60d0 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -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 */ diff --git a/src/xfns.c b/src/xfns.c index fe99d36f9f..65148d1c9e 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -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 (); diff --git a/src/xmenu.c b/src/xmenu.c index 6d880993d1..56a3783127 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -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 diff --git a/src/xselect.c b/src/xselect.c index 9abfb2931f..b7cdf70ff7 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -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) -- 2.20.1