changeset 86285:59344cb482f3

* lisp.h (struct Lisp_Buffer_Objfwd): Add a `slottype' field. * data.c (store_symval_forwarding): Get type from buffer_objfwd. Update call to buffer_slot_type_mismatch. * buffer.h (buffer_local_types, PER_BUFFER_TYPE): Remove. (buffer_slot_type_mismatch): Update. * buffer.c (buffer_local_types): Remove. (buffer_slot_type_mismatch): Get the symbol and type as arguments. (defvar_per_buffer): Set the type in the buffer_objfwd.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Wed, 21 Nov 2007 20:59:47 +0000
parents d0c1a4ea2562
children 08ed3671eb2d
files src/ChangeLog src/buffer.c src/buffer.h src/data.c src/lisp.h
diffstat 5 files changed, 24 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Wed Nov 21 20:37:22 2007 +0000
+++ b/src/ChangeLog	Wed Nov 21 20:59:47 2007 +0000
@@ -1,7 +1,18 @@
+2007-11-21  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* lisp.h (struct Lisp_Buffer_Objfwd): Add a `slottype' field.
+	* data.c (store_symval_forwarding): Get type from buffer_objfwd.
+	Update call to buffer_slot_type_mismatch.
+	* buffer.h (buffer_local_types, PER_BUFFER_TYPE): Remove.
+	(buffer_slot_type_mismatch): Update.
+	* buffer.c (buffer_local_types): Remove.
+	(buffer_slot_type_mismatch): Get the symbol and type as arguments.
+	(defvar_per_buffer): Set the type in the buffer_objfwd.
+
 2007-11-21  Jason Rumney  <jasonr@gnu.org>
 
-	* w32bdf.c (w32_init_bdf_font, w32_BDF_to_x_font): CreateFileMapping
-	returns NULL on failure.
+	* w32bdf.c (w32_init_bdf_font, w32_BDF_to_x_font):
+	CreateFileMapping returns NULL on failure.
 
 2007-11-21  Stefan Monnier  <monnier@iro.umontreal.ca>
 
--- a/src/buffer.c	Wed Nov 21 20:37:22 2007 +0000
+++ b/src/buffer.c	Wed Nov 21 20:59:47 2007 +0000
@@ -99,17 +99,6 @@
 /* A Lisp_Object pointer to the above, used for staticpro */
 static Lisp_Object Vbuffer_local_symbols;
 
-/* This structure holds the required types for the values in the
-   buffer-local slots.  If a slot contains Qnil, then the
-   corresponding buffer slot may contain a value of any type.  If a
-   slot contains an integer, then prospective values' tags must be
-   equal to that integer (except nil is always allowed).
-   When a tag does not match, the function
-   buffer_slot_type_mismatch will signal an error.
-
-   If a slot here contains -1, the corresponding variable is read-only.  */
-struct buffer buffer_local_types;
-
 /* Flags indicating which built-in buffer-local variables
    are permanent locals.  */
 static char buffer_permanent_local_flags[MAX_PER_BUFFER_VARS];
@@ -4402,13 +4391,13 @@
    in the slot with offset OFFSET.  */
 
 void
-buffer_slot_type_mismatch (offset)
-     int offset;
+buffer_slot_type_mismatch (sym, type)
+     Lisp_Object sym;
+     int type;
 {
-  Lisp_Object sym;
   char *type_name;
 
-  switch (XINT (PER_BUFFER_TYPE (offset)))
+  switch (type)
     {
     case Lisp_Int:
       type_name = "integers";
@@ -4426,7 +4415,6 @@
       abort ();
     }
 
-  sym = PER_BUFFER_SYMBOL (offset);
   error ("Only %s should be stored in the buffer-local variable %s",
 	 type_name, SDATA (SYMBOL_NAME (sym)));
 }
@@ -5274,9 +5262,9 @@
 
   XMISCTYPE (val) = Lisp_Misc_Buffer_Objfwd;
   XBUFFER_OBJFWD (val)->offset = offset;
