# HG changeset patch # User Jim Blandy # Date 714205117 0 # Node ID c1ebe69206dfb49c3c8c9a40d4e3deacd2d74770 # Parent 67bfadf240438968b16a28116d7800253ddb1ec0 * buffer.c (syms_of_buffer): Call DEFVAR_PER_BUFFER with the new TYPE argument. * buffer.c (buffer_local_types): New variable. (buffer_slot_type_mismatch): New function. diff -r 67bfadf24043 -r c1ebe69206df src/buffer.c --- a/src/buffer.c Wed Aug 19 06:18:07 1992 +0000 +++ b/src/buffer.c Wed Aug 19 06:18:37 1992 +0000 @@ -85,6 +85,14 @@ /* 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. When a tag does not match, the function + buffer_slot_type_mismatch will signal an error. */ +struct buffer buffer_local_types; + /* Nonzero means don't allow modification of protected fields. */ int check_protected_fields; @@ -1201,6 +1209,34 @@ return collector; } +/* Somebody has tried to store NEWVAL into the buffer-local slot with + offset XUINT (valcontents), and NEWVAL has an unacceptable type. */ +void +buffer_slot_type_mismatch (valcontents, newval) + Lisp_Object valcontents, newval; +{ + unsigned int offset = XUINT (valcontents); + char *symbol_name = + (XSYMBOL (*(Lisp_Object *)(offset + (char *)&buffer_local_symbols)) + ->name->data); + char *type_name; + + switch (XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_types))) + { + case Lisp_Int: type_name = "integers"; break; + case Lisp_String: type_name = "strings"; break; + case Lisp_Marker: type_name = "markers"; break; + case Lisp_Symbol: type_name = "symbols"; break; + case Lisp_Cons: type_name = "lists"; break; + case Lisp_Vector: type_name = "vector"; break; + default: + abort (); + } + + error ("only %s should be stored in the buffer-local variable %s", + type_name, symbol_name); +} + init_buffer_once () { register Lisp_Object tem; @@ -1378,7 +1414,8 @@ "Default value of `case-fold-search' for buffers that don't override it.\n\ This is the same as (default-value 'case-fold-search)."); - DEFVAR_PER_BUFFER ("mode-line-format", ¤t_buffer->mode_line_format, 0); + DEFVAR_PER_BUFFER ("mode-line-format", ¤t_buffer->mode_line_format, + Qnil, 0); /* This doc string is too long for cpp; cpp dies if it isn't in a comment. But make-docfile finds it! @@ -1415,40 +1452,46 @@ nil here means use current buffer's major mode."); DEFVAR_PER_BUFFER ("major-mode", ¤t_buffer->major_mode, + make_number (Lisp_Symbol), "Symbol for current buffer's major mode."); DEFVAR_PER_BUFFER ("mode-name", ¤t_buffer->mode_name, + make_number (Lisp_String), "Pretty name of current buffer's major mode (a string)."); - DEFVAR_PER_BUFFER ("abbrev-mode", ¤t_buffer->abbrev_mode, + DEFVAR_PER_BUFFER ("abbrev-mode", ¤t_buffer->abbrev_mode, Qnil, "Non-nil turns on automatic expansion of abbrevs as they are inserted.\n\ Automatically becomes buffer-local when set in any fashion."); DEFVAR_PER_BUFFER ("case-fold-search", ¤t_buffer->case_fold_search, + Qnil, "*Non-nil if searches should ignore case.\n\ Automatically becomes buffer-local when set in any fashion."); DEFVAR_PER_BUFFER ("fill-column", ¤t_buffer->fill_column, + make_number (Lisp_Int), "*Column beyond which automatic line-wrapping should happen.\n\ Automatically becomes buffer-local when set in any fashion."); DEFVAR_PER_BUFFER ("left-margin", ¤t_buffer->left_margin, + make_number (Lisp_Int), "*Column for the default indent-line-function to indent to.\n\ Linefeed indents to this column in Fundamental mode.\n\ Automatically becomes buffer-local when set in any fashion."); DEFVAR_PER_BUFFER ("tab-width", ¤t_buffer->tab_width, + make_number (Lisp_Int), "*Distance between tab stops (for display of tab characters), in columns.\n\ Automatically becomes buffer-local when set in any fashion."); - DEFVAR_PER_BUFFER ("ctl-arrow", ¤t_buffer->ctl_arrow, + DEFVAR_PER_BUFFER ("ctl-arrow", ¤t_buffer->ctl_arrow, Qnil, "*Non-nil means display control chars with uparrow.\n\ Nil means use backslash and octal digits.\n\ Automatically becomes buffer-local when set in any fashion.\n\ This variable does not apply to characters whose display is specified\n\ in the current display table (if there is one)."); - DEFVAR_PER_BUFFER ("truncate-lines", ¤t_buffer->truncate_lines, + DEFVAR_PER_BUFFER ("truncate-lines", ¤t_buffer->truncate_lines, Qnil, "*Non-nil means do not display continuation lines;\n\ give each line of text one screen line.\n\ Automatically becomes buffer-local when set in any fashion.\n\ @@ -1458,10 +1501,12 @@ and this buffer is not full-frame width."); DEFVAR_PER_BUFFER ("default-directory", ¤t_buffer->directory, + make_number (Lisp_String), "Name of default directory of current buffer. Should end with slash.\n\ Each buffer has its own value of this variable."); DEFVAR_PER_BUFFER ("auto-fill-function", ¤t_buffer->auto_fill_function, + Qnil, "Function called (if non-nil) to perform auto-fill.\n\ It is called after self-inserting a space at a column beyond `fill-column'.\n\ Each buffer has its own value of this variable.\n\ @@ -1469,30 +1514,34 @@ It may not be a list of functions."); DEFVAR_PER_BUFFER ("buffer-file-name", ¤t_buffer->filename, + make_number (Lisp_String), "Name of file visited in current buffer, or nil if not visiting a file.\n\ Each buffer has its own value of this variable."); DEFVAR_PER_BUFFER ("buffer-auto-save-file-name", ¤t_buffer->auto_save_file_name, + make_number (Lisp_String), "Name of file for auto-saving current buffer,\n\ or nil if buffer should not be auto-saved.\n\ Each buffer has its own value of this variable."); - DEFVAR_PER_BUFFER ("buffer-read-only", ¤t_buffer->read_only, + DEFVAR_PER_BUFFER ("buffer-read-only", ¤t_buffer->read_only, Qnil, "Non-nil if this buffer is read-only.\n\ Each buffer has its own value of this variable."); - DEFVAR_PER_BUFFER ("buffer-backed-up", ¤t_buffer->backed_up, + DEFVAR_PER_BUFFER ("buffer-backed-up", ¤t_buffer->backed_up, Qnil, "Non-nil if this buffer's file has been backed up.\n\ Backing up is done before the first time the file is saved.\n\ Each buffer has its own value of this variable."); DEFVAR_PER_BUFFER ("buffer-saved-size", ¤t_buffer->save_length, + make_number (Lisp_Int), "Length of current buffer when last read in, saved or auto-saved.\n\ 0 initially.\n\ Each buffer has its own value of this variable."); DEFVAR_PER_BUFFER ("selective-display", ¤t_buffer->selective_display, + Qnil, "Non-nil enables selective display:\n\ Integer N as value means display only lines\n\ that start with less than n columns of space.\n\ @@ -1503,15 +1552,17 @@ #ifndef old DEFVAR_PER_BUFFER ("selective-display-ellipses", ¤t_buffer->selective_display_ellipses, + Qnil, "t means display ... on previous line when a line is invisible.\n\ Automatically becomes buffer-local when set in any fashion."); #endif - DEFVAR_PER_BUFFER ("overwrite-mode", ¤t_buffer->overwrite_mode, + DEFVAR_PER_BUFFER ("overwrite-mode", ¤t_buffer->overwrite_mode, Qnil, "Non-nil if self-insertion should replace existing text.\n\ Automatically becomes buffer-local when set in any fashion."); DEFVAR_PER_BUFFER ("buffer-display-table", ¤t_buffer->display_table, + make_number (Lisp_Vector), "Display table that controls display of the contents of current buffer.\n\ Automatically becomes buffer-local when set in any fashion.\n\ The display table is a vector created with `make-display-table'.\n\ @@ -1528,6 +1579,7 @@ Each window can have its own, overriding display table."); DEFVAR_PER_BUFFER ("buffer-field-list", ¤t_buffer->fieldlist, + make_number (Lisp_Cons), "List of fields in the current buffer. See `add-field'."); DEFVAR_BOOL ("check-protected-fields", check_protected_fields, @@ -1569,6 +1621,7 @@ Vfirst_change_function = Qnil; DEFVAR_PER_BUFFER ("buffer-undo-list", ¤t_buffer->undo_list, + make_number (Lisp_Cons), "List of undo entries in current buffer.\n\ Recent changes come first; older changes follow newer.\n\ \n\