aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.h
diff options
context:
space:
mode:
authorStefan Monnier2010-04-19 21:50:52 -0400
committerStefan Monnier2010-04-19 21:50:52 -0400
commitce5b453a449e4e7729abb5128114e2687f08360d (patch)
tree55a132b01782b9667ff6f754949d55d5e52e76a4 /src/buffer.h
parent56d365a93da3c6b439998c251e9f01c73791f4b2 (diff)
downloademacs-ce5b453a449e4e7729abb5128114e2687f08360d.tar.gz
emacs-ce5b453a449e4e7729abb5128114e2687f08360d.zip
Make variable forwarding explicit rather the using special values.
Basically, this makes the structure of buffer-local values and object forwarding explicit in the type of Lisp_Symbols rather than use special Lisp_Objects for that. This tends to lead to slightly more verbose code, but is more C-like, simpler, and makes it easier to make sure we handled all cases, among other things by letting the compiler help us check it. * lisp.h (enum Lisp_Misc_Type, union Lisp_Misc): Removing forwarding objects. (enum Lisp_Fwd_Type, enum symbol_redirect, union Lisp_Fwd): New types. (struct Lisp_Symbol): Make the various forms of variable-forwarding explicit rather than hiding them inside Lisp_Object "values". (XFWDTYPE): New macro. (XINTFWD, XBOOLFWD, XOBJFWD, XKBOARD_OBJFWD): Redefine. (XBUFFER_LOCAL_VALUE): Remove. (SYMBOL_VAL, SYMBOL_ALIAS, SYMBOL_BLV, SYMBOL_FWD, SET_SYMBOL_VAL) (SET_SYMBOL_ALIAS, SET_SYMBOL_BLV, SET_SYMBOL_FWD): New macros. (SYMBOL_VALUE, SET_SYMBOL_VALUE): Remove. (struct Lisp_Intfwd, struct Lisp_Boolfwd, struct Lisp_Objfwd) (struct Lisp_Buffer_Objfwd, struct Lisp_Kboard_Objfwd): Remove the Lisp_Misc_* header. (struct Lisp_Buffer_Local_Value): Redefine. (BLV_FOUND, SET_BLV_FOUND, BLV_VALUE, SET_BLV_VALUE): New macros. (struct Lisp_Misc_Any): Add filler to get the right size. (struct Lisp_Free): Use struct Lisp_Misc_Any rather than struct Lisp_Intfwd. (DEFVAR_LISP, DEFVAR_LISP_NOPRO, DEFVAR_BOOL, DEFVAR_INT) (DEFVAR_KBOARD): Allocate a forwarding object. * data.c (do_blv_forwarding, store_blv_forwarding): New macros. (let_shadows_global_binding_p): New function. (union Lisp_Val_Fwd): New type. (make_blv): New function. (swap_in_symval_forwarding, indirect_variable, do_symval_forwarding) (store_symval_forwarding, swap_in_global_binding, Fboundp) (swap_in_symval_forwarding, find_symbol_value, Fset) (let_shadows_buffer_binding_p, set_internal, default_value) (Fset_default, Fmake_variable_buffer_local, Fmake_local_variable) (Fkill_local_variable, Fmake_variable_frame_local) (Flocal_variable_p, Flocal_variable_if_set_p) (Fvariable_binding_locus): * xdisp.c (select_frame_for_redisplay): * lread.c (Fintern, Funintern, init_obarray, defvar_int) (defvar_bool, defvar_lisp_nopro, defvar_lisp, defvar_kboard): * frame.c (store_frame_param): * eval.c (Fdefvaralias, Fuser_variable_p, specbind, unbind_to): * bytecode.c (Fbyte_code) <varref, varset>: Adapt to the new symbol value structure. * buffer.c (PER_BUFFER_SYMBOL): Move from buffer.h. (clone_per_buffer_values): Only adjust markers into the current buffer. (reset_buffer_local_variables): PER_BUFFER_IDX is never -2. (Fbuffer_local_value, set_buffer_internal_1) (swap_out_buffer_local_variables): Adapt to the new symbol value structure. (DEFVAR_PER_BUFFER): Allocate a Lisp_Buffer_Objfwd object. (defvar_per_buffer): Take a new arg for the fwd object. (buffer_lisp_local_variables): Return a proper alist (different fix for bug#4138). * alloc.c (Fmake_symbol): Use SET_SYMBOL_VAL. (Fgarbage_collect): Don't handle buffer_defaults specially. (mark_object): Handle new symbol value structure rather than the old special Lisp_Misc_* objects. (gc_sweep) <symbols>: Free also the buffer-local-value objects. * term.c (set_tty_color_mode): * bidi.c (bidi_initialize): Don't access the ->value field directly. * buffer.h (PER_BUFFER_VAR_OFFSET): Don't bother with a buffer_local_flags. * print.c (print_object): Get rid of impossible forwarding objects.
Diffstat (limited to 'src/buffer.h')
-rw-r--r--src/buffer.h25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/buffer.h b/src/buffer.h
index fa3fc6dafb8..b750e490078 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -107,6 +107,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
107#define BUF_BEG(buf) (BEG) 107#define BUF_BEG(buf) (BEG)
108#define BUF_BEG_BYTE(buf) (BEG_BYTE) 108#define BUF_BEG_BYTE(buf) (BEG_BYTE)
109 109
110/* !!!FIXME: all the BUF_BEGV/BUF_ZV/BUF_PT macros are flawed:
111 on indirect (or base) buffers, that value is only correct if that buffer
112 is the current_buffer, or if the buffer's text hasn't been modified (via
113 an indirect buffer) since it was last current. */
114
110/* Position of beginning of accessible range of buffer. */ 115/* Position of beginning of accessible range of buffer. */
111#define BUF_BEGV(buf) ((buf)->begv) 116#define BUF_BEGV(buf) ((buf)->begv)
112#define BUF_BEGV_BYTE(buf) ((buf)->begv_byte) 117#define BUF_BEGV_BYTE(buf) ((buf)->begv_byte)
@@ -313,7 +318,7 @@ while (0)
313 - (ptr - (current_buffer)->text->beg <= (unsigned) (GPT_BYTE - BEG_BYTE) ? 0 : GAP_SIZE) \ 318 - (ptr - (current_buffer)->text->beg <= (unsigned) (GPT_BYTE - BEG_BYTE) ? 0 : GAP_SIZE) \
314 + BEG_BYTE) 319 + BEG_BYTE)
315 320
316/* Return character at position POS. */ 321/* Return character at byte position POS. */
317 322
318#define FETCH_CHAR(pos) \ 323#define FETCH_CHAR(pos) \
319 (!NILP (current_buffer->enable_multibyte_characters) \ 324 (!NILP (current_buffer->enable_multibyte_characters) \
@@ -327,7 +332,7 @@ while (0)
327/* Variables used locally in FETCH_MULTIBYTE_CHAR. */ 332/* Variables used locally in FETCH_MULTIBYTE_CHAR. */
328extern unsigned char *_fetch_multibyte_char_p; 333extern unsigned char *_fetch_multibyte_char_p;
329 334
330/* Return character code of multi-byte form at position POS. If POS 335/* Return character code of multi-byte form at byte position POS. If POS
331 doesn't point the head of valid multi-byte form, only the byte at 336 doesn't point the head of valid multi-byte form, only the byte at
332 POS is returned. No range checking. */ 337 POS is returned. No range checking. */
333 338
@@ -336,7 +341,7 @@ extern unsigned char *_fetch_multibyte_char_p;
336 + (pos) + BEG_ADDR - BEG_BYTE), \ 341 + (pos) + BEG_ADDR - BEG_BYTE), \
337 STRING_CHAR (_fetch_multibyte_char_p)) 342 STRING_CHAR (_fetch_multibyte_char_p))
338 343
339/* Return character at position POS. If the current buffer is unibyte 344/* Return character at byte position POS. If the current buffer is unibyte
340 and the character is not ASCII, make the returning character 345 and the character is not ASCII, make the returning character
341 multibyte. */ 346 multibyte. */
342 347
@@ -447,7 +452,10 @@ struct buffer_text
447 /* The markers that refer to this buffer. 452 /* The markers that refer to this buffer.
448 This is actually a single marker --- 453 This is actually a single marker ---
449 successive elements in its marker `chain' 454 successive elements in its marker `chain'
450 are the other markers referring to this buffer. */ 455 are the other markers referring to this buffer.
456 This is a singly linked unordered list, which means that it's
457 very cheap to add a marker to the list and it's also very cheap
458 to move a marker within a buffer. */
451 struct Lisp_Marker *markers; 459 struct Lisp_Marker *markers;
452 460
453 /* Usually 0. Temporarily set to 1 in decode_coding_gap to 461 /* Usually 0. Temporarily set to 1 in decode_coding_gap to
@@ -843,6 +851,7 @@ extern struct buffer buffer_defaults;
843 be a Lisp-level local variable for the slot, it has no default value, 851 be a Lisp-level local variable for the slot, it has no default value,
844 and the corresponding slot in buffer_defaults is not used. */ 852 and the corresponding slot in buffer_defaults is not used. */
845 853
854
846extern struct buffer buffer_local_flags; 855extern struct buffer buffer_local_flags;
847 856
848/* For each buffer slot, this points to the Lisp symbol name 857/* For each buffer slot, this points to the Lisp symbol name
@@ -948,7 +957,7 @@ extern int last_per_buffer_idx;
948 from the start of a buffer structure. */ 957 from the start of a buffer structure. */
949 958
950#define PER_BUFFER_VAR_OFFSET(VAR) \ 959#define PER_BUFFER_VAR_OFFSET(VAR) \
951 ((char *) &buffer_local_flags.VAR - (char *) &buffer_local_flags) 960 ((char *) &((struct buffer *)0)->VAR - (char *) ((struct buffer *)0))
952 961
953/* Return the index of buffer-local variable VAR. Each per-buffer 962/* Return the index of buffer-local variable VAR. Each per-buffer
954 variable has an index > 0 associated with it, except when it always 963 variable has an index > 0 associated with it, except when it always
@@ -1013,11 +1022,5 @@ extern int last_per_buffer_idx;
1013#define PER_BUFFER_VALUE(BUFFER, OFFSET) \ 1022#define PER_BUFFER_VALUE(BUFFER, OFFSET) \
1014 (*(Lisp_Object *)((OFFSET) + (char *) (BUFFER))) 1023 (*(Lisp_Object *)((OFFSET) + (char *) (BUFFER)))
1015 1024
1016/* Return the symbol of the per-buffer variable at offset OFFSET in
1017 the buffer structure. */
1018
1019#define PER_BUFFER_SYMBOL(OFFSET) \
1020 (*(Lisp_Object *)((OFFSET) + (char *) &buffer_local_symbols))
1021
1022/* arch-tag: 679305dd-d41c-4a50-b170-3caf5c97b2d1 1025/* arch-tag: 679305dd-d41c-4a50-b170-3caf5c97b2d1
1023 (do not change this comment) */ 1026 (do not change this comment) */