Mercurial > emacs
diff src/alloc.c @ 85021:a0c901e4e649
* lisp.h (struct Lisp_Hash_Table): Move non-traced elements at the end.
Turn `count' into an integer.
* fns.c (make_hash_table, hash_put, hash_remove, hash_clear)
(sweep_weak_table, sweep_weak_hash_tables, Fhash_table_count):
* print.c (print_object) <HASH_TABLE_P>: `count' is an int.
* alloc.c (allocate_hash_table): Use ALLOCATE_PSEUDOVECTOR.
(mark_object) <HASH_TABLE_P>: Use mark_vectorlike.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Tue, 02 Oct 2007 21:24:47 +0000 |
parents | db98fea45dfd |
children | 96eb42c9e0e3 |
line wrap: on
line diff
--- a/src/alloc.c Tue Oct 02 21:19:17 2007 +0000 +++ b/src/alloc.c Tue Oct 02 21:24:47 2007 +0000 @@ -2986,20 +2986,12 @@ (VECSIZE (typ), PSEUDOVECSIZE (typ, field), tag)) struct Lisp_Hash_Table * -allocate_hash_table () +allocate_hash_table (void) { - EMACS_INT len = VECSIZE (struct Lisp_Hash_Table); - struct Lisp_Vector *v = allocate_vectorlike (len); - EMACS_INT i; - - v->size = len; - for (i = 0; i < len; ++i) - v->contents[i] = Qnil; - - return (struct Lisp_Hash_Table *) v; + return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE); } - - + + struct window * allocate_window () { @@ -5617,33 +5609,10 @@ else if (GC_HASH_TABLE_P (obj)) { struct Lisp_Hash_Table *h = XHASH_TABLE (obj); - - /* Stop if already marked. */ - if (VECTOR_MARKED_P (h)) - break; - - /* Mark it. */ - CHECK_LIVE (live_vector_p); - VECTOR_MARK (h); - - /* Mark contents. */ - /* Do not mark next_free or next_weak. - Being in the next_weak chain - should not keep the hash table alive. - No need to mark `count' since it is an integer. */ - mark_object (h->test); - mark_object (h->weak); - mark_object (h->rehash_size); - mark_object (h->rehash_threshold); - mark_object (h->hash); - mark_object (h->next); - mark_object (h->index); - mark_object (h->user_hash_function); - mark_object (h->user_cmp_function); - - /* If hash table is not weak, mark all keys and values. - For weak tables, mark only the vector. */ - if (GC_NILP (h->weak)) + if (mark_vectorlike ((struct Lisp_Vector *)h)) + { /* If hash table is not weak, mark all keys and values. + For weak tables, mark only the vector. */ + if (GC_NILP (h->weak)) mark_object (h->key_and_value); else VECTOR_MARK (XVECTOR (h->key_and_value));