Mercurial > emacs
comparison src/alloc.c @ 89945:59dcbfe97385
Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-17
Merge from emacs--cvs-trunk--0
Patches applied:
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-417
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-419
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-420
Tweak permissions
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-421
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-430
Update from CVS
| author | Miles Bader <miles@gnu.org> |
|---|---|
| date | Tue, 29 Jun 2004 16:46:06 +0000 |
| parents | 4c90ffeb71c5 a446552d2240 |
| children | 97905c4f1a42 |
comparison
equal
deleted
inserted
replaced
| 89944:ecb75580442e | 89945:59dcbfe97385 |
|---|---|
| 577 bcopy (s, p, len); | 577 bcopy (s, p, len); |
| 578 return p; | 578 return p; |
| 579 } | 579 } |
| 580 | 580 |
| 581 | 581 |
| 582 /* Unwind for SAFE_ALLOCA */ | |
| 583 | |
| 584 Lisp_Object | |
| 585 safe_alloca_unwind (arg) | |
| 586 Lisp_Object arg; | |
| 587 { | |
| 588 register struct Lisp_Save_Value *p = XSAVE_VALUE (arg); | |
| 589 | |
| 590 p->dogc = 0; | |
| 591 xfree (p->pointer); | |
| 592 p->pointer = 0; | |
| 593 free_misc (arg); | |
| 594 return Qnil; | |
| 595 } | |
| 596 | |
| 597 | |
| 582 /* Like malloc but used for allocating Lisp data. NBYTES is the | 598 /* Like malloc but used for allocating Lisp data. NBYTES is the |
| 583 number of bytes to allocate, TYPE describes the intended use of the | 599 number of bytes to allocate, TYPE describes the intended use of the |
| 584 allcated memory block (for strings, for conses, ...). */ | 600 allcated memory block (for strings, for conses, ...). */ |
| 585 | 601 |
| 586 static void *lisp_malloc_loser; | 602 static void *lisp_malloc_loser; |
| 2861 MEM_TYPE_MISC); | 2877 MEM_TYPE_MISC); |
| 2862 new->next = marker_block; | 2878 new->next = marker_block; |
| 2863 marker_block = new; | 2879 marker_block = new; |
| 2864 marker_block_index = 0; | 2880 marker_block_index = 0; |
| 2865 n_marker_blocks++; | 2881 n_marker_blocks++; |
| 2882 total_free_markers += MARKER_BLOCK_SIZE; | |
| 2866 } | 2883 } |
| 2867 XSETMISC (val, &marker_block->markers[marker_block_index]); | 2884 XSETMISC (val, &marker_block->markers[marker_block_index]); |
| 2868 marker_block_index++; | 2885 marker_block_index++; |
| 2869 } | 2886 } |
| 2870 | 2887 |
| 2888 --total_free_markers; | |
| 2871 consing_since_gc += sizeof (union Lisp_Misc); | 2889 consing_since_gc += sizeof (union Lisp_Misc); |
| 2872 misc_objects_consed++; | 2890 misc_objects_consed++; |
| 2873 XMARKER (val)->gcmarkbit = 0; | 2891 XMARKER (val)->gcmarkbit = 0; |
| 2874 return val; | 2892 return val; |
| 2893 } | |
| 2894 | |
| 2895 /* Free a Lisp_Misc object */ | |
| 2896 | |
| 2897 void | |
| 2898 free_misc (misc) | |
| 2899 Lisp_Object misc; | |
| 2900 { | |
| 2901 XMISC (misc)->u_marker.type = Lisp_Misc_Free; | |
| 2902 XMISC (misc)->u_free.chain = marker_free_list; | |
| 2903 marker_free_list = XMISC (misc); | |
| 2904 | |
| 2905 total_free_markers++; | |
| 2875 } | 2906 } |
| 2876 | 2907 |
| 2877 /* Return a Lisp_Misc_Save_Value object containing POINTER and | 2908 /* Return a Lisp_Misc_Save_Value object containing POINTER and |
| 2878 INTEGER. This is used to package C values to call record_unwind_protect. | 2909 INTEGER. This is used to package C values to call record_unwind_protect. |
| 2879 The unwind function can get the C values back using XSAVE_VALUE. */ | 2910 The unwind function can get the C values back using XSAVE_VALUE. */ |
| 2889 val = allocate_misc (); | 2920 val = allocate_misc (); |
| 2890 XMISCTYPE (val) = Lisp_Misc_Save_Value; | 2921 XMISCTYPE (val) = Lisp_Misc_Save_Value; |
| 2891 p = XSAVE_VALUE (val); | 2922 p = XSAVE_VALUE (val); |
| 2892 p->pointer = pointer; | 2923 p->pointer = pointer; |
| 2893 p->integer = integer; | 2924 p->integer = integer; |
| 2925 p->dogc = 0; | |
| 2894 return val; | 2926 return val; |
| 2895 } | 2927 } |
| 2896 | 2928 |
| 2897 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, | 2929 DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0, |
| 2898 doc: /* Return a newly allocated marker which does not point at any place. */) | 2930 doc: /* Return a newly allocated marker which does not point at any place. */) |
| 2917 void | 2949 void |
| 2918 free_marker (marker) | 2950 free_marker (marker) |
| 2919 Lisp_Object marker; | 2951 Lisp_Object marker; |
| 2920 { | 2952 { |
| 2921 unchain_marker (XMARKER (marker)); | 2953 unchain_marker (XMARKER (marker)); |
| 2922 | 2954 free_misc (marker); |
| 2923 XMISC (marker)->u_marker.type = Lisp_Misc_Free; | |
| 2924 XMISC (marker)->u_free.chain = marker_free_list; | |
| 2925 marker_free_list = XMISC (marker); | |
| 2926 | |
| 2927 total_free_markers++; | |
| 2928 } | 2955 } |
| 2929 | 2956 |
| 2930 | 2957 |
| 2931 /* Return a newly created vector or string with specified arguments as | 2958 /* Return a newly created vector or string with specified arguments as |
| 2932 elements. If all the arguments are characters that can fit | 2959 elements. If all the arguments are characters that can fit |
| 4922 case Lisp_Misc: | 4949 case Lisp_Misc: |
| 4923 CHECK_ALLOCATED_AND_LIVE (live_misc_p); | 4950 CHECK_ALLOCATED_AND_LIVE (live_misc_p); |
| 4924 if (XMARKER (obj)->gcmarkbit) | 4951 if (XMARKER (obj)->gcmarkbit) |
| 4925 break; | 4952 break; |
| 4926 XMARKER (obj)->gcmarkbit = 1; | 4953 XMARKER (obj)->gcmarkbit = 1; |
| 4954 | |
| 4927 switch (XMISCTYPE (obj)) | 4955 switch (XMISCTYPE (obj)) |
| 4928 { | 4956 { |
| 4929 case Lisp_Misc_Buffer_Local_Value: | 4957 case Lisp_Misc_Buffer_Local_Value: |
| 4930 case Lisp_Misc_Some_Buffer_Local_Value: | 4958 case Lisp_Misc_Some_Buffer_Local_Value: |
| 4931 { | 4959 { |
| 4946 | 4974 |
| 4947 case Lisp_Misc_Marker: | 4975 case Lisp_Misc_Marker: |
| 4948 /* DO NOT mark thru the marker's chain. | 4976 /* DO NOT mark thru the marker's chain. |
| 4949 The buffer's markers chain does not preserve markers from gc; | 4977 The buffer's markers chain does not preserve markers from gc; |
| 4950 instead, markers are removed from the chain when freed by gc. */ | 4978 instead, markers are removed from the chain when freed by gc. */ |
| 4979 break; | |
| 4980 | |
| 4951 case Lisp_Misc_Intfwd: | 4981 case Lisp_Misc_Intfwd: |
| 4952 case Lisp_Misc_Boolfwd: | 4982 case Lisp_Misc_Boolfwd: |
| 4953 case Lisp_Misc_Objfwd: | 4983 case Lisp_Misc_Objfwd: |
| 4954 case Lisp_Misc_Buffer_Objfwd: | 4984 case Lisp_Misc_Buffer_Objfwd: |
| 4955 case Lisp_Misc_Kboard_Objfwd: | 4985 case Lisp_Misc_Kboard_Objfwd: |
| 4956 /* Don't bother with Lisp_Buffer_Objfwd, | 4986 /* Don't bother with Lisp_Buffer_Objfwd, |
| 4957 since all markable slots in current buffer marked anyway. */ | 4987 since all markable slots in current buffer marked anyway. */ |
| 4958 /* Don't need to do Lisp_Objfwd, since the places they point | 4988 /* Don't need to do Lisp_Objfwd, since the places they point |
| 4959 are protected with staticpro. */ | 4989 are protected with staticpro. */ |
| 4990 break; | |
| 4991 | |
| 4960 case Lisp_Misc_Save_Value: | 4992 case Lisp_Misc_Save_Value: |
| 4993 { | |
| 4994 register struct Lisp_Save_Value *ptr = XSAVE_VALUE (obj); | |
| 4995 /* If DOGC is set, POINTER is the address of a memory | |
| 4996 area containing INTEGER potential Lisp_Objects. */ | |
| 4997 if (ptr->dogc) | |
| 4998 { | |
| 4999 Lisp_Object *p = (Lisp_Object *) ptr->pointer; | |
| 5000 int nelt; | |
| 5001 for (nelt = ptr->integer; nelt > 0; nelt--, p++) | |
| 5002 mark_maybe_object (*p); | |
| 5003 } | |
| 5004 } | |
| 4961 break; | 5005 break; |
| 4962 | 5006 |
| 4963 case Lisp_Misc_Overlay: | 5007 case Lisp_Misc_Overlay: |
| 4964 { | 5008 { |
| 4965 struct Lisp_Overlay *ptr = XOVERLAY (obj); | 5009 struct Lisp_Overlay *ptr = XOVERLAY (obj); |
