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: