emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r111471: Omit buffer_slot_type_mismat


From: Dmitry Antipov
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r111471: Omit buffer_slot_type_mismatch and use generic predicates to enforce
Date: Thu, 10 Jan 2013 14:30:16 +0400
User-agent: Bazaar (2.5.0)

------------------------------------------------------------
revno: 111471
committer: Dmitry Antipov <address@hidden>
branch nick: trunk
timestamp: Thu 2013-01-10 14:30:16 +0400
message:
  Omit buffer_slot_type_mismatch and use generic predicates to enforce
  the type of per-buffer values where appropriate.
  * src/lisp.h (struct Lisp_Buffer_Objfwd): Rename slottype member to
  predicate, which is how it's really used now.  Adjust comment.
  * src/buffer.h (buffer_slot_type_mismatch): Remove prototype.
  * src/buffer.c (buffer_slot_type_mismatch): Remove.
  (DEFVAR_PER_BUFFER, defvar_per_buffer): Rename type argument to
  predicate.  Adjust comment.
  (syms_of_buffer): Use Qsymbolp for major-mode.  Use Qintegerp for
  fill-column, left-margin, tab-width, buffer-saved-size,
  left-margin-width, right-margin-width, left-fringe-width,
  right-fringe-width, scroll-bar-width and buffer-display-count.
  Use Qstringp for default-directory, buffer-file-name,
  buffer-file-truename and buffer-auto-save-file-name.  Use Qfloatp for
  scroll-up-aggressively and scroll-down-aggressively.  Use Qnumberp for
  line-spacing.
  * src/data.c (store_symval_forwarding): Adjust to call the predicate.
  * lisp/cus-start.el (toplevel): Only allow float values for
  scroll-up-aggressively and scroll-down-aggressively.
  Allow any number for line-spacing.
modified:
  lisp/ChangeLog
  lisp/cus-start.el
  src/ChangeLog
  src/buffer.c
  src/buffer.h
  src/data.c
  src/lisp.h
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2013-01-10 05:05:24 +0000
+++ b/lisp/ChangeLog    2013-01-10 10:30:16 +0000
@@ -1,3 +1,9 @@
+2013-01-10  Dmitry Antipov  <address@hidden>
+
+       * cus-start.el (toplevel): Only allow float values for
+       scroll-up-aggressively and scroll-down-aggressively.
+       Allow any number for line-spacing.
+
 2013-01-10  Stefan Monnier  <address@hidden>
 
        * doc-view.el (doc-view-pdfdraw-program): Allow "pdfdraw" name.

=== modified file 'lisp/cus-start.el'
--- a/lisp/cus-start.el 2013-01-02 16:13:04 +0000
+++ b/lisp/cus-start.el 2013-01-10 10:30:16 +0000
@@ -115,12 +115,12 @@
                            (const :tag "On the right" (down . right))))
               (other :tag "On left, no arrows" t)))
             (scroll-up-aggressively windows
-                                    (choice (const :tag "off" nil) number)
+                                    (choice (const :tag "off" nil) float)
                                     "21.1")
             (scroll-down-aggressively windows
-                                      (choice (const :tag "off" nil) number)
+                                      (choice (const :tag "off" nil) float)
                                       "21.1")
-            (line-spacing display (choice (const :tag "none" nil) integer)
+            (line-spacing display (choice (const :tag "none" nil) number)
                           "22.1")
             (cursor-in-non-selected-windows
              cursor boolean nil

=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2013-01-09 15:07:01 +0000
+++ b/src/ChangeLog     2013-01-10 10:30:16 +0000
@@ -1,3 +1,23 @@
+2013-01-10  Dmitry Antipov  <address@hidden>
+
+       Omit buffer_slot_type_mismatch and use generic predicates to enforce
+       the type of per-buffer values where appropriate.
+       * lisp.h (struct Lisp_Buffer_Objfwd): Rename slottype member to
+       predicate, which is how it's really used now.  Adjust comment.
+       * buffer.h (buffer_slot_type_mismatch): Remove prototype.
+       * buffer.c (buffer_slot_type_mismatch): Remove.
+       (DEFVAR_PER_BUFFER, defvar_per_buffer): Rename type argument to
+       predicate.  Adjust comment.
+       (syms_of_buffer): Use Qsymbolp for major-mode.  Use Qintegerp for
+       fill-column, left-margin, tab-width, buffer-saved-size,
+       left-margin-width, right-margin-width, left-fringe-width,
+       right-fringe-width, scroll-bar-width and buffer-display-count.
+       Use Qstringp for default-directory, buffer-file-name,
+       buffer-file-truename and buffer-auto-save-file-name.  Use Qfloatp for
+       scroll-up-aggressively and scroll-down-aggressively.  Use Qnumberp for
+       line-spacing.
+       * data.c (store_symval_forwarding): Adjust to call the predicate.
+
 2013-01-09  Juanma Barranquero  <address@hidden>
 
        * w32.c (get_name_and_id, acl_set_file):

=== modified file 'src/buffer.c'
--- a/src/buffer.c      2013-01-09 13:50:22 +0000
+++ b/src/buffer.c      2013-01-10 10:30:16 +0000
@@ -4576,27 +4576,7 @@
   for (; CONSP (hit_list); hit_list = XCDR (hit_list))
     Fdelete_overlay (XCAR (hit_list));
 }
-
-/* Somebody has tried to store a value with an unacceptable type
-   in the slot with offset OFFSET.  */
-
-void
-buffer_slot_type_mismatch (Lisp_Object newval, int type)
-{
-  Lisp_Object predicate;
-
-  switch (type)
-    {
-    case_Lisp_Int:    predicate = Qintegerp; break;
-    case Lisp_String: predicate = Qstringp;  break;
-    case Lisp_Symbol: predicate = Qsymbolp;  break;
-    default: emacs_abort ();
-    }
-
-  wrong_type_argument (predicate, newval);
-}
-
-
+
 /***********************************************************************
                         Allocation with mmap
  ***********************************************************************/
@@ -5370,25 +5350,23 @@
   free (pwd);
 }
 
-/* Similar to defvar_lisp but define a variable whose value is the Lisp
-   Object stored in the current buffer.  address is the address of the slot
-   in the buffer that is current now. */
+/* Similar to defvar_lisp but define a variable whose value is the
+   Lisp_Object stored in the current buffer.  LNAME is the Lisp-level
+   variable name.  VNAME is the name of the buffer slot.  PREDICATE
+   is nil for a general Lisp variable.  If PREDICATE is non-nil, then
+   only Lisp values that satisfies the PREDICATE are allowed (except
+   that nil is allowed too).  DOC is a dummy where you write the doc
+   string as a comment.  */
 
