Mercurial > emacs
comparison src/alloc.c @ 104582:7d47cb148b29
(mark_char_table): New function.
(mark_object): Use mark_char_table for a char-table.
| author | Kenichi Handa <handa@m17n.org> |
|---|---|
| date | Tue, 25 Aug 2009 06:03:09 +0000 |
| parents | 73f76307d49b |
| children | 68dd71358159 |
comparison
equal
deleted
inserted
replaced
| 104581:03bf18369e45 | 104582:7d47cb148b29 |
|---|---|
| 5367 The distinction is used e.g. by Lisp_Process which places extra | 5367 The distinction is used e.g. by Lisp_Process which places extra |
| 5368 non-Lisp_Object fields at the end of the structure. */ | 5368 non-Lisp_Object fields at the end of the structure. */ |
| 5369 for (i = 0; i < size; i++) /* and then mark its elements */ | 5369 for (i = 0; i < size; i++) /* and then mark its elements */ |
| 5370 mark_object (ptr->contents[i]); | 5370 mark_object (ptr->contents[i]); |
| 5371 return 1; | 5371 return 1; |
| 5372 } | |
| 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 } | |
| 5372 } | 5400 } |
| 5373 | 5401 |
| 5374 void | 5402 void |
| 5375 mark_object (arg) | 5403 mark_object (arg) |
| 5376 Lisp_Object arg; | 5404 Lisp_Object arg; |
| 5531 mark_object (h->key_and_value); | 5559 mark_object (h->key_and_value); |
| 5532 else | 5560 else |
| 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; |
| 5539 | 5572 |
| 5540 case Lisp_Symbol: | 5573 case Lisp_Symbol: |
