diff options
| author | Stefan Monnier | 2010-04-19 21:50:52 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2010-04-19 21:50:52 -0400 |
| commit | ce5b453a449e4e7729abb5128114e2687f08360d (patch) | |
| tree | 55a132b01782b9667ff6f754949d55d5e52e76a4 /src/buffer.h | |
| parent | 56d365a93da3c6b439998c251e9f01c73791f4b2 (diff) | |
| download | emacs-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.h | 25 |
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. */ |
| 328 | extern unsigned char *_fetch_multibyte_char_p; | 333 | extern 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 | |||
| 846 | extern struct buffer buffer_local_flags; | 855 | extern 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) */ |