+  XBUFFER_OBJFWD (val)->slottype = type;
   SET_SYMBOL_VALUE (sym, val);
   PER_BUFFER_SYMBOL (offset) = sym;
-  PER_BUFFER_TYPE (offset) = type;
 
   if (PER_BUFFER_IDX (offset) == 0)
     /* Did a DEFVAR_PER_BUFFER without initializing the corresponding
--- a/src/buffer.h	Wed Nov 21 20:37:22 2007 +0000
+++ b/src/buffer.h	Wed Nov 21 20:59:47 2007 +0000
@@ -818,18 +818,6 @@
    that don't have such names.  */
 
 extern struct buffer buffer_local_symbols;
-
-/* This structure holds the required types for the values in the
-   buffer-local slots.  If a slot contains Qnil, then the
-   corresponding buffer slot may contain a value of any type.  If a
-   slot contains an integer, then prospective values' tags must be
-   equal to that integer (except nil is always allowed).
-   When a tag does not match, the function
-   buffer_slot_type_mismatch will signal an error.
-
-   If a slot here contains -1, the corresponding variable is read-only.  */
-
-extern struct buffer buffer_local_types;
 
 extern void delete_all_overlays P_ ((struct buffer *));
 extern void reset_buffer P_ ((struct buffer *));
@@ -843,7 +831,7 @@
 extern void set_buffer_internal_1 P_ ((struct buffer *));
 extern void set_buffer_temp P_ ((struct buffer *));
 extern void record_buffer P_ ((Lisp_Object));
-extern void buffer_slot_type_mismatch P_ ((int)) NO_RETURN;
+extern void buffer_slot_type_mismatch P_ ((Lisp_Object, int)) NO_RETURN;
 extern void fix_overlays_before P_ ((struct buffer *, EMACS_INT, EMACS_INT));
 extern void mmap_set_vars P_ ((int));
 
@@ -995,11 +983,5 @@
 #define PER_BUFFER_SYMBOL(OFFSET) \
       (*(Lisp_Object *)((OFFSET) + (char *) &buffer_local_symbols))
 
-/* Return the type of the per-buffer variable at offset OFFSET in the
-   buffer structure.  */
-
-#define PER_BUFFER_TYPE(OFFSET) \
-      (*(Lisp_Object *)((OFFSET) + (char *) &buffer_local_types))
-
 /* arch-tag: 679305dd-d41c-4a50-b170-3caf5c97b2d1
    (do not change this comment) */
--- a/src/data.c	Wed Nov 21 20:37:22 2007 +0000
+++ b/src/data.c	Wed Nov 21 20:59:47 2007 +0000
@@ -930,7 +930,7 @@
 	  break;
 
 	case Lisp_Misc_Boolfwd:
-	  *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1;
+	  *XBOOLFWD (valcontents)->boolvar = !NILP (newval);
 	  break;
 
 	case Lisp_Misc_Objfwd:
@@ -970,12 +970,11 @@
 	case Lisp_Misc_Buffer_Objfwd:
 	  {
 	    int offset = XBUFFER_OBJFWD (valcontents)->offset;
-	    Lisp_Object type;
-
-	    type = PER_BUFFER_TYPE (offset);
+	    Lisp_Object type = XBUFFER_OBJFWD (valcontents)->slottype;
+
 	    if (! NILP (type) && ! NILP (newval)
 		&& XTYPE (newval) != XINT (type))
-	      buffer_slot_type_mismatch (offset);
+	      buffer_slot_type_mismatch (symbol, XINT (type));
 
 	    if (buf == NULL)
 	      buf = current_buffer;
--- a/src/lisp.h	Wed Nov 21 20:37:22 2007 +0000
+++ b/src/lisp.h	Wed Nov 21 20:59:47 2007 +0000
@@ -1226,6 +1226,7 @@
     int type : 16;	/* = Lisp_Misc_Buffer_Objfwd */
     unsigned gcmarkbit : 1;
     int spacer : 15;
+    Lisp_Object slottype; /* Qnil, Lisp_Int, Lisp_Symbol, or Lisp_String.  */
     int offset;
   };