comparison src/alloc.c @ 34308:6d490e8ef117

(gc_sweep): Prevent symbols read during loadup from being freed.
author Gerd Moellmann <gerd@gnu.org>
date Wed, 06 Dec 2000 21:03:16 +0000
parents 773e6aa2ec38
children a65d8c29442a
comparison
equal deleted inserted replaced
34307:91a288b94484 34308:6d490e8ef117
4762 register struct symbol_block *sblk; 4762 register struct symbol_block *sblk;
4763 struct symbol_block **sprev = &symbol_block; 4763 struct symbol_block **sprev = &symbol_block;
4764 register int lim = symbol_block_index; 4764 register int lim = symbol_block_index;
4765 register int num_free = 0, num_used = 0; 4765 register int num_free = 0, num_used = 0;
4766 4766
4767 symbol_free_list = 0; 4767 symbol_free_list = NULL;
4768 4768
4769 for (sblk = symbol_block; sblk; sblk = *sprev) 4769 for (sblk = symbol_block; sblk; sblk = *sprev)
4770 { 4770 {
4771 register int i;
4772 int this_free = 0; 4771 int this_free = 0;
4773 for (i = 0; i < lim; i++) 4772 struct Lisp_Symbol *sym = sblk->symbols;
4774 if (!XMARKBIT (sblk->symbols[i].plist)) 4773 struct Lisp_Symbol *end = sym + lim;
4775 { 4774
4776 *(struct Lisp_Symbol **)&sblk->symbols[i].value = symbol_free_list; 4775 for (; sym < end; ++sym)
4777 symbol_free_list = &sblk->symbols[i]; 4776 {
4777 int pure_p = PURE_POINTER_P (sym->name);
4778
4779 if (!XMARKBIT (sym->plist) && !pure_p)
4780 {
4781 *(struct Lisp_Symbol **) &sym->value = symbol_free_list;
4782 symbol_free_list = sym;
4778 #if GC_MARK_STACK 4783 #if GC_MARK_STACK
4779 symbol_free_list->function = Vdead; 4784 symbol_free_list->function = Vdead;
4780 #endif 4785 #endif
4781 this_free++; 4786 ++this_free;
4782 } 4787 }
4783 else 4788 else
4784 { 4789 {
4785 num_used++; 4790 ++num_used;
4786 if (!PURE_POINTER_P (sblk->symbols[i].name)) 4791 if (!pure_p)
4787 UNMARK_STRING (sblk->symbols[i].name); 4792 UNMARK_STRING (sym->name);
4788 XUNMARK (sblk->symbols[i].plist); 4793 XUNMARK (sym->plist);
4789 } 4794 }
4795 }
4796
4790 lim = SYMBOL_BLOCK_SIZE; 4797 lim = SYMBOL_BLOCK_SIZE;
4791 /* If this block contains only free symbols and we have already 4798 /* If this block contains only free symbols and we have already
4792 seen more than two blocks worth of free symbols then deallocate 4799 seen more than two blocks worth of free symbols then deallocate
4793 this block. */ 4800 this block. */
4794 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE) 4801 if (this_free == SYMBOL_BLOCK_SIZE && num_free > SYMBOL_BLOCK_SIZE)