XEmacs 21.2.43 "Terspichore".
[chise/xemacs-chise.git.1] / src / alloc.c
1 /* Storage allocation and gc for XEmacs Lisp interpreter.
2    Copyright (C) 1985-1998 Free Software Foundation, Inc.
3    Copyright (C) 1995 Sun Microsystems, Inc.
4    Copyright (C) 1995, 1996 Ben Wing.
5
6 This file is part of XEmacs.
7
8 XEmacs is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with XEmacs; see the file COPYING.  If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA.  */
22
23 /* Synched up with: FSF 19.28, Mule 2.0.  Substantially different from
24    FSF. */
25
26 /* Authorship:
27
28    FSF: Original version; a long time ago.
29    Mly: Significantly rewritten to use new 3-bit tags and
30         nicely abstracted object definitions, for 19.8.
31    JWZ: Improved code to keep track of purespace usage and
32         issue nice purespace and GC stats.
33    Ben Wing: Cleaned up frob-block lrecord code, added error-checking
34         and various changes for Mule, for 19.12.
35         Added bit vectors for 19.13.
36         Added lcrecord lists for 19.14.
37    slb: Lots of work on the purification and dump time code.
38         Synched Doug Lea malloc support from Emacs 20.2.
39    og:  Killed the purespace.  Portable dumper (moved to dumper.c)
40 */
41
42 #include <config.h>
43 #include "lisp.h"
44
45 #include "backtrace.h"
46 #include "buffer.h"
47 #include "bytecode.h"
48 #include "chartab.h"
49 #include "device.h"
50 #include "elhash.h"
51 #include "events.h"
52 #include "extents.h"
53 #include "frame.h"
54 #include "glyphs.h"
55 #include "opaque.h"
56 #include "redisplay.h"
57 #include "specifier.h"
58 #include "sysfile.h"
59 #include "sysdep.h"
60 #include "window.h"
61 #include "console-stream.h"
62
63 #ifdef DOUG_LEA_MALLOC
64 #include <malloc.h>
65 #endif
66
67 #ifdef PDUMP
68 #include "dumper.h"
69 #endif
70
71 EXFUN (Fgarbage_collect, 0);
72
73 #if 0 /* this is _way_ too slow to be part of the standard debug options */
74 #if defined(DEBUG_XEMACS) && defined(MULE)
75 #define VERIFY_STRING_CHARS_INTEGRITY
76 #endif
77 #endif
78
79 /* Define this to use malloc/free with no freelist for all datatypes,
80    the hope being that some debugging tools may help detect
81    freed memory references */
82 #ifdef USE_DEBUG_MALLOC /* Taking the above comment at face value -slb */
83 #include <dmalloc.h>
84 #define ALLOC_NO_POOLS
85 #endif
86
87 #ifdef DEBUG_XEMACS
88 static int debug_allocation;
89 static int debug_allocation_backtrace_length;
90 #endif
91
92 /* Number of bytes of consing done since the last gc */
93 EMACS_INT consing_since_gc;
94 #define INCREMENT_CONS_COUNTER_1(size) (consing_since_gc += (size))
95
96 #define debug_allocation_backtrace()                            \
97 do {                                                            \
98   if (debug_allocation_backtrace_length > 0)                    \
99     debug_short_backtrace (debug_allocation_backtrace_length);  \
100 } while (0)
101
102 #ifdef DEBUG_XEMACS
103 #define INCREMENT_CONS_COUNTER(foosize, type)                   \
104   do {                                                          \
105     if (debug_allocation)                                       \
106       {                                                         \
107         stderr_out ("allocating %s (size %ld)\n", type, (long)foosize); \
108         debug_allocation_backtrace ();                          \
109       }                                                         \
110     INCREMENT_CONS_COUNTER_1 (foosize);                         \
111   } while (0)
112 #define NOSEEUM_INCREMENT_CONS_COUNTER(foosize, type)           \
113   do {                                                          \
114     if (debug_allocation > 1)                                   \
115       {                                                         \
116         stderr_out ("allocating noseeum %s (size %ld)\n", type, (long)foosize); \
117         debug_allocation_backtrace ();                          \
118       }                                                         \
119     INCREMENT_CONS_COUNTER_1 (foosize);                         \
120   } while (0)
121 #else
122 #define INCREMENT_CONS_COUNTER(size, type) INCREMENT_CONS_COUNTER_1 (size)
123 #define NOSEEUM_INCREMENT_CONS_COUNTER(size, type) \
124   INCREMENT_CONS_COUNTER_1 (size)
125 #endif
126
127 #define DECREMENT_CONS_COUNTER(size) do {       \
128   consing_since_gc -= (size);                   \
129   if (consing_since_gc < 0)                     \
130     consing_since_gc = 0;                       \
131 } while (0)
132
133 /* Number of bytes of consing since gc before another gc should be done. */
134 EMACS_INT gc_cons_threshold;
135
136 /* Nonzero during gc */
137 int gc_in_progress;
138
139 /* Number of times GC has happened at this level or below.
140  * Level 0 is most volatile, contrary to usual convention.
141  *  (Of course, there's only one level at present) */
142 EMACS_INT gc_generation_number[1];
143
144 /* This is just for use by the printer, to allow things to print uniquely */
145 static int lrecord_uid_counter;
146
147 /* Nonzero when calling certain hooks or doing other things where
148    a GC would be bad */
149 int gc_currently_forbidden;
150
151 /* Hooks. */
152 Lisp_Object Vpre_gc_hook, Qpre_gc_hook;
153 Lisp_Object Vpost_gc_hook, Qpost_gc_hook;
154
155 /* "Garbage collecting" */
156 Lisp_Object Vgc_message;
157 Lisp_Object Vgc_pointer_glyph;
158 static const char gc_default_message[] = "Garbage collecting";
159 Lisp_Object Qgarbage_collecting;
160
161 /* Non-zero means we're in the process of doing the dump */
162 int purify_flag;
163
164 #ifdef ERROR_CHECK_TYPECHECK
165
166 Error_behavior ERROR_ME, ERROR_ME_NOT, ERROR_ME_WARN;
167
168 #endif
169
170 int
171 c_readonly (Lisp_Object obj)
172 {
173   return POINTER_TYPE_P (XTYPE (obj)) && C_READONLY (obj);
174 }
175
176 int
177 lisp_readonly (Lisp_Object obj)
178 {
179   return POINTER_TYPE_P (XTYPE (obj)) && LISP_READONLY (obj);
180 }
181
182 \f
183 /* Maximum amount of C stack to save when a GC happens.  */
184
185 #ifndef MAX_SAVE_STACK
186 #define MAX_SAVE_STACK 0 /* 16000 */
187 #endif
188
189 /* Non-zero means ignore malloc warnings.  Set during initialization.  */
190 int ignore_malloc_warnings;
191
192 \f
193 static void *breathing_space;
194
195 void
196 release_breathing_space (void)
197 {
198   if (breathing_space)
199     {
200       void *tmp = breathing_space;
201       breathing_space = 0;
202       xfree (tmp);
203     }
204 }
205
206 /* malloc calls this if it finds we are near exhausting storage */
207 void
208 malloc_warning (const char *str)
209 {
210   if (ignore_malloc_warnings)
211     return;
212
213   warn_when_safe
214     (Qmemory, Qcritical,
215      "%s\n"
216      "Killing some buffers may delay running out of memory.\n"
217      "However, certainly by the time you receive the 95%% warning,\n"
218      "you should clean up, kill this Emacs, and start a new one.",
219      str);
220 }
221
222 /* Called if malloc returns zero */
223 DOESNT_RETURN
224 memory_full (void)
225 {
226   /* Force a GC next time eval is called.
227      It's better to loop garbage-collecting (we might reclaim enough
228      to win) than to loop beeping and barfing "Memory exhausted"
229    */
230   consing_since_gc = gc_cons_threshold + 1;
231   release_breathing_space ();
232
233   /* Flush some histories which might conceivably contain garbalogical
234      inhibitors.  */
235   if (!NILP (Fboundp (Qvalues)))
236     Fset (Qvalues, Qnil);
237   Vcommand_history = Qnil;
238
239   error ("Memory exhausted");
240 }
241
242 /* like malloc and realloc but check for no memory left, and block input. */
243
244 #undef xmalloc
245 void *
246 xmalloc (size_t size)
247 {
248   void *val = malloc (size);
249
250   if (!val && (size != 0)) memory_full ();
251   return val;
252 }
253
254 #undef xcalloc
255 static void *
256 xcalloc (size_t nelem, size_t elsize)
257 {
258   void *val = calloc (nelem, elsize);
259
260   if (!val && (nelem != 0)) memory_full ();
261   return val;
262 }
263
264 void *
265 xmalloc_and_zero (size_t size)
266 {
267   return xcalloc (size, sizeof (char));
268 }
269
270 #undef xrealloc
271 void *
272 xrealloc (void *block, size_t size)
273 {
274   /* We must call malloc explicitly when BLOCK is 0, since some
275      reallocs don't do this.  */
276   void *val = block ? realloc (block, size) : malloc (size);
277
278   if (!val && (size != 0)) memory_full ();
279   return val;
280 }
281
282 void
283 #ifdef ERROR_CHECK_MALLOC
284 xfree_1 (void *block)
285 #else
286 xfree (void *block)
287 #endif
288 {
289 #ifdef ERROR_CHECK_MALLOC
290   /* Unbelievably, calling free() on 0xDEADBEEF doesn't cause an
291      error until much later on for many system mallocs, such as
292      the one that comes with Solaris 2.3.  FMH!! */
293   assert (block != (void *) 0xDEADBEEF);
294   assert (block);
295 #endif /* ERROR_CHECK_MALLOC */
296   free (block);
297 }
298
299 #ifdef ERROR_CHECK_GC
300
301 #if SIZEOF_INT == 4
302 typedef unsigned int four_byte_t;
303 #elif SIZEOF_LONG == 4
304 typedef unsigned long four_byte_t;
305 #elif SIZEOF_SHORT == 4
306 typedef unsigned short four_byte_t;
307 #else
308 What kind of strange-ass system are we running on?
309 #endif
310
311 static void
312 deadbeef_memory (void *ptr, size_t size)
313 {
314   four_byte_t *ptr4 = (four_byte_t *) ptr;
315   size_t beefs = size >> 2;
316
317   /* In practice, size will always be a multiple of four.  */
318   while (beefs--)
319     (*ptr4++) = 0xDEADBEEF;
320 }
321
322 #else /* !ERROR_CHECK_GC */
323
324
325 #define deadbeef_memory(ptr, size)
326
327 #endif /* !ERROR_CHECK_GC */
328
329 #undef xstrdup
330 char *
331 xstrdup (const char *str)
332 {
333   int len = strlen (str) + 1;   /* for stupid terminating 0 */
334
335   void *val = xmalloc (len);
336   if (val == 0) return 0;
337   return (char *) memcpy (val, str, len);
338 }
339
340 #ifdef NEED_STRDUP
341 char *
342 strdup (const char *s)
343 {
344   return xstrdup (s);
345 }
346 #endif /* NEED_STRDUP */
347
348 \f
349 static void *
350 allocate_lisp_storage (size_t size)
351 {
352   return xmalloc (size);
353 }
354
355
356 /* lcrecords are chained together through their "next" field.
357    After doing the mark phase, GC will walk this linked list
358    and free any lcrecord which hasn't been marked. */
359 static struct lcrecord_header *all_lcrecords;
360
361 void *
362 alloc_lcrecord (size_t size, const struct lrecord_implementation *implementation)
363 {
364   struct lcrecord_header *lcheader;
365
366   type_checking_assert
367     ((implementation->static_size == 0 ?
368       implementation->size_in_bytes_method != NULL :
369       implementation->static_size == size)
370      &&
371      (! implementation->basic_p)
372      &&
373      (! (implementation->hash == NULL && implementation->equal != NULL)));
374
375   lcheader = (struct lcrecord_header *) allocate_lisp_storage (size);
376   set_lheader_implementation (&lcheader->lheader, implementation);
377   lcheader->next = all_lcrecords;
378 #if 1                           /* mly prefers to see small ID numbers */
379   lcheader->uid = lrecord_uid_counter++;
380 #else                           /* jwz prefers to see real addrs */
381   lcheader->uid = (int) &lcheader;
382 #endif
383   lcheader->free = 0;
384   all_lcrecords = lcheader;
385   INCREMENT_CONS_COUNTER (size, implementation->name);
386   return lcheader;
387 }
388
389 #if 0 /* Presently unused */
390 /* Very, very poor man's EGC?
391  * This may be slow and thrash pages all over the place.
392  *  Only call it if you really feel you must (and if the
393  *  lrecord was fairly recently allocated).
394  * Otherwise, just let the GC do its job -- that's what it's there for
395  */
396 void
397 free_lcrecord (struct lcrecord_header *lcrecord)
398 {
399   if (all_lcrecords == lcrecord)
400     {
401       all_lcrecords = lcrecord->next;
402     }
403   else
404     {
405       struct lrecord_header *header = all_lcrecords;
406       for (;;)
407         {
408           struct lrecord_header *next = header->next;
409           if (next == lcrecord)
410             {
411               header->next = lrecord->next;
412               break;
413             }
414           else if (next == 0)
415             abort ();
416           else
417             header = next;
418         }
419     }
420   if (lrecord->implementation->finalizer)
421     lrecord->implementation->finalizer (lrecord, 0);
422   xfree (lrecord);
423   return;
424 }
425 #endif /* Unused */
426
427
428 static void
429 disksave_object_finalization_1 (void)
430 {
431   struct lcrecord_header *header;
432
433   for (header = all_lcrecords; header; header = header->next)
434     {
435       if (LHEADER_IMPLEMENTATION (&header->lheader)->finalizer &&
436           !header->free)
437         LHEADER_IMPLEMENTATION (&header->lheader)->finalizer (header, 1);
438     }
439 }
440
441 \f
442 /************************************************************************/
443 /*                        Debugger support                              */
444 /************************************************************************/
445 /* Give gdb/dbx enough information to decode Lisp Objects.  We make
446    sure certain symbols are always defined, so gdb doesn't complain
447    about expressions in src/.gdbinit.  See src/.gdbinit or src/.dbxrc
448    to see how this is used.  */
449
450 const EMACS_UINT dbg_valmask = ((1UL << VALBITS) - 1) << GCBITS;
451 const EMACS_UINT dbg_typemask = (1UL << GCTYPEBITS) - 1;
452
453 #ifdef USE_UNION_TYPE
454 const unsigned char dbg_USE_UNION_TYPE = 1;
455 #else
456 const unsigned char dbg_USE_UNION_TYPE = 0;
457 #endif
458
459 const unsigned char dbg_valbits = VALBITS;
460 const unsigned char dbg_gctypebits = GCTYPEBITS;
461
462 /* Macros turned into functions for ease of debugging.
463    Debuggers don't know about macros! */
464 int dbg_eq (Lisp_Object obj1, Lisp_Object obj2);
465 int
466 dbg_eq (Lisp_Object obj1, Lisp_Object obj2)
467 {
468   return EQ (obj1, obj2);
469 }
470
471 \f
472 /************************************************************************/
473 /*                        Fixed-size type macros                        */
474 /************************************************************************/
475
476 /* For fixed-size types that are commonly used, we malloc() large blocks
477    of memory at a time and subdivide them into chunks of the correct
478    size for an object of that type.  This is more efficient than
479    malloc()ing each object separately because we save on malloc() time
480    and overhead due to the fewer number of malloc()ed blocks, and
481    also because we don't need any extra pointers within each object
482    to keep them threaded together for GC purposes.  For less common
483    (and frequently large-size) types, we use lcrecords, which are
484    malloc()ed individually and chained together through a pointer
485    in the lcrecord header.  lcrecords do not need to be fixed-size
486    (i.e. two objects of the same type need not have the same size;
487    however, the size of a particular object cannot vary dynamically).
488    It is also much easier to create a new lcrecord type because no
489    additional code needs to be added to alloc.c.  Finally, lcrecords
490    may be more efficient when there are only a small number of them.
491
492    The types that are stored in these large blocks (or "frob blocks")
493    are cons, float, compiled-function, symbol, marker, extent, event,
494    and string.
495
496    Note that strings are special in that they are actually stored in
497    two parts: a structure containing information about the string, and
498    the actual data associated with the string.  The former structure
499    (a struct Lisp_String) is a fixed-size structure and is managed the
500    same way as all the other such types.  This structure contains a
501    pointer to the actual string data, which is stored in structures of
502    type struct string_chars_block.  Each string_chars_block consists
503    of a pointer to a struct Lisp_String, followed by the data for that
504    string, followed by another pointer to a Lisp_String, followed by
505    the data for that string, etc.  At GC time, the data in these
506    blocks is compacted by searching sequentially through all the
507    blocks and compressing out any holes created by unmarked strings.
508    Strings that are more than a certain size (bigger than the size of
509    a string_chars_block, although something like half as big might
510    make more sense) are malloc()ed separately and not stored in
511    string_chars_blocks.  Furthermore, no one string stretches across
512    two string_chars_blocks.
513
514    Vectors are each malloc()ed separately, similar to lcrecords.
515
516    In the following discussion, we use conses, but it applies equally
517    well to the other fixed-size types.
518
519    We store cons cells inside of cons_blocks, allocating a new
520    cons_block with malloc() whenever necessary.  Cons cells reclaimed
521    by GC are put on a free list to be reallocated before allocating
522    any new cons cells from the latest cons_block.  Each cons_block is
523    just under 2^n - MALLOC_OVERHEAD bytes long, since malloc (at least
524    the versions in malloc.c and gmalloc.c) really allocates in units
525    of powers of two and uses 4 bytes for its own overhead.
526
527    What GC actually does is to search through all the cons_blocks,
528    from the most recently allocated to the oldest, and put all
529    cons cells that are not marked (whether or not they're already
530    free) on a cons_free_list.  The cons_free_list is a stack, and
531    so the cons cells in the oldest-allocated cons_block end up
532    at the head of the stack and are the first to be reallocated.
533    If any cons_block is entirely free, it is freed with free()
534    and its cons cells removed from the cons_free_list.  Because
535    the cons_free_list ends up basically in memory order, we have
536    a high locality of reference (assuming a reasonable turnover
537    of allocating and freeing) and have a reasonable probability
538    of entirely freeing up cons_blocks that have been more recently
539    allocated.  This stage is called the "sweep stage" of GC, and
540    is executed after the "mark stage", which involves starting
541    from all places that are known to point to in-use Lisp objects
542    (e.g. the obarray, where are all symbols are stored; the
543    current catches and condition-cases; the backtrace list of
544    currently executing functions; the gcpro list; etc.) and
545    recursively marking all objects that are accessible.
546
547    At the beginning of the sweep stage, the conses in the cons blocks
548    are in one of three states: in use and marked, in use but not
549    marked, and not in use (already freed).  Any conses that are marked
550    have been marked in the mark stage just executed, because as part
551    of the sweep stage we unmark any marked objects.  The way we tell
552    whether or not a cons cell is in use is through the LRECORD_FREE_P
553    macro.  This uses a special lrecord type `lrecord_type_free',
554    which is never associated with any valid object.
555
556    Conses on the free_cons_list are threaded through a pointer stored
557    in the conses themselves.  Because the cons is still in a
558    cons_block and needs to remain marked as not in use for the next
559    time that GC happens, we need room to store both the "free"
560    indicator and the chaining pointer.  So this pointer is stored
561    after the lrecord header (actually where C places a pointer after
562    the lrecord header; they are not necessarily contiguous).  This
563    implies that all fixed-size types must be big enough to contain at
564    least one pointer.  This is true for all current fixed-size types,
565    with the possible exception of Lisp_Floats, for which we define the
566    meat of the struct using a union of a pointer and a double to
567    ensure adequate space for the free list chain pointer.
568
569    Some types of objects need additional "finalization" done
570    when an object is converted from in use to not in use;
571    this is the purpose of the ADDITIONAL_FREE_type macro.
572    For example, markers need to be removed from the chain
573    of markers that is kept in each buffer.  This is because
574    markers in a buffer automatically disappear if the marker
575    is no longer referenced anywhere (the same does not
576    apply to extents, however).
577
578    WARNING: Things are in an extremely bizarre state when
579    the ADDITIONAL_FREE_type macros are called, so beware!
580
581    When ERROR_CHECK_GC is defined, we do things differently so as to
582    maximize our chances of catching places where there is insufficient
583    GCPROing.  The thing we want to avoid is having an object that
584    we're using but didn't GCPRO get freed by GC and then reallocated
585    while we're in the process of using it -- this will result in
586    something seemingly unrelated getting trashed, and is extremely
587    difficult to track down.  If the object gets freed but not
588    reallocated, we can usually catch this because we set most of the
589    bytes of a freed object to 0xDEADBEEF. (The lisp object type is set
590    to the invalid type `lrecord_type_free', however, and a pointer
591    used to chain freed objects together is stored after the lrecord
592    header; we play some tricks with this pointer to make it more
593    bogus, so crashes are more likely to occur right away.)
594
595    We want freed objects to stay free as long as possible,
596    so instead of doing what we do above, we maintain the
597    free objects in a first-in first-out queue.  We also
598    don't recompute the free list each GC, unlike above;
599    this ensures that the queue ordering is preserved.
600    [This means that we are likely to have worse locality
601    of reference, and that we can never free a frob block
602    once it's allocated. (Even if we know that all cells
603    in it are free, there's no easy way to remove all those
604    cells from the free list because the objects on the
605    free list are unlikely to be in memory order.)]
606    Furthermore, we never take objects off the free list
607    unless there's a large number (usually 1000, but
608    varies depending on type) of them already on the list.
609    This way, we ensure that an object that gets freed will
610    remain free for the next 1000 (or whatever) times that
611    an object of that type is allocated.  */
612
613 #ifndef MALLOC_OVERHEAD
614 #ifdef GNU_MALLOC
615 #define MALLOC_OVERHEAD 0
616 #elif defined (rcheck)
617 #define MALLOC_OVERHEAD 20
618 #else
619 #define MALLOC_OVERHEAD 8
620 #endif
621 #endif /* MALLOC_OVERHEAD */
622
623 #if !defined(HAVE_MMAP) || defined(DOUG_LEA_MALLOC)
624 /* If we released our reserve (due to running out of memory),
625    and we have a fair amount free once again,
626    try to set aside another reserve in case we run out once more.
627
628    This is called when a relocatable block is freed in ralloc.c.  */
629 void refill_memory_reserve (void);
630 void
631 refill_memory_reserve (void)
632 {
633   if (breathing_space == 0)
634     breathing_space = (char *) malloc (4096 - MALLOC_OVERHEAD);
635 }
636 #endif
637
638 #ifdef ALLOC_NO_POOLS
639 # define TYPE_ALLOC_SIZE(type, structtype) 1
640 #else
641 # define TYPE_ALLOC_SIZE(type, structtype)                      \
642     ((2048 - MALLOC_OVERHEAD - sizeof (struct type##_block *))  \
643      / sizeof (structtype))
644 #endif /* ALLOC_NO_POOLS */
645
646 #define DECLARE_FIXED_TYPE_ALLOC(type, structtype)      \
647                                                         \
648 struct type##_block                                     \
649 {                                                       \
650   struct type##_block *prev;                            \
651   structtype block[TYPE_ALLOC_SIZE (type, structtype)]; \
652 };                                                      \
653                                                         \
654 static struct type##_block *current_##type##_block;     \
655 static int current_##type##_block_index;                \
656                                                         \
657 static Lisp_Free *type##_free_list;                     \
658 static Lisp_Free *type##_free_list_tail;                \
659                                                         \
660 static void                                             \
661 init_##type##_alloc (void)                              \
662 {                                                       \
663   current_##type##_block = 0;                           \
664   current_##type##_block_index =                        \
665     countof (current_##type##_block->block);            \
666   type##_free_list = 0;                                 \
667   type##_free_list_tail = 0;                            \
668 }                                                       \
669                                                         \
670 static int gc_count_num_##type##_in_use;                \
671 static int gc_count_num_##type##_freelist
672
673 #define ALLOCATE_FIXED_TYPE_FROM_BLOCK(type, result) do {               \
674   if (current_##type##_block_index                                      \
675       == countof (current_##type##_block->block))                       \
676     {                                                                   \
677       struct type##_block *AFTFB_new = (struct type##_block *)          \
678         allocate_lisp_storage (sizeof (struct type##_block));           \
679       AFTFB_new->prev = current_##type##_block;                         \
680       current_##type##_block = AFTFB_new;                               \
681       current_##type##_block_index = 0;                                 \
682     }                                                                   \
683   (result) =                                                            \
684     &(current_##type##_block->block[current_##type##_block_index++]);   \
685 } while (0)
686
687 /* Allocate an instance of a type that is stored in blocks.
688    TYPE is the "name" of the type, STRUCTTYPE is the corresponding
689    structure type. */
690
691 #ifdef ERROR_CHECK_GC
692
693 /* Note: if you get crashes in this function, suspect incorrect calls
694    to free_cons() and friends.  This happened once because the cons
695    cell was not GC-protected and was getting collected before
696    free_cons() was called. */
697
698 #define ALLOCATE_FIXED_TYPE_1(type, structtype, result) do {    \
699   if (gc_count_num_##type##_freelist >                          \
700       MINIMUM_ALLOWED_FIXED_TYPE_CELLS_##type)                  \
701     {                                                           \
702       result = (structtype *) type##_free_list;                 \
703       /* Before actually using the chain pointer,               \
704          we complement all its bits; see FREE_FIXED_TYPE(). */  \
705       type##_free_list = (Lisp_Free *)                          \
706         (~ (EMACS_UINT) (type##_free_list->chain));             \
707       gc_count_num_##type##_freelist--;                         \
708     }                                                           \
709   else                                                          \
710     ALLOCATE_FIXED_TYPE_FROM_BLOCK (type, result);              \
711   MARK_LRECORD_AS_NOT_FREE (result);                            \
712 } while (0)
713
714 #else /* !ERROR_CHECK_GC */
715
716 #define ALLOCATE_FIXED_TYPE_1(type, structtype, result) do {    \
717   if (type##_free_list)                                         \
718     {                                                           \
719       result = (structtype *) type##_free_list;                 \
720       type##_free_list = type##_free_list->chain;               \
721     }                                                           \
722   else                                                          \
723     ALLOCATE_FIXED_TYPE_FROM_BLOCK (type, result);              \
724   MARK_LRECORD_AS_NOT_FREE (result);                            \
725 } while (0)
726
727 #endif /* !ERROR_CHECK_GC */
728
729
730 #define ALLOCATE_FIXED_TYPE(type, structtype, result)   \
731 do                                                      \
732 {                                                       \
733   ALLOCATE_FIXED_TYPE_1 (type, structtype, result);     \
734   INCREMENT_CONS_COUNTER (sizeof (structtype), #type);  \
735 } while (0)
736
737 #define NOSEEUM_ALLOCATE_FIXED_TYPE(type, structtype, result)   \
738 do                                                              \
739 {                                                               \
740   ALLOCATE_FIXED_TYPE_1 (type, structtype, result);             \
741   NOSEEUM_INCREMENT_CONS_COUNTER (sizeof (structtype), #type);  \
742 } while (0)
743
744
745 /* Lisp_Free is the type to represent a free list member inside a frob
746    block of any lisp object type.  */
747 typedef struct Lisp_Free
748 {
749   struct lrecord_header lheader;
750   struct Lisp_Free *chain;
751 } Lisp_Free;
752
753 #define LRECORD_FREE_P(ptr) \
754 ((ptr)->lheader.type == lrecord_type_free)
755
756 #define MARK_LRECORD_AS_FREE(ptr) \
757 ((void) ((ptr)->lheader.type = lrecord_type_free))
758
759 #ifdef ERROR_CHECK_GC
760 #define MARK_LRECORD_AS_NOT_FREE(ptr) \
761 ((void) ((ptr)->lheader.type = lrecord_type_undefined))
762 #else
763 #define MARK_LRECORD_AS_NOT_FREE(ptr) DO_NOTHING
764 #endif
765
766 #ifdef ERROR_CHECK_GC
767
768 #define PUT_FIXED_TYPE_ON_FREE_LIST(type, structtype, ptr) do { \
769   if (type##_free_list_tail)                                    \
770     {                                                           \
771       /* When we store the chain pointer, we complement all     \
772          its bits; this should significantly increase its       \
773          bogosity in case someone tries to use the value, and   \
774          should make us crash faster if someone overwrites the  \
775          pointer because when it gets un-complemented in        \
776          ALLOCATED_FIXED_TYPE(), the resulting pointer will be  \
777          extremely bogus. */                                    \
778       type##_free_list_tail->chain =                            \
779         (Lisp_Free *) ~ (EMACS_UINT) (ptr);                     \
780     }                                                           \
781   else                                                          \
782     type##_free_list = (Lisp_Free *) (ptr);                     \
783   type##_free_list_tail = (Lisp_Free *) (ptr);                  \
784 } while (0)
785
786 #else /* !ERROR_CHECK_GC */
787
788 #define PUT_FIXED_TYPE_ON_FREE_LIST(type, structtype, ptr) do { \
789   ((Lisp_Free *) (ptr))->chain = type##_free_list;              \
790   type##_free_list = (Lisp_Free *) (ptr);                       \
791 } while (0)                                                     \
792
793 #endif /* !ERROR_CHECK_GC */
794
795 /* TYPE and STRUCTTYPE are the same as in ALLOCATE_FIXED_TYPE(). */
796
797 #define FREE_FIXED_TYPE(type, structtype, ptr) do {             \
798   structtype *FFT_ptr = (ptr);                                  \
799   ADDITIONAL_FREE_##type (FFT_ptr);                             \
800   deadbeef_memory (FFT_ptr, sizeof (structtype));               \
801   PUT_FIXED_TYPE_ON_FREE_LIST (type, structtype, FFT_ptr);      \
802   MARK_LRECORD_AS_FREE (FFT_ptr);                               \
803 } while (0)
804
805 /* Like FREE_FIXED_TYPE() but used when we are explicitly
806    freeing a structure through free_cons(), free_marker(), etc.
807    rather than through the normal process of sweeping.
808    We attempt to undo the changes made to the allocation counters
809    as a result of this structure being allocated.  This is not
810    completely necessary but helps keep things saner: e.g. this way,
811    repeatedly allocating and freeing a cons will not result in
812    the consing-since-gc counter advancing, which would cause a GC
813    and somewhat defeat the purpose of explicitly freeing. */
814
815 #define FREE_FIXED_TYPE_WHEN_NOT_IN_GC(type, structtype, ptr)   \
816 do { FREE_FIXED_TYPE (type, structtype, ptr);                   \
817      DECREMENT_CONS_COUNTER (sizeof (structtype));              \
818      gc_count_num_##type##_freelist++;                          \
819    } while (0)
820
821
822 \f
823 /************************************************************************/
824 /*                         Cons allocation                              */
825 /************************************************************************/
826
827 DECLARE_FIXED_TYPE_ALLOC (cons, Lisp_Cons);
828 /* conses are used and freed so often that we set this really high */
829 /* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 20000 */
830 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_cons 2000
831
832 static Lisp_Object
833 mark_cons (Lisp_Object obj)
834 {
835   if (NILP (XCDR (obj)))
836     return XCAR (obj);
837
838   mark_object (XCAR (obj));
839   return XCDR (obj);
840 }
841
842 static int
843 cons_equal (Lisp_Object ob1, Lisp_Object ob2, int depth)
844 {
845   depth++;
846   while (internal_equal (XCAR (ob1), XCAR (ob2), depth))
847     {
848       ob1 = XCDR (ob1);
849       ob2 = XCDR (ob2);
850       if (! CONSP (ob1) || ! CONSP (ob2))
851         return internal_equal (ob1, ob2, depth);
852     }
853   return 0;
854 }
855
856 static const struct lrecord_description cons_description[] = {
857   { XD_LISP_OBJECT, offsetof (Lisp_Cons, car) },
858   { XD_LISP_OBJECT, offsetof (Lisp_Cons, cdr) },
859   { XD_END }
860 };
861
862 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("cons", cons,
863                                      mark_cons, print_cons, 0,
864                                      cons_equal,
865                                      /*
866                                       * No `hash' method needed.
867                                       * internal_hash knows how to
868                                       * handle conses.
869                                       */
870                                      0,
871                                      cons_description,
872                                      Lisp_Cons);
873
874 DEFUN ("cons", Fcons, 2, 2, 0, /*
875 Create a new cons, give it CAR and CDR as components, and return it.
876 */
877        (car, cdr))
878 {
879   /* This cannot GC. */
880   Lisp_Object val;
881   Lisp_Cons *c;
882
883   ALLOCATE_FIXED_TYPE (cons, Lisp_Cons, c);
884   set_lheader_implementation (&c->lheader, &lrecord_cons);
885   XSETCONS (val, c);
886   c->car = car;
887   c->cdr = cdr;
888   return val;
889 }
890
891 /* This is identical to Fcons() but it used for conses that we're
892    going to free later, and is useful when trying to track down
893    "real" consing. */
894 Lisp_Object
895 noseeum_cons (Lisp_Object car, Lisp_Object cdr)
896 {
897   Lisp_Object val;
898   Lisp_Cons *c;
899
900   NOSEEUM_ALLOCATE_FIXED_TYPE (cons, Lisp_Cons, c);
901   set_lheader_implementation (&c->lheader, &lrecord_cons);
902   XSETCONS (val, c);
903   XCAR (val) = car;
904   XCDR (val) = cdr;
905   return val;
906 }
907
908 DEFUN ("list", Flist, 0, MANY, 0, /*
909 Return a newly created list with specified arguments as elements.
910 Any number of arguments, even zero arguments, are allowed.
911 */
912        (int nargs, Lisp_Object *args))
913 {
914   Lisp_Object val = Qnil;
915   Lisp_Object *argp = args + nargs;
916
917   while (argp > args)
918     val = Fcons (*--argp, val);
919   return val;
920 }
921
922 Lisp_Object
923 list1 (Lisp_Object obj0)
924 {
925   /* This cannot GC. */
926   return Fcons (obj0, Qnil);
927 }
928
929 Lisp_Object
930 list2 (Lisp_Object obj0, Lisp_Object obj1)
931 {
932   /* This cannot GC. */
933   return Fcons (obj0, Fcons (obj1, Qnil));
934 }
935
936 Lisp_Object
937 list3 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2)
938 {
939   /* This cannot GC. */
940   return Fcons (obj0, Fcons (obj1, Fcons (obj2, Qnil)));
941 }
942
943 Lisp_Object
944 cons3 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2)
945 {
946   /* This cannot GC. */
947   return Fcons (obj0, Fcons (obj1, obj2));
948 }
949
950 Lisp_Object
951 acons (Lisp_Object key, Lisp_Object value, Lisp_Object alist)
952 {
953   return Fcons (Fcons (key, value), alist);
954 }
955
956 Lisp_Object
957 list4 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2, Lisp_Object obj3)
958 {
959   /* This cannot GC. */
960   return Fcons (obj0, Fcons (obj1, Fcons (obj2, Fcons (obj3, Qnil))));
961 }
962
963 Lisp_Object
964 list5 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2, Lisp_Object obj3,
965        Lisp_Object obj4)
966 {
967   /* This cannot GC. */
968   return Fcons (obj0, Fcons (obj1, Fcons (obj2, Fcons (obj3, Fcons (obj4, Qnil)))));
969 }
970
971 Lisp_Object
972 list6 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2, Lisp_Object obj3,
973        Lisp_Object obj4, Lisp_Object obj5)
974 {
975   /* This cannot GC. */
976   return Fcons (obj0, Fcons (obj1, Fcons (obj2, Fcons (obj3, Fcons (obj4, Fcons (obj5, Qnil))))));
977 }
978
979 DEFUN ("make-list", Fmake_list, 2, 2, 0, /*
980 Return a new list of length LENGTH, with each element being OBJECT.
981 */
982        (length, object))
983 {
984   CHECK_NATNUM (length);
985
986   {
987     Lisp_Object val = Qnil;
988     size_t size = XINT (length);
989
990     while (size--)
991       val = Fcons (object, val);
992     return val;
993   }
994 }
995
996 \f
997 /************************************************************************/
998 /*                        Float allocation                              */
999 /************************************************************************/
1000
1001 #ifdef LISP_FLOAT_TYPE
1002
1003 DECLARE_FIXED_TYPE_ALLOC (float, Lisp_Float);
1004 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_float 1000
1005
1006 Lisp_Object
1007 make_float (double float_value)
1008 {
1009   Lisp_Object val;
1010   Lisp_Float *f;
1011
1012   ALLOCATE_FIXED_TYPE (float, Lisp_Float, f);
1013
1014   /* Avoid dump-time `uninitialized memory read' purify warnings. */
1015   if (sizeof (struct lrecord_header) + sizeof (double) != sizeof (*f))
1016     xzero (*f);
1017
1018   set_lheader_implementation (&f->lheader, &lrecord_float);
1019   float_data (f) = float_value;
1020   XSETFLOAT (val, f);
1021   return val;
1022 }
1023
1024 #endif /* LISP_FLOAT_TYPE */
1025
1026 \f
1027 /************************************************************************/
1028 /*                         Vector allocation                            */
1029 /************************************************************************/
1030
1031 static Lisp_Object
1032 mark_vector (Lisp_Object obj)
1033 {
1034   Lisp_Vector *ptr = XVECTOR (obj);
1035   int len = vector_length (ptr);
1036   int i;
1037
1038   for (i = 0; i < len - 1; i++)
1039     mark_object (ptr->contents[i]);
1040   return (len > 0) ? ptr->contents[len - 1] : Qnil;
1041 }
1042
1043 static size_t
1044 size_vector (const void *lheader)
1045 {
1046   return FLEXIBLE_ARRAY_STRUCT_SIZEOF (Lisp_Vector, Lisp_Object, contents,
1047                                        ((Lisp_Vector *) lheader)->size);
1048 }
1049
1050 static int
1051 vector_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
1052 {
1053   int len = XVECTOR_LENGTH (obj1);
1054   if (len != XVECTOR_LENGTH (obj2))
1055     return 0;
1056
1057   {
1058     Lisp_Object *ptr1 = XVECTOR_DATA (obj1);
1059     Lisp_Object *ptr2 = XVECTOR_DATA (obj2);
1060     while (len--)
1061       if (!internal_equal (*ptr1++, *ptr2++, depth + 1))
1062         return 0;
1063   }
1064   return 1;
1065 }
1066
1067 static hashcode_t
1068 vector_hash (Lisp_Object obj, int depth)
1069 {
1070   return HASH2 (XVECTOR_LENGTH (obj),
1071                 internal_array_hash (XVECTOR_DATA (obj),
1072                                      XVECTOR_LENGTH (obj),
1073                                      depth + 1));
1074 }
1075
1076 static const struct lrecord_description vector_description[] = {
1077   { XD_LONG,              offsetof (Lisp_Vector, size) },
1078   { XD_LISP_OBJECT_ARRAY, offsetof (Lisp_Vector, contents), XD_INDIRECT(0, 0) },
1079   { XD_END }
1080 };
1081
1082 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION("vector", vector,
1083                                        mark_vector, print_vector, 0,
1084                                        vector_equal,
1085                                        vector_hash,
1086                                        vector_description,
1087                                        size_vector, Lisp_Vector);
1088
1089 /* #### should allocate `small' vectors from a frob-block */
1090 static Lisp_Vector *
1091 make_vector_internal (size_t sizei)
1092 {
1093   /* no vector_next */
1094   size_t sizem = FLEXIBLE_ARRAY_STRUCT_SIZEOF (Lisp_Vector, Lisp_Object,
1095                                                contents, sizei);
1096   Lisp_Vector *p = (Lisp_Vector *) alloc_lcrecord (sizem, &lrecord_vector);
1097
1098   p->size = sizei;
1099   return p;
1100 }
1101
1102 Lisp_Object
1103 make_vector (size_t length, Lisp_Object object)
1104 {
1105   Lisp_Vector *vecp = make_vector_internal (length);
1106   Lisp_Object *p = vector_data (vecp);
1107
1108   while (length--)
1109     *p++ = object;
1110
1111   {
1112     Lisp_Object vector;
1113     XSETVECTOR (vector, vecp);
1114     return vector;
1115   }
1116 }
1117
1118 DEFUN ("make-vector", Fmake_vector, 2, 2, 0, /*
1119 Return a new vector of length LENGTH, with each element being OBJECT.
1120 See also the function `vector'.
1121 */
1122        (length, object))
1123 {
1124   CONCHECK_NATNUM (length);
1125   return make_vector (XINT (length), object);
1126 }
1127
1128 DEFUN ("vector", Fvector, 0, MANY, 0, /*
1129 Return a newly created vector with specified arguments as elements.
1130 Any number of arguments, even zero arguments, are allowed.
1131 */
1132        (int nargs, Lisp_Object *args))
1133 {
1134   Lisp_Vector *vecp = make_vector_internal (nargs);
1135   Lisp_Object *p = vector_data (vecp);
1136
1137   while (nargs--)
1138     *p++ = *args++;
1139
1140   {
1141     Lisp_Object vector;
1142     XSETVECTOR (vector, vecp);
1143     return vector;
1144   }
1145 }
1146
1147 Lisp_Object
1148 vector1 (Lisp_Object obj0)
1149 {
1150   return Fvector (1, &obj0);
1151 }
1152
1153 Lisp_Object
1154 vector2 (Lisp_Object obj0, Lisp_Object obj1)
1155 {
1156   Lisp_Object args[2];
1157   args[0] = obj0;
1158   args[1] = obj1;
1159   return Fvector (2, args);
1160 }
1161
1162 Lisp_Object
1163 vector3 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2)
1164 {
1165   Lisp_Object args[3];
1166   args[0] = obj0;
1167   args[1] = obj1;
1168   args[2] = obj2;
1169   return Fvector (3, args);
1170 }
1171
1172 #if 0 /* currently unused */
1173
1174 Lisp_Object
1175 vector4 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1176          Lisp_Object obj3)
1177 {
1178   Lisp_Object args[4];
1179   args[0] = obj0;
1180   args[1] = obj1;
1181   args[2] = obj2;
1182   args[3] = obj3;
1183   return Fvector (4, args);
1184 }
1185
1186 Lisp_Object
1187 vector5 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1188          Lisp_Object obj3, Lisp_Object obj4)
1189 {
1190   Lisp_Object args[5];
1191   args[0] = obj0;
1192   args[1] = obj1;
1193   args[2] = obj2;
1194   args[3] = obj3;
1195   args[4] = obj4;
1196   return Fvector (5, args);
1197 }
1198
1199 Lisp_Object
1200 vector6 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1201          Lisp_Object obj3, Lisp_Object obj4, Lisp_Object obj5)
1202 {
1203   Lisp_Object args[6];
1204   args[0] = obj0;
1205   args[1] = obj1;
1206   args[2] = obj2;
1207   args[3] = obj3;
1208   args[4] = obj4;
1209   args[5] = obj5;
1210   return Fvector (6, args);
1211 }
1212
1213 Lisp_Object
1214 vector7 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1215          Lisp_Object obj3, Lisp_Object obj4, Lisp_Object obj5,
1216          Lisp_Object obj6)
1217 {
1218   Lisp_Object args[7];
1219   args[0] = obj0;
1220   args[1] = obj1;
1221   args[2] = obj2;
1222   args[3] = obj3;
1223   args[4] = obj4;
1224   args[5] = obj5;
1225   args[6] = obj6;
1226   return Fvector (7, args);
1227 }
1228
1229 Lisp_Object
1230 vector8 (Lisp_Object obj0, Lisp_Object obj1, Lisp_Object obj2,
1231          Lisp_Object obj3, Lisp_Object obj4, Lisp_Object obj5,
1232          Lisp_Object obj6, Lisp_Object obj7)
1233 {
1234   Lisp_Object args[8];
1235   args[0] = obj0;
1236   args[1] = obj1;
1237   args[2] = obj2;
1238   args[3] = obj3;
1239   args[4] = obj4;
1240   args[5] = obj5;
1241   args[6] = obj6;
1242   args[7] = obj7;
1243   return Fvector (8, args);
1244 }
1245 #endif /* unused */
1246
1247 /************************************************************************/
1248 /*                       Bit Vector allocation                          */
1249 /************************************************************************/
1250
1251 static Lisp_Object all_bit_vectors;
1252
1253 /* #### should allocate `small' bit vectors from a frob-block */
1254 static Lisp_Bit_Vector *
1255 make_bit_vector_internal (size_t sizei)
1256 {
1257   size_t num_longs = BIT_VECTOR_LONG_STORAGE (sizei);
1258   size_t sizem = FLEXIBLE_ARRAY_STRUCT_SIZEOF (Lisp_Bit_Vector, unsigned long,
1259                                                bits, num_longs);
1260   Lisp_Bit_Vector *p = (Lisp_Bit_Vector *) allocate_lisp_storage (sizem);
1261   set_lheader_implementation (&p->lheader, &lrecord_bit_vector);
1262
1263   INCREMENT_CONS_COUNTER (sizem, "bit-vector");
1264
1265   bit_vector_length (p) = sizei;
1266   bit_vector_next   (p) = all_bit_vectors;
1267   /* make sure the extra bits in the last long are 0; the calling
1268      functions might not set them. */
1269   p->bits[num_longs - 1] = 0;
1270   XSETBIT_VECTOR (all_bit_vectors, p);
1271   return p;
1272 }
1273
1274 Lisp_Object
1275 make_bit_vector (size_t length, Lisp_Object bit)
1276 {
1277   Lisp_Bit_Vector *p = make_bit_vector_internal (length);
1278   size_t num_longs = BIT_VECTOR_LONG_STORAGE (length);
1279
1280   CHECK_BIT (bit);
1281
1282   if (ZEROP (bit))
1283     memset (p->bits, 0, num_longs * sizeof (long));
1284   else
1285     {
1286       size_t bits_in_last = length & (LONGBITS_POWER_OF_2 - 1);
1287       memset (p->bits, ~0, num_longs * sizeof (long));
1288       /* But we have to make sure that the unused bits in the
1289          last long are 0, so that equal/hash is easy. */
1290       if (bits_in_last)
1291         p->bits[num_longs - 1] &= (1 << bits_in_last) - 1;
1292     }
1293
1294   {
1295     Lisp_Object bit_vector;
1296     XSETBIT_VECTOR (bit_vector, p);
1297     return bit_vector;
1298   }
1299 }
1300
1301 Lisp_Object
1302 make_bit_vector_from_byte_vector (unsigned char *bytevec, size_t length)
1303 {
1304   int i;
1305   Lisp_Bit_Vector *p = make_bit_vector_internal (length);
1306
1307   for (i = 0; i < length; i++)
1308     set_bit_vector_bit (p, i, bytevec[i]);
1309
1310   {
1311     Lisp_Object bit_vector;
1312     XSETBIT_VECTOR (bit_vector, p);
1313     return bit_vector;
1314   }
1315 }
1316
1317 DEFUN ("make-bit-vector", Fmake_bit_vector, 2, 2, 0, /*
1318 Return a new bit vector of length LENGTH. with each bit set to BIT.
1319 BIT must be one of the integers 0 or 1.  See also the function `bit-vector'.
1320 */
1321        (length, bit))
1322 {
1323   CONCHECK_NATNUM (length);
1324
1325   return make_bit_vector (XINT (length), bit);
1326 }
1327
1328 DEFUN ("bit-vector", Fbit_vector, 0, MANY, 0, /*
1329 Return a newly created bit vector with specified arguments as elements.
1330 Any number of arguments, even zero arguments, are allowed.
1331 Each argument must be one of the integers 0 or 1.
1332 */
1333        (int nargs, Lisp_Object *args))
1334 {
1335   int i;
1336   Lisp_Bit_Vector *p = make_bit_vector_internal (nargs);
1337
1338   for (i = 0; i < nargs; i++)
1339     {
1340       CHECK_BIT (args[i]);
1341       set_bit_vector_bit (p, i, !ZEROP (args[i]));
1342     }
1343
1344   {
1345     Lisp_Object bit_vector;
1346     XSETBIT_VECTOR (bit_vector, p);
1347     return bit_vector;
1348   }
1349 }
1350
1351 \f
1352 /************************************************************************/
1353 /*                   Compiled-function allocation                       */
1354 /************************************************************************/
1355
1356 DECLARE_FIXED_TYPE_ALLOC (compiled_function, Lisp_Compiled_Function);
1357 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_compiled_function 1000
1358
1359 static Lisp_Object
1360 make_compiled_function (void)
1361 {
1362   Lisp_Compiled_Function *f;
1363   Lisp_Object fun;
1364
1365   ALLOCATE_FIXED_TYPE (compiled_function, Lisp_Compiled_Function, f);
1366   set_lheader_implementation (&f->lheader, &lrecord_compiled_function);
1367
1368   f->stack_depth = 0;
1369   f->specpdl_depth = 0;
1370   f->flags.documentationp = 0;
1371   f->flags.interactivep = 0;
1372   f->flags.domainp = 0; /* I18N3 */
1373   f->instructions = Qzero;
1374   f->constants = Qzero;
1375   f->arglist = Qnil;
1376   f->doc_and_interactive = Qnil;
1377 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
1378   f->annotated = Qnil;
1379 #endif
1380   XSETCOMPILED_FUNCTION (fun, f);
1381   return fun;
1382 }
1383
1384 DEFUN ("make-byte-code", Fmake_byte_code, 4, MANY, 0, /*
1385 Return a new compiled-function object.
1386 Usage: (arglist instructions constants stack-depth
1387         &optional doc-string interactive)
1388 Note that, unlike all other emacs-lisp functions, calling this with five
1389 arguments is NOT the same as calling it with six arguments, the last of
1390 which is nil.  If the INTERACTIVE arg is specified as nil, then that means
1391 that this function was defined with `(interactive)'.  If the arg is not
1392 specified, then that means the function is not interactive.
1393 This is terrible behavior which is retained for compatibility with old
1394 `.elc' files which expect these semantics.
1395 */
1396        (int nargs, Lisp_Object *args))
1397 {
1398 /* In a non-insane world this function would have this arglist...
1399    (arglist instructions constants stack_depth &optional doc_string interactive)
1400  */
1401   Lisp_Object fun = make_compiled_function ();
1402   Lisp_Compiled_Function *f = XCOMPILED_FUNCTION (fun);
1403
1404   Lisp_Object arglist      = args[0];
1405   Lisp_Object instructions = args[1];
1406   Lisp_Object constants    = args[2];
1407   Lisp_Object stack_depth  = args[3];
1408   Lisp_Object doc_string   = (nargs > 4) ? args[4] : Qnil;
1409   Lisp_Object interactive  = (nargs > 5) ? args[5] : Qunbound;
1410
1411   if (nargs < 4 || nargs > 6)
1412     return Fsignal (Qwrong_number_of_arguments,
1413                     list2 (intern ("make-byte-code"), make_int (nargs)));
1414
1415   /* Check for valid formal parameter list now, to allow us to use
1416      SPECBIND_FAST_UNSAFE() later in funcall_compiled_function(). */
1417   {
1418     EXTERNAL_LIST_LOOP_3 (symbol, arglist, tail)
1419       {
1420         CHECK_SYMBOL (symbol);
1421         if (EQ (symbol, Qt)   ||
1422             EQ (symbol, Qnil) ||
1423             SYMBOL_IS_KEYWORD (symbol))
1424           signal_simple_error_2
1425             ("Invalid constant symbol in formal parameter list",
1426              symbol, arglist);
1427       }
1428   }
1429   f->arglist = arglist;
1430
1431   /* `instructions' is a string or a cons (string . int) for a
1432      lazy-loaded function. */
1433   if (CONSP (instructions))
1434     {
1435       CHECK_STRING (XCAR (instructions));
1436       CHECK_INT (XCDR (instructions));
1437     }
1438   else
1439     {
1440       CHECK_STRING (instructions);
1441     }
1442   f->instructions = instructions;
1443
1444   if (!NILP (constants))
1445     CHECK_VECTOR (constants);
1446   f->constants = constants;
1447
1448   CHECK_NATNUM (stack_depth);
1449   f->stack_depth = (unsigned short) XINT (stack_depth);
1450
1451 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
1452   if (!NILP (Vcurrent_compiled_function_annotation))
1453     f->annotated = Fcopy (Vcurrent_compiled_function_annotation);
1454   else if (!NILP (Vload_file_name_internal_the_purecopy))
1455     f->annotated = Vload_file_name_internal_the_purecopy;
1456   else if (!NILP (Vload_file_name_internal))
1457     {
1458       struct gcpro gcpro1;
1459       GCPRO1 (fun);             /* don't let fun get reaped */
1460       Vload_file_name_internal_the_purecopy =
1461         Ffile_name_nondirectory (Vload_file_name_internal);
1462       f->annotated = Vload_file_name_internal_the_purecopy;
1463       UNGCPRO;
1464     }
1465 #endif /* COMPILED_FUNCTION_ANNOTATION_HACK */
1466
1467   /* doc_string may be nil, string, int, or a cons (string . int).
1468      interactive may be list or string (or unbound). */
1469   f->doc_and_interactive = Qunbound;
1470 #ifdef I18N3
1471   if ((f->flags.domainp = !NILP (Vfile_domain)) != 0)
1472     f->doc_and_interactive = Vfile_domain;
1473 #endif
1474   if ((f->flags.interactivep = !UNBOUNDP (interactive)) != 0)
1475     {
1476       f->doc_and_interactive
1477         = (UNBOUNDP (f->doc_and_interactive) ? interactive :
1478            Fcons (interactive, f->doc_and_interactive));
1479     }
1480   if ((f->flags.documentationp = !NILP (doc_string)) != 0)
1481     {
1482       f->doc_and_interactive
1483         = (UNBOUNDP (f->doc_and_interactive) ? doc_string :
1484            Fcons (doc_string, f->doc_and_interactive));
1485     }
1486   if (UNBOUNDP (f->doc_and_interactive))
1487     f->doc_and_interactive = Qnil;
1488
1489   return fun;
1490 }
1491
1492 \f
1493 /************************************************************************/
1494 /*                          Symbol allocation                           */
1495 /************************************************************************/
1496
1497 DECLARE_FIXED_TYPE_ALLOC (symbol, Lisp_Symbol);
1498 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_symbol 1000
1499
1500 DEFUN ("make-symbol", Fmake_symbol, 1, 1, 0, /*
1501 Return a newly allocated uninterned symbol whose name is NAME.
1502 Its value and function definition are void, and its property list is nil.
1503 */
1504        (name))
1505 {
1506   Lisp_Object val;
1507   Lisp_Symbol *p;
1508
1509   CHECK_STRING (name);
1510
1511   ALLOCATE_FIXED_TYPE (symbol, Lisp_Symbol, p);
1512   set_lheader_implementation (&p->lheader, &lrecord_symbol);
1513   p->name     = XSTRING (name);
1514   p->plist    = Qnil;
1515   p->value    = Qunbound;
1516   p->function = Qunbound;
1517   symbol_next (p) = 0;
1518   XSETSYMBOL (val, p);
1519   return val;
1520 }
1521
1522 \f
1523 /************************************************************************/
1524 /*                         Extent allocation                            */
1525 /************************************************************************/
1526
1527 DECLARE_FIXED_TYPE_ALLOC (extent, struct extent);
1528 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_extent 1000
1529
1530 struct extent *
1531 allocate_extent (void)
1532 {
1533   struct extent *e;
1534
1535   ALLOCATE_FIXED_TYPE (extent, struct extent, e);
1536   set_lheader_implementation (&e->lheader, &lrecord_extent);
1537   extent_object (e) = Qnil;
1538   set_extent_start (e, -1);
1539   set_extent_end (e, -1);
1540   e->plist = Qnil;
1541
1542   xzero (e->flags);
1543
1544   extent_face (e) = Qnil;
1545   e->flags.end_open = 1;  /* default is for endpoints to behave like markers */
1546   e->flags.detachable = 1;
1547
1548   return e;
1549 }
1550
1551 \f
1552 /************************************************************************/
1553 /*                         Event allocation                             */
1554 /************************************************************************/
1555
1556 DECLARE_FIXED_TYPE_ALLOC (event, Lisp_Event);
1557 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_event 1000
1558
1559 Lisp_Object
1560 allocate_event (void)
1561 {
1562   Lisp_Object val;
1563   Lisp_Event *e;
1564
1565   ALLOCATE_FIXED_TYPE (event, Lisp_Event, e);
1566   set_lheader_implementation (&e->lheader, &lrecord_event);
1567
1568   XSETEVENT (val, e);
1569   return val;
1570 }
1571
1572 \f
1573 /************************************************************************/
1574 /*                       Marker allocation                              */
1575 /************************************************************************/
1576
1577 DECLARE_FIXED_TYPE_ALLOC (marker, Lisp_Marker);
1578 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_marker 1000
1579
1580 DEFUN ("make-marker", Fmake_marker, 0, 0, 0, /*
1581 Return a new marker which does not point at any place.
1582 */
1583        ())
1584 {
1585   Lisp_Object val;
1586   Lisp_Marker *p;
1587
1588   ALLOCATE_FIXED_TYPE (marker, Lisp_Marker, p);
1589   set_lheader_implementation (&p->lheader, &lrecord_marker);
1590   p->buffer = 0;
1591   p->memind = 0;
1592   marker_next (p) = 0;
1593   marker_prev (p) = 0;
1594   p->insertion_type = 0;
1595   XSETMARKER (val, p);
1596   return val;
1597 }
1598
1599 Lisp_Object
1600 noseeum_make_marker (void)
1601 {
1602   Lisp_Object val;
1603   Lisp_Marker *p;
1604
1605   NOSEEUM_ALLOCATE_FIXED_TYPE (marker, Lisp_Marker, p);
1606   set_lheader_implementation (&p->lheader, &lrecord_marker);
1607   p->buffer = 0;
1608   p->memind = 0;
1609   marker_next (p) = 0;
1610   marker_prev (p) = 0;
1611   p->insertion_type = 0;
1612   XSETMARKER (val, p);
1613   return val;
1614 }
1615
1616 \f
1617 /************************************************************************/
1618 /*                        String allocation                             */
1619 /************************************************************************/
1620
1621 /* The data for "short" strings generally resides inside of structs of type
1622    string_chars_block. The Lisp_String structure is allocated just like any
1623    other Lisp object (except for vectors), and these are freelisted when
1624    they get garbage collected. The data for short strings get compacted,
1625    but the data for large strings do not.
1626
1627    Previously Lisp_String structures were relocated, but this caused a lot
1628    of bus-errors because the C code didn't include enough GCPRO's for
1629    strings (since EVERY REFERENCE to a short string needed to be GCPRO'd so
1630    that the reference would get relocated).
1631
1632    This new method makes things somewhat bigger, but it is MUCH safer.  */
1633
1634 DECLARE_FIXED_TYPE_ALLOC (string, Lisp_String);
1635 /* strings are used and freed quite often */
1636 /* #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 10000 */
1637 #define MINIMUM_ALLOWED_FIXED_TYPE_CELLS_string 1000
1638
1639 static Lisp_Object
1640 mark_string (Lisp_Object obj)
1641 {
1642   Lisp_String *ptr = XSTRING (obj);
1643
1644   if (CONSP (ptr->plist) && EXTENT_INFOP (XCAR (ptr->plist)))
1645     flush_cached_extent_info (XCAR (ptr->plist));
1646   return ptr->plist;
1647 }
1648
1649 static int
1650 string_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
1651 {
1652   Bytecount len;
1653   return (((len = XSTRING_LENGTH (obj1)) == XSTRING_LENGTH (obj2)) &&
1654           !memcmp (XSTRING_DATA (obj1), XSTRING_DATA (obj2), len));
1655 }
1656
1657 static const struct lrecord_description string_description[] = {
1658   { XD_BYTECOUNT,       offsetof (Lisp_String, size) },
1659   { XD_OPAQUE_DATA_PTR, offsetof (Lisp_String, data), XD_INDIRECT(0, 1) },
1660   { XD_LISP_OBJECT,     offsetof (Lisp_String, plist) },
1661   { XD_END }
1662 };
1663
1664 /* We store the string's extent info as the first element of the string's
1665    property list; and the string's MODIFF as the first or second element
1666    of the string's property list (depending on whether the extent info
1667    is present), but only if the string has been modified.  This is ugly
1668    but it reduces the memory allocated for the string in the vast
1669    majority of cases, where the string is never modified and has no
1670    extent info.
1671
1672    #### This means you can't use an int as a key in a string's plist. */
1673
1674 static Lisp_Object *
1675 string_plist_ptr (Lisp_Object string)
1676 {
1677   Lisp_Object *ptr = &XSTRING (string)->plist;
1678
1679   if (CONSP (*ptr) && EXTENT_INFOP (XCAR (*ptr)))
1680     ptr = &XCDR (*ptr);
1681   if (CONSP (*ptr) && INTP (XCAR (*ptr)))
1682     ptr = &XCDR (*ptr);
1683   return ptr;
1684 }
1685
1686 static Lisp_Object
1687 string_getprop (Lisp_Object string, Lisp_Object property)
1688 {
1689   return external_plist_get (string_plist_ptr (string), property, 0, ERROR_ME);
1690 }
1691
1692 static int
1693 string_putprop (Lisp_Object string, Lisp_Object property, Lisp_Object value)
1694 {
1695   external_plist_put (string_plist_ptr (string), property, value, 0, ERROR_ME);
1696   return 1;
1697 }
1698
1699 static int
1700 string_remprop (Lisp_Object string, Lisp_Object property)
1701 {
1702   return external_remprop (string_plist_ptr (string), property, 0, ERROR_ME);
1703 }
1704
1705 static Lisp_Object
1706 string_plist (Lisp_Object string)
1707 {
1708   return *string_plist_ptr (string);
1709 }
1710
1711 /* No `finalize', or `hash' methods.
1712    internal_hash() already knows how to hash strings and finalization
1713    is done with the ADDITIONAL_FREE_string macro, which is the
1714    standard way to do finalization when using
1715    SWEEP_FIXED_TYPE_BLOCK(). */
1716 DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS ("string", string,
1717                                                 mark_string, print_string,
1718                                                 0, string_equal, 0,
1719                                                 string_description,
1720                                                 string_getprop,
1721                                                 string_putprop,
1722                                                 string_remprop,
1723                                                 string_plist,
1724                                                 Lisp_String);
1725
1726 /* String blocks contain this many useful bytes. */
1727 #define STRING_CHARS_BLOCK_SIZE                                 \
1728 ((Bytecount) (8192 - MALLOC_OVERHEAD -                          \
1729               ((2 * sizeof (struct string_chars_block *))       \
1730                + sizeof (EMACS_INT))))
1731 /* Block header for small strings. */
1732 struct string_chars_block
1733 {
1734   EMACS_INT pos;
1735   struct string_chars_block *next;
1736   struct string_chars_block *prev;
1737   /* Contents of string_chars_block->string_chars are interleaved
1738      string_chars structures (see below) and the actual string data */
1739   unsigned char string_chars[STRING_CHARS_BLOCK_SIZE];
1740 };
1741
1742 static struct string_chars_block *first_string_chars_block;
1743 static struct string_chars_block *current_string_chars_block;
1744
1745 /* If SIZE is the length of a string, this returns how many bytes
1746  *  the string occupies in string_chars_block->string_chars
1747  *  (including alignment padding).
1748  */
1749 #define STRING_FULLSIZE(size) \
1750    ALIGN_SIZE (((size) + 1 + sizeof (Lisp_String *)),\
1751                ALIGNOF (Lisp_String *))
1752
1753 #define BIG_STRING_FULLSIZE_P(fullsize) ((fullsize) >= STRING_CHARS_BLOCK_SIZE)
1754 #define BIG_STRING_SIZE_P(size) (BIG_STRING_FULLSIZE_P (STRING_FULLSIZE(size)))
1755
1756 #define STRING_CHARS_FREE_P(ptr) ((ptr)->string == NULL)
1757 #define MARK_STRING_CHARS_AS_FREE(ptr) ((void) ((ptr)->string = NULL))
1758
1759 struct string_chars
1760 {
1761   Lisp_String *string;
1762   unsigned char chars[1];
1763 };
1764
1765 struct unused_string_chars
1766 {
1767   Lisp_String *string;
1768   EMACS_INT fullsize;
1769 };
1770
1771 static void
1772 init_string_chars_alloc (void)
1773 {
1774   first_string_chars_block = xnew (struct string_chars_block);
1775   first_string_chars_block->prev = 0;
1776   first_string_chars_block->next = 0;
1777   first_string_chars_block->pos = 0;
1778   current_string_chars_block = first_string_chars_block;
1779 }
1780
1781 static struct string_chars *
1782 allocate_string_chars_struct (Lisp_String *string_it_goes_with,
1783                               EMACS_INT fullsize)
1784 {
1785   struct string_chars *s_chars;
1786
1787   if (fullsize <=
1788       (countof (current_string_chars_block->string_chars)
1789        - current_string_chars_block->pos))
1790     {
1791       /* This string can fit in the current string chars block */
1792       s_chars = (struct string_chars *)
1793         (current_string_chars_block->string_chars
1794          + current_string_chars_block->pos);
1795       current_string_chars_block->pos += fullsize;
1796     }
1797   else
1798     {
1799       /* Make a new current string chars block */
1800       struct string_chars_block *new_scb = xnew (struct string_chars_block);
1801
1802       current_string_chars_block->next = new_scb;
1803       new_scb->prev = current_string_chars_block;
1804       new_scb->next = 0;
1805       current_string_chars_block = new_scb;
1806       new_scb->pos = fullsize;
1807       s_chars = (struct string_chars *)
1808         current_string_chars_block->string_chars;
1809     }
1810
1811   s_chars->string = string_it_goes_with;
1812
1813   INCREMENT_CONS_COUNTER (fullsize, "string chars");
1814
1815   return s_chars;
1816 }
1817
1818 Lisp_Object
1819 make_uninit_string (Bytecount length)
1820 {
1821   Lisp_String *s;
1822   EMACS_INT fullsize = STRING_FULLSIZE (length);
1823   Lisp_Object val;
1824
1825   assert (length >= 0 && fullsize > 0);
1826
1827   /* Allocate the string header */
1828   ALLOCATE_FIXED_TYPE (string, Lisp_String, s);
1829   set_lheader_implementation (&s->lheader, &lrecord_string);
1830
1831   set_string_data (s, BIG_STRING_FULLSIZE_P (fullsize)
1832                    ? xnew_array (Bufbyte, length + 1)
1833                    : allocate_string_chars_struct (s, fullsize)->chars);
1834
1835   set_string_length (s, length);
1836   s->plist = Qnil;
1837
1838   set_string_byte (s, length, 0);
1839
1840   XSETSTRING (val, s);
1841   return val;
1842 }
1843
1844 #ifdef VERIFY_STRING_CHARS_INTEGRITY
1845 static void verify_string_chars_integrity (void);
1846 #endif
1847
1848 /* Resize the string S so that DELTA bytes can be inserted starting
1849    at POS.  If DELTA < 0, it means deletion starting at POS.  If
1850    POS < 0, resize the string but don't copy any characters.  Use
1851    this if you're planning on completely overwriting the string.
1852 */
1853
1854 void
1855 resize_string (Lisp_String *s, Bytecount pos, Bytecount delta)
1856 {
1857   Bytecount oldfullsize, newfullsize;
1858 #ifdef VERIFY_STRING_CHARS_INTEGRITY
1859   verify_string_chars_integrity ();
1860 #endif
1861
1862 #ifdef ERROR_CHECK_BUFPOS
1863   if (pos >= 0)
1864     {
1865       assert (pos <= string_length (s));
1866       if (delta < 0)
1867         assert (pos + (-delta) <= string_length (s));
1868     }
1869   else
1870     {
1871       if (delta < 0)
1872         assert ((-delta) <= string_length (s));
1873     }
1874 #endif /* ERROR_CHECK_BUFPOS */
1875
1876   if (delta == 0)
1877     /* simplest case: no size change. */
1878     return;
1879
1880   if (pos >= 0 && delta < 0)
1881     /* If DELTA < 0, the functions below will delete the characters
1882        before POS.  We want to delete characters *after* POS, however,
1883        so convert this to the appropriate form. */
1884     pos += -delta;
1885
1886   oldfullsize = STRING_FULLSIZE (string_length (s));
1887   newfullsize = STRING_FULLSIZE (string_length (s) + delta);
1888
1889   if (BIG_STRING_FULLSIZE_P (oldfullsize))
1890     {
1891       if (BIG_STRING_FULLSIZE_P (newfullsize))
1892         {
1893           /* Both strings are big.  We can just realloc().
1894              But careful!  If the string is shrinking, we have to
1895              memmove() _before_ realloc(), and if growing, we have to
1896              memmove() _after_ realloc() - otherwise the access is
1897              illegal, and we might crash. */
1898           Bytecount len = string_length (s) + 1 - pos;
1899
1900           if (delta < 0 && pos >= 0)
1901             memmove (string_data (s) + pos + delta, string_data (s) + pos, len);
1902           set_string_data (s, (Bufbyte *) xrealloc (string_data (s),
1903                                                     string_length (s) + delta + 1));
1904           if (delta > 0 && pos >= 0)
1905             memmove (string_data (s) + pos + delta, string_data (s) + pos, len);
1906         }
1907       else /* String has been demoted from BIG_STRING. */
1908         {
1909           Bufbyte *new_data =
1910             allocate_string_chars_struct (s, newfullsize)->chars;
1911           Bufbyte *old_data = string_data (s);
1912
1913           if (pos >= 0)
1914             {
1915               memcpy (new_data, old_data, pos);
1916               memcpy (new_data + pos + delta, old_data + pos,
1917                       string_length (s) + 1 - pos);
1918             }
1919           set_string_data (s, new_data);
1920           xfree (old_data);
1921         }
1922     }
1923   else /* old string is small */
1924     {
1925       if (oldfullsize == newfullsize)
1926         {
1927           /* special case; size change but the necessary
1928              allocation size won't change (up or down; code
1929              somewhere depends on there not being any unused
1930              allocation space, modulo any alignment
1931              constraints). */
1932           if (pos >= 0)
1933             {
1934               Bufbyte *addroff = pos + string_data (s);
1935
1936               memmove (addroff + delta, addroff,
1937                        /* +1 due to zero-termination. */
1938                        string_length (s) + 1 - pos);
1939             }
1940         }
1941       else
1942         {
1943           Bufbyte *old_data = string_data (s);
1944           Bufbyte *new_data =
1945             BIG_STRING_FULLSIZE_P (newfullsize)
1946             ? xnew_array (Bufbyte, string_length (s) + delta + 1)
1947             : allocate_string_chars_struct (s, newfullsize)->chars;
1948
1949           if (pos >= 0)
1950             {
1951               memcpy (new_data, old_data, pos);
1952               memcpy (new_data + pos + delta, old_data + pos,
1953                       string_length (s) + 1 - pos);
1954             }
1955           set_string_data (s, new_data);
1956
1957           {
1958             /* We need to mark this chunk of the string_chars_block
1959                as unused so that compact_string_chars() doesn't
1960                freak. */
1961             struct string_chars *old_s_chars = (struct string_chars *)
1962               ((char *) old_data - offsetof (struct string_chars, chars));
1963             /* Sanity check to make sure we aren't hosed by strange
1964                alignment/padding. */
1965             assert (old_s_chars->string == s);
1966             MARK_STRING_CHARS_AS_FREE (old_s_chars);
1967             ((struct unused_string_chars *) old_s_chars)->fullsize =
1968               oldfullsize;
1969           }
1970         }
1971     }
1972
1973   set_string_length (s, string_length (s) + delta);
1974   /* If pos < 0, the string won't be zero-terminated.
1975      Terminate now just to make sure. */
1976   string_data (s)[string_length (s)] = '\0';
1977
1978   if (pos >= 0)
1979     {
1980       Lisp_Object string;
1981
1982       XSETSTRING (string, s);
1983       /* We also have to adjust all of the extent indices after the
1984          place we did the change.  We say "pos - 1" because
1985          adjust_extents() is exclusive of the starting position
1986          passed to it. */
1987       adjust_extents (string, pos - 1, string_length (s),
1988                       delta);
1989     }
1990
1991 #ifdef VERIFY_STRING_CHARS_INTEGRITY
1992   verify_string_chars_integrity ();
1993 #endif
1994 }
1995
1996 #ifdef MULE
1997
1998 void
1999 set_string_char (Lisp_String *s, Charcount i, Emchar c)
2000 {
2001   Bufbyte newstr[MAX_EMCHAR_LEN];
2002   Bytecount bytoff = charcount_to_bytecount (string_data (s), i);
2003   Bytecount oldlen = charcount_to_bytecount (string_data (s) + bytoff, 1);
2004   Bytecount newlen = set_charptr_emchar (newstr, c);
2005
2006   if (oldlen != newlen)
2007     resize_string (s, bytoff, newlen - oldlen);
2008   /* Remember, string_data (s) might have changed so we can't cache it. */
2009   memcpy (string_data (s) + bytoff, newstr, newlen);
2010 }
2011
2012 #endif /* MULE */
2013
2014 DEFUN ("make-string", Fmake_string, 2, 2, 0, /*
2015 Return a new string consisting of LENGTH copies of CHARACTER.
2016 LENGTH must be a non-negative integer.
2017 */
2018        (length, character))
2019 {
2020   CHECK_NATNUM (length);
2021   CHECK_CHAR_COERCE_INT (character);
2022   {
2023     Bufbyte init_str[MAX_EMCHAR_LEN];
2024     int len = set_charptr_emchar (init_str, XCHAR (character));
2025     Lisp_Object val = make_uninit_string (len * XINT (length));
2026
2027     if (len == 1)
2028       /* Optimize the single-byte case */
2029       memset (XSTRING_DATA (val), XCHAR (character), XSTRING_LENGTH (val));
2030     else
2031       {
2032         size_t i;
2033         Bufbyte *ptr = XSTRING_DATA (val);
2034
2035         for (i = XINT (length); i; i--)
2036           {
2037             Bufbyte *init_ptr = init_str;
2038             switch (len)
2039               {
2040               case 4: *ptr++ = *init_ptr++;
2041               case 3: *ptr++ = *init_ptr++;
2042               case 2: *ptr++ = *init_ptr++;
2043               case 1: *ptr++ = *init_ptr++;
2044               }
2045           }
2046       }
2047     return val;
2048   }
2049 }
2050
2051 DEFUN ("string", Fstring, 0, MANY, 0, /*
2052 Concatenate all the argument characters and make the result a string.
2053 */
2054        (int nargs, Lisp_Object *args))
2055 {
2056   Bufbyte *storage = alloca_array (Bufbyte, nargs * MAX_EMCHAR_LEN);
2057   Bufbyte *p = storage;
2058
2059   for (; nargs; nargs--, args++)
2060     {
2061       Lisp_Object lisp_char = *args;
2062       CHECK_CHAR_COERCE_INT (lisp_char);
2063       p += set_charptr_emchar (p, XCHAR (lisp_char));
2064     }
2065   return make_string (storage, p - storage);
2066 }
2067
2068
2069 /* Take some raw memory, which MUST already be in internal format,
2070    and package it up into a Lisp string. */
2071 Lisp_Object
2072 make_string (const Bufbyte *contents, Bytecount length)
2073 {
2074   Lisp_Object val;
2075
2076   /* Make sure we find out about bad make_string's when they happen */
2077 #if defined (ERROR_CHECK_BUFPOS) && defined (MULE)
2078   bytecount_to_charcount (contents, length); /* Just for the assertions */
2079 #endif
2080
2081   val = make_uninit_string (length);
2082   memcpy (XSTRING_DATA (val), contents, length);
2083   return val;
2084 }
2085
2086 /* Take some raw memory, encoded in some external data format,
2087    and convert it into a Lisp string. */
2088 Lisp_Object
2089 make_ext_string (const Extbyte *contents, EMACS_INT length,
2090                  Lisp_Object coding_system)
2091 {
2092   Lisp_Object string;
2093   TO_INTERNAL_FORMAT (DATA, (contents, length),
2094                       LISP_STRING, string,
2095                       coding_system);
2096   return string;
2097 }
2098
2099 Lisp_Object
2100 build_string (const char *str)
2101 {
2102   /* Some strlen's crash and burn if passed null. */
2103   return make_string ((const Bufbyte *) str, (str ? strlen(str) : 0));
2104 }
2105
2106 Lisp_Object
2107 build_ext_string (const char *str, Lisp_Object coding_system)
2108 {
2109   /* Some strlen's crash and burn if passed null. */
2110   return make_ext_string ((const Extbyte *) str, (str ? strlen(str) : 0),
2111                           coding_system);
2112 }
2113
2114 Lisp_Object
2115 build_translated_string (const char *str)
2116 {
2117   return build_string (GETTEXT (str));
2118 }
2119
2120 Lisp_Object
2121 make_string_nocopy (const Bufbyte *contents, Bytecount length)
2122 {
2123   Lisp_String *s;
2124   Lisp_Object val;
2125
2126   /* Make sure we find out about bad make_string_nocopy's when they happen */
2127 #if defined (ERROR_CHECK_BUFPOS) && defined (MULE)
2128   bytecount_to_charcount (contents, length); /* Just for the assertions */
2129 #endif
2130
2131   /* Allocate the string header */
2132   ALLOCATE_FIXED_TYPE (string, Lisp_String, s);
2133   set_lheader_implementation (&s->lheader, &lrecord_string);
2134   SET_C_READONLY_RECORD_HEADER (&s->lheader);
2135   s->plist = Qnil;
2136   set_string_data (s, (Bufbyte *)contents);
2137   set_string_length (s, length);
2138
2139   XSETSTRING (val, s);
2140   return val;
2141 }
2142
2143 \f
2144 /************************************************************************/
2145 /*                           lcrecord lists                             */
2146 /************************************************************************/
2147
2148 /* Lcrecord lists are used to manage the allocation of particular
2149    sorts of lcrecords, to avoid calling alloc_lcrecord() (and thus
2150    malloc() and garbage-collection junk) as much as possible.
2151    It is similar to the Blocktype class.
2152
2153    It works like this:
2154
2155    1) Create an lcrecord-list object using make_lcrecord_list().
2156       This is often done at initialization.  Remember to staticpro_nodump
2157       this object!  The arguments to make_lcrecord_list() are the
2158       same as would be passed to alloc_lcrecord().
2159    2) Instead of calling alloc_lcrecord(), call allocate_managed_lcrecord()
2160       and pass the lcrecord-list earlier created.
2161    3) When done with the lcrecord, call free_managed_lcrecord().
2162       The standard freeing caveats apply: ** make sure there are no
2163       pointers to the object anywhere! **
2164    4) Calling free_managed_lcrecord() is just like kissing the
2165       lcrecord goodbye as if it were garbage-collected.  This means:
2166       -- the contents of the freed lcrecord are undefined, and the
2167          contents of something produced by allocate_managed_lcrecord()
2168          are undefined, just like for alloc_lcrecord().
2169       -- the mark method for the lcrecord's type will *NEVER* be called
2170          on freed lcrecords.
2171       -- the finalize method for the lcrecord's type will be called
2172          at the time that free_managed_lcrecord() is called.
2173
2174    */
2175
2176 static Lisp_Object
2177 mark_lcrecord_list (Lisp_Object obj)
2178 {
2179   struct lcrecord_list *list = XLCRECORD_LIST (obj);
2180   Lisp_Object chain = list->free;
2181
2182   while (!NILP (chain))
2183     {
2184       struct lrecord_header *lheader = XRECORD_LHEADER (chain);
2185       struct free_lcrecord_header *free_header =
2186         (struct free_lcrecord_header *) lheader;
2187
2188       gc_checking_assert
2189         (/* There should be no other pointers to the free list. */
2190          ! MARKED_RECORD_HEADER_P (lheader)
2191          &&
2192          /* Only lcrecords should be here. */
2193          ! LHEADER_IMPLEMENTATION (lheader)->basic_p
2194          &&
2195          /* Only free lcrecords should be here. */
2196          free_header->lcheader.free
2197          &&
2198          /* The type of the lcrecord must be right. */
2199          LHEADER_IMPLEMENTATION (lheader) == list->implementation
2200          &&
2201          /* So must the size. */
2202          (LHEADER_IMPLEMENTATION (lheader)->static_size == 0 ||
2203           LHEADER_IMPLEMENTATION (lheader)->static_size == list->size)
2204          );
2205
2206       MARK_RECORD_HEADER (lheader);
2207       chain = free_header->chain;
2208     }
2209
2210   return Qnil;
2211 }
2212
2213 DEFINE_LRECORD_IMPLEMENTATION ("lcrecord-list", lcrecord_list,
2214                                mark_lcrecord_list, internal_object_printer,
2215                                0, 0, 0, 0, struct lcrecord_list);
2216 Lisp_Object
2217 make_lcrecord_list (size_t size,
2218                     const struct lrecord_implementation *implementation)
2219 {
2220   struct lcrecord_list *p = alloc_lcrecord_type (struct lcrecord_list,
2221                                                  &lrecord_lcrecord_list);
2222   Lisp_Object val;
2223
2224   p->implementation = implementation;
2225   p->size = size;
2226   p->free = Qnil;
2227   XSETLCRECORD_LIST (val, p);
2228   return val;
2229 }
2230
2231 Lisp_Object
2232 allocate_managed_lcrecord (Lisp_Object lcrecord_list)
2233 {
2234   struct lcrecord_list *list = XLCRECORD_LIST (lcrecord_list);
2235   if (!NILP (list->free))
2236     {
2237       Lisp_Object val = list->free;
2238       struct free_lcrecord_header *free_header =
2239         (struct free_lcrecord_header *) XPNTR (val);
2240
2241 #ifdef ERROR_CHECK_GC
2242       struct lrecord_header *lheader = &free_header->lcheader.lheader;
2243
2244       /* There should be no other pointers to the free list. */
2245       assert (! MARKED_RECORD_HEADER_P (lheader));
2246       /* Only lcrecords should be here. */
2247       assert (! LHEADER_IMPLEMENTATION (lheader)->basic_p);
2248       /* Only free lcrecords should be here. */
2249       assert (free_header->lcheader.free);
2250       /* The type of the lcrecord must be right. */
2251       assert (LHEADER_IMPLEMENTATION (lheader) == list->implementation);
2252       /* So must the size. */
2253       assert (LHEADER_IMPLEMENTATION (lheader)->static_size == 0 ||
2254               LHEADER_IMPLEMENTATION (lheader)->static_size == list->size);
2255 #endif /* ERROR_CHECK_GC */
2256
2257       list->free = free_header->chain;
2258       free_header->lcheader.free = 0;
2259       return val;
2260     }
2261   else
2262     {
2263       Lisp_Object val;
2264
2265       XSETOBJ (val, alloc_lcrecord (list->size, list->implementation));
2266       return val;
2267     }
2268 }
2269
2270 void
2271 free_managed_lcrecord (Lisp_Object lcrecord_list, Lisp_Object lcrecord)
2272 {
2273   struct lcrecord_list *list = XLCRECORD_LIST (lcrecord_list);
2274   struct free_lcrecord_header *free_header =
2275     (struct free_lcrecord_header *) XPNTR (lcrecord);
2276   struct lrecord_header *lheader = &free_header->lcheader.lheader;
2277   const struct lrecord_implementation *implementation
2278     = LHEADER_IMPLEMENTATION (lheader);
2279
2280   /* Make sure the size is correct.  This will catch, for example,
2281      putting a window configuration on the wrong free list. */
2282   gc_checking_assert ((implementation->size_in_bytes_method ?
2283                        implementation->size_in_bytes_method (lheader) :
2284                        implementation->static_size)
2285                       == list->size);
2286
2287   if (implementation->finalizer)
2288     implementation->finalizer (lheader, 0);
2289   free_header->chain = list->free;
2290   free_header->lcheader.free = 1;
2291   list->free = lcrecord;
2292 }
2293
2294 \f
2295
2296 \f
2297 DEFUN ("purecopy", Fpurecopy, 1, 1, 0, /*
2298 Kept for compatibility, returns its argument.
2299 Old:
2300 Make a copy of OBJECT in pure storage.
2301 Recursively copies contents of vectors and cons cells.
2302 Does not copy symbols.
2303 */
2304        (object))
2305 {
2306   return object;
2307 }
2308
2309 \f
2310 /************************************************************************/
2311 /*                         Garbage Collection                           */
2312 /************************************************************************/
2313
2314 /* All the built-in lisp object types are enumerated in `enum lrecord_type'.
2315    Additional ones may be defined by a module (none yet).  We leave some
2316    room in `lrecord_implementations_table' for such new lisp object types. */
2317 const struct lrecord_implementation *lrecord_implementations_table[(unsigned int)lrecord_type_last_built_in_type + MODULE_DEFINABLE_TYPE_COUNT];
2318 unsigned int lrecord_type_count = (unsigned int)lrecord_type_last_built_in_type;
2319 /* Object marker functions are in the lrecord_implementation structure.
2320    But copying them to a parallel array is much more cache-friendly.
2321    This hack speeds up (garbage-collect) by about 5%. */
2322 Lisp_Object (*lrecord_markers[countof (lrecord_implementations_table)]) (Lisp_Object);
2323
2324 struct gcpro *gcprolist;
2325
2326 /* We want the staticpros relocated, but not the pointers found therein.
2327    Hence we use a trivial description, as for pointerless objects. */
2328 static const struct lrecord_description staticpro_description_1[] = {
2329   { XD_END }
2330 };
2331
2332 static const struct struct_description staticpro_description = {
2333   sizeof (Lisp_Object *),
2334   staticpro_description_1
2335 };
2336
2337 static const struct lrecord_description staticpros_description_1[] = {
2338   XD_DYNARR_DESC (Lisp_Object_ptr_dynarr, &staticpro_description),
2339   { XD_END }
2340 };
2341
2342 static const struct struct_description staticpros_description = {
2343   sizeof (Lisp_Object_ptr_dynarr),
2344   staticpros_description_1
2345 };
2346
2347 Lisp_Object_ptr_dynarr *staticpros;
2348
2349 /* Mark the Lisp_Object at non-heap VARADDRESS as a root object for
2350    garbage collection, and for dumping. */
2351 void
2352 staticpro (Lisp_Object *varaddress)
2353 {
2354   Dynarr_add (staticpros, varaddress);
2355   dump_add_root_object (varaddress);
2356 }
2357
2358
2359 Lisp_Object_ptr_dynarr *staticpros_nodump;
2360
2361 /* Mark the Lisp_Object at non-heap VARADDRESS as a root object for
2362    garbage collection, but not for dumping. */
2363 void
2364 staticpro_nodump (Lisp_Object *varaddress)
2365 {
2366   Dynarr_add (staticpros_nodump, varaddress);
2367 }
2368
2369 #ifdef ERROR_CHECK_GC
2370 #define GC_CHECK_LHEADER_INVARIANTS(lheader) do {               \
2371   struct lrecord_header * GCLI_lh = (lheader);                  \
2372   assert (GCLI_lh != 0);                                        \
2373   assert (GCLI_lh->type < lrecord_type_count);                  \
2374   assert (! C_READONLY_RECORD_HEADER_P (GCLI_lh) ||             \
2375           (MARKED_RECORD_HEADER_P (GCLI_lh) &&                  \
2376            LISP_READONLY_RECORD_HEADER_P (GCLI_lh)));           \
2377 } while (0)
2378 #else
2379 #define GC_CHECK_LHEADER_INVARIANTS(lheader)
2380 #endif
2381
2382 \f
2383 /* Mark reference to a Lisp_Object.  If the object referred to has not been
2384    seen yet, recursively mark all the references contained in it. */
2385
2386 void
2387 mark_object (Lisp_Object obj)
2388 {
2389  tail_recurse:
2390
2391   /* Checks we used to perform */
2392   /* if (EQ (obj, Qnull_pointer)) return; */
2393   /* if (!POINTER_TYPE_P (XGCTYPE (obj))) return; */
2394   /* if (PURIFIED (XPNTR (obj))) return; */
2395
2396   if (XTYPE (obj) == Lisp_Type_Record)
2397     {
2398       struct lrecord_header *lheader = XRECORD_LHEADER (obj);
2399
2400       GC_CHECK_LHEADER_INVARIANTS (lheader);
2401
2402       gc_checking_assert (LHEADER_IMPLEMENTATION (lheader)->basic_p ||
2403                           ! ((struct lcrecord_header *) lheader)->free);
2404
2405       /* All c_readonly objects have their mark bit set,
2406          so that we only need to check the mark bit here. */
2407       if (! MARKED_RECORD_HEADER_P (lheader))
2408         {
2409           MARK_RECORD_HEADER (lheader);
2410
2411           if (RECORD_MARKER (lheader))
2412             {
2413               obj = RECORD_MARKER (lheader) (obj);
2414               if (!NILP (obj)) goto tail_recurse;
2415             }
2416         }
2417     }
2418 }
2419
2420 /* mark all of the conses in a list and mark the final cdr; but
2421    DO NOT mark the cars.
2422
2423    Use only for internal lists!  There should never be other pointers
2424    to the cons cells, because if so, the cars will remain unmarked
2425    even when they maybe should be marked. */
2426 void
2427 mark_conses_in_list (Lisp_Object obj)
2428 {
2429   Lisp_Object rest;
2430
2431   for (rest = obj; CONSP (rest); rest = XCDR (rest))
2432     {
2433       if (CONS_MARKED_P (XCONS (rest)))
2434         return;
2435       MARK_CONS (XCONS (rest));
2436     }
2437
2438   mark_object (rest);
2439 }
2440
2441 \f
2442 /* Find all structures not marked, and free them. */
2443
2444 static int gc_count_num_bit_vector_used, gc_count_bit_vector_total_size;
2445 static int gc_count_bit_vector_storage;
2446 static int gc_count_num_short_string_in_use;
2447 static int gc_count_string_total_size;
2448 static int gc_count_short_string_total_size;
2449
2450 /* static int gc_count_total_records_used, gc_count_records_total_size; */
2451
2452 \f
2453 /* stats on lcrecords in use - kinda kludgy */
2454
2455 static struct
2456 {
2457   int instances_in_use;
2458   int bytes_in_use;
2459   int instances_freed;
2460   int bytes_freed;
2461   int instances_on_free_list;
2462 } lcrecord_stats [countof (lrecord_implementations_table)];
2463
2464 static void
2465 tick_lcrecord_stats (const struct lrecord_header *h, int free_p)
2466 {
2467   unsigned int type_index = h->type;
2468
2469   if (((struct lcrecord_header *) h)->free)
2470     {
2471       gc_checking_assert (!free_p);
2472       lcrecord_stats[type_index].instances_on_free_list++;
2473     }
2474   else
2475     {
2476       const struct lrecord_implementation *implementation =
2477         LHEADER_IMPLEMENTATION (h);
2478
2479       size_t sz = (implementation->size_in_bytes_method ?
2480                    implementation->size_in_bytes_method (h) :
2481                    implementation->static_size);
2482       if (free_p)
2483         {
2484           lcrecord_stats[type_index].instances_freed++;
2485           lcrecord_stats[type_index].bytes_freed += sz;
2486         }
2487       else
2488         {
2489           lcrecord_stats[type_index].instances_in_use++;
2490           lcrecord_stats[type_index].bytes_in_use += sz;
2491         }
2492     }
2493 }
2494
2495 \f
2496 /* Free all unmarked records */
2497 static void
2498 sweep_lcrecords_1 (struct lcrecord_header **prev, int *used)
2499 {
2500   struct lcrecord_header *header;
2501   int num_used = 0;
2502   /* int total_size = 0; */
2503
2504   xzero (lcrecord_stats); /* Reset all statistics to 0. */
2505
2506   /* First go through and call all the finalize methods.
2507      Then go through and free the objects.  There used to
2508      be only one loop here, with the call to the finalizer
2509      occurring directly before the xfree() below.  That
2510      is marginally faster but much less safe -- if the
2511      finalize method for an object needs to reference any
2512      other objects contained within it (and many do),
2513      we could easily be screwed by having already freed that
2514      other object. */
2515
2516   for (header = *prev; header; header = header->next)
2517     {
2518       struct lrecord_header *h = &(header->lheader);
2519
2520       GC_CHECK_LHEADER_INVARIANTS (h);
2521
2522       if (! MARKED_RECORD_HEADER_P (h) && ! header->free)
2523         {
2524           if (LHEADER_IMPLEMENTATION (h)->finalizer)
2525             LHEADER_IMPLEMENTATION (h)->finalizer (h, 0);
2526         }
2527     }
2528
2529   for (header = *prev; header; )
2530     {
2531       struct lrecord_header *h = &(header->lheader);
2532       if (MARKED_RECORD_HEADER_P (h))
2533         {
2534           if (! C_READONLY_RECORD_HEADER_P (h))
2535             UNMARK_RECORD_HEADER (h);
2536           num_used++;
2537           /* total_size += n->implementation->size_in_bytes (h);*/
2538           /* #### May modify header->next on a C_READONLY lcrecord */
2539           prev = &(header->next);
2540           header = *prev;
2541           tick_lcrecord_stats (h, 0);
2542         }
2543       else
2544         {
2545           struct lcrecord_header *next = header->next;
2546           *prev = next;
2547           tick_lcrecord_stats (h, 1);
2548           /* used to call finalizer right here. */
2549           xfree (header);
2550           header = next;
2551         }
2552     }
2553   *used = num_used;
2554   /* *total = total_size; */
2555 }
2556
2557
2558 static void
2559 sweep_bit_vectors_1 (Lisp_Object *prev,
2560                      int *used, int *total, int *storage)
2561 {
2562   Lisp_Object bit_vector;
2563   int num_used = 0;
2564   int total_size = 0;
2565   int total_storage = 0;
2566
2567   /* BIT_VECTORP fails because the objects are marked, which changes
2568      their implementation */
2569   for (bit_vector = *prev; !EQ (bit_vector, Qzero); )
2570     {
2571       Lisp_Bit_Vector *v = XBIT_VECTOR (bit_vector);
2572       int len = v->size;
2573       if (MARKED_RECORD_P (bit_vector))
2574         {
2575           if (! C_READONLY_RECORD_HEADER_P(&(v->lheader)))
2576             UNMARK_RECORD_HEADER (&(v->lheader));
2577           total_size += len;
2578           total_storage +=
2579             MALLOC_OVERHEAD +
2580             FLEXIBLE_ARRAY_STRUCT_SIZEOF (Lisp_Bit_Vector, unsigned long,
2581                                           bits, BIT_VECTOR_LONG_STORAGE (len));
2582           num_used++;
2583           /* #### May modify next on a C_READONLY bitvector */
2584           prev = &(bit_vector_next (v));
2585           bit_vector = *prev;
2586         }
2587       else
2588         {
2589           Lisp_Object next = bit_vector_next (v);
2590           *prev = next;
2591           xfree (v);
2592           bit_vector = next;
2593         }
2594     }
2595   *used = num_used;
2596   *total = total_size;
2597   *storage = total_storage;
2598 }
2599
2600 /* And the Lord said: Thou shalt use the `c-backslash-region' command
2601    to make macros prettier. */
2602
2603 #ifdef ERROR_CHECK_GC
2604
2605 #define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type)                      \
2606 do {                                                                    \
2607   struct typename##_block *SFTB_current;                                \
2608   int SFTB_limit;                                                       \
2609   int num_free = 0, num_used = 0;                                       \
2610                                                                         \
2611   for (SFTB_current = current_##typename##_block,                       \
2612        SFTB_limit = current_##typename##_block_index;                   \
2613        SFTB_current;                                                    \
2614        )                                                                \
2615     {                                                                   \
2616       int SFTB_iii;                                                     \
2617                                                                         \
2618       for (SFTB_iii = 0; SFTB_iii < SFTB_limit; SFTB_iii++)             \
2619         {                                                               \
2620           obj_type *SFTB_victim = &(SFTB_current->block[SFTB_iii]);     \
2621                                                                         \
2622           if (LRECORD_FREE_P (SFTB_victim))                             \
2623             {                                                           \
2624               num_free++;                                               \
2625             }                                                           \
2626           else if (C_READONLY_RECORD_HEADER_P (&SFTB_victim->lheader))  \
2627             {                                                           \
2628               num_used++;                                               \
2629             }                                                           \
2630           else if (! MARKED_RECORD_HEADER_P (&SFTB_victim->lheader))    \
2631             {                                                           \
2632               num_free++;                                               \
2633               FREE_FIXED_TYPE (typename, obj_type, SFTB_victim);        \
2634             }                                                           \
2635           else                                                          \
2636             {                                                           \
2637               num_used++;                                               \
2638               UNMARK_##typename (SFTB_victim);                          \
2639             }                                                           \
2640         }                                                               \
2641       SFTB_current = SFTB_current->prev;                                \
2642       SFTB_limit = countof (current_##typename##_block->block);         \
2643     }                                                                   \
2644                                                                         \
2645   gc_count_num_##typename##_in_use = num_used;                          \
2646   gc_count_num_##typename##_freelist = num_free;                        \
2647 } while (0)
2648
2649 #else /* !ERROR_CHECK_GC */
2650
2651 #define SWEEP_FIXED_TYPE_BLOCK(typename, obj_type)                              \
2652 do {                                                                            \
2653   struct typename##_block *SFTB_current;                                        \
2654   struct typename##_block **SFTB_prev;                                          \
2655   int SFTB_limit;                                                               \
2656   int num_free = 0, num_used = 0;                                               \
2657                                                                                 \
2658   typename##_free_list = 0;                                                     \
2659                                                                                 \
2660   for (SFTB_prev = &current_##typename##_block,                                 \
2661        SFTB_current = current_##typename##_block,                               \
2662        SFTB_limit = current_##typename##_block_index;                           \
2663        SFTB_current;                                                            \
2664        )                                                                        \
2665     {                                                                           \
2666       int SFTB_iii;                                                             \
2667       int SFTB_empty = 1;                                                       \
2668       Lisp_Free *SFTB_old_free_list = typename##_free_list;                     \
2669                                                                                 \
2670       for (SFTB_iii = 0; SFTB_iii < SFTB_limit; SFTB_iii++)                     \
2671         {                                                                       \
2672           obj_type *SFTB_victim = &(SFTB_current->block[SFTB_iii]);             \
2673                                                                                 \
2674           if (LRECORD_FREE_P (SFTB_victim))                                     \
2675             {                                                                   \
2676               num_free++;                                                       \
2677               PUT_FIXED_TYPE_ON_FREE_LIST (typename, obj_type, SFTB_victim);    \
2678             }                                                                   \
2679           else if (C_READONLY_RECORD_HEADER_P (&SFTB_victim->lheader))          \
2680             {                                                                   \
2681               SFTB_empty = 0;                                                   \
2682               num_used++;                                                       \
2683             }                                                                   \
2684           else if (! MARKED_RECORD_HEADER_P (&SFTB_victim->lheader))            \
2685             {                                                                   \
2686               num_free++;                                                       \
2687               FREE_FIXED_TYPE (typename, obj_type, SFTB_victim);                \
2688             }                                                                   \
2689           else                                                                  \
2690             {                                                                   \
2691               SFTB_empty = 0;                                                   \
2692               num_used++;                                                       \
2693               UNMARK_##typename (SFTB_victim);                                  \
2694             }                                                                   \
2695         }                                                                       \
2696       if (!SFTB_empty)                                                          \
2697         {                                                                       \
2698           SFTB_prev = &(SFTB_current->prev);                                    \
2699           SFTB_current = SFTB_current->prev;                                    \
2700         }                                                                       \
2701       else if (SFTB_current == current_##typename##_block                       \
2702                && !SFTB_current->prev)                                          \
2703         {                                                                       \
2704           /* No real point in freeing sole allocation block */                  \
2705           break;                                                                \
2706         }                                                                       \
2707       else                                                                      \
2708         {                                                                       \
2709           struct typename##_block *SFTB_victim_block = SFTB_current;            \
2710           if (SFTB_victim_block == current_##typename##_block)                  \
2711             current_##typename##_block_index                                    \
2712               = countof (current_##typename##_block->block);                    \
2713           SFTB_current = SFTB_current->prev;                                    \
2714           {                                                                     \
2715             *SFTB_prev = SFTB_current;                                          \
2716             xfree (SFTB_victim_block);                                          \
2717             /* Restore free list to what it was before victim was swept */      \
2718             typename##_free_list = SFTB_old_free_list;                          \
2719             num_free -= SFTB_limit;                                             \
2720           }                                                                     \
2721         }                                                                       \
2722       SFTB_limit = countof (current_##typename##_block->block);                 \
2723     }                                                                           \
2724                                                                                 \
2725   gc_count_num_##typename##_in_use = num_used;                                  \
2726   gc_count_num_##typename##_freelist = num_free;                                \
2727 } while (0)
2728
2729 #endif /* !ERROR_CHECK_GC */
2730
2731 \f
2732
2733
2734 static void
2735 sweep_conses (void)
2736 {
2737 #define UNMARK_cons(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2738 #define ADDITIONAL_FREE_cons(ptr)
2739
2740   SWEEP_FIXED_TYPE_BLOCK (cons, Lisp_Cons);
2741 }
2742
2743 /* Explicitly free a cons cell.  */
2744 void
2745 free_cons (Lisp_Cons *ptr)
2746 {
2747 #ifdef ERROR_CHECK_GC
2748   /* If the CAR is not an int, then it will be a pointer, which will
2749      always be four-byte aligned.  If this cons cell has already been
2750      placed on the free list, however, its car will probably contain
2751      a chain pointer to the next cons on the list, which has cleverly
2752      had all its 0's and 1's inverted.  This allows for a quick
2753      check to make sure we're not freeing something already freed. */
2754   if (POINTER_TYPE_P (XTYPE (ptr->car)))
2755     ASSERT_VALID_POINTER (XPNTR (ptr->car));
2756 #endif /* ERROR_CHECK_GC */
2757
2758 #ifndef ALLOC_NO_POOLS
2759   FREE_FIXED_TYPE_WHEN_NOT_IN_GC (cons, Lisp_Cons, ptr);
2760 #endif /* ALLOC_NO_POOLS */
2761 }
2762
2763 /* explicitly free a list.  You **must make sure** that you have
2764    created all the cons cells that make up this list and that there
2765    are no pointers to any of these cons cells anywhere else.  If there
2766    are, you will lose. */
2767
2768 void
2769 free_list (Lisp_Object list)
2770 {
2771   Lisp_Object rest, next;
2772
2773   for (rest = list; !NILP (rest); rest = next)
2774     {
2775       next = XCDR (rest);
2776       free_cons (XCONS (rest));
2777     }
2778 }
2779
2780 /* explicitly free an alist.  You **must make sure** that you have
2781    created all the cons cells that make up this alist and that there
2782    are no pointers to any of these cons cells anywhere else.  If there
2783    are, you will lose. */
2784
2785 void
2786 free_alist (Lisp_Object alist)
2787 {
2788   Lisp_Object rest, next;
2789
2790   for (rest = alist; !NILP (rest); rest = next)
2791     {
2792       next = XCDR (rest);
2793       free_cons (XCONS (XCAR (rest)));
2794       free_cons (XCONS (rest));
2795     }
2796 }
2797
2798 static void
2799 sweep_compiled_functions (void)
2800 {
2801 #define UNMARK_compiled_function(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2802 #define ADDITIONAL_FREE_compiled_function(ptr)
2803
2804   SWEEP_FIXED_TYPE_BLOCK (compiled_function, Lisp_Compiled_Function);
2805 }
2806
2807
2808 #ifdef LISP_FLOAT_TYPE
2809 static void
2810 sweep_floats (void)
2811 {
2812 #define UNMARK_float(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2813 #define ADDITIONAL_FREE_float(ptr)
2814
2815   SWEEP_FIXED_TYPE_BLOCK (float, Lisp_Float);
2816 }
2817 #endif /* LISP_FLOAT_TYPE */
2818
2819 static void
2820 sweep_symbols (void)
2821 {
2822 #define UNMARK_symbol(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2823 #define ADDITIONAL_FREE_symbol(ptr)
2824
2825   SWEEP_FIXED_TYPE_BLOCK (symbol, Lisp_Symbol);
2826 }
2827
2828 static void
2829 sweep_extents (void)
2830 {
2831 #define UNMARK_extent(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2832 #define ADDITIONAL_FREE_extent(ptr)
2833
2834   SWEEP_FIXED_TYPE_BLOCK (extent, struct extent);
2835 }
2836
2837 static void
2838 sweep_events (void)
2839 {
2840 #define UNMARK_event(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2841 #define ADDITIONAL_FREE_event(ptr)
2842
2843   SWEEP_FIXED_TYPE_BLOCK (event, Lisp_Event);
2844 }
2845
2846 static void
2847 sweep_markers (void)
2848 {
2849 #define UNMARK_marker(ptr) UNMARK_RECORD_HEADER (&((ptr)->lheader))
2850 #define ADDITIONAL_FREE_marker(ptr)                                     \
2851   do { Lisp_Object tem;                                                 \
2852        XSETMARKER (tem, ptr);                                           \
2853        unchain_marker (tem);                                            \
2854      } while (0)
2855
2856   SWEEP_FIXED_TYPE_BLOCK (marker, Lisp_Marker);
2857 }
2858
2859 /* Explicitly free a marker.  */
2860 void
2861 free_marker (Lisp_Marker *ptr)
2862 {
2863   /* Perhaps this will catch freeing an already-freed marker. */
2864   gc_checking_assert (ptr->lheader.type == lrecord_type_marker);
2865
2866 #ifndef ALLOC_NO_POOLS
2867   FREE_FIXED_TYPE_WHEN_NOT_IN_GC (marker, Lisp_Marker, ptr);
2868 #endif /* ALLOC_NO_POOLS */
2869 }
2870 \f
2871
2872 #if defined (MULE) && defined (VERIFY_STRING_CHARS_INTEGRITY)
2873
2874 static void
2875 verify_string_chars_integrity (void)
2876 {
2877   struct string_chars_block *sb;
2878
2879   /* Scan each existing string block sequentially, string by string.  */
2880   for (sb = first_string_chars_block; sb; sb = sb->next)
2881     {
2882       int pos = 0;
2883       /* POS is the index of the next string in the block.  */
2884       while (pos < sb->pos)
2885         {
2886           struct string_chars *s_chars =
2887             (struct string_chars *) &(sb->string_chars[pos]);
2888           Lisp_String *string;
2889           int size;
2890           int fullsize;
2891
2892           /* If the string_chars struct is marked as free (i.e. the
2893              STRING pointer is NULL) then this is an unused chunk of
2894              string storage. (See below.) */
2895
2896           if (STRING_CHARS_FREE_P (s_chars))
2897             {
2898               fullsize = ((struct unused_string_chars *) s_chars)->fullsize;
2899               pos += fullsize;
2900               continue;
2901             }
2902
2903           string = s_chars->string;
2904           /* Must be 32-bit aligned. */
2905           assert ((((int) string) & 3) == 0);
2906
2907           size = string_length (string);
2908           fullsize = STRING_FULLSIZE (size);
2909
2910           assert (!BIG_STRING_FULLSIZE_P (fullsize));
2911           assert (string_data (string) == s_chars->chars);
2912           pos += fullsize;
2913         }
2914       assert (pos == sb->pos);
2915     }
2916 }
2917
2918 #endif /* MULE && ERROR_CHECK_GC */
2919
2920 /* Compactify string chars, relocating the reference to each --
2921    free any empty string_chars_block we see. */
2922 static void
2923 compact_string_chars (void)
2924 {
2925   struct string_chars_block *to_sb = first_string_chars_block;
2926   int to_pos = 0;
2927   struct string_chars_block *from_sb;
2928
2929   /* Scan each existing string block sequentially, string by string.  */
2930   for (from_sb = first_string_chars_block; from_sb; from_sb = from_sb->next)
2931     {
2932       int from_pos = 0;
2933       /* FROM_POS is the index of the next string in the block.  */
2934       while (from_pos < from_sb->pos)
2935         {
2936           struct string_chars *from_s_chars =
2937             (struct string_chars *) &(from_sb->string_chars[from_pos]);
2938           struct string_chars *to_s_chars;
2939           Lisp_String *string;
2940           int size;
2941           int fullsize;
2942
2943           /* If the string_chars struct is marked as free (i.e. the
2944              STRING pointer is NULL) then this is an unused chunk of
2945              string storage.  This happens under Mule when a string's
2946              size changes in such a way that its fullsize changes.
2947              (Strings can change size because a different-length
2948              character can be substituted for another character.)
2949              In this case, after the bogus string pointer is the
2950              "fullsize" of this entry, i.e. how many bytes to skip. */
2951
2952           if (STRING_CHARS_FREE_P (from_s_chars))
2953             {
2954               fullsize = ((struct unused_string_chars *) from_s_chars)->fullsize;
2955               from_pos += fullsize;
2956               continue;
2957             }
2958
2959           string = from_s_chars->string;
2960           assert (!(LRECORD_FREE_P (string)));
2961
2962           size = string_length (string);
2963           fullsize = STRING_FULLSIZE (size);
2964
2965           gc_checking_assert (! BIG_STRING_FULLSIZE_P (fullsize));
2966
2967           /* Just skip it if it isn't marked.  */
2968           if (! MARKED_RECORD_HEADER_P (&(string->lheader)))
2969             {
2970               from_pos += fullsize;
2971               continue;
2972             }
2973
2974           /* If it won't fit in what's left of TO_SB, close TO_SB out
2975              and go on to the next string_chars_block.  We know that TO_SB
2976              cannot advance past FROM_SB here since FROM_SB is large enough
2977              to currently contain this string. */
2978           if ((to_pos + fullsize) > countof (to_sb->string_chars))
2979             {
2980               to_sb->pos = to_pos;
2981               to_sb = to_sb->next;
2982               to_pos = 0;
2983             }
2984
2985           /* Compute new address of this string
2986              and update TO_POS for the space being used.  */
2987           to_s_chars = (struct string_chars *) &(to_sb->string_chars[to_pos]);
2988
2989           /* Copy the string_chars to the new place.  */
2990           if (from_s_chars != to_s_chars)
2991             memmove (to_s_chars, from_s_chars, fullsize);
2992
2993           /* Relocate FROM_S_CHARS's reference */
2994           set_string_data (string, &(to_s_chars->chars[0]));
2995
2996           from_pos += fullsize;
2997           to_pos += fullsize;
2998         }
2999     }
3000
3001   /* Set current to the last string chars block still used and
3002      free any that follow. */
3003   {
3004     struct string_chars_block *victim;
3005
3006     for (victim = to_sb->next; victim; )
3007       {
3008         struct string_chars_block *next = victim->next;
3009         xfree (victim);
3010         victim = next;
3011       }
3012
3013     current_string_chars_block = to_sb;
3014     current_string_chars_block->pos = to_pos;
3015     current_string_chars_block->next = 0;
3016   }
3017 }
3018
3019 #if 1 /* Hack to debug missing purecopy's */
3020 static int debug_string_purity;
3021
3022 static void
3023 debug_string_purity_print (Lisp_String *p)
3024 {
3025   Charcount i;
3026   Charcount s = string_char_length (p);
3027   stderr_out ("\"");
3028   for (i = 0; i < s; i++)
3029   {
3030     Emchar ch = string_char (p, i);
3031     if (ch < 32 || ch >= 126)
3032       stderr_out ("\\%03o", ch);
3033     else if (ch == '\\' || ch == '\"')
3034       stderr_out ("\\%c", ch);
3035     else
3036       stderr_out ("%c", ch);
3037   }
3038   stderr_out ("\"\n");
3039 }
3040 #endif /* 1 */
3041
3042
3043 static void
3044 sweep_strings (void)
3045 {
3046   int num_small_used = 0, num_small_bytes = 0, num_bytes = 0;
3047   int debug = debug_string_purity;
3048
3049 #define UNMARK_string(ptr) do {                 \
3050     Lisp_String *p = (ptr);                     \
3051     size_t size = string_length (p);            \
3052     UNMARK_RECORD_HEADER (&(p->lheader));       \
3053     num_bytes += size;                          \
3054     if (!BIG_STRING_SIZE_P (size))              \
3055       {                                         \
3056         num_small_bytes += size;                \
3057         num_small_used++;                       \
3058       }                                         \
3059     if (debug)                                  \
3060       debug_string_purity_print (p);            \
3061   } while (0)
3062 #define ADDITIONAL_FREE_string(ptr) do {        \
3063     size_t size = string_length (ptr);          \
3064     if (BIG_STRING_SIZE_P (size))               \
3065       xfree (ptr->data);                        \
3066   } while (0)
3067
3068   SWEEP_FIXED_TYPE_BLOCK (string, Lisp_String);
3069
3070   gc_count_num_short_string_in_use = num_small_used;
3071   gc_count_string_total_size = num_bytes;
3072   gc_count_short_string_total_size = num_small_bytes;
3073 }
3074
3075
3076 /* I hate duplicating all this crap! */
3077 int
3078 marked_p (Lisp_Object obj)
3079 {
3080   /* Checks we used to perform. */
3081   /* if (EQ (obj, Qnull_pointer)) return 1; */
3082   /* if (!POINTER_TYPE_P (XGCTYPE (obj))) return 1; */
3083   /* if (PURIFIED (XPNTR (obj))) return 1; */
3084
3085   if (XTYPE (obj) == Lisp_Type_Record)
3086     {
3087       struct lrecord_header *lheader = XRECORD_LHEADER (obj);
3088
3089       GC_CHECK_LHEADER_INVARIANTS (lheader);
3090
3091       return MARKED_RECORD_HEADER_P (lheader);
3092     }
3093   return 1;
3094 }
3095
3096 static void
3097 gc_sweep (void)
3098 {
3099   /* Free all unmarked records.  Do this at the very beginning,
3100      before anything else, so that the finalize methods can safely
3101      examine items in the objects.  sweep_lcrecords_1() makes
3102      sure to call all the finalize methods *before* freeing anything,
3103      to complete the safety. */
3104   {
3105     int ignored;
3106     sweep_lcrecords_1 (&all_lcrecords, &ignored);
3107   }
3108
3109   compact_string_chars ();
3110
3111   /* Finalize methods below (called through the ADDITIONAL_FREE_foo
3112      macros) must be *extremely* careful to make sure they're not
3113      referencing freed objects.  The only two existing finalize
3114      methods (for strings and markers) pass muster -- the string
3115      finalizer doesn't look at anything but its own specially-
3116      created block, and the marker finalizer only looks at live
3117      buffers (which will never be freed) and at the markers before
3118      and after it in the chain (which, by induction, will never be
3119      freed because if so, they would have already removed themselves
3120      from the chain). */
3121
3122   /* Put all unmarked strings on free list, free'ing the string chars
3123      of large unmarked strings */
3124   sweep_strings ();
3125
3126   /* Put all unmarked conses on free list */
3127   sweep_conses ();
3128
3129   /* Free all unmarked bit vectors */
3130   sweep_bit_vectors_1 (&all_bit_vectors,
3131                        &gc_count_num_bit_vector_used,
3132                        &gc_count_bit_vector_total_size,
3133                        &gc_count_bit_vector_storage);
3134
3135   /* Free all unmarked compiled-function objects */
3136   sweep_compiled_functions ();
3137
3138 #ifdef LISP_FLOAT_TYPE
3139   /* Put all unmarked floats on free list */
3140   sweep_floats ();
3141 #endif
3142
3143   /* Put all unmarked symbols on free list */
3144   sweep_symbols ();
3145
3146   /* Put all unmarked extents on free list */
3147   sweep_extents ();
3148
3149   /* Put all unmarked markers on free list.
3150      Dechain each one first from the buffer into which it points. */
3151   sweep_markers ();
3152
3153   sweep_events ();
3154
3155 #ifdef PDUMP
3156   pdump_objects_unmark ();
3157 #endif
3158 }
3159 \f
3160 /* Clearing for disksave. */
3161
3162 void
3163 disksave_object_finalization (void)
3164 {
3165   /* It's important that certain information from the environment not get
3166      dumped with the executable (pathnames, environment variables, etc.).
3167      To make it easier to tell when this has happened with strings(1) we
3168      clear some known-to-be-garbage blocks of memory, so that leftover
3169      results of old evaluation don't look like potential problems.
3170      But first we set some notable variables to nil and do one more GC,
3171      to turn those strings into garbage.
3172   */
3173
3174   /* Yeah, this list is pretty ad-hoc... */
3175   Vprocess_environment = Qnil;
3176   Vexec_directory = Qnil;
3177   Vdata_directory = Qnil;
3178   Vsite_directory = Qnil;
3179   Vdoc_directory = Qnil;
3180   Vconfigure_info_directory = Qnil;
3181   Vexec_path = Qnil;
3182   Vload_path = Qnil;
3183   /* Vdump_load_path = Qnil; */
3184   /* Release hash tables for locate_file */
3185   Flocate_file_clear_hashing (Qt);
3186   uncache_home_directory();
3187
3188 #if defined(LOADHIST) && !(defined(LOADHIST_DUMPED) || \
3189                            defined(LOADHIST_BUILTIN))
3190   Vload_history = Qnil;
3191 #endif
3192   Vshell_file_name = Qnil;
3193
3194   garbage_collect_1 ();
3195
3196   /* Run the disksave finalization methods of all live objects. */
3197   disksave_object_finalization_1 ();
3198
3199   /* Zero out the uninitialized (really, unused) part of the containers
3200      for the live strings. */
3201   {
3202     struct string_chars_block *scb;
3203     for (scb = first_string_chars_block; scb; scb = scb->next)
3204       {
3205         int count = sizeof (scb->string_chars) - scb->pos;
3206
3207         assert (count >= 0 && count < STRING_CHARS_BLOCK_SIZE);
3208         if (count != 0)
3209           {
3210             /* from the block's fill ptr to the end */
3211             memset ((scb->string_chars + scb->pos), 0, count);
3212           }
3213       }
3214   }
3215
3216   /* There, that ought to be enough... */
3217
3218 }
3219
3220 \f
3221 Lisp_Object
3222 restore_gc_inhibit (Lisp_Object val)
3223 {
3224   gc_currently_forbidden = XINT (val);
3225   return val;
3226 }
3227
3228 /* Maybe we want to use this when doing a "panic" gc after memory_full()? */
3229 static int gc_hooks_inhibited;
3230
3231 \f
3232 void
3233 garbage_collect_1 (void)
3234 {
3235 #if MAX_SAVE_STACK > 0
3236   char stack_top_variable;
3237   extern char *stack_bottom;
3238 #endif
3239   struct frame *f;
3240   int speccount;
3241   int cursor_changed;
3242   Lisp_Object pre_gc_cursor;
3243   struct gcpro gcpro1;
3244
3245   if (gc_in_progress
3246       || gc_currently_forbidden
3247       || in_display
3248       || preparing_for_armageddon)
3249     return;
3250
3251   /* We used to call selected_frame() here.
3252
3253      The following functions cannot be called inside GC
3254      so we move to after the above tests. */
3255   {
3256     Lisp_Object frame;
3257     Lisp_Object device = Fselected_device (Qnil);
3258     if (NILP (device)) /* Could happen during startup, eg. if always_gc */
3259       return;
3260     frame = DEVICE_SELECTED_FRAME (XDEVICE (device));
3261     if (NILP (frame))
3262       signal_simple_error ("No frames exist on device", device);
3263     f = XFRAME (frame);
3264   }
3265
3266   pre_gc_cursor = Qnil;
3267   cursor_changed = 0;
3268
3269   GCPRO1 (pre_gc_cursor);
3270
3271   /* Very important to prevent GC during any of the following
3272      stuff that might run Lisp code; otherwise, we'll likely
3273      have infinite GC recursion. */
3274   speccount = specpdl_depth ();
3275   record_unwind_protect (restore_gc_inhibit,
3276                          make_int (gc_currently_forbidden));
3277   gc_currently_forbidden = 1;
3278
3279   if (!gc_hooks_inhibited)
3280     run_hook_trapping_errors ("Error in pre-gc-hook", Qpre_gc_hook);
3281
3282   /* Now show the GC cursor/message. */
3283   if (!noninteractive)
3284     {
3285       if (FRAME_WIN_P (f))
3286         {
3287           Lisp_Object frame = make_frame (f);
3288           Lisp_Object cursor = glyph_image_instance (Vgc_pointer_glyph,
3289                                                      FRAME_SELECTED_WINDOW (f),
3290                                                      ERROR_ME_NOT, 1);
3291           pre_gc_cursor = f->pointer;
3292           if (POINTER_IMAGE_INSTANCEP (cursor)
3293               /* don't change if we don't know how to change back. */
3294               && POINTER_IMAGE_INSTANCEP (pre_gc_cursor))
3295             {
3296               cursor_changed = 1;
3297               Fset_frame_pointer (frame, cursor);
3298             }
3299         }
3300
3301       /* Don't print messages to the stream device. */
3302       if (!cursor_changed && !FRAME_STREAM_P (f))
3303         {
3304           char *msg = (STRINGP (Vgc_message)
3305                        ? GETTEXT ((char *) XSTRING_DATA (Vgc_message))
3306                        : 0);
3307           Lisp_Object args[2], whole_msg;
3308           args[0] = build_string (msg ? msg :
3309                                   GETTEXT ((const char *) gc_default_message));
3310           args[1] = build_string ("...");
3311           whole_msg = Fconcat (2, args);
3312           echo_area_message (f, (Bufbyte *) 0, whole_msg, 0, -1,
3313                              Qgarbage_collecting);
3314         }
3315     }
3316
3317   /***** Now we actually start the garbage collection. */
3318
3319   gc_in_progress = 1;
3320
3321   gc_generation_number[0]++;
3322
3323 #if MAX_SAVE_STACK > 0
3324
3325   /* Save a copy of the contents of the stack, for debugging.  */
3326   if (!purify_flag)
3327     {
3328       /* Static buffer in which we save a copy of the C stack at each GC.  */
3329       static char *stack_copy;
3330       static size_t stack_copy_size;
3331
3332       ptrdiff_t stack_diff = &stack_top_variable - stack_bottom;
3333       size_t stack_size = (stack_diff > 0 ? stack_diff : -stack_diff);
3334       if (stack_size < MAX_SAVE_STACK)
3335         {
3336           if (stack_copy_size < stack_size)
3337             {
3338               stack_copy = (char *) xrealloc (stack_copy, stack_size);
3339               stack_copy_size = stack_size;
3340             }
3341
3342           memcpy (stack_copy,
3343                   stack_diff > 0 ? stack_bottom : &stack_top_variable,
3344                   stack_size);
3345         }
3346     }
3347 #endif /* MAX_SAVE_STACK > 0 */
3348
3349   /* Do some totally ad-hoc resource clearing. */
3350   /* #### generalize this? */
3351   clear_event_resource ();
3352   cleanup_specifiers ();
3353
3354   /* Mark all the special slots that serve as the roots of accessibility. */
3355
3356   { /* staticpro() */
3357     Lisp_Object **p = Dynarr_begin (staticpros);
3358     size_t count;
3359     for (count = Dynarr_length (staticpros); count; count--)
3360       mark_object (**p++);
3361   }
3362
3363   { /* staticpro_nodump() */
3364     Lisp_Object **p = Dynarr_begin (staticpros_nodump);
3365     size_t count;
3366     for (count = Dynarr_length (staticpros_nodump); count; count--)
3367       mark_object (**p++);
3368   }
3369
3370   { /* GCPRO() */
3371     struct gcpro *tail;
3372     int i;
3373     for (tail = gcprolist; tail; tail = tail->next)
3374       for (i = 0; i < tail->nvars; i++)
3375         mark_object (tail->var[i]);
3376   }
3377
3378   { /* specbind() */
3379     struct specbinding *bind;
3380     for (bind = specpdl; bind != specpdl_ptr; bind++)
3381       {
3382         mark_object (bind->symbol);
3383         mark_object (bind->old_value);
3384       }
3385   }
3386
3387   {
3388     struct catchtag *catch;
3389     for (catch = catchlist; catch; catch = catch->next)
3390       {
3391         mark_object (catch->tag);
3392         mark_object (catch->val);
3393       }
3394   }
3395
3396   {
3397     struct backtrace *backlist;
3398     for (backlist = backtrace_list; backlist; backlist = backlist->next)
3399       {
3400         int nargs = backlist->nargs;
3401         int i;
3402
3403         mark_object (*backlist->function);
3404         if (nargs < 0 /* nargs == UNEVALLED || nargs == MANY */)
3405           mark_object (backlist->args[0]);
3406         else
3407           for (i = 0; i < nargs; i++)
3408             mark_object (backlist->args[i]);
3409       }
3410   }
3411
3412   mark_redisplay ();
3413   mark_profiling_info ();
3414
3415   /* OK, now do the after-mark stuff.  This is for things that
3416      are only marked when something else is marked (e.g. weak hash tables).
3417      There may be complex dependencies between such objects -- e.g.
3418      a weak hash table might be unmarked, but after processing a later
3419      weak hash table, the former one might get marked.  So we have to
3420      iterate until nothing more gets marked. */
3421
3422   while (finish_marking_weak_hash_tables () > 0 ||
3423          finish_marking_weak_lists       () > 0)
3424     ;
3425
3426   /* And prune (this needs to be called after everything else has been
3427      marked and before we do any sweeping). */
3428   /* #### this is somewhat ad-hoc and should probably be an object
3429      method */
3430   prune_weak_hash_tables ();
3431   prune_weak_lists ();
3432   prune_specifiers ();
3433   prune_syntax_tables ();
3434
3435   gc_sweep ();
3436
3437   consing_since_gc = 0;
3438 #ifndef DEBUG_XEMACS
3439   /* Allow you to set it really fucking low if you really want ... */
3440   if (gc_cons_threshold < 10000)
3441     gc_cons_threshold = 10000;
3442 #endif
3443
3444   gc_in_progress = 0;
3445
3446   /******* End of garbage collection ********/
3447
3448   run_hook_trapping_errors ("Error in post-gc-hook", Qpost_gc_hook);
3449
3450   /* Now remove the GC cursor/message */
3451   if (!noninteractive)
3452     {
3453       if (cursor_changed)
3454         Fset_frame_pointer (make_frame (f), pre_gc_cursor);
3455       else if (!FRAME_STREAM_P (f))
3456         {
3457           char *msg = (STRINGP (Vgc_message)
3458                        ? GETTEXT ((char *) XSTRING_DATA (Vgc_message))
3459                        : 0);
3460
3461           /* Show "...done" only if the echo area would otherwise be empty. */
3462           if (NILP (clear_echo_area (selected_frame (),
3463                                      Qgarbage_collecting, 0)))
3464             {
3465               Lisp_Object args[2], whole_msg;
3466               args[0] = build_string (msg ? msg :
3467                                       GETTEXT ((const char *)
3468                                                gc_default_message));
3469               args[1] = build_string ("... done");
3470               whole_msg = Fconcat (2, args);
3471               echo_area_message (selected_frame (), (Bufbyte *) 0,
3472                                  whole_msg, 0, -1,
3473                                  Qgarbage_collecting);
3474             }
3475         }
3476     }
3477
3478   /* now stop inhibiting GC */
3479   unbind_to (speccount, Qnil);
3480
3481   if (!breathing_space)
3482     {
3483       breathing_space = malloc (4096 - MALLOC_OVERHEAD);
3484     }
3485
3486   UNGCPRO;
3487   return;
3488 }
3489
3490 /* Debugging aids.  */
3491
3492 static Lisp_Object
3493 gc_plist_hack (const char *name, int value, Lisp_Object tail)
3494 {
3495   /* C doesn't have local functions (or closures, or GC, or readable syntax,
3496      or portable numeric datatypes, or bit-vectors, or characters, or
3497      arrays, or exceptions, or ...) */
3498   return cons3 (intern (name), make_int (value), tail);
3499 }
3500
3501 #define HACK_O_MATIC(type, name, pl) do {                               \
3502   int s = 0;                                                            \
3503   struct type##_block *x = current_##type##_block;                      \
3504   while (x) { s += sizeof (*x) + MALLOC_OVERHEAD; x = x->prev; }        \
3505   (pl) = gc_plist_hack ((name), s, (pl));                               \
3506 } while (0)
3507
3508 DEFUN ("garbage-collect", Fgarbage_collect, 0, 0, "", /*
3509 Reclaim storage for Lisp objects no longer needed.
3510 Return info on amount of space in use:
3511  ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)
3512   (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS
3513   PLIST)
3514   where `PLIST' is a list of alternating keyword/value pairs providing
3515   more detailed information.
3516 Garbage collection happens automatically if you cons more than
3517 `gc-cons-threshold' bytes of Lisp data since previous garbage collection.
3518 */
3519        ())
3520 {
3521   Lisp_Object pl = Qnil;
3522   int i;
3523   int gc_count_vector_total_size = 0;
3524
3525   garbage_collect_1 ();
3526
3527   for (i = 0; i < lrecord_type_count; i++)
3528     {
3529       if (lcrecord_stats[i].bytes_in_use != 0
3530           || lcrecord_stats[i].bytes_freed != 0
3531           || lcrecord_stats[i].instances_on_free_list != 0)
3532         {
3533           char buf [255];
3534           const char *name = lrecord_implementations_table[i]->name;
3535           int len = strlen (name);
3536           /* save this for the FSFmacs-compatible part of the summary */
3537           if (i == lrecord_vector.lrecord_type_index)
3538             gc_count_vector_total_size =
3539               lcrecord_stats[i].bytes_in_use + lcrecord_stats[i].bytes_freed;
3540
3541           sprintf (buf, "%s-storage", name);
3542           pl = gc_plist_hack (buf, lcrecord_stats[i].bytes_in_use, pl);
3543           /* Okay, simple pluralization check for `symbol-value-varalias' */
3544           if (name[len-1] == 's')
3545             sprintf (buf, "%ses-freed", name);
3546           else
3547             sprintf (buf, "%ss-freed", name);
3548           if (lcrecord_stats[i].instances_freed != 0)
3549             pl = gc_plist_hack (buf, lcrecord_stats[i].instances_freed, pl);
3550           if (name[len-1] == 's')
3551             sprintf (buf, "%ses-on-free-list", name);
3552           else
3553             sprintf (buf, "%ss-on-free-list", name);
3554           if (lcrecord_stats[i].instances_on_free_list != 0)
3555             pl = gc_plist_hack (buf, lcrecord_stats[i].instances_on_free_list,
3556                                 pl);
3557           if (name[len-1] == 's')
3558             sprintf (buf, "%ses-used", name);
3559           else
3560             sprintf (buf, "%ss-used", name);
3561           pl = gc_plist_hack (buf, lcrecord_stats[i].instances_in_use, pl);
3562         }
3563     }
3564
3565   HACK_O_MATIC (extent, "extent-storage", pl);
3566   pl = gc_plist_hack ("extents-free", gc_count_num_extent_freelist, pl);
3567   pl = gc_plist_hack ("extents-used", gc_count_num_extent_in_use, pl);
3568   HACK_O_MATIC (event, "event-storage", pl);
3569   pl = gc_plist_hack ("events-free", gc_count_num_event_freelist, pl);
3570   pl = gc_plist_hack ("events-used", gc_count_num_event_in_use, pl);
3571   HACK_O_MATIC (marker, "marker-storage", pl);
3572   pl = gc_plist_hack ("markers-free", gc_count_num_marker_freelist, pl);
3573   pl = gc_plist_hack ("markers-used", gc_count_num_marker_in_use, pl);
3574 #ifdef LISP_FLOAT_TYPE
3575   HACK_O_MATIC (float, "float-storage", pl);
3576   pl = gc_plist_hack ("floats-free", gc_count_num_float_freelist, pl);
3577   pl = gc_plist_hack ("floats-used", gc_count_num_float_in_use, pl);
3578 #endif /* LISP_FLOAT_TYPE */
3579   HACK_O_MATIC (string, "string-header-storage", pl);
3580   pl = gc_plist_hack ("long-strings-total-length",
3581                       gc_count_string_total_size
3582                       - gc_count_short_string_total_size, pl);
3583   HACK_O_MATIC (string_chars, "short-string-storage", pl);
3584   pl = gc_plist_hack ("short-strings-total-length",
3585                       gc_count_short_string_total_size, pl);
3586   pl = gc_plist_hack ("strings-free", gc_count_num_string_freelist, pl);
3587   pl = gc_plist_hack ("long-strings-used",
3588                       gc_count_num_string_in_use
3589                       - gc_count_num_short_string_in_use, pl);
3590   pl = gc_plist_hack ("short-strings-used",
3591                       gc_count_num_short_string_in_use, pl);
3592
3593   HACK_O_MATIC (compiled_function, "compiled-function-storage", pl);
3594   pl = gc_plist_hack ("compiled-functions-free",
3595                       gc_count_num_compiled_function_freelist, pl);
3596   pl = gc_plist_hack ("compiled-functions-used",
3597                       gc_count_num_compiled_function_in_use, pl);
3598
3599   pl = gc_plist_hack ("bit-vector-storage", gc_count_bit_vector_storage, pl);
3600   pl = gc_plist_hack ("bit-vectors-total-length",
3601                       gc_count_bit_vector_total_size, pl);
3602   pl = gc_plist_hack ("bit-vectors-used", gc_count_num_bit_vector_used, pl);
3603
3604   HACK_O_MATIC (symbol, "symbol-storage", pl);
3605   pl = gc_plist_hack ("symbols-free", gc_count_num_symbol_freelist, pl);
3606   pl = gc_plist_hack ("symbols-used", gc_count_num_symbol_in_use, pl);
3607
3608   HACK_O_MATIC (cons, "cons-storage", pl);
3609   pl = gc_plist_hack ("conses-free", gc_count_num_cons_freelist, pl);
3610   pl = gc_plist_hack ("conses-used", gc_count_num_cons_in_use, pl);
3611
3612   /* The things we do for backwards-compatibility */
3613   return
3614     list6 (Fcons (make_int (gc_count_num_cons_in_use),
3615                   make_int (gc_count_num_cons_freelist)),
3616            Fcons (make_int (gc_count_num_symbol_in_use),
3617                   make_int (gc_count_num_symbol_freelist)),
3618            Fcons (make_int (gc_count_num_marker_in_use),
3619                   make_int (gc_count_num_marker_freelist)),
3620            make_int (gc_count_string_total_size),
3621            make_int (gc_count_vector_total_size),
3622            pl);
3623 }
3624 #undef HACK_O_MATIC
3625
3626 DEFUN ("consing-since-gc", Fconsing_since_gc, 0, 0, "", /*
3627 Return the number of bytes consed since the last garbage collection.
3628 \"Consed\" is a misnomer in that this actually counts allocation
3629 of all different kinds of objects, not just conses.
3630
3631 If this value exceeds `gc-cons-threshold', a garbage collection happens.
3632 */
3633        ())
3634 {
3635   return make_int (consing_since_gc);
3636 }
3637
3638 #if 0
3639 DEFUN ("memory-limit", Fmemory_limit, 0, 0, 0, /*
3640 Return the address of the last byte Emacs has allocated, divided by 1024.
3641 This may be helpful in debugging Emacs's memory usage.
3642 The value is divided by 1024 to make sure it will fit in a lisp integer.
3643 */
3644        ())
3645 {
3646   return make_int ((EMACS_INT) sbrk (0) / 1024);
3647 }
3648 #endif
3649
3650 \f
3651 int
3652 object_dead_p (Lisp_Object obj)
3653 {
3654   return ((BUFFERP  (obj) && !BUFFER_LIVE_P  (XBUFFER  (obj))) ||
3655           (FRAMEP   (obj) && !FRAME_LIVE_P   (XFRAME   (obj))) ||
3656           (WINDOWP  (obj) && !WINDOW_LIVE_P  (XWINDOW  (obj))) ||
3657           (DEVICEP  (obj) && !DEVICE_LIVE_P  (XDEVICE  (obj))) ||
3658           (CONSOLEP (obj) && !CONSOLE_LIVE_P (XCONSOLE (obj))) ||
3659           (EVENTP   (obj) && !EVENT_LIVE_P   (XEVENT   (obj))) ||
3660           (EXTENTP  (obj) && !EXTENT_LIVE_P  (XEXTENT  (obj))));
3661 }
3662
3663 #ifdef MEMORY_USAGE_STATS
3664
3665 /* Attempt to determine the actual amount of space that is used for
3666    the block allocated starting at PTR, supposedly of size "CLAIMED_SIZE".
3667
3668    It seems that the following holds:
3669
3670    1. When using the old allocator (malloc.c):
3671
3672       -- blocks are always allocated in chunks of powers of two.  For
3673          each block, there is an overhead of 8 bytes if rcheck is not
3674          defined, 20 bytes if it is defined.  In other words, a
3675          one-byte allocation needs 8 bytes of overhead for a total of
3676          9 bytes, and needs to have 16 bytes of memory chunked out for
3677          it.
3678
3679    2. When using the new allocator (gmalloc.c):
3680
3681       -- blocks are always allocated in chunks of powers of two up
3682          to 4096 bytes.  Larger blocks are allocated in chunks of
3683          an integral multiple of 4096 bytes.  The minimum block
3684          size is 2*sizeof (void *), or 16 bytes if SUNOS_LOCALTIME_BUG
3685          is defined.  There is no per-block overhead, but there
3686          is an overhead of 3*sizeof (size_t) for each 4096 bytes
3687          allocated.
3688
3689     3. When using the system malloc, anything goes, but they are
3690        generally slower and more space-efficient than the GNU
3691        allocators.  One possibly reasonable assumption to make
3692        for want of better data is that sizeof (void *), or maybe
3693        2 * sizeof (void *), is required as overhead and that
3694        blocks are allocated in the minimum required size except
3695        that some minimum block size is imposed (e.g. 16 bytes). */
3696
3697 size_t
3698 malloced_storage_size (void *ptr, size_t claimed_size,
3699                        struct overhead_stats *stats)
3700 {
3701   size_t orig_claimed_size = claimed_size;
3702
3703 #ifdef GNU_MALLOC
3704
3705   if (claimed_size < 2 * sizeof (void *))
3706     claimed_size = 2 * sizeof (void *);
3707 # ifdef SUNOS_LOCALTIME_BUG
3708   if (claimed_size < 16)
3709     claimed_size = 16;
3710 # endif
3711   if (claimed_size < 4096)
3712     {
3713       int log = 1;
3714
3715       /* compute the log base two, more or less, then use it to compute
3716          the block size needed. */
3717       claimed_size--;
3718       /* It's big, it's heavy, it's wood! */
3719       while ((claimed_size /= 2) != 0)
3720         ++log;
3721       claimed_size = 1;
3722       /* It's better than bad, it's good! */
3723       while (log > 0)
3724         {
3725           claimed_size *= 2;
3726           log--;
3727         }
3728       /* We have to come up with some average about the amount of
3729          blocks used. */
3730       if ((size_t) (rand () & 4095) < claimed_size)
3731         claimed_size += 3 * sizeof (void *);
3732     }
3733   else
3734     {
3735       claimed_size += 4095;
3736       claimed_size &= ~4095;
3737       claimed_size += (claimed_size / 4096) * 3 * sizeof (size_t);
3738     }
3739
3740 #elif defined (SYSTEM_MALLOC)
3741
3742   if (claimed_size < 16)
3743     claimed_size = 16;
3744   claimed_size += 2 * sizeof (void *);
3745
3746 #else /* old GNU allocator */
3747
3748 # ifdef rcheck /* #### may not be defined here */
3749   claimed_size += 20;
3750 # else
3751   claimed_size += 8;
3752 # endif
3753   {
3754     int log = 1;
3755
3756     /* compute the log base two, more or less, then use it to compute
3757        the block size needed. */
3758     claimed_size--;
3759     /* It's big, it's heavy, it's wood! */
3760     while ((claimed_size /= 2) != 0)
3761       ++log;
3762     claimed_size = 1;
3763     /* It's better than bad, it's good! */
3764     while (log > 0)
3765       {
3766         claimed_size *= 2;
3767         log--;
3768       }
3769   }
3770
3771 #endif /* old GNU allocator */
3772
3773   if (stats)
3774     {
3775       stats->was_requested += orig_claimed_size;
3776       stats->malloc_overhead += claimed_size - orig_claimed_size;
3777     }
3778   return claimed_size;
3779 }
3780
3781 size_t
3782 fixed_type_block_overhead (size_t size)
3783 {
3784   size_t per_block = TYPE_ALLOC_SIZE (cons, unsigned char);
3785   size_t overhead = 0;
3786   size_t storage_size = malloced_storage_size (0, per_block, 0);
3787   while (size >= per_block)
3788     {
3789       size -= per_block;
3790       overhead += sizeof (void *) + per_block - storage_size;
3791     }
3792   if (rand () % per_block < size)
3793     overhead += sizeof (void *) + per_block - storage_size;
3794   return overhead;
3795 }
3796
3797 #endif /* MEMORY_USAGE_STATS */
3798
3799 \f
3800 /* Initialization */
3801 void
3802 reinit_alloc_once_early (void)
3803 {
3804   gc_generation_number[0] = 0;
3805   breathing_space = 0;
3806   XSETINT (all_bit_vectors, 0); /* Qzero may not be set yet. */
3807   XSETINT (Vgc_message, 0);
3808   all_lcrecords = 0;
3809   ignore_malloc_warnings = 1;
3810 #ifdef DOUG_LEA_MALLOC
3811   mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */
3812   mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */
3813 #if 0 /* Moved to emacs.c */
3814   mallopt (M_MMAP_MAX, 64); /* max. number of mmap'ed areas */
3815 #endif
3816 #endif
3817   init_string_alloc ();
3818   init_string_chars_alloc ();
3819   init_cons_alloc ();
3820   init_symbol_alloc ();
3821   init_compiled_function_alloc ();
3822 #ifdef LISP_FLOAT_TYPE
3823   init_float_alloc ();
3824 #endif /* LISP_FLOAT_TYPE */
3825   init_marker_alloc ();
3826   init_extent_alloc ();
3827   init_event_alloc ();
3828
3829   ignore_malloc_warnings = 0;
3830
3831   if (staticpros_nodump)
3832     Dynarr_free (staticpros_nodump);
3833   staticpros_nodump = Dynarr_new2 (Lisp_Object_ptr_dynarr, Lisp_Object *);
3834   Dynarr_resize (staticpros_nodump, 100); /* merely a small optimization */
3835
3836   consing_since_gc = 0;
3837 #if 1
3838   gc_cons_threshold = 500000; /* XEmacs change */
3839 #else
3840   gc_cons_threshold = 15000; /* debugging */
3841 #endif
3842   lrecord_uid_counter = 259;
3843   debug_string_purity = 0;
3844   gcprolist = 0;
3845
3846   gc_currently_forbidden = 0;
3847   gc_hooks_inhibited = 0;
3848
3849 #ifdef ERROR_CHECK_TYPECHECK
3850   ERROR_ME.really_unlikely_name_to_have_accidentally_in_a_non_errb_structure =
3851     666;
3852   ERROR_ME_NOT.
3853     really_unlikely_name_to_have_accidentally_in_a_non_errb_structure = 42;
3854   ERROR_ME_WARN.
3855     really_unlikely_name_to_have_accidentally_in_a_non_errb_structure =
3856       3333632;
3857 #endif /* ERROR_CHECK_TYPECHECK */
3858 }
3859
3860 void
3861 init_alloc_once_early (void)
3862 {
3863   reinit_alloc_once_early ();
3864
3865   {
3866     int i;
3867     for (i = 0; i < countof (lrecord_implementations_table); i++)
3868       lrecord_implementations_table[i] = 0;
3869   }
3870
3871   INIT_LRECORD_IMPLEMENTATION (cons);
3872   INIT_LRECORD_IMPLEMENTATION (vector);
3873   INIT_LRECORD_IMPLEMENTATION (string);
3874   INIT_LRECORD_IMPLEMENTATION (lcrecord_list);
3875
3876   staticpros = Dynarr_new2 (Lisp_Object_ptr_dynarr, Lisp_Object *);
3877   Dynarr_resize (staticpros, 1410); /* merely a small optimization */
3878   dump_add_root_struct_ptr (&staticpros, &staticpros_description);
3879 }
3880
3881 void
3882 reinit_alloc (void)
3883 {
3884   gcprolist = 0;
3885 }
3886
3887 void
3888 syms_of_alloc (void)
3889 {
3890   DEFSYMBOL (Qpre_gc_hook);
3891   DEFSYMBOL (Qpost_gc_hook);
3892   DEFSYMBOL (Qgarbage_collecting);
3893
3894   DEFSUBR (Fcons);
3895   DEFSUBR (Flist);
3896   DEFSUBR (Fvector);
3897   DEFSUBR (Fbit_vector);
3898   DEFSUBR (Fmake_byte_code);
3899   DEFSUBR (Fmake_list);
3900   DEFSUBR (Fmake_vector);
3901   DEFSUBR (Fmake_bit_vector);
3902   DEFSUBR (Fmake_string);
3903   DEFSUBR (Fstring);
3904   DEFSUBR (Fmake_symbol);
3905   DEFSUBR (Fmake_marker);
3906   DEFSUBR (Fpurecopy);
3907   DEFSUBR (Fgarbage_collect);
3908 #if 0
3909   DEFSUBR (Fmemory_limit);
3910 #endif
3911   DEFSUBR (Fconsing_since_gc);
3912 }
3913
3914 void
3915 vars_of_alloc (void)
3916 {
3917   DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold /*
3918 *Number of bytes of consing between garbage collections.
3919 \"Consing\" is a misnomer in that this actually counts allocation
3920 of all different kinds of objects, not just conses.
3921 Garbage collection can happen automatically once this many bytes have been
3922 allocated since the last garbage collection.  All data types count.
3923
3924 Garbage collection happens automatically when `eval' or `funcall' are
3925 called.  (Note that `funcall' is called implicitly as part of evaluation.)
3926 By binding this temporarily to a large number, you can effectively
3927 prevent garbage collection during a part of the program.
3928
3929 See also `consing-since-gc'.
3930 */ );
3931
3932 #ifdef DEBUG_XEMACS
3933   DEFVAR_INT ("debug-allocation", &debug_allocation /*
3934 If non-zero, print out information to stderr about all objects allocated.
3935 See also `debug-allocation-backtrace-length'.
3936 */ );
3937   debug_allocation = 0;
3938
3939   DEFVAR_INT ("debug-allocation-backtrace-length",
3940               &debug_allocation_backtrace_length /*
3941 Length (in stack frames) of short backtrace printed out by `debug-allocation'.
3942 */ );
3943   debug_allocation_backtrace_length = 2;
3944 #endif
3945
3946   DEFVAR_BOOL ("purify-flag", &purify_flag /*
3947 Non-nil means loading Lisp code in order to dump an executable.
3948 This means that certain objects should be allocated in readonly space.
3949 */ );
3950
3951   DEFVAR_LISP ("pre-gc-hook", &Vpre_gc_hook /*
3952 Function or functions to be run just before each garbage collection.
3953 Interrupts, garbage collection, and errors are inhibited while this hook
3954 runs, so be extremely careful in what you add here.  In particular, avoid
3955 consing, and do not interact with the user.
3956 */ );
3957   Vpre_gc_hook = Qnil;
3958
3959   DEFVAR_LISP ("post-gc-hook", &Vpost_gc_hook /*
3960 Function or functions to be run just after each garbage collection.
3961 Interrupts, garbage collection, and errors are inhibited while this hook
3962 runs, so be extremely careful in what you add here.  In particular, avoid
3963 consing, and do not interact with the user.
3964 */ );
3965   Vpost_gc_hook = Qnil;
3966
3967   DEFVAR_LISP ("gc-message", &Vgc_message /*
3968 String to print to indicate that a garbage collection is in progress.
3969 This is printed in the echo area.  If the selected frame is on a
3970 window system and `gc-pointer-glyph' specifies a value (i.e. a pointer
3971 image instance) in the domain of the selected frame, the mouse pointer
3972 will change instead of this message being printed.
3973 */ );
3974   Vgc_message = build_string (gc_default_message);
3975
3976   DEFVAR_LISP ("gc-pointer-glyph", &Vgc_pointer_glyph /*
3977 Pointer glyph used to indicate that a garbage collection is in progress.
3978 If the selected window is on a window system and this glyph specifies a
3979 value (i.e. a pointer image instance) in the domain of the selected
3980 window, the pointer will be changed as specified during garbage collection.
3981 Otherwise, a message will be printed in the echo area, as controlled
3982 by `gc-message'.
3983 */ );
3984 }
3985
3986 void
3987 complex_vars_of_alloc (void)
3988 {
3989   Vgc_pointer_glyph = Fmake_glyph_internal (Qpointer);
3990 }