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/lread.c | |
| 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/lread.c')
| -rw-r--r-- | src/lread.c | 94 |
1 files changed, 47 insertions, 47 deletions
diff --git a/src/lread.c b/src/lread.c index 83ebc8b3b10..a04b9679d83 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -3687,7 +3687,8 @@ it defaults to the value of `obarray'. */) | |||
| 3687 | && EQ (obarray, initial_obarray)) | 3687 | && EQ (obarray, initial_obarray)) |
| 3688 | { | 3688 | { |
| 3689 | XSYMBOL (sym)->constant = 1; | 3689 | XSYMBOL (sym)->constant = 1; |
| 3690 | XSYMBOL (sym)->value = sym; | 3690 | XSYMBOL (sym)->redirect = SYMBOL_PLAINVAL; |
| 3691 | SET_SYMBOL_VAL (XSYMBOL (sym), sym); | ||
| 3691 | } | 3692 | } |
| 3692 | 3693 | ||
| 3693 | ptr = &XVECTOR (obarray)->contents[XINT (tem)]; | 3694 | ptr = &XVECTOR (obarray)->contents[XINT (tem)]; |
| @@ -3768,8 +3769,6 @@ OBARRAY defaults to the value of the variable `obarray'. */) | |||
| 3768 | error ("Attempt to unintern t or nil"); */ | 3769 | error ("Attempt to unintern t or nil"); */ |
| 3769 | 3770 | ||
| 3770 | XSYMBOL (tem)->interned = SYMBOL_UNINTERNED; | 3771 | XSYMBOL (tem)->interned = SYMBOL_UNINTERNED; |
| 3771 | XSYMBOL (tem)->constant = 0; | ||
| 3772 | XSYMBOL (tem)->indirect_variable = 0; | ||
| 3773 | 3772 | ||
| 3774 | hash = oblookup_last_bucket_number; | 3773 | hash = oblookup_last_bucket_number; |
| 3775 | 3774 | ||
| @@ -3914,35 +3913,31 @@ void | |||
| 3914 | init_obarray () | 3913 | init_obarray () |
| 3915 | { | 3914 | { |
| 3916 | Lisp_Object oblength; | 3915 | Lisp_Object oblength; |
| 3917 | int hash; | ||
| 3918 | Lisp_Object *tem; | ||
| 3919 | 3916 | ||
| 3920 | XSETFASTINT (oblength, OBARRAY_SIZE); | 3917 | XSETFASTINT (oblength, OBARRAY_SIZE); |
| 3921 | 3918 | ||
| 3922 | Qnil = Fmake_symbol (make_pure_c_string ("nil")); | ||
| 3923 | Vobarray = Fmake_vector (oblength, make_number (0)); | 3919 | Vobarray = Fmake_vector (oblength, make_number (0)); |
| 3924 | initial_obarray = Vobarray; | 3920 | initial_obarray = Vobarray; |
| 3925 | staticpro (&initial_obarray); | 3921 | staticpro (&initial_obarray); |
| 3926 | /* Intern nil in the obarray */ | ||
| 3927 | XSYMBOL (Qnil)->interned = SYMBOL_INTERNED_IN_INITIAL_OBARRAY; | ||
| 3928 | XSYMBOL (Qnil)->constant = 1; | ||
| 3929 | |||
| 3930 | /* These locals are to kludge around a pyramid compiler bug. */ | ||
| 3931 | hash = hash_string ("nil", 3); | ||
| 3932 | /* Separate statement here to avoid VAXC bug. */ | ||
| 3933 | hash %= OBARRAY_SIZE; | ||
| 3934 | tem = &XVECTOR (Vobarray)->contents[hash]; | ||
| 3935 | *tem = Qnil; | ||
| 3936 | 3922 | ||
| 3937 | Qunbound = Fmake_symbol (make_pure_c_string ("unbound")); | 3923 | Qunbound = Fmake_symbol (make_pure_c_string ("unbound")); |
| 3938 | XSYMBOL (Qnil)->function = Qunbound; | 3924 | /* Set temporary dummy values to Qnil and Vpurify_flag to satisfy the |
| 3939 | XSYMBOL (Qunbound)->value = Qunbound; | 3925 | NILP (Vpurify_flag) check in intern_c_string. */ |
| 3926 | Qnil = make_number (-1); Vpurify_flag = make_number (1); | ||
| 3927 | Qnil = intern_c_string ("nil"); | ||
| 3928 | |||
| 3929 | /* Fmake_symbol inits fields of new symbols with Qunbound and Qnil, | ||
| 3930 | so those two need to be fixed manally. */ | ||
| 3931 | SET_SYMBOL_VAL (XSYMBOL (Qunbound), Qunbound); | ||
| 3940 | XSYMBOL (Qunbound)->function = Qunbound; | 3932 | XSYMBOL (Qunbound)->function = Qunbound; |
| 3933 | XSYMBOL (Qunbound)->plist = Qnil; | ||
| 3934 | /* XSYMBOL (Qnil)->function = Qunbound; */ | ||
| 3935 | SET_SYMBOL_VAL (XSYMBOL (Qnil), Qnil); | ||
| 3936 | XSYMBOL (Qnil)->constant = 1; | ||
| 3937 | XSYMBOL (Qnil)->plist = Qnil; | ||
| 3941 | 3938 | ||
| 3942 | Qt = intern_c_string ("t"); | 3939 | Qt = intern_c_string ("t"); |
| 3943 | XSYMBOL (Qnil)->value = Qnil; | 3940 | SET_SYMBOL_VAL (XSYMBOL (Qt), Qt); |
| 3944 | XSYMBOL (Qnil)->plist = Qnil; | ||
| 3945 | XSYMBOL (Qt)->value = Qt; | ||
| 3946 | XSYMBOL (Qt)->constant = 1; | 3941 | XSYMBOL (Qt)->constant = 1; |
| 3947 | 3942 | ||
| 3948 | /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */ | 3943 | /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */ |
| @@ -3981,27 +3976,29 @@ defalias (sname, string) | |||
| 3981 | to a C variable of type int. Sample call: | 3976 | to a C variable of type int. Sample call: |
| 3982 | DEFVAR_INT ("emacs-priority", &emacs_priority, "Documentation"); */ | 3977 | DEFVAR_INT ("emacs-priority", &emacs_priority, "Documentation"); */ |
| 3983 | void | 3978 | void |
| 3984 | defvar_int (const char *namestring, EMACS_INT *address) | 3979 | defvar_int (struct Lisp_Intfwd *i_fwd, |
| 3980 | const char *namestring, EMACS_INT *address) | ||
| 3985 | { | 3981 | { |
| 3986 | Lisp_Object sym, val; | 3982 | Lisp_Object sym; |
| 3987 | sym = intern_c_string (namestring); | 3983 | sym = intern_c_string (namestring); |
| 3988 | val = allocate_misc (); | 3984 | i_fwd->type = Lisp_Fwd_Int; |
| 3989 | XMISCTYPE (val) = Lisp_Misc_Intfwd; | 3985 | i_fwd->intvar = address; |
| 3990 | XINTFWD (val)->intvar = address; | 3986 | XSYMBOL (sym)->redirect = SYMBOL_FORWARDED; |
| 3991 | SET_SYMBOL_VALUE (sym, val); | 3987 | SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)i_fwd); |
| 3992 | } | 3988 | } |
| 3993 | 3989 | ||
| 3994 | /* Similar but define a variable whose value is t if address contains 1, | 3990 | /* Similar but define a variable whose value is t if address contains 1, |
| 3995 | nil if address contains 0. */ | 3991 | nil if address contains 0. */ |
| 3996 | void | 3992 | void |
| 3997 | defvar_bool (const char *namestring, int *address) | 3993 | defvar_bool (struct Lisp_Boolfwd *b_fwd, |
| 3994 | const char *namestring, int *address) | ||
| 3998 | { | 3995 | { |
| 3999 | Lisp_Object sym, val; | 3996 | Lisp_Object sym; |
| 4000 | sym = intern_c_string (namestring); | 3997 | sym = intern_c_string (namestring); |
| 4001 | val = allocate_misc (); | 3998 | b_fwd->type = Lisp_Fwd_Bool; |
| 4002 | XMISCTYPE (val) = Lisp_Misc_Boolfwd; | 3999 | b_fwd->boolvar = address; |
| 4003 | XBOOLFWD (val)->boolvar = address; | 4000 | XSYMBOL (sym)->redirect = SYMBOL_FORWARDED; |
| 4004 | SET_SYMBOL_VALUE (sym, val); | 4001 | SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)b_fwd); |
| 4005 | Vbyte_boolean_vars = Fcons (sym, Vbyte_boolean_vars); | 4002 | Vbyte_boolean_vars = Fcons (sym, Vbyte_boolean_vars); |
| 4006 | } | 4003 | } |
| 4007 | 4004 | ||
| @@ -4011,20 +4008,22 @@ defvar_bool (const char *namestring, int *address) | |||
| 4011 | gc-marked for some other reason, since marking the same slot twice | 4008 | gc-marked for some other reason, since marking the same slot twice |
| 4012 | can cause trouble with strings. */ | 4009 | can cause trouble with strings. */ |
| 4013 | void | 4010 | void |
| 4014 | defvar_lisp_nopro (const char *namestring, Lisp_Object *address) | 4011 | defvar_lisp_nopro (struct Lisp_Objfwd *o_fwd, |
| 4012 | const char *namestring, Lisp_Object *address) | ||
| 4015 | { | 4013 | { |
| 4016 | Lisp_Object sym, val; | 4014 | Lisp_Object sym; |
| 4017 | sym = intern_c_string (namestring); | 4015 | sym = intern_c_string (namestring); |
| 4018 | val = allocate_misc (); | 4016 | o_fwd->type = Lisp_Fwd_Obj; |
| 4019 | XMISCTYPE (val) = Lisp_Misc_Objfwd; | 4017 | o_fwd->objvar = address; |
| 4020 | XOBJFWD (val)->objvar = address; | 4018 | XSYMBOL (sym)->redirect = SYMBOL_FORWARDED; |
| 4021 | SET_SYMBOL_VALUE (sym, val); | 4019 | SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)o_fwd); |
| 4022 | } | 4020 | } |
| 4023 | 4021 | ||
| 4024 | void | 4022 | void |
| 4025 | defvar_lisp (const char *namestring, Lisp_Object *address) | 4023 | defvar_lisp (struct Lisp_Objfwd *o_fwd, |
| 4024 | const char *namestring, Lisp_Object *address) | ||
| 4026 | { | 4025 | { |
| 4027 | defvar_lisp_nopro (namestring, address); | 4026 | defvar_lisp_nopro (o_fwd, namestring, address); |
| 4028 | staticpro (address); | 4027 | staticpro (address); |
| 4029 | } | 4028 | } |
| 4030 | 4029 | ||
| @@ -4032,14 +4031,15 @@ defvar_lisp (const char *namestring, Lisp_Object *address) | |||
| 4032 | at a particular offset in the current kboard object. */ | 4031 | at a particular offset in the current kboard object. */ |
| 4033 | 4032 | ||
| 4034 | void | 4033 | void |
| 4035 | defvar_kboard (const char *namestring, int offset) | 4034 | defvar_kboard (struct Lisp_Kboard_Objfwd *ko_fwd, |
| 4035 | const char *namestring, int offset) | ||
| 4036 | { | 4036 | { |
| 4037 | Lisp_Object sym, val; | 4037 | Lisp_Object sym; |
| 4038 | sym = intern_c_string (namestring); | 4038 | sym = intern_c_string (namestring); |
| 4039 | val = allocate_misc (); | 4039 | ko_fwd->type = Lisp_Fwd_Kboard_Obj; |
| 4040 | XMISCTYPE (val) = Lisp_Misc_Kboard_Objfwd; | 4040 | ko_fwd->offset = offset; |
| 4041 | XKBOARD_OBJFWD (val)->offset = offset; | 4041 | XSYMBOL (sym)->redirect = SYMBOL_FORWARDED; |
| 4042 | SET_SYMBOL_VALUE (sym, val); | 4042 | SET_SYMBOL_FWD (XSYMBOL (sym), (union Lisp_Fwd *)ko_fwd); |
| 4043 | } | 4043 | } |
| 4044 | 4044 | ||
| 4045 | /* Record the value of load-path used at the start of dumping | 4045 | /* Record the value of load-path used at the start of dumping |