diff options
| author | Stefan Monnier | 2011-02-17 21:07:36 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2011-02-17 21:07:36 -0500 |
| commit | b286858c7a0d5dafa302b9e88970c13385358a6a (patch) | |
| tree | 37aca1554bbef09ef09256d7162e619222dbb4a1 /src/alloc.c | |
| parent | 3804652098c7c8824f332e92846a3b8896b9e683 (diff) | |
| download | emacs-b286858c7a0d5dafa302b9e88970c13385358a6a.tar.gz emacs-b286858c7a0d5dafa302b9e88970c13385358a6a.zip | |
Don't GC-scan stack data redundantly.
* src/alloc.c (Fgarbage_collect): When using stack scanning, don't
redundantly scan byte-code stacks, catchlist, and handlerlist.
* src/bytecode.c (BYTE_MAINTAIN_TOP): New macros.
(struct byte_stack): Only define `top' and `bottom' if used.
(mark_byte_stack): Only define if used.
(BEFORE_POTENTIAL_GC, AFTER_POTENTIAL_GC): Nullify if BYTE_MAINTAIN_TOP
is not set.
(Fbyte_code): Don't set `bottom' unless BYTE_MAINTAIN_TOP is set.
* src/lisp.h (BYTE_MARK_STACK): New macro.
(mark_byte_stack): Only declare if BYTE_MARK_STACK is set.
* src/term.c (OUTPUT_IF): Use OUTPUT.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/alloc.c b/src/alloc.c index 566c6fe00b9..e8b8f45e9b1 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -4842,8 +4842,6 @@ returns nil, because real GC can't be done. */) | |||
| 4842 | (void) | 4842 | (void) |
| 4843 | { | 4843 | { |
| 4844 | register struct specbinding *bind; | 4844 | register struct specbinding *bind; |
| 4845 | struct catchtag *catch; | ||
| 4846 | struct handler *handler; | ||
| 4847 | char stack_top_variable; | 4845 | char stack_top_variable; |
| 4848 | register int i; | 4846 | register int i; |
| 4849 | int message_p; | 4847 | int message_p; |
| @@ -4972,9 +4970,11 @@ returns nil, because real GC can't be done. */) | |||
| 4972 | for (i = 0; i < tail->nvars; i++) | 4970 | for (i = 0; i < tail->nvars; i++) |
| 4973 | mark_object (tail->var[i]); | 4971 | mark_object (tail->var[i]); |
| 4974 | } | 4972 | } |
| 4975 | #endif | ||
| 4976 | |||
| 4977 | mark_byte_stack (); | 4973 | mark_byte_stack (); |
| 4974 | { | ||
| 4975 | struct catchtag *catch; | ||
| 4976 | struct handler *handler; | ||
| 4977 | |||
| 4978 | for (catch = catchlist; catch; catch = catch->next) | 4978 | for (catch = catchlist; catch; catch = catch->next) |
| 4979 | { | 4979 | { |
| 4980 | mark_object (catch->tag); | 4980 | mark_object (catch->tag); |
| @@ -4985,7 +4985,9 @@ returns nil, because real GC can't be done. */) | |||
| 4985 | mark_object (handler->handler); | 4985 | mark_object (handler->handler); |
| 4986 | mark_object (handler->var); | 4986 | mark_object (handler->var); |
| 4987 | } | 4987 | } |
| 4988 | } | ||
| 4988 | mark_backtrace (); | 4989 | mark_backtrace (); |
| 4990 | #endif | ||
| 4989 | 4991 | ||
| 4990 | #ifdef HAVE_WINDOW_SYSTEM | 4992 | #ifdef HAVE_WINDOW_SYSTEM |
| 4991 | mark_fringe_data (); | 4993 | mark_fringe_data (); |