diff options
| author | Gerd Moellmann | 2000-12-06 21:05:09 +0000 |
|---|---|---|
| committer | Gerd Moellmann | 2000-12-06 21:05:09 +0000 |
| commit | d285b373956fbe32141a491729cd84f190413e17 (patch) | |
| tree | f5709dc42f5bffa0c60c8ecb2c36661c94bf29a3 /src | |
| parent | fbd9f2769958be3d1610e5d89156f07dbd2dab88 (diff) | |
| download | emacs-d285b373956fbe32141a491729cd84f190413e17.tar.gz emacs-d285b373956fbe32141a491729cd84f190413e17.zip | |
(gc_sweep): Prevent symbols read during loadup
from being freed.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 3 | ||||
| -rw-r--r-- | src/alloc.c | 41 |
2 files changed, 27 insertions, 17 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 9783d88397a..2c34188c8d6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -14,6 +14,9 @@ | |||
| 14 | 14 | ||
| 15 | 2000-12-06 Gerd Moellmann <gerd@gnu.org> | 15 | 2000-12-06 Gerd Moellmann <gerd@gnu.org> |
| 16 | 16 | ||
| 17 | * alloc.c (gc_sweep): Prevent symbols read during loadup | ||
| 18 | from being freed. | ||
| 19 | |||
| 17 | * xdisp.c (underlying_face_id): New function. | 20 | * xdisp.c (underlying_face_id): New function. |
| 18 | (handle_face_prop, face_before_or_after_it_pos): Use it | 21 | (handle_face_prop, face_before_or_after_it_pos): Use it |
| 19 | to determine the face ``under'' a string. Let strings inherit | 22 | to determine the face ``under'' a string. Let strings inherit |
diff --git a/src/alloc.c b/src/alloc.c index 23ab3a3bcd2..83007657e20 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -4764,29 +4764,36 @@ gc_sweep () | |||
| 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 |