aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorDmitry Antipov2012-07-03 07:57:52 +0400
committerDmitry Antipov2012-07-03 07:57:52 +0400
commit36429c89cbd7282a7614a358e5edb4d37f4a3f47 (patch)
treeeafca213d91a33d626e60caec38ccc21bdd394fe /src/alloc.c
parentb544fef2ac730e5fc8c072b33584d9b48d25f6fa (diff)
downloademacs-36429c89cbd7282a7614a358e5edb4d37f4a3f47.tar.gz
emacs-36429c89cbd7282a7614a358e5edb4d37f4a3f47.zip
Cleanup basic buffer management.
* buffer.h (struct buffer): Change layout to use generic vector marking code. Fix some comments. Change type of 'clip_changed' to bitfield. Remove unused #ifndef old. (FIRST_FIELD_PER_BUFFER, LAST_FIELD_PER_BUFFER): Remove. (GET_OVERLAYS_AT): Fix indentation. (for_each_per_buffer_object_at): New macro. * buffer.c (clone_per_buffer_values, reset_buffer_local_variables) (Fbuffer_local_variables): Use it. (init_buffer_once, syms_of_buffer): Remove unused #ifndef old. * alloc.c (allocate_buffer): Adjust to match new layout of struct buffer. Fix comment. (mark_overlay): New function. (mark_buffer): Use it. Use mark_vectorlike to mark normal Lisp area of struct buffer. (mark_object): Use it. Adjust marking of misc objects and related comments.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c131
1 files changed, 54 insertions, 77 deletions
diff --git a/src/alloc.c b/src/alloc.c
index b0945aa30de..b329f89d15b 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -1186,21 +1186,6 @@ lisp_align_free (void *block)
1186 MALLOC_UNBLOCK_INPUT; 1186 MALLOC_UNBLOCK_INPUT;
1187} 1187}
1188 1188
1189/* Return a new buffer structure allocated from the heap with
1190 a call to lisp_malloc. */
1191
1192struct buffer *
1193allocate_buffer (void)
1194{
1195 struct buffer *b
1196 = (struct buffer *) lisp_malloc (sizeof (struct buffer),
1197 MEM_TYPE_BUFFER);
1198 XSETPVECTYPESIZE (b, PVEC_BUFFER,
1199 ((sizeof (struct buffer) + sizeof (EMACS_INT) - 1)
1200 / sizeof (EMACS_INT)));
1201 return b;
1202}
1203
1204 1189
1205#ifndef SYSTEM_MALLOC 1190#ifndef SYSTEM_MALLOC
1206 1191
@@ -3258,6 +3243,17 @@ allocate_pseudovector (int memlen, int lisplen, int tag)
3258 return v; 3243 return v;
3259} 3244}
3260 3245
3246struct buffer *
3247allocate_buffer (void)
3248{
3249 struct buffer *b = lisp_malloc (sizeof (struct buffer), MEM_TYPE_BUFFER);
3250
3251 XSETPVECTYPESIZE (b, PVEC_BUFFER, (offsetof (struct buffer, own_text)
3252 - header_size) / word_size);
3253 /* Note that the fields of B are not initialized. */
3254 return b;
3255}
3256
3261struct Lisp_Hash_Table * 3257struct Lisp_Hash_Table *
3262allocate_hash_table (void) 3258allocate_hash_table (void)
3263{ 3259{
@@ -5786,15 +5782,29 @@ mark_char_table (struct Lisp_Vector *ptr)
5786 } 5782 }
5787} 5783}
5788 5784
5789/* Mark the pointers in a buffer structure. */ 5785/* Mark the chain of overlays starting at PTR. */
5786
5787static void
5788mark_overlay (struct Lisp_Overlay *ptr)
5789{
5790 for (; ptr && !ptr->gcmarkbit; ptr = ptr->next)
5791 {
5792 ptr->gcmarkbit = 1;
5793 mark_object (ptr->start);
5794 mark_object (ptr->end);
5795 mark_object (ptr->plist);
5796 }
5797}
5798
5799/* Mark Lisp_Objects and special pointers in BUFFER. */
5790 5800
5791static void 5801static void
5792mark_buffer (struct buffer *buffer) 5802mark_buffer (struct buffer *buffer)
5793{ 5803{
5794 register Lisp_Object *ptr, tmp; 5804 /* This is handled much like other pseudovectors... */
5805 mark_vectorlike ((struct Lisp_Vector *) buffer);
5795 5806
5796 eassert (!VECTOR_MARKED_P (buffer)); 5807 /* ...but there are some buffer-specific things. */
5797 VECTOR_MARK (buffer);
5798 5808
5799 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer)); 5809 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
5800 5810
@@ -5802,24 +5812,8 @@ mark_buffer (struct buffer *buffer)
5802 a special way just before the sweep phase, and after stripping 5812 a special way just before the sweep phase, and after stripping
5803 some of its elements that are not needed any more. */ 5813 some of its elements that are not needed any more. */
5804 5814
5805 if (buffer->overlays_before) 5815 mark_overlay (buffer->overlays_before);
5806 { 5816 mark_overlay (buffer->overlays_after);
5807 XSETMISC (tmp, buffer->overlays_before);
5808 mark_object (tmp);
5809 }
5810 if (buffer->overlays_after)
5811 {
5812 XSETMISC (tmp, buffer->overlays_after);
5813 mark_object (tmp);
5814 }
5815
5816 /* buffer-local Lisp variables start at `undo_list',
5817 tho only the ones from `name' on are GC'd normally. */
5818 for (ptr = &buffer->BUFFER_INTERNAL_FIELD (name);
5819 ptr <= &PER_BUFFER_VALUE (buffer,
5820 PER_BUFFER_VAR_OFFSET (LAST_FIELD_PER_BUFFER));
5821 ptr++)
5822 mark_object (*ptr);
5823 5817
5824 /* If this is an indirect buffer, mark its base buffer. */ 5818 /* If this is an indirect buffer, mark its base buffer. */
5825 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer)) 5819 if (buffer->base_buffer && !VECTOR_MARKED_P (buffer->base_buffer))
@@ -6061,52 +6055,35 @@ mark_object (Lisp_Object arg)
6061 6055
6062 case Lisp_Misc: 6056 case Lisp_Misc:
6063 CHECK_ALLOCATED_AND_LIVE (live_misc_p); 6057 CHECK_ALLOCATED_AND_LIVE (live_misc_p);
6064 if (XMISCANY (obj)->gcmarkbit)
6065 break;
6066 XMISCANY (obj)->gcmarkbit = 1;
6067 6058
6068 switch (XMISCTYPE (obj)) 6059 if (XMISCTYPE (obj) == Lisp_Misc_Overlay)
6060 mark_overlay (XOVERLAY (obj));
6061 else
6069 { 6062 {
6063 if (XMISCANY (obj)->gcmarkbit)
6064 break;
6065 XMISCANY (obj)->gcmarkbit = 1;
6070 6066
6071 case Lisp_Misc_Marker: 6067 /* Note that we don't mark thru the marker's
6072 /* DO NOT mark thru the marker's chain. 6068 chain. The buffer's markers chain does not
6073 The buffer's markers chain does not preserve markers from gc; 6069 preserve markers from GC; instead, markers
6074 instead, markers are removed from the chain when freed by gc. */ 6070 are removed from the chain when freed by GC. */
6075 break;
6076 6071
6077 case Lisp_Misc_Save_Value:
6078#if GC_MARK_STACK 6072#if GC_MARK_STACK
6079 { 6073 if (XMISCTYPE (obj) == Lisp_Misc_Save_Value)
6080 register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj); 6074 {
6081 /* If DOGC is set, POINTER is the address of a memory 6075 register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj);
6082 area containing INTEGER potential Lisp_Objects. */ 6076 /* If DOGC is set, POINTER is the address of a memory
6083 if (ptr->dogc) 6077 area containing INTEGER potential Lisp_Objects. */
6084 { 6078 if (ptr->dogc)
6085 Lisp_Object *p = (Lisp_Object *) ptr->pointer; 6079 {
6086 ptrdiff_t nelt; 6080 Lisp_Object *p = (Lisp_Object *) ptr->pointer;
6087 for (nelt = ptr->integer; nelt > 0; nelt--, p++) 6081 ptrdiff_t nelt;
6088 mark_maybe_object (*p); 6082 for (nelt = ptr->integer; nelt > 0; nelt--, p++)
6089 } 6083 mark_maybe_object (*p);
6090 } 6084 }
6085 }
6091#endif 6086#endif
6092 break;
6093
6094 case Lisp_Misc_Overlay:
6095 {
6096 struct Lisp_Overlay *ptr = XOVERLAY (obj);
6097 mark_object (ptr->start);
6098 mark_object (ptr->end);
6099 mark_object (ptr->plist);
6100 if (ptr->next)
6101 {
6102 XSETMISC (obj, ptr->next);
6103 goto loop;
6104 }
6105 }
6106 break;
6107
6108 default:
6109 abort ();
6110 } 6087 }
6111 break; 6088 break;
6112 6089