# HG changeset patch # User Gerd Moellmann # Date 954079650 0 # Node ID c46e609d887ac35eb76ec6a583b0310e4706c198 # Parent cdb964ab44c3f6e06c153b307f4b701f6ca48cb4 (buffer_permanent_local_flags): Make a char array. (max_buffer_local_idx): New variable. (reset_buffer_local_variables, Fbuffer_local_variables): Rewritten for new handling of per-buffer variables. (buffer_slot_type_mismatch): Use new macros for per-buffer vars. (init_buffer_once): Initialize per-buffer vars differently. Set max_buffer_local_idx. diff -r cdb964ab44c3 -r c46e609d887a src/buffer.c --- a/src/buffer.c Sun Mar 26 14:06:41 2000 +0000 +++ b/src/buffer.c Sun Mar 26 14:07:30 2000 +0000 @@ -73,8 +73,8 @@ The value has only one nonzero bit. When a buffer has its own local value for a slot, - the bit for that slot (found in the same slot in this structure) - is turned on in the buffer's local_var_flags slot. + the entry for that slot (found in the same slot in this structure) + is turned on in the buffer's local_flags array. If a slot in this structure is -1, then even though there may be a DEFVAR_PER_BUFFER for the slot, there is no default value for it; @@ -112,7 +112,11 @@ /* Flags indicating which built-in buffer-local variables are permanent locals. */ -static int buffer_permanent_local_flags; +static char buffer_permanent_local_flags[MAX_BUFFER_LOCAL_VARS]; + +/* Number of per-buffer variables used. */ + +int max_buffer_local_idx; Lisp_Object Fset_buffer (); void set_buffer_internal (); @@ -556,13 +560,7 @@ int permanent_too; { register int offset; - int dont_reset; - - /* Decide which built-in local variables to reset. */ - if (permanent_too) - dont_reset = 0; - else - dont_reset = buffer_permanent_local_flags; + int i; /* Reset the major mode to Fundamental, together with all the things that depend on the major mode. @@ -597,22 +595,24 @@ /* Reset all (or most) per-buffer variables to their defaults. */ b->local_var_alist = Qnil; - b->local_var_flags &= dont_reset; + for (i = 0; i < max_buffer_local_idx; ++i) + if (permanent_too || buffer_permanent_local_flags[i] == 0) + SET_BUFFER_HAS_LOCAL_VALUE_P (b, i, 0); /* For each slot that has a default value, copy that into the slot. */ - for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags; - offset < sizeof (struct buffer); - offset += sizeof (Lisp_Object)) /* sizeof EMACS_INT == sizeof Lisp_Object */ + for (offset = BUFFER_LOCAL_VAR_OFFSET (name); + offset < sizeof *b; + offset += sizeof (Lisp_Object)) { - int flag = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags)); - if ((flag > 0 - /* Don't reset a permanent local. */ - && ! (dont_reset & flag)) - || flag == -2) - *(Lisp_Object *)(offset + (char *)b) - = *(Lisp_Object *)(offset + (char *)&buffer_defaults); + int idx = BUFFER_LOCAL_IDX (offset); + if ((idx > 0 + && (permanent_too + || buffer_permanent_local_flags[idx] == 0)) + /* Is -2 used anywhere? */ + || idx == -2) + BUFFER_LOCAL_VALUE (b, offset) = BUFFER_LOCAL_DEFAULT_VALUE (offset); } } @@ -757,20 +757,19 @@ /* Add on all the variables stored in special slots. */ { - register int offset, mask; - - for (offset = (char *)&buffer_local_symbols.name - (char *)&buffer_local_symbols; + int offset, idx; + + for (offset = BUFFER_LOCAL_VAR_OFFSET (name); offset < sizeof (struct buffer); - offset += (sizeof (EMACS_INT))) /* sizeof EMACS_INT == sizeof Lisp_Object */ + /* sizeof EMACS_INT == sizeof Lisp_Object */ + offset += (sizeof (EMACS_INT))) { - mask = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags)); - if (mask == -1 || (buf->local_var_flags & mask)) - if (SYMBOLP (*(Lisp_Object *)(offset - + (char *)&buffer_local_symbols))) - result = Fcons (Fcons (*((Lisp_Object *) - (offset + (char *)&buffer_local_symbols)), - *(Lisp_Object *)(offset + (char *)buf)), - result); + idx = BUFFER_LOCAL_IDX (offset); + if ((idx == -1 || BUFFER_HAS_LOCAL_VALUE_P (buf, idx)) + && SYMBOLP (BUFFER_LOCAL_SYMBOL (offset))) + result = Fcons (Fcons (BUFFER_LOCAL_SYMBOL (offset), + BUFFER_LOCAL_VALUE (buf, offset)), + result); } } @@ -3822,25 +3821,37 @@ { Lisp_Object sym; char *type_name; - sym = *(Lisp_Object *)(offset + (char *)&buffer_local_symbols); - switch (XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_types))) + + switch (XINT (BUFFER_LOCAL_TYPE (offset))) { - case Lisp_Int: type_name = "integers"; break; - case Lisp_String: type_name = "strings"; break; - case Lisp_Symbol: type_name = "symbols"; break; - + case Lisp_Int: + type_name = "integers"; + break; + + case Lisp_String: + type_name = "strings"; + break; + + case Lisp_Symbol: + type_name = "symbols"; + break; + default: abort (); } + sym = BUFFER_LOCAL_SYMBOL (offset); error ("Only %s should be stored in the buffer-local variable %s", type_name, XSYMBOL (sym)->name->data); } + void init_buffer_once () { - buffer_permanent_local_flags = 0; + int idx; + + bzero (buffer_permanent_local_flags, sizeof buffer_permanent_local_flags); /* Make sure all markable slots in buffer_defaults are initialized reasonably, so mark_buffer won't choke. */ @@ -3927,40 +3938,46 @@ XSETINT (buffer_local_flags.display_time, -1); XSETINT (buffer_local_flags.enable_multibyte_characters, -1); - XSETFASTINT (buffer_local_flags.mode_line_format, 1); - XSETFASTINT (buffer_local_flags.abbrev_mode, 2); - XSETFASTINT (buffer_local_flags.overwrite_mode, 4); - XSETFASTINT (buffer_local_flags.case_fold_search, 8); - XSETFASTINT (buffer_local_flags.auto_fill_function, 0x10); - XSETFASTINT (buffer_local_flags.selective_display, 0x20); + idx = 1; + XSETFASTINT (buffer_local_flags.mode_line_format, idx); ++idx; + XSETFASTINT (buffer_local_flags.abbrev_mode, idx); ++idx; + XSETFASTINT (buffer_local_flags.overwrite_mode, idx); ++idx; + XSETFASTINT (buffer_local_flags.case_fold_search, idx); ++idx; + XSETFASTINT (buffer_local_flags.auto_fill_function, idx); ++idx; + XSETFASTINT (buffer_local_flags.selective_display, idx); ++idx; #ifndef old - XSETFASTINT (buffer_local_flags.selective_display_ellipses, 0x40); + XSETFASTINT (buffer_local_flags.selective_display_ellipses, idx); ++idx; #endif - XSETFASTINT (buffer_local_flags.tab_width, 0x80); - XSETFASTINT (buffer_local_flags.truncate_lines, 0x100); - XSETFASTINT (buffer_local_flags.ctl_arrow, 0x200); - XSETFASTINT (buffer_local_flags.fill_column, 0x400); - XSETFASTINT (buffer_local_flags.left_margin, 0x800); - XSETFASTINT (buffer_local_flags.abbrev_table, 0x1000); - XSETFASTINT (buffer_local_flags.display_table, 0x2000); + XSETFASTINT (buffer_local_flags.tab_width, idx); ++idx; + XSETFASTINT (buffer_local_flags.truncate_lines, idx); ++idx; + XSETFASTINT (buffer_local_flags.ctl_arrow, idx); ++idx; + XSETFASTINT (buffer_local_flags.fill_column, idx); ++idx; + XSETFASTINT (buffer_local_flags.left_margin, idx); ++idx; + XSETFASTINT (buffer_local_flags.abbrev_table, idx); ++idx; + XSETFASTINT (buffer_local_flags.display_table, idx); ++idx; #ifdef DOS_NT - XSETFASTINT (buffer_local_flags.buffer_file_type, 0x4000); + XSETFASTINT (buffer_local_flags.buffer_file_type, idx); /* Make this one a permanent local. */ - buffer_permanent_local_flags |= 0x4000; + buffer_permanent_local_flags[idx++] = 1; #endif - XSETFASTINT (buffer_local_flags.syntax_table, 0x8000); - XSETFASTINT (buffer_local_flags.cache_long_line_scans, 0x10000); - XSETFASTINT (buffer_local_flags.category_table, 0x20000); - XSETFASTINT (buffer_local_flags.direction_reversed, 0x40000); - XSETFASTINT (buffer_local_flags.buffer_file_coding_system, 0x80000); + XSETFASTINT (buffer_local_flags.syntax_table, idx); ++idx; + XSETFASTINT (buffer_local_flags.cache_long_line_scans, idx); ++idx; + XSETFASTINT (buffer_local_flags.category_table, idx); ++idx; + XSETFASTINT (buffer_local_flags.direction_reversed, idx); ++idx; + XSETFASTINT (buffer_local_flags.buffer_file_coding_system, idx); /* Make this one a permanent local. */ - buffer_permanent_local_flags |= 0x80000; - XSETFASTINT (buffer_local_flags.left_margin_width, 0x100000); - XSETFASTINT (buffer_local_flags.right_margin_width, 0x200000); - XSETFASTINT (buffer_local_flags.indicate_empty_lines, 0x400000); - XSETFASTINT (buffer_local_flags.scroll_up_aggressively, 0x800000); - XSETFASTINT (buffer_local_flags.scroll_down_aggressively, 0x1000000); - XSETFASTINT (buffer_local_flags.header_line_format, 0x2000000); + buffer_permanent_local_flags[idx++] = 1; + XSETFASTINT (buffer_local_flags.left_margin_width, idx); ++idx; + XSETFASTINT (buffer_local_flags.right_margin_width, idx); ++idx; + XSETFASTINT (buffer_local_flags.indicate_empty_lines, idx); ++idx; + XSETFASTINT (buffer_local_flags.scroll_up_aggressively, idx); ++idx; + XSETFASTINT (buffer_local_flags.scroll_down_aggressively, idx); ++idx; + XSETFASTINT (buffer_local_flags.header_line_format, idx); ++idx; + + /* Need more room? */ + if (idx >= MAX_BUFFER_LOCAL_VARS) + abort (); + max_buffer_local_idx = idx; Vbuffer_alist = Qnil; current_buffer = 0;