Mercurial > emacs
changeset 9891:f4a53f86853d
(enum Lisp_Misc_Type): Add new enumerations Lisp_Misc_Buffer_Local_Value and
Lisp_Misc_Some_Buffer_Local_Value.
(enum Lisp_Type): Delete the corresponding enumerations from here.
(struct Lisp_Buffer_Local_Value): New structure.
(XBUFFER_LOCAL_VALUE): Access the new structure.
(BUFFER_LOCAL_VALUEP, BUFFER_SOME_LOCAL_VALUEP): Likewise.
(union Lisp_Misc): Add new member.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Fri, 11 Nov 1994 07:32:54 +0000 |
parents | 5f3d80bda2f8 |
children | beb59716f299 |
files | src/lisp.h |
diffstat | 1 files changed, 51 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lisp.h Fri Nov 11 04:23:40 1994 +0000 +++ b/src/lisp.h Fri Nov 11 07:32:54 1994 +0000 @@ -78,45 +78,6 @@ Lisp_Frame, #endif - /* Used in a symbol value cell when the symbol's value is per-buffer. - The actual contents are a cons cell which starts a list like this: - (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE). - - BUFFER is the last buffer for which this symbol's value was - made up to date. - - CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's - local_var_alist, that being the element whose car is this - variable. Or it can be a pointer to the - (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), - if BUFFER does not have an element in its alist for this - variable (that is, if BUFFER sees the default value of this - variable). - - If we want to examine or set the value and BUFFER is current, - we just examine or set REALVALUE. If BUFFER is not current, we - store the current REALVALUE value into CURRENT-ALIST-ELEMENT, - then find the appropriate alist element for the buffer now - current and set up CURRENT-ALIST-ELEMENT. Then we set - REALVALUE out of that element, and store into BUFFER. - - If we are setting the variable and the current buffer does not - have an alist entry for this variable, an alist entry is - created. - - Note that REALVALUE can be a forwarding pointer. Each time it - is examined or set, forwarding must be done. Each time we - switch buffers, buffer-local variables which forward into C - variables are swapped immediately, so the C code can assume - that they are always up to date. */ - Lisp_Buffer_Local_Value, - - /* Like Lisp_Buffer_Local_Value with one difference: - merely setting the variable while some buffer is current - does not cause that buffer to have its own local value of this variable. - Only make-local-variable does that. */ - Lisp_Some_Buffer_Local_Value, - /* Window used for Emacs display. Data inside looks like a Lisp_Vector. */ Lisp_Window, @@ -146,7 +107,9 @@ Lisp_Misc_Intfwd, Lisp_Misc_Boolfwd, Lisp_Misc_Objfwd, - Lisp_Misc_Buffer_Objfwd + Lisp_Misc_Buffer_Objfwd, + Lisp_Misc_Buffer_Local_Value, + Lisp_Misc_Some_Buffer_Local_Value }; #ifndef NO_UNION_TYPE @@ -419,6 +382,7 @@ #define XBOOLFWD(a) (&(XMISC(a)->u_boolfwd)) #define XOBJFWD(a) (&(XMISC(a)->u_objfwd)) #define XBUFFER_OBJFWD(a) (&(XMISC(a)->u_buffer_objfwd)) +#define XBUFFER_LOCAL_VALUE(a) (&(XMISC(a)->u_buffer_local_value)) #define XSETINT(a, b) XSET (a, Lisp_Int, b) #define XSETCONS(a, b) XSET (a, Lisp_Cons, b) @@ -609,6 +573,50 @@ int offset; }; +/* Used in a symbol value cell when the symbol's value is per-buffer. + The actual contents resemble a cons cell which starts a list like this: + (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE). + + BUFFER is the last buffer for which this symbol's value was + made up to date. + + CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's + local_var_alist, that being the element whose car is this + variable. Or it can be a pointer to the + (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), + if BUFFER does not have an element in its alist for this + variable (that is, if BUFFER sees the default value of this + variable). + + If we want to examine or set the value and BUFFER is current, + we just examine or set REALVALUE. If BUFFER is not current, we + store the current REALVALUE value into CURRENT-ALIST-ELEMENT, + then find the appropriate alist element for the buffer now + current and set up CURRENT-ALIST-ELEMENT. Then we set + REALVALUE out of that element, and store into BUFFER. + + If we are setting the variable and the current buffer does not + have an alist entry for this variable, an alist entry is + created. + + Note that REALVALUE can be a forwarding pointer. Each time it + is examined or set, forwarding must be done. Each time we + switch buffers, buffer-local variables which forward into C + variables are swapped immediately, so the C code can assume + that they are always up to date. + + Lisp_Misc_Buffer_Local_Value and Lisp_Misc_Some_Buffer_Local_Value + use the same substructure. The difference is that with the latter, + merely setting the variable while some buffer is current + does not cause that buffer to have its own local value of this variable. + Only make-local-variable does that. */ +struct Lisp_Buffer_Local_Value + { + enum Lisp_Misc_Type type; /* = Lisp_Misc_Buffer_Local_Value + or Lisp_Misc_Some_Buffer_Local_Value */ + Lisp_Object car, cdr; + }; + union Lisp_Misc { enum Lisp_Misc_Type type; @@ -618,6 +626,7 @@ struct Lisp_Boolfwd u_boolfwd; struct Lisp_Objfwd u_objfwd; struct Lisp_Buffer_Objfwd u_buffer_objfwd; + struct Lisp_Buffer_Local_Value u_buffer_local_value; }; #ifdef LISP_FLOAT_TYPE @@ -761,13 +770,13 @@ #define FLOATP(x) (0) #endif #define OVERLAYP(x) (XTYPE ((x)) == Lisp_Overlay) -#define BUFFER_LOCAL_VALUEP(x) (XTYPE ((x)) == Lisp_Buffer_Local_Value) -#define SOME_BUFFER_LOCAL_VALUEP(x) (XTYPE ((x)) == Lisp_Some_Buffer_Local_Value) #define MARKERP(x) (MISCP (x) && XMISC (x)->type == Lisp_Misc_Marker) #define INTFWDP(x) (MISCP (x) && XMISC (x)->type == Lisp_Misc_Intfwd) #define BOOLFWDP(x) (MISCP (x) && XMISC (x)->type == Lisp_Misc_Boolfwd) #define OBJFWDP(x) (MISCP (x) && XMISC (x)->type == Lisp_Misc_Objfwd) #define BUFFER_OBJFWDP(x) (MISCP (x) && XMISC (x)->type == Lisp_Misc_Buffer_Objfwd) +#define BUFFER_LOCAL_VALUEP(x) (MISCP (x) && XMISC (x)->type == Lisp_Misc_Buffer_Local_Value) +#define SOME_BUFFER_LOCAL_VALUEP(x) (MISCP (x) && XMISC (x)->type == Lisp_Misc_Some_Buffer_Local_Value) #define EQ(x, y) (XFASTINT (x) == XFASTINT (y)) #define GC_EQ(x, y) (XGCTYPE (x) == XGCTYPE (y) && XPNTR (x) == XPNTR (y))