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);