Mercurial > emacs
comparison src/alloc.c @ 91056:1251cabc40b7
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 890-898)
- Update from CVS
- Merge from emacs--rel--22
* emacs--rel--22 (patch 122-128)
- Update from CVS
- Merge from gnus--rel--5.10
* gnus--rel--5.10 (patch 257-258)
- Merge from emacs--rel--22
- Update from CVS
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-270
author | Miles Bader <miles@gnu.org> |
---|---|
date | Fri, 19 Oct 2007 00:00:21 +0000 |
parents | 35069180a991 99492f857499 |
children | 4bc33ffdda1a |
comparison
equal
deleted
inserted
replaced
91055:46bc3a01b2fa | 91056:1251cabc40b7 |
---|---|
1151 allocate_buffer () | 1151 allocate_buffer () |
1152 { | 1152 { |
1153 struct buffer *b | 1153 struct buffer *b |
1154 = (struct buffer *) lisp_malloc (sizeof (struct buffer), | 1154 = (struct buffer *) lisp_malloc (sizeof (struct buffer), |
1155 MEM_TYPE_BUFFER); | 1155 MEM_TYPE_BUFFER); |
1156 b->size = sizeof (struct buffer) / sizeof (EMACS_INT); | |
1157 XSETPVECTYPE (b, PVEC_BUFFER); | |
1156 return b; | 1158 return b; |
1157 } | 1159 } |
1158 | 1160 |
1159 | 1161 |
1160 #ifndef SYSTEM_MALLOC | 1162 #ifndef SYSTEM_MALLOC |
3305 MALLOC_UNBLOCK_INPUT; | 3307 MALLOC_UNBLOCK_INPUT; |
3306 | 3308 |
3307 --total_free_markers; | 3309 --total_free_markers; |
3308 consing_since_gc += sizeof (union Lisp_Misc); | 3310 consing_since_gc += sizeof (union Lisp_Misc); |
3309 misc_objects_consed++; | 3311 misc_objects_consed++; |
3310 XMARKER (val)->gcmarkbit = 0; | 3312 XMISCANY (val)->gcmarkbit = 0; |
3311 return val; | 3313 return val; |
3312 } | 3314 } |
3313 | 3315 |
3314 /* Free a Lisp_Misc object */ | 3316 /* Free a Lisp_Misc object */ |
3315 | 3317 |
3316 void | 3318 void |
3317 free_misc (misc) | 3319 free_misc (misc) |
3318 Lisp_Object misc; | 3320 Lisp_Object misc; |
3319 { | 3321 { |
3320 XMISC (misc)->u_marker.type = Lisp_Misc_Free; | 3322 XMISCTYPE (misc) = Lisp_Misc_Free; |
3321 XMISC (misc)->u_free.chain = marker_free_list; | 3323 XMISC (misc)->u_free.chain = marker_free_list; |
3322 marker_free_list = XMISC (misc); | 3324 marker_free_list = XMISC (misc); |
3323 | 3325 |
3324 total_free_markers++; | 3326 total_free_markers++; |
3325 } | 3327 } |
4031 return (offset >= 0 | 4033 return (offset >= 0 |
4032 && offset % sizeof b->markers[0] == 0 | 4034 && offset % sizeof b->markers[0] == 0 |
4033 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0]) | 4035 && offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0]) |
4034 && (b != marker_block | 4036 && (b != marker_block |
4035 || offset / sizeof b->markers[0] < marker_block_index) | 4037 || offset / sizeof b->markers[0] < marker_block_index) |
4036 && ((union Lisp_Misc *) p)->u_marker.type != Lisp_Misc_Free); | 4038 && ((union Lisp_Misc *) p)->u_any.type != Lisp_Misc_Free); |
4037 } | 4039 } |
4038 else | 4040 else |
4039 return 0; | 4041 return 0; |
4040 } | 4042 } |
4041 | 4043 |
4162 else if (live_buffer_p (m, po)) | 4164 else if (live_buffer_p (m, po)) |
4163 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj)); | 4165 mark_p = BUFFERP (obj) && !VECTOR_MARKED_P (XBUFFER (obj)); |
4164 break; | 4166 break; |
4165 | 4167 |
4166 case Lisp_Misc: | 4168 case Lisp_Misc: |
4167 mark_p = (live_misc_p (m, po) && !XMARKER (obj)->gcmarkbit); | 4169 mark_p = (live_misc_p (m, po) && !XMISCANY (obj)->gcmarkbit); |
4168 break; | 4170 break; |
4169 | 4171 |
4170 case Lisp_Int: | 4172 case Lisp_Int: |
4171 case Lisp_Type_Limit: | 4173 case Lisp_Type_Limit: |
4172 break; | 4174 break; |
5611 } | 5613 } |
5612 break; | 5614 break; |
5613 | 5615 |
5614 case Lisp_Misc: | 5616 case Lisp_Misc: |
5615 CHECK_ALLOCATED_AND_LIVE (live_misc_p); | 5617 CHECK_ALLOCATED_AND_LIVE (live_misc_p); |
5616 if (XMARKER (obj)->gcmarkbit) | 5618 if (XMISCANY (obj)->gcmarkbit) |
5617 break; | 5619 break; |
5618 XMARKER (obj)->gcmarkbit = 1; | 5620 XMISCANY (obj)->gcmarkbit = 1; |
5619 | 5621 |
5620 switch (XMISCTYPE (obj)) | 5622 switch (XMISCTYPE (obj)) |
5621 { | 5623 { |
5622 case Lisp_Misc_Buffer_Local_Value: | 5624 case Lisp_Misc_Buffer_Local_Value: |
5623 case Lisp_Misc_Some_Buffer_Local_Value: | |
5624 { | 5625 { |
5625 register struct Lisp_Buffer_Local_Value *ptr | 5626 register struct Lisp_Buffer_Local_Value *ptr |
5626 = XBUFFER_LOCAL_VALUE (obj); | 5627 = XBUFFER_LOCAL_VALUE (obj); |
5627 /* If the cdr is nil, avoid recursion for the car. */ | 5628 /* If the cdr is nil, avoid recursion for the car. */ |
5628 if (EQ (ptr->cdr, Qnil)) | 5629 if (EQ (ptr->cdr, Qnil)) |
5804 case Lisp_Symbol: | 5805 case Lisp_Symbol: |
5805 survives_p = XSYMBOL (obj)->gcmarkbit; | 5806 survives_p = XSYMBOL (obj)->gcmarkbit; |
5806 break; | 5807 break; |
5807 | 5808 |
5808 case Lisp_Misc: | 5809 case Lisp_Misc: |
5809 survives_p = XMARKER (obj)->gcmarkbit; | 5810 survives_p = XMISCANY (obj)->gcmarkbit; |
5810 break; | 5811 break; |
5811 | 5812 |
5812 case Lisp_String: | 5813 case Lisp_String: |
5813 survives_p = STRING_MARKED_P (XSTRING (obj)); | 5814 survives_p = STRING_MARKED_P (XSTRING (obj)); |
5814 break; | 5815 break; |
6101 register int i; | 6102 register int i; |
6102 int this_free = 0; | 6103 int this_free = 0; |
6103 | 6104 |
6104 for (i = 0; i < lim; i++) | 6105 for (i = 0; i < lim; i++) |
6105 { | 6106 { |
6106 if (!mblk->markers[i].u_marker.gcmarkbit) | 6107 if (!mblk->markers[i].u_any.gcmarkbit) |
6107 { | 6108 { |
6108 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker) | 6109 if (mblk->markers[i].u_any.type == Lisp_Misc_Marker) |
6109 unchain_marker (&mblk->markers[i].u_marker); | 6110 unchain_marker (&mblk->markers[i].u_marker); |
6110 /* Set the type of the freed object to Lisp_Misc_Free. | 6111 /* Set the type of the freed object to Lisp_Misc_Free. |
6111 We could leave the type alone, since nobody checks it, | 6112 We could leave the type alone, since nobody checks it, |
6112 but this might catch bugs faster. */ | 6113 but this might catch bugs faster. */ |
6113 mblk->markers[i].u_marker.type = Lisp_Misc_Free; | 6114 mblk->markers[i].u_marker.type = Lisp_Misc_Free; |
6116 this_free++; | 6117 this_free++; |
6117 } | 6118 } |
6118 else | 6119 else |
6119 { | 6120 { |
6120 num_used++; | 6121 num_used++; |
6121 mblk->markers[i].u_marker.gcmarkbit = 0; | 6122 mblk->markers[i].u_any.gcmarkbit = 0; |
6122 } | 6123 } |
6123 } | 6124 } |
6124 lim = MARKER_BLOCK_SIZE; | 6125 lim = MARKER_BLOCK_SIZE; |
6125 /* If this block contains only free markers and we have already | 6126 /* If this block contains only free markers and we have already |
6126 seen more than two blocks worth of free markers then deallocate | 6127 seen more than two blocks worth of free markers then deallocate |
6254 die (msg, file, line) | 6255 die (msg, file, line) |
6255 const char *msg; | 6256 const char *msg; |
6256 const char *file; | 6257 const char *file; |
6257 int line; | 6258 int line; |
6258 { | 6259 { |
6259 fprintf (stderr, "\r\nEmacs fatal error: %s:%d: %s\r\n", | 6260 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: %s\r\n", |
6260 file, line, msg); | 6261 file, line, msg); |
6261 abort (); | 6262 abort (); |
6262 } | 6263 } |
6263 | 6264 |
6264 /* Initialization */ | 6265 /* Initialization */ |