(mark_char_table): New function.
(mark_object): Use mark_char_table for a char-table.
This commit is contained in:
parent
af62aa887b
commit
5802634797
1 changed files with 33 additions and 0 deletions
33
src/alloc.c
33
src/alloc.c
|
@ -5371,6 +5371,34 @@ mark_vectorlike (ptr)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Like mark_vectorlike but optimized for char-tables (and
|
||||
sub-char-tables) assuming that the contents are mostly integers or
|
||||
symbols. */
|
||||
|
||||
static void
|
||||
mark_char_table (ptr)
|
||||
struct Lisp_Vector *ptr;
|
||||
{
|
||||
register EMACS_INT size = ptr->size & PSEUDOVECTOR_SIZE_MASK;
|
||||
register int i;
|
||||
|
||||
VECTOR_MARK (ptr);
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
Lisp_Object val = ptr->contents[i];
|
||||
|
||||
if (INTEGERP (val) || SYMBOLP (val) && XSYMBOL (val)->gcmarkbit)
|
||||
continue;
|
||||
if (SUB_CHAR_TABLE_P (val))
|
||||
{
|
||||
if (! VECTOR_MARKED_P (XVECTOR (val)))
|
||||
mark_char_table (XVECTOR (val));
|
||||
}
|
||||
else
|
||||
mark_object (val);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
mark_object (arg)
|
||||
Lisp_Object arg;
|
||||
|
@ -5533,6 +5561,11 @@ mark_object (arg)
|
|||
VECTOR_MARK (XVECTOR (h->key_and_value));
|
||||
}
|
||||
}
|
||||
else if (CHAR_TABLE_P (obj))
|
||||
{
|
||||
if (! VECTOR_MARKED_P (XVECTOR (obj)))
|
||||
mark_char_table (XVECTOR (obj));
|
||||
}
|
||||
else
|
||||
mark_vectorlike (XVECTOR (obj));
|
||||
break;
|
||||
|
|
Loading…
Add table
Reference in a new issue