diff options
| author | Kenichi Handa | 2009-08-25 06:03:09 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2009-08-25 06:03:09 +0000 |
| commit | 5802634797b76bc7385716398c52aac9be90c0d0 (patch) | |
| tree | 98ccd0fd5ab69bfd939ea30a5e19c52d6cc4b385 /src/alloc.c | |
| parent | af62aa887b1a9bc9f94d669a7511d7ba06866269 (diff) | |
| download | emacs-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.c | 33 |
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 | |||
| 5378 | static void | ||
| 5379 | mark_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 | |||
| 5374 | void | 5402 | void |
| 5375 | mark_object (arg) | 5403 | mark_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; |