diff options
| author | Dmitry Antipov | 2012-09-07 11:05:56 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2012-09-07 11:05:56 +0400 |
| commit | b4fa72f2796476e089a57545e0d6dce912b504d3 (patch) | |
| tree | 8605646ec13d45ed8920fbbd38c1d327c0762c43 /src/alloc.c | |
| parent | 30730c93a08089674c0507aa80dc33691badd2df (diff) | |
| download | emacs-b4fa72f2796476e089a57545e0d6dce912b504d3.tar.gz emacs-b4fa72f2796476e089a57545e0d6dce912b504d3.zip | |
* alloc.c (mark_buffer): Revert unsafe marking optimization.
(mark_object): Likewise for frame objects.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 48 |
1 files changed, 15 insertions, 33 deletions
diff --git a/src/alloc.c b/src/alloc.c index bf7c156d321..aaf2f0846dc 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -5842,29 +5842,23 @@ mark_overlay (struct Lisp_Overlay *ptr) | |||
| 5842 | static void | 5842 | static void |
| 5843 | mark_buffer (struct buffer *buffer) | 5843 | mark_buffer (struct buffer *buffer) |
| 5844 | { | 5844 | { |
| 5845 | if (NILP (BVAR (buffer, name))) | 5845 | /* This is handled much like other pseudovectors... */ |
| 5846 | /* If the buffer is killed, mark just the buffer itself. */ | 5846 | mark_vectorlike ((struct Lisp_Vector *) buffer); |
| 5847 | VECTOR_MARK (buffer); | ||
| 5848 | else | ||
| 5849 | { | ||
| 5850 | /* This is handled much like other pseudovectors... */ | ||
| 5851 | mark_vectorlike ((struct Lisp_Vector *) buffer); | ||
| 5852 | 5847 | ||
| 5853 | /* ...but there are some buffer-specific things. */ | 5848 | /* ...but there are some buffer-specific things. */ |
| 5854 | 5849 | ||
| 5855 | MARK_INTERVAL_TREE (buffer_intervals (buffer)); | 5850 | MARK_INTERVAL_TREE (buffer_intervals (buffer)); |
| 5856 | 5851 | ||
| 5857 | /* For now, we just don't mark the undo_list. It's done later in | 5852 | /* For now, we just don't mark the undo_list. It's done later in |
| 5858 | a special way just before the sweep phase, and after stripping | 5853 | a special way just before the sweep phase, and after stripping |
| 5859 | some of its elements that are not needed any more. */ | 5854 | some of its elements that are not needed any more. */ |
| 5860 | 5855 | ||
| 5861 | mark_overlay (buffer->overlays_before); | 5856 | mark_overlay (buffer->overlays_before); |
| 5862 | mark_overlay (buffer->overlays_after); | 5857 | mark_overlay (buffer->overlays_after); |
| 5863 | 5858 | ||
| 5864 | /* If this is an indirect buffer, mark its base buffer. */ | 5859 | /* If this is an indirect buffer, mark its base buffer. */ |
| 5865 | if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) | 5860 | if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) |
| 5866 | mark_buffer (buffer->base_buffer); | 5861 | mark_buffer (buffer->base_buffer); |
| 5867 | } | ||
| 5868 | } | 5862 | } |
| 5869 | 5863 | ||
| 5870 | /* Determine type of generic Lisp_Object and mark it accordingly. */ | 5864 | /* Determine type of generic Lisp_Object and mark it accordingly. */ |
| @@ -6003,26 +5997,14 @@ mark_object (Lisp_Object arg) | |||
| 6003 | break; | 5997 | break; |
| 6004 | 5998 | ||
| 6005 | case PVEC_FRAME: | 5999 | case PVEC_FRAME: |
| 6006 | { | 6000 | mark_vectorlike (ptr); |
| 6007 | struct frame *f = (struct frame *) ptr; | 6001 | mark_face_cache (((struct frame *) ptr)->face_cache); |
| 6008 | |||
| 6009 | if (FRAME_LIVE_P (f)) | ||
| 6010 | { | ||
| 6011 | mark_vectorlike (ptr); | ||
| 6012 | mark_face_cache (f->face_cache); | ||
| 6013 | } | ||
| 6014 | else | ||
| 6015 | /* If the frame is deleted, mark just the frame itself. */ | ||
| 6016 | VECTOR_MARK (ptr); | ||
| 6017 | } | ||
| 6018 | break; | 6002 | break; |
| 6019 | 6003 | ||
| 6020 | case PVEC_WINDOW: | 6004 | case PVEC_WINDOW: |
| 6021 | { | 6005 | { |
| 6022 | struct window *w = (struct window *) ptr; | 6006 | struct window *w = (struct window *) ptr; |
| 6023 | 6007 | ||
| 6024 | /* Even if the window is deleted, we can't mark just the window | ||
| 6025 | itself because set-window-configuration can resurrect it. */ | ||
| 6026 | mark_vectorlike (ptr); | 6008 | mark_vectorlike (ptr); |
| 6027 | /* Mark glyphs for leaf windows. Marking window | 6009 | /* Mark glyphs for leaf windows. Marking window |
| 6028 | matrices is sufficient because frame matrices | 6010 | matrices is sufficient because frame matrices |