[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/alloc.c
From: |
Stefan Monnier |
Subject: |
[Emacs-diffs] Changes to emacs/src/alloc.c |
Date: |
Wed, 25 Jun 2003 19:27:32 -0400 |
Index: emacs/src/alloc.c
diff -c emacs/src/alloc.c:1.303 emacs/src/alloc.c:1.304
*** emacs/src/alloc.c:1.303 Sun Jun 15 17:48:14 2003
--- emacs/src/alloc.c Wed Jun 25 19:27:32 2003
***************
*** 947,952 ****
--- 947,953 ----
consing_since_gc += sizeof (struct interval);
intervals_consed++;
RESET_INTERVAL (val);
+ val->gcmarkbit = 0;
return val;
}
***************
*** 958,967 ****
register INTERVAL i;
Lisp_Object dummy;
{
! if (XMARKBIT (i->plist))
! abort ();
mark_object (&i->plist);
- XMARK (i->plist);
}
--- 959,967 ----
register INTERVAL i;
Lisp_Object dummy;
{
! eassert (!i->gcmarkbit); /* Intervals are never shared. */
! i->gcmarkbit = 1;
mark_object (&i->plist);
}
***************
*** 976,985 ****
function is always called through the MARK_INTERVAL_TREE macro,
which takes care of that. */
- /* XMARK expands to an assignment; the LHS of an assignment can't be
- a cast. */
- XMARK (tree->up.obj);
-
traverse_intervals_noorder (tree, mark_interval, Qnil);
}
--- 976,981 ----
***************
*** 988,1010 ****
#define MARK_INTERVAL_TREE(i) \
do { \
! if (!NULL_INTERVAL_P (i) \
! && ! XMARKBIT (i->up.obj)) \
mark_interval_tree (i); \
} while (0)
- /* The oddity in the call to XUNMARK is necessary because XUNMARK
- expands to an assignment to its argument, and most C compilers
- don't support casts on the left operand of `='. */
-
#define UNMARK_BALANCE_INTERVALS(i) \
do { \
if (! NULL_INTERVAL_P (i)) \
! { \
! XUNMARK ((i)->up.obj); \
! (i) = balance_intervals (i); \
! } \
} while (0)
--- 984,998 ----
#define MARK_INTERVAL_TREE(i) \
do { \
! if (!NULL_INTERVAL_P (i) && !i->gcmarkbit) \
mark_interval_tree (i); \
} while (0)
#define UNMARK_BALANCE_INTERVALS(i) \
do { \
if (! NULL_INTERVAL_P (i)) \
! (i) = balance_intervals (i); \
} while (0)
***************
*** 2568,2573 ****
--- 2556,2562 ----
p->value = Qunbound;
p->function = Qunbound;
p->next = NULL;
+ p->gcmarkbit = 0;
p->interned = SYMBOL_UNINTERNED;
p->constant = 0;
p->indirect_variable = 0;
***************
*** 2644,2649 ****
--- 2633,2639 ----
consing_since_gc += sizeof (union Lisp_Misc);
misc_objects_consed++;
+ XMARKER (val)->gcmarkbit = 0;
return val;
}
***************
*** 3302,3308 ****
}
! /* Value is non-zero of P is a pointer to a live buffer. M is a
pointer to the mem_block for P. */
static INLINE int
--- 3292,3298 ----
}
! /* Value is non-zero if P is a pointer to a live buffer. M is a
pointer to the mem_block for P. */
static INLINE int
***************
*** 3397,3404 ****
break;
case Lisp_Symbol:
! mark_p = (live_symbol_p (m, po)
! && !XMARKBIT (XSYMBOL (obj)->plist));
break;
case Lisp_Float:
--- 3387,3393 ----
break;
case Lisp_Symbol:
! mark_p = (live_symbol_p (m, po) && !XSYMBOL (obj)->gcmarkbit);
break;
case Lisp_Float:
***************
*** 3418,3441 ****
break;
case Lisp_Misc:
! if (live_misc_p (m, po))
! {
! switch (XMISCTYPE (obj))
! {
! case Lisp_Misc_Marker:
! mark_p = !XMARKBIT (XMARKER (obj)->chain);
! break;
!
! case Lisp_Misc_Buffer_Local_Value:
! case Lisp_Misc_Some_Buffer_Local_Value:
! mark_p = !XMARKBIT (XBUFFER_LOCAL_VALUE (obj)->realvalue);
! break;
!
! case Lisp_Misc_Overlay:
! mark_p = !XMARKBIT (XOVERLAY (obj)->plist);
! break;
! }
! }
break;
case Lisp_Int:
--- 3407,3413 ----
break;
case Lisp_Misc:
! mark_p = (live_misc_p (m, po) && !XMARKER (obj)->gcmarkbit);
break;
case Lisp_Int:
***************
*** 3500,3534 ****
break;
case MEM_TYPE_MISC:
! if (live_misc_p (m, p))
! {
! Lisp_Object tem;
! XSETMISC (tem, p);
!
! switch (XMISCTYPE (tem))
! {
! case Lisp_Misc_Marker:
! if (!XMARKBIT (XMARKER (tem)->chain))
! obj = tem;
! break;
!
! case Lisp_Misc_Buffer_Local_Value:
! case Lisp_Misc_Some_Buffer_Local_Value:
! if (!XMARKBIT (XBUFFER_LOCAL_VALUE (tem)->realvalue))
! obj = tem;
! break;
!
! case Lisp_Misc_Overlay:
! if (!XMARKBIT (XOVERLAY (tem)->plist))
! obj = tem;
! break;
! }
! }
break;
case MEM_TYPE_SYMBOL:
! if (live_symbol_p (m, p)
! && !XMARKBIT (((struct Lisp_Symbol *) p)->plist))
XSETSYMBOL (obj, p);
break;
--- 3472,3483 ----
break;
case MEM_TYPE_MISC:
! if (live_misc_p (m, p) && !((struct Lisp_Free *) p)->gcmarkbit)
! XSETMISC (obj, p);
break;
case MEM_TYPE_SYMBOL:
! if (live_symbol_p (m, p) && !((struct Lisp_Symbol *) p)->gcmarkbit)
XSETSYMBOL (obj, p);
break;
***************
*** 4278,4284 ****
{
if (GC_CONSP (XCAR (tail))
&& GC_MARKERP (XCAR (XCAR (tail)))
! && ! XMARKBIT (XMARKER (XCAR (XCAR (tail)))->chain))
{
if (NILP (prev))
nextb->undo_list = tail = XCDR (tail);
--- 4227,4233 ----
{
if (GC_CONSP (XCAR (tail))
&& GC_MARKERP (XCAR (XCAR (tail)))
! && !XMARKER (XCAR (XCAR (tail)))->gcmarkbit)
{
if (NILP (prev))
nextb->undo_list = tail = XCDR (tail);
***************
*** 4774,4782 ****
register struct Lisp_Symbol *ptr = XSYMBOL (obj);
struct Lisp_Symbol *ptrx;
! if (XMARKBIT (ptr->plist)) break;
CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
! XMARK (ptr->plist);
mark_object ((Lisp_Object *) &ptr->value);
mark_object (&ptr->function);
mark_object (&ptr->plist);
--- 4723,4731 ----
register struct Lisp_Symbol *ptr = XSYMBOL (obj);
struct Lisp_Symbol *ptrx;
! if (ptr->gcmarkbit) break;
CHECK_ALLOCATED_AND_LIVE (live_symbol_p);
! ptr->gcmarkbit = 1;
mark_object ((Lisp_Object *) &ptr->value);
mark_object (&ptr->function);
mark_object (&ptr->plist);
***************
*** 4804,4825 ****
case Lisp_Misc:
CHECK_ALLOCATED_AND_LIVE (live_misc_p);
switch (XMISCTYPE (obj))
{
- case Lisp_Misc_Marker:
- XMARK (XMARKER (obj)->chain);
- /* DO NOT mark thru the marker's chain.
- The buffer's markers chain does not preserve markers from gc;
- instead, markers are removed from the chain when freed by gc. */
- break;
-
case Lisp_Misc_Buffer_Local_Value:
case Lisp_Misc_Some_Buffer_Local_Value:
{
register struct Lisp_Buffer_Local_Value *ptr
= XBUFFER_LOCAL_VALUE (obj);
- if (XMARKBIT (ptr->realvalue)) break;
- XMARK (ptr->realvalue);
/* If the cdr is nil, avoid recursion for the car. */
if (EQ (ptr->cdr, Qnil))
{
--- 4753,4768 ----
case Lisp_Misc:
CHECK_ALLOCATED_AND_LIVE (live_misc_p);
+ if (XMARKER (obj)->gcmarkbit)
+ break;
+ XMARKER (obj)->gcmarkbit = 1;
switch (XMISCTYPE (obj))
{
case Lisp_Misc_Buffer_Local_Value:
case Lisp_Misc_Some_Buffer_Local_Value:
{
register struct Lisp_Buffer_Local_Value *ptr
= XBUFFER_LOCAL_VALUE (obj);
/* If the cdr is nil, avoid recursion for the car. */
if (EQ (ptr->cdr, Qnil))
{
***************
*** 4833,4838 ****
--- 4776,4785 ----
goto loop;
}
+ case Lisp_Misc_Marker:
+ /* DO NOT mark thru the marker's chain.
+ The buffer's markers chain does not preserve markers from gc;
+ instead, markers are removed from the chain when freed by gc. */
case Lisp_Misc_Intfwd:
case Lisp_Misc_Boolfwd:
case Lisp_Misc_Objfwd:
***************
*** 4847,4860 ****
case Lisp_Misc_Overlay:
{
struct Lisp_Overlay *ptr = XOVERLAY (obj);
! if (!XMARKBIT (ptr->plist))
! {
! XMARK (ptr->plist);
! mark_object (&ptr->start);
! mark_object (&ptr->end);
! objptr = &ptr->plist;
! goto loop;
! }
}
break;
--- 4794,4803 ----
case Lisp_Misc_Overlay:
{
struct Lisp_Overlay *ptr = XOVERLAY (obj);
! mark_object (&ptr->start);
! mark_object (&ptr->end);
! objptr = &ptr->plist;
! goto loop;
}
break;
***************
*** 4922,4927 ****
--- 4865,4873 ----
Lisp_Object tail;
tail = buffer->undo_list;
+ /* We mark the undo list specially because
+ its pointers to markers should be weak. */
+
while (CONSP (tail))
{
register struct Lisp_Cons *ptr = XCONS (tail);
***************
*** 4980,4998 ****
break;
case Lisp_Symbol:
! survives_p = XMARKBIT (XSYMBOL (obj)->plist);
break;
case Lisp_Misc:
switch (XMISCTYPE (obj))
{
case Lisp_Misc_Marker:
! survives_p = XMARKBIT (obj);
break;
case Lisp_Misc_Buffer_Local_Value:
case Lisp_Misc_Some_Buffer_Local_Value:
! survives_p = XMARKBIT (XBUFFER_LOCAL_VALUE (obj)->realvalue);
break;
case Lisp_Misc_Intfwd:
--- 4926,4945 ----
break;
case Lisp_Symbol:
! survives_p = XSYMBOL (obj)->gcmarkbit;
break;
case Lisp_Misc:
+ /* FIXME: Maybe we should just use obj->mark for all? */
switch (XMISCTYPE (obj))
{
case Lisp_Misc_Marker:
! survives_p = XMARKER (obj)->gcmarkbit;
break;
case Lisp_Misc_Buffer_Local_Value:
case Lisp_Misc_Some_Buffer_Local_Value:
! survives_p = XBUFFER_LOCAL_VALUE (obj)->gcmarkbit;
break;
case Lisp_Misc_Intfwd:
***************
*** 5004,5010 ****
break;
case Lisp_Misc_Overlay:
! survives_p = XMARKBIT (XOVERLAY (obj)->plist);
break;
default:
--- 4951,4957 ----
break;
case Lisp_Misc_Overlay:
! survives_p = XOVERLAY (obj)->gcmarkbit;
break;
default:
***************
*** 5176,5182 ****
for (i = 0; i < lim; i++)
{
! if (! XMARKBIT (iblk->intervals[i].plist))
{
SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
interval_free_list = &iblk->intervals[i];
--- 5123,5129 ----
for (i = 0; i < lim; i++)
{
! if (!iblk->intervals[i].gcmarkbit)
{
SET_INTERVAL_PARENT (&iblk->intervals[i], interval_free_list);
interval_free_list = &iblk->intervals[i];
***************
*** 5185,5191 ****
else
{
num_used++;
! XUNMARK (iblk->intervals[i].plist);
}
}
lim = INTERVAL_BLOCK_SIZE;
--- 5132,5138 ----
else
{
num_used++;
! iblk->intervals[i].gcmarkbit = 0;
}
}
lim = INTERVAL_BLOCK_SIZE;
***************
*** 5232,5238 ****
so we conservatively assume that it is live. */
int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
! if (!XMARKBIT (sym->plist) && !pure_p)
{
*(struct Lisp_Symbol **) &sym->value = symbol_free_list;
symbol_free_list = sym;
--- 5179,5185 ----
so we conservatively assume that it is live. */
int pure_p = PURE_POINTER_P (XSTRING (sym->xname));
! if (!sym->gcmarkbit && !pure_p)
{
*(struct Lisp_Symbol **) &sym->value = symbol_free_list;
symbol_free_list = sym;
***************
*** 5246,5252 ****
++num_used;
if (!pure_p)
UNMARK_STRING (XSTRING (sym->xname));
! XUNMARK (sym->plist);
}
}
--- 5193,5199 ----
++num_used;
if (!pure_p)
UNMARK_STRING (XSTRING (sym->xname));
! sym->gcmarkbit = 0;
}
}
***************
*** 5286,5318 ****
{
register int i;
int this_free = 0;
- EMACS_INT already_free = -1;
for (i = 0; i < lim; i++)
{
! Lisp_Object *markword;
! switch (mblk->markers[i].u_marker.type)
! {
! case Lisp_Misc_Marker:
! markword = &mblk->markers[i].u_marker.chain;
! break;
! case Lisp_Misc_Buffer_Local_Value:
! case Lisp_Misc_Some_Buffer_Local_Value:
! markword = &mblk->markers[i].u_buffer_local_value.realvalue;
! break;
! case Lisp_Misc_Overlay:
! markword = &mblk->markers[i].u_overlay.plist;
! break;
! case Lisp_Misc_Free:
! /* If the object was already free, keep it
! on the free list. */
! markword = (Lisp_Object *) &already_free;
! break;
! default:
! markword = 0;
! break;
! }
! if (markword && !XMARKBIT (*markword))
{
Lisp_Object tem;
if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
--- 5233,5242 ----
{
register int i;
int this_free = 0;
for (i = 0; i < lim; i++)
{
! if (!mblk->markers[i].u_marker.gcmarkbit)
{
Lisp_Object tem;
if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
***************
*** 5333,5340 ****
else
{
num_used++;
! if (markword)
! XUNMARK (*markword);
}
}
lim = MARKER_BLOCK_SIZE;
--- 5257,5263 ----
else
{
num_used++;
! mblk->markers[i].u_marker.gcmarkbit = 0;
}
}
lim = MARKER_BLOCK_SIZE;