-/* TYPE is nil for a general Lisp variable.
-   An integer specifies a type; then only Lisp values
-   with that type code are allowed (except that nil is allowed too).
-   LNAME is the Lisp-level variable name.
-   VNAME is the name of the buffer slot.
-   DOC is a dummy where you write the doc string as a comment.  */
-#define DEFVAR_PER_BUFFER(lname, vname, type, doc)                     \
-  do {                                                                 \
-    static struct Lisp_Buffer_Objfwd bo_fwd;                           \
-    defvar_per_buffer (&bo_fwd, lname, vname, type);                   \
+#define DEFVAR_PER_BUFFER(lname, vname, predicate, doc)                \
+  do {                                                         \
+    static struct Lisp_Buffer_Objfwd bo_fwd;                   \
+    defvar_per_buffer (&bo_fwd, lname, vname, predicate);      \
   } while (0)
 
 static void
 defvar_per_buffer (struct Lisp_Buffer_Objfwd *bo_fwd, const char *namestring,
-                  Lisp_Object *address, Lisp_Object type)
+                  Lisp_Object *address, Lisp_Object predicate)
 {
   struct Lisp_Symbol *sym;
   int offset;
@@ -5398,7 +5376,7 @@
 
   bo_fwd->type = Lisp_Fwd_Buffer_Obj;
   bo_fwd->offset = offset;
-  bo_fwd->slottype = type;
+  bo_fwd->predicate = predicate;
   sym->declared_special = 1;
   sym->redirect = SYMBOL_FORWARDED;
   {
@@ -5661,7 +5639,7 @@
                          doc: /* Value of `major-mode' for new buffers.  */);
 
   DEFVAR_PER_BUFFER ("major-mode", &BVAR (current_buffer, major_mode),
-                    make_number (Lisp_Symbol),
+                    Qsymbolp,
                     doc: /* Symbol for current buffer's major mode.
 The default value (normally `fundamental-mode') affects new buffers.
 A value of nil means to use the current buffer's major mode, provided
@@ -5692,17 +5670,17 @@
                     doc: /* Non-nil if searches and matches should ignore 
case.  */);
 
   DEFVAR_PER_BUFFER ("fill-column", &BVAR (current_buffer, fill_column),
-                    make_number (Lisp_Int0),
+                    Qintegerp,
                     doc: /* Column beyond which automatic line-wrapping should 
happen.
 Interactively, you can set the buffer local value using \\[set-fill-column].  
*/);
 
   DEFVAR_PER_BUFFER ("left-margin", &BVAR (current_buffer, left_margin),
-                    make_number (Lisp_Int0),
+                    Qintegerp,
                     doc: /* Column for the default `indent-line-function' to 
indent to.
 Linefeed indents to this column in Fundamental mode.  */);
 
   DEFVAR_PER_BUFFER ("tab-width", &BVAR (current_buffer, tab_width),
-                    make_number (Lisp_Int0),
+                    Qintegerp,
                     doc: /* Distance between tab stops (for display of tab 
characters), in columns.
 This should be an integer greater than zero.  */);
 
@@ -5787,7 +5765,7 @@
 `visual-line-mode'.  */);
 
   DEFVAR_PER_BUFFER ("default-directory", &BVAR (current_buffer, directory),
-                    make_number (Lisp_String),
+                    Qstringp,
                     doc: /* Name of default directory of current buffer.  
Should end with slash.
 To interactively change the default directory, use command `cd'.  */);
 
@@ -5800,18 +5778,18 @@
 its value may not be a list of functions.  */);
 
   DEFVAR_PER_BUFFER ("buffer-file-name", &BVAR (current_buffer, filename),
-                    make_number (Lisp_String),
+                    Qstringp,
                     doc: /* Name of file visited in current buffer, or nil if 
not visiting a file.  */);
 
   DEFVAR_PER_BUFFER ("buffer-file-truename", &BVAR (current_buffer, 
file_truename),
-                    make_number (Lisp_String),
+                    Qstringp,
                     doc: /* Abbreviated truename of file visited in current 
buffer, or nil if none.
 The truename of a file is calculated by `file-truename'
 and then abbreviated with `abbreviate-file-name'.  */);
 
   DEFVAR_PER_BUFFER ("buffer-auto-save-file-name",
                     &BVAR (current_buffer, auto_save_file_name),
-                    make_number (Lisp_String),
+                    Qstringp,
                     doc: /* Name of file for auto-saving current buffer.
 If it is nil, that means don't auto-save this buffer.  */);
 
@@ -5823,7 +5801,7 @@
 Backing up is done before the first time the file is saved.  */);
 
   DEFVAR_PER_BUFFER ("buffer-saved-size", &BVAR (current_buffer, save_length),
-                    make_number (Lisp_Int0),
+                    Qintegerp,
                     doc: /* Length of current buffer when last read in, saved 
or auto-saved.
 0 initially.
 -1 means auto-saving turned off until next real save.
@@ -5893,23 +5871,23 @@
 See also the functions `display-table-slot' and `set-display-table-slot'.  */);
 
   DEFVAR_PER_BUFFER ("left-margin-width", &BVAR (current_buffer, 
left_margin_cols),
-                    Qnil,
+                    Qintegerp,
                     doc: /* Width of left marginal area for display of a 
buffer.
 A value of nil means no marginal area.  */);
 
   DEFVAR_PER_BUFFER ("right-margin-width", &BVAR (current_buffer, 
right_margin_cols),
-                    Qnil,
+                    Qintegerp,
                     doc: /* Width of right marginal area for display of a 
buffer.
 A value of nil means no marginal area.  */);
 
   DEFVAR_PER_BUFFER ("left-fringe-width", &BVAR (current_buffer, 
left_fringe_width),
-                    Qnil,
+                    Qintegerp,
                     doc: /* Width of this buffer's left fringe (in pixels).
 A value of 0 means no left fringe is shown in this buffer's window.
 A value of nil means to use the left fringe width from the window's frame.  
*/);
 
   DEFVAR_PER_BUFFER ("right-fringe-width", &BVAR (current_buffer, 
right_fringe_width),
-                    Qnil,
+                    Qintegerp,
                     doc: /* Width of this buffer's right fringe (in pixels).
 A value of 0 means no right fringe is shown in this buffer's window.
 A value of nil means to use the right fringe width from the window's frame.  
*/);
@@ -5920,7 +5898,7 @@
 A value of nil means to display fringes between margins and buffer text.  */);
 
   DEFVAR_PER_BUFFER ("scroll-bar-width", &BVAR (current_buffer, 
scroll_bar_width),
-                    Qnil,
+                    Qintegerp,
                     doc: /* Width of this buffer's scroll bars in pixels.
 A value of nil means to use the scroll bar width from the window's frame.  */);
 
