From: Kenichi Handa Date: Tue, 25 Aug 2009 06:03:09 +0000 (+0000) Subject: (mark_char_table): New function. X-Git-Tag: emacs-pretest-23.1.90~1705 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5802634797b76bc7385716398c52aac9be90c0d0;p=emacs.git (mark_char_table): New function. (mark_object): Use mark_char_table for a char-table. --- diff --git a/src/alloc.c b/src/alloc.c index 157d768d69d..d11eff3d387 100644 --- a/src/alloc.c +++ b/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;