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