@@ -6000,7 +5978,7 @@
 cursor type.  */);
 
   DEFVAR_PER_BUFFER ("scroll-up-aggressively",
-                    &BVAR (current_buffer, scroll_up_aggressively), Qnil,
+                    &BVAR (current_buffer, scroll_up_aggressively), Qfloatp,
                     doc: /* How far to scroll windows upward.
 If you move point off the bottom, the window scrolls automatically.
 This variable controls how far it scrolls.  The value nil, the default,
@@ -6013,7 +5991,7 @@
 between 0.0 and 1.0, inclusive.  */);
 
   DEFVAR_PER_BUFFER ("scroll-down-aggressively",
-                    &BVAR (current_buffer, scroll_down_aggressively), Qnil,
+                    &BVAR (current_buffer, scroll_down_aggressively), Qfloatp,
                     doc: /* How far to scroll windows downward.
 If you move point off the top, the window scrolls automatically.
 This variable controls how far it scrolls.  The value nil, the default,
@@ -6167,7 +6145,7 @@
 and they have an ellipsis as well if ELLIPSIS is non-nil.  */);
 
   DEFVAR_PER_BUFFER ("buffer-display-count",
-                    &BVAR (current_buffer, display_count), Qnil,
+                    &BVAR (current_buffer, display_count), Qintegerp,
                     doc: /* A number incremented each time this buffer is 
displayed in a window.
 The function `set-window-buffer' increments it.  */);
 
@@ -6226,7 +6204,7 @@
 `cursor-in-non-selected-windows'.  */);
 
   DEFVAR_PER_BUFFER ("line-spacing",
-                    &BVAR (current_buffer, extra_line_spacing), Qnil,
+                    &BVAR (current_buffer, extra_line_spacing), Qnumberp,
                     doc: /* Additional space to put between lines when 
displaying a buffer.
 The space is measured in pixels, and put below lines on graphic displays,
 see `display-graphic-p'.

=== modified file 'src/buffer.h'
--- a/src/buffer.h      2013-01-09 13:50:22 +0000
+++ b/src/buffer.h      2013-01-10 10:30:16 +0000
@@ -1078,7 +1078,6 @@
 extern void set_buffer_temp (struct buffer *);
 extern Lisp_Object buffer_local_value_1 (Lisp_Object, Lisp_Object);
 extern void record_buffer (Lisp_Object);
-extern _Noreturn void buffer_slot_type_mismatch (Lisp_Object, int);
 extern void fix_overlays_before (struct buffer *, ptrdiff_t, ptrdiff_t);
 extern void mmap_set_vars (bool);
 

=== modified file 'src/data.c'
--- a/src/data.c        2013-01-02 16:13:04 +0000
+++ b/src/data.c        2013-01-10 10:30:16 +0000
@@ -914,13 +914,11 @@
     case Lisp_Fwd_Buffer_Obj:
       {
        int offset = XBUFFER_OBJFWD (valcontents)->offset;
-       Lisp_Object type = XBUFFER_OBJFWD (valcontents)->slottype;
+       Lisp_Object predicate = XBUFFER_OBJFWD (valcontents)->predicate;
 
-       if (!(NILP (type) || NILP (newval)
-             || (XINT (type) == Lisp_Int0
-                 ? INTEGERP (newval)
-                 : XTYPE (newval) == XINT (type))))
-         buffer_slot_type_mismatch (newval, XINT (type));
+       if (!NILP (predicate) && !NILP (newval)
+           && NILP (call1 (predicate, newval)))
+         wrong_type_argument (predicate, newval);
 
        if (buf == NULL)
          buf = current_buffer;

=== modified file 'src/lisp.h'
--- a/src/lisp.h        2013-01-09 13:50:22 +0000
+++ b/src/lisp.h        2013-01-10 10:30:16 +0000
@@ -1450,7 +1450,8 @@
   {
     enum Lisp_Fwd_Type type;   /* = Lisp_Fwd_Buffer_Obj */
     int offset;
-    Lisp_Object slottype; /* Qnil, Lisp_Int, Lisp_Symbol, or Lisp_String.  */
+    /* One of Qnil, Qintegerp, Qsymbolp, Qstringp, Qfloatp or Qnumberp.  */
+    Lisp_Object predicate;
   };
 
 /* struct Lisp_Buffer_Local_Value is used in a symbol value cell when


reply via email to

[Prev in Thread] Current Thread [Next in Thread]