aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorKenichi Handa2009-08-25 06:03:09 +0000
committerKenichi Handa2009-08-25 06:03:09 +0000
commit5802634797b76bc7385716398c52aac9be90c0d0 (patch)
tree98ccd0fd5ab69bfd939ea30a5e19c52d6cc4b385 /src/alloc.c
parentaf62aa887b1a9bc9f94d669a7511d7ba06866269 (diff)
downloademacs-5802634797b76bc7385716398c52aac9be90c0d0.tar.gz
emacs-5802634797b76bc7385716398c52aac9be90c0d0.zip
(mark_char_table): New function.
(mark_object): Use mark_char_table for a char-table.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c33
1 files changed, 33 insertions, 0 deletions
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)
5371 return 1; 5371 return 1;
5372} 5372}
5373 5373
5374/* Like mark_vectorlike but optimized for char-tables (and
5375 sub-char-tables) assuming that the contents are mostly integers or
5376 symbols. */
5377
5378static void
5379mark_char_table (ptr)
5380 struct Lisp_Vector *ptr;
5381{
5382 register EMACS_INT size = ptr->size & PSEUDOVECTOR_SIZE_MASK;
5383 register int i;
5384
5385 VECTOR_MARK (ptr);
5386 for (i = 0; i < size; i++)
5387 {
5388 Lisp_Object val = ptr->contents[i];
5389
5390 if (INTEGERP (val) || SYMBOLP (val) && XSYMBOL (val)->gcmarkbit)
5391 continue;
5392 if (SUB_CHAR_TABLE_P (val))
5393 {
5394 if (! VECTOR_MARKED_P (XVECTOR (val)))
5395 mark_char_table (XVECTOR (val));
5396 }
5397 else
5398 mark_object (val);
5399 }
5400}
5401
5374void 5402void
5375mark_object (arg) 5403mark_object (arg)
5376 Lisp_Object arg; 5404 Lisp_Object arg;
@@ -5533,6 +5561,11 @@ mark_object (arg)
5533 VECTOR_MARK (XVECTOR (h->key_and_value)); 5561 VECTOR_MARK (XVECTOR (h->key_and_value));
5534 } 5562 }
5535 } 5563 }
5564 else if (CHAR_TABLE_P (obj))
5565 {
5566 if (! VECTOR_MARKED_P (XVECTOR (obj)))
5567 mark_char_table (XVECTOR (obj));
5568 }
5536 else 5569 else
5537 mark_vectorlike (XVECTOR (obj)); 5570 mark_vectorlike (XVECTOR (obj));
5538 break; 5571 break;