aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.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/alloc.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/alloc.c')
-rw-r--r--src/alloc.c70
1 files changed, 35 insertions, 35 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 37ec06c7be1..c1f1094d15f 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -1365,7 +1365,7 @@ uninterrupt_malloc ()
1365 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); 1365 pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE);
1366 pthread_mutex_init (&alloc_mutex, &attr); 1366 pthread_mutex_init (&alloc_mutex, &attr);
1367#else /* !DOUG_LEA_MALLOC */ 1367#else /* !DOUG_LEA_MALLOC */
1368 /* Some systems such as Solaris 2.6 doesn't have a recursive mutex, 1368 /* Some systems such as Solaris 2.6 don't have a recursive mutex,
1369 and the bundled gmalloc.c doesn't require it. */ 1369 and the bundled gmalloc.c doesn't require it. */
1370 pthread_mutex_init (&alloc_mutex, NULL); 1370 pthread_mutex_init (&alloc_mutex, NULL);
1371#endif /* !DOUG_LEA_MALLOC */ 1371#endif /* !DOUG_LEA_MALLOC */
@@ -3193,13 +3193,13 @@ Its value and function definition are void, and its property list is nil. */)
3193 p = XSYMBOL (val); 3193 p = XSYMBOL (val);
3194 p->xname = name; 3194 p->xname = name;
3195 p->plist = Qnil; 3195 p->plist = Qnil;
3196 p->value = Qunbound; 3196 p->redirect = SYMBOL_PLAINVAL;
3197 SET_SYMBOL_VAL (p, Qunbound);
3197 p->function = Qunbound; 3198 p->function = Qunbound;
3198 p->next = NULL; 3199 p->next = NULL;
3199 p->gcmarkbit = 0; 3200 p->gcmarkbit = 0;
3200 p->interned = SYMBOL_UNINTERNED; 3201 p->interned = SYMBOL_UNINTERNED;
3201 p->constant = 0; 3202 p->constant = 0;
3202 p->indirect_variable = 0;
3203 consing_since_gc += sizeof (struct Lisp_Symbol); 3203 consing_since_gc += sizeof (struct Lisp_Symbol);
3204 symbols_consed++; 3204 symbols_consed++;
3205 return val; 3205 return val;
@@ -5581,17 +5581,42 @@ mark_object (arg)
5581 break; 5581 break;
5582 CHECK_ALLOCATED_AND_LIVE (live_symbol_p); 5582 CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
5583 ptr->gcmarkbit = 1; 5583 ptr->gcmarkbit = 1;
5584 mark_object (ptr->value);
5585 mark_object (ptr->function); 5584 mark_object (ptr->function);
5586 mark_object (ptr->plist); 5585 mark_object (ptr->plist);
5587 5586 switch (ptr->redirect)
5587 {
5588 case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
5589 case SYMBOL_VARALIAS:
5590 {
5591 Lisp_Object tem;
5592 XSETSYMBOL (tem, SYMBOL_ALIAS (ptr));
5593 mark_object (tem);
5594 break;
5595 }
5596 case SYMBOL_LOCALIZED:
5597 {
5598 struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (ptr);
5599 /* If the value is forwarded to a buffer or keyboard field,
5600 these are marked when we see the corresponding object.
5601 And if it's forwarded to a C variable, either it's not
5602 a Lisp_Object var, or it's staticpro'd already. */
5603 mark_object (blv->where);
5604 mark_object (blv->valcell);
5605 mark_object (blv->defcell);
5606 break;
5607 }
5608 case SYMBOL_FORWARDED:
5609 /* If the value is forwarded to a buffer or keyboard field,
5610 these are marked when we see the corresponding object.
5611 And if it's forwarded to a C variable, either it's not
5612 a Lisp_Object var, or it's staticpro'd already. */
5613 break;
5614 default: abort ();
5615 }
5588 if (!PURE_POINTER_P (XSTRING (ptr->xname))) 5616 if (!PURE_POINTER_P (XSTRING (ptr->xname)))
5589 MARK_STRING (XSTRING (ptr->xname)); 5617 MARK_STRING (XSTRING (ptr->xname));
5590 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname)); 5618 MARK_INTERVAL_TREE (STRING_INTERVALS (ptr->xname));
5591 5619
5592 /* Note that we do not mark the obarray of the symbol.
5593 It is safe not to do so because nothing accesses that
5594 slot except to check whether it is nil. */
5595 ptr = ptr->next; 5620 ptr = ptr->next;
5596 if (ptr) 5621 if (ptr)
5597 { 5622 {
@@ -5610,22 +5635,6 @@ mark_object (arg)
5610 5635
5611 switch (XMISCTYPE (obj)) 5636 switch (XMISCTYPE (obj))
5612 { 5637 {
5613 case Lisp_Misc_Buffer_Local_Value:
5614 {
5615 register struct Lisp_Buffer_Local_Value *ptr
5616 = XBUFFER_LOCAL_VALUE (obj);
5617 /* If the cdr is nil, avoid recursion for the car. */
5618 if (EQ (ptr->cdr, Qnil))
5619 {
5620 obj = ptr->realvalue;
5621 goto loop;
5622 }
5623 mark_object (ptr->realvalue);
5624 mark_object (ptr->buffer);
5625 mark_object (ptr->frame);
5626 obj = ptr->cdr;
5627 goto loop;
5628 }
5629 5638
5630 case Lisp_Misc_Marker: 5639 case Lisp_Misc_Marker:
5631 /* DO NOT mark thru the marker's chain. 5640 /* DO NOT mark thru the marker's chain.
@@ -5633,17 +5642,6 @@ mark_object (arg)
5633 instead, markers are removed from the chain when freed by gc. */ 5642 instead, markers are removed from the chain when freed by gc. */
5634 break; 5643 break;
5635 5644
5636 case Lisp_Misc_Intfwd:
5637 case Lisp_Misc_Boolfwd:
5638 case Lisp_Misc_Objfwd:
5639 case Lisp_Misc_Buffer_Objfwd:
5640 case Lisp_Misc_Kboard_Objfwd:
5641 /* Don't bother with Lisp_Buffer_Objfwd,
5642 since all markable slots in current buffer marked anyway. */
5643 /* Don't need to do Lisp_Objfwd, since the places they point
5644 are protected with staticpro. */
5645 break;
5646
5647 case Lisp_Misc_Save_Value: 5645 case Lisp_Misc_Save_Value:
5648#if GC_MARK_STACK 5646#if GC_MARK_STACK
5649 { 5647 {
@@ -6048,6 +6046,8 @@ gc_sweep ()
6048 6046
6049 if (!sym->gcmarkbit && !pure_p) 6047 if (!sym->gcmarkbit && !pure_p)
6050 { 6048 {
6049 if (sym->redirect == SYMBOL_LOCALIZED)
6050 xfree (SYMBOL_BLV (sym));
6051 sym->next = symbol_free_list; 6051 sym->next = symbol_free_list;
6052 symbol_free_list = sym; 6052 symbol_free_list = sym;
6053#if GC_MARK_STACK 6053#if GC_MARK_STACK