aboutsummaryrefslogtreecommitdiffstats
path: root/src/lread.c
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/lread.c
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/lread.c')
-rw-r--r--src/lread.c94
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
3914init_obarray () 3913init_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"); */
3983void 3978void
3984defvar_int (const char *namestring, EMACS_INT *address) 3979defvar_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. */
3996void 3992void
3997defvar_bool (const char *namestring, int *address) 3993defvar_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. */
4013void 4010void
4014defvar_lisp_nopro (const char *namestring, Lisp_Object *address) 4011defvar_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
4024void 4022void
4025defvar_lisp (const char *namestring, Lisp_Object *address) 4023defvar_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
4034void 4033void
4035defvar_kboard (const char *namestring, int offset) 4034defvar_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