(delete-frame-enabled-p): New subroutine.
[bpt/emacs.git] / src / alloc.c
CommitLineData
7146af97 1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
0220c518 2 Copyright (C) 1985, 86, 88, 93, 94, 95 Free Software Foundation, Inc.
7146af97
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
7c299e7a 8the Free Software Foundation; either version 2, or (at your option)
7146af97
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
cf026b25 20#include <signal.h>
7146af97 21
18160b98 22#include <config.h>
7146af97 23#include "lisp.h"
d5e35230 24#include "intervals.h"
4c0be5f4 25#include "puresize.h"
7146af97
JB
26#ifndef standalone
27#include "buffer.h"
28#include "window.h"
502b9b64 29#include "frame.h"
9ac0d9e0 30#include "blockinput.h"
077d751f 31#include "keyboard.h"
7146af97
JB
32#endif
33
e065a56e
JB
34#include "syssignal.h"
35
276cbe5a
RS
36/* The following come from gmalloc.c. */
37
38#if defined (__STDC__) && __STDC__
39#include <stddef.h>
40#define __malloc_size_t size_t
41#else
42#define __malloc_size_t unsigned int
43#endif
44extern __malloc_size_t _bytes_used;
45extern int __malloc_extra_blocks;
46
7146af97 47#define max(A,B) ((A) > (B) ? (A) : (B))
b580578b 48#define min(A,B) ((A) < (B) ? (A) : (B))
7146af97
JB
49
50/* Macro to verify that storage intended for Lisp objects is not
51 out of range to fit in the space for a pointer.
52 ADDRESS is the start of the block, and SIZE
53 is the amount of space within which objects can start. */
54#define VALIDATE_LISP_STORAGE(address, size) \
55do \
56 { \
57 Lisp_Object val; \
45d12a89 58 XSETCONS (val, (char *) address + size); \
7146af97
JB
59 if ((char *) XCONS (val) != (char *) address + size) \
60 { \
9ac0d9e0 61 xfree (address); \
7146af97
JB
62 memory_full (); \
63 } \
64 } while (0)
65
276cbe5a
RS
66/* Value of _bytes_used, when spare_memory was freed. */
67static __malloc_size_t bytes_used_when_full;
68
7146af97
JB
69/* Number of bytes of consing done since the last gc */
70int consing_since_gc;
71
72/* Number of bytes of consing since gc before another gc should be done. */
b580578b 73int gc_cons_threshold;
7146af97
JB
74
75/* Nonzero during gc */
76int gc_in_progress;
77
78#ifndef VIRT_ADDR_VARIES
79extern
80#endif /* VIRT_ADDR_VARIES */
81 int malloc_sbrk_used;
82
83#ifndef VIRT_ADDR_VARIES
84extern
85#endif /* VIRT_ADDR_VARIES */
86 int malloc_sbrk_unused;
87
502b9b64
JB
88/* Two limits controlling how much undo information to keep. */
89int undo_limit;
90int undo_strong_limit;
7146af97 91
276cbe5a
RS
92/* Points to memory space allocated as "spare",
93 to be freed if we run out of memory. */
94static char *spare_memory;
95
96/* Amount of spare memory to keep in reserve. */
97#define SPARE_MEMORY (1 << 14)
98
99/* Number of extra blocks malloc should get when it needs more core. */
100static int malloc_hysteresis;
101
7146af97
JB
102/* Non-nil means defun should do purecopy on the function definition */
103Lisp_Object Vpurify_flag;
104
105#ifndef HAVE_SHM
42607681 106EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = {0,}; /* Force it into data space! */
7146af97
JB
107#define PUREBEG (char *) pure
108#else
109#define pure PURE_SEG_BITS /* Use shared memory segment */
110#define PUREBEG (char *)PURE_SEG_BITS
4c0be5f4
JB
111
112/* This variable is used only by the XPNTR macro when HAVE_SHM is
113 defined. If we used the PURESIZE macro directly there, that would
114 make most of emacs dependent on puresize.h, which we don't want -
115 you should be able to change that without too much recompilation.
116 So map_in_data initializes pure_size, and the dependencies work
117 out. */
42607681 118EMACS_INT pure_size;
7146af97
JB
119#endif /* not HAVE_SHM */
120
121/* Index in pure at which next pure object will be allocated. */
122int pureptr;
123
124/* If nonzero, this is a warning delivered by malloc and not yet displayed. */
125char *pending_malloc_warning;
126
bcb61d60 127/* Pre-computed signal argument for use when memory is exhausted. */
cf3540e4 128Lisp_Object memory_signal_data;
bcb61d60 129
7146af97
JB
130/* Maximum amount of C stack to save when a GC happens. */
131
132#ifndef MAX_SAVE_STACK
133#define MAX_SAVE_STACK 16000
134#endif
135
1fb577f7
KH
136/* Define DONT_COPY_FLAG to be some bit which will always be zero in a
137 pointer to a Lisp_Object, when that pointer is viewed as an integer.
138 (On most machines, pointers are even, so we can use the low bit.
139 Word-addressible architectures may need to override this in the m-file.)
140 When linking references to small strings through the size field, we
141 use this slot to hold the bit that would otherwise be interpreted as
142 the GC mark bit. */
155ffe9c 143#ifndef DONT_COPY_FLAG
1fb577f7 144#define DONT_COPY_FLAG 1
155ffe9c
RS
145#endif /* no DONT_COPY_FLAG */
146
7146af97
JB
147/* Buffer in which we save a copy of the C stack at each GC. */
148
149char *stack_copy;
150int stack_copy_size;
151
152/* Non-zero means ignore malloc warnings. Set during initialization. */
153int ignore_warnings;
350273a4 154
e8197642
RS
155Lisp_Object Qgc_cons_threshold;
156
b875d3f7 157static void mark_object (), mark_buffer (), mark_kboards ();
350273a4
JA
158static void clear_marks (), gc_sweep ();
159static void compact_strings ();
7146af97 160\f
1a4f1e2c
JB
161/* Versions of malloc and realloc that print warnings as memory gets full. */
162
7146af97
JB
163Lisp_Object
164malloc_warning_1 (str)
165 Lisp_Object str;
166{
167 Fprinc (str, Vstandard_output);
168 write_string ("\nKilling some buffers may delay running out of memory.\n", -1);
169 write_string ("However, certainly by the time you receive the 95% warning,\n", -1);
170 write_string ("you should clean up, kill this Emacs, and start a new one.", -1);
171 return Qnil;
172}
173
174/* malloc calls this if it finds we are near exhausting storage */
175malloc_warning (str)
176 char *str;
177{
178 pending_malloc_warning = str;
179}
180
181display_malloc_warning ()
182{
183 register Lisp_Object val;
184
185 val = build_string (pending_malloc_warning);
186 pending_malloc_warning = 0;
187 internal_with_output_to_temp_buffer (" *Danger*", malloc_warning_1, val);
188}
189
190/* Called if malloc returns zero */
276cbe5a 191
7146af97
JB
192memory_full ()
193{
276cbe5a
RS
194#ifndef SYSTEM_MALLOC
195 bytes_used_when_full = _bytes_used;
196#endif
197
198 /* The first time we get here, free the spare memory. */
199 if (spare_memory)
200 {
201 free (spare_memory);
202 spare_memory = 0;
203 }
204
205 /* This used to call error, but if we've run out of memory, we could get
206 infinite recursion trying to build the string. */
207 while (1)
208 Fsignal (Qerror, memory_signal_data);
209}
210
211/* Called if we can't allocate relocatable space for a buffer. */
212
213void
214buffer_memory_full ()
215{
216 /* If buffers use the relocating allocator,
217 no need to free spare_memory, because we may have plenty of malloc
218 space left that we could get, and if we don't, the malloc that fails
219 will itself cause spare_memory to be freed.
220 If buffers don't use the relocating allocator,
221 treat this like any other failing malloc. */
222
223#ifndef REL_ALLOC
224 memory_full ();
225#endif
226
bcb61d60
KH
227 /* This used to call error, but if we've run out of memory, we could get
228 infinite recursion trying to build the string. */
229 while (1)
230 Fsignal (Qerror, memory_signal_data);
7146af97
JB
231}
232
9ac0d9e0 233/* like malloc routines but check for no memory and block interrupt input. */
7146af97
JB
234
235long *
236xmalloc (size)
237 int size;
238{
239 register long *val;
240
9ac0d9e0 241 BLOCK_INPUT;
7146af97 242 val = (long *) malloc (size);
9ac0d9e0 243 UNBLOCK_INPUT;
7146af97
JB
244
245 if (!val && size) memory_full ();
246 return val;
247}
248
249long *
250xrealloc (block, size)
251 long *block;
252 int size;
253{
254 register long *val;
255
9ac0d9e0 256 BLOCK_INPUT;
56d2031b
JB
257 /* We must call malloc explicitly when BLOCK is 0, since some
258 reallocs don't do this. */
259 if (! block)
260 val = (long *) malloc (size);
f048679d 261 else
56d2031b 262 val = (long *) realloc (block, size);
9ac0d9e0 263 UNBLOCK_INPUT;
7146af97
JB
264
265 if (!val && size) memory_full ();
266 return val;
267}
9ac0d9e0
JB
268
269void
270xfree (block)
271 long *block;
272{
273 BLOCK_INPUT;
274 free (block);
275 UNBLOCK_INPUT;
276}
277
278\f
279/* Arranging to disable input signals while we're in malloc.
280
281 This only works with GNU malloc. To help out systems which can't
282 use GNU malloc, all the calls to malloc, realloc, and free
283 elsewhere in the code should be inside a BLOCK_INPUT/UNBLOCK_INPUT
284 pairs; unfortunately, we have no idea what C library functions
285 might call malloc, so we can't really protect them unless you're
286 using GNU malloc. Fortunately, most of the major operating can use
287 GNU malloc. */
288
289#ifndef SYSTEM_MALLOC
b0846f52
JB
290extern void * (*__malloc_hook) ();
291static void * (*old_malloc_hook) ();
292extern void * (*__realloc_hook) ();
293static void * (*old_realloc_hook) ();
294extern void (*__free_hook) ();
295static void (*old_free_hook) ();
9ac0d9e0 296
276cbe5a
RS
297/* This function is used as the hook for free to call. */
298
9ac0d9e0
JB
299static void
300emacs_blocked_free (ptr)
301 void *ptr;
302{
303 BLOCK_INPUT;
304 __free_hook = old_free_hook;
305 free (ptr);
276cbe5a
RS
306 /* If we released our reserve (due to running out of memory),
307 and we have a fair amount free once again,
308 try to set aside another reserve in case we run out once more. */
309 if (spare_memory == 0
310 /* Verify there is enough space that even with the malloc
311 hysteresis this call won't run out again.
312 The code here is correct as long as SPARE_MEMORY
313 is substantially larger than the block size malloc uses. */
314 && (bytes_used_when_full
315 > _bytes_used + max (malloc_hysteresis, 4) * SPARE_MEMORY))
316 spare_memory = (char *) malloc (SPARE_MEMORY);
317
b0846f52 318 __free_hook = emacs_blocked_free;
9ac0d9e0
JB
319 UNBLOCK_INPUT;
320}
321
276cbe5a
RS
322/* If we released our reserve (due to running out of memory),
323 and we have a fair amount free once again,
324 try to set aside another reserve in case we run out once more.
325
326 This is called when a relocatable block is freed in ralloc.c. */
327
328void
329refill_memory_reserve ()
330{
331 if (spare_memory == 0)
332 spare_memory = (char *) malloc (SPARE_MEMORY);
333}
334
335/* This function is the malloc hook that Emacs uses. */
336
9ac0d9e0
JB
337static void *
338emacs_blocked_malloc (size)
339 unsigned size;
340{
341 void *value;
342
343 BLOCK_INPUT;
344 __malloc_hook = old_malloc_hook;
276cbe5a 345 __malloc_extra_blocks = malloc_hysteresis;
2756d8ee 346 value = (void *) malloc (size);
b0846f52 347 __malloc_hook = emacs_blocked_malloc;
9ac0d9e0
JB
348 UNBLOCK_INPUT;
349
350 return value;
351}
352
353static void *
354emacs_blocked_realloc (ptr, size)
355 void *ptr;
356 unsigned size;
357{
358 void *value;
359
360 BLOCK_INPUT;
361 __realloc_hook = old_realloc_hook;
2756d8ee 362 value = (void *) realloc (ptr, size);
b0846f52 363 __realloc_hook = emacs_blocked_realloc;
9ac0d9e0
JB
364 UNBLOCK_INPUT;
365
366 return value;
367}
368
369void
370uninterrupt_malloc ()
371{
372 old_free_hook = __free_hook;
b0846f52 373 __free_hook = emacs_blocked_free;
9ac0d9e0
JB
374
375 old_malloc_hook = __malloc_hook;
b0846f52 376 __malloc_hook = emacs_blocked_malloc;
9ac0d9e0
JB
377
378 old_realloc_hook = __realloc_hook;
b0846f52 379 __realloc_hook = emacs_blocked_realloc;
9ac0d9e0
JB
380}
381#endif
7146af97 382\f
1a4f1e2c
JB
383/* Interval allocation. */
384
d5e35230
JA
385#ifdef USE_TEXT_PROPERTIES
386#define INTERVAL_BLOCK_SIZE \
387 ((1020 - sizeof (struct interval_block *)) / sizeof (struct interval))
388
389struct interval_block
390 {
391 struct interval_block *next;
392 struct interval intervals[INTERVAL_BLOCK_SIZE];
393 };
394
395struct interval_block *interval_block;
396static int interval_block_index;
397
398INTERVAL interval_free_list;
399
400static void
401init_intervals ()
402{
403 interval_block
404 = (struct interval_block *) malloc (sizeof (struct interval_block));
405 interval_block->next = 0;
406 bzero (interval_block->intervals, sizeof interval_block->intervals);
407 interval_block_index = 0;
408 interval_free_list = 0;
409}
410
411#define INIT_INTERVALS init_intervals ()
412
413INTERVAL
414make_interval ()
415{
416 INTERVAL val;
417
418 if (interval_free_list)
419 {
420 val = interval_free_list;
421 interval_free_list = interval_free_list->parent;
422 }
423 else
424 {
425 if (interval_block_index == INTERVAL_BLOCK_SIZE)
426 {
427 register struct interval_block *newi
9ac0d9e0 428 = (struct interval_block *) xmalloc (sizeof (struct interval_block));
d5e35230
JA
429
430 VALIDATE_LISP_STORAGE (newi, sizeof *newi);
431 newi->next = interval_block;
432 interval_block = newi;
433 interval_block_index = 0;
434 }
435 val = &interval_block->intervals[interval_block_index++];
436 }
437 consing_since_gc += sizeof (struct interval);
438 RESET_INTERVAL (val);
439 return val;
440}
441
442static int total_free_intervals, total_intervals;
443
444/* Mark the pointers of one interval. */
445
446static void
d393c068 447mark_interval (i, dummy)
d5e35230 448 register INTERVAL i;
d393c068 449 Lisp_Object dummy;
d5e35230
JA
450{
451 if (XMARKBIT (i->plist))
452 abort ();
453 mark_object (&i->plist);
454 XMARK (i->plist);
455}
456
457static void
458mark_interval_tree (tree)
459 register INTERVAL tree;
460{
e8720644
JB
461 /* No need to test if this tree has been marked already; this
462 function is always called through the MARK_INTERVAL_TREE macro,
463 which takes care of that. */
464
465 /* XMARK expands to an assignment; the LHS of an assignment can't be
466 a cast. */
467 XMARK (* (Lisp_Object *) &tree->parent);
d5e35230 468
d393c068 469 traverse_intervals (tree, 1, 0, mark_interval, Qnil);
d5e35230
JA
470}
471
e8720644
JB
472#define MARK_INTERVAL_TREE(i) \
473 do { \
474 if (!NULL_INTERVAL_P (i) \
475 && ! XMARKBIT ((Lisp_Object) i->parent)) \
476 mark_interval_tree (i); \
477 } while (0)
d5e35230 478
1a4f1e2c 479/* The oddity in the call to XUNMARK is necessary because XUNMARK
eb8c3be9 480 expands to an assignment to its argument, and most C compilers don't
1a4f1e2c
JB
481 support casts on the left operand of `='. */
482#define UNMARK_BALANCE_INTERVALS(i) \
483{ \
484 if (! NULL_INTERVAL_P (i)) \
485 { \
486 XUNMARK (* (Lisp_Object *) (&(i)->parent)); \
487 (i) = balance_intervals (i); \
488 } \
d5e35230
JA
489}
490
491#else /* no interval use */
492
493#define INIT_INTERVALS
494
495#define UNMARK_BALANCE_INTERVALS(i)
496#define MARK_INTERVAL_TREE(i)
497
498#endif /* no interval use */
499\f
1a4f1e2c
JB
500/* Floating point allocation. */
501
7146af97
JB
502#ifdef LISP_FLOAT_TYPE
503/* Allocation of float cells, just like conses */
504/* We store float cells inside of float_blocks, allocating a new
505 float_block with malloc whenever necessary. Float cells reclaimed by
506 GC are put on a free list to be reallocated before allocating
507 any new float cells from the latest float_block.
508
509 Each float_block is just under 1020 bytes long,
510 since malloc really allocates in units of powers of two
511 and uses 4 bytes for its own overhead. */
512
513#define FLOAT_BLOCK_SIZE \
514 ((1020 - sizeof (struct float_block *)) / sizeof (struct Lisp_Float))
515
516struct float_block
517 {
518 struct float_block *next;
519 struct Lisp_Float floats[FLOAT_BLOCK_SIZE];
520 };
521
522struct float_block *float_block;
523int float_block_index;
524
525struct Lisp_Float *float_free_list;
526
527void
528init_float ()
529{
530 float_block = (struct float_block *) malloc (sizeof (struct float_block));
531 float_block->next = 0;
532 bzero (float_block->floats, sizeof float_block->floats);
533 float_block_index = 0;
534 float_free_list = 0;
535}
536
537/* Explicitly free a float cell. */
538free_float (ptr)
539 struct Lisp_Float *ptr;
540{
85481507 541 *(struct Lisp_Float **)&ptr->type = float_free_list;
7146af97
JB
542 float_free_list = ptr;
543}
544
545Lisp_Object
546make_float (float_value)
547 double float_value;
548{
549 register Lisp_Object val;
550
551 if (float_free_list)
552 {
45d12a89 553 XSETFLOAT (val, float_free_list);
85481507 554 float_free_list = *(struct Lisp_Float **)&float_free_list->type;
7146af97
JB
555 }
556 else
557 {
558 if (float_block_index == FLOAT_BLOCK_SIZE)
559 {
9ac0d9e0 560 register struct float_block *new = (struct float_block *) xmalloc (sizeof (struct float_block));
7146af97
JB
561 VALIDATE_LISP_STORAGE (new, sizeof *new);
562 new->next = float_block;
563 float_block = new;
564 float_block_index = 0;
565 }
45d12a89 566 XSETFLOAT (val, &float_block->floats[float_block_index++]);
7146af97
JB
567 }
568 XFLOAT (val)->data = float_value;
67ba9986 569 XSETFASTINT (XFLOAT (val)->type, 0); /* bug chasing -wsr */
7146af97
JB
570 consing_since_gc += sizeof (struct Lisp_Float);
571 return val;
572}
573
574#endif /* LISP_FLOAT_TYPE */
575\f
576/* Allocation of cons cells */
577/* We store cons cells inside of cons_blocks, allocating a new
578 cons_block with malloc whenever necessary. Cons cells reclaimed by
579 GC are put on a free list to be reallocated before allocating
580 any new cons cells from the latest cons_block.
581
582 Each cons_block is just under 1020 bytes long,
583 since malloc really allocates in units of powers of two
584 and uses 4 bytes for its own overhead. */
585
586#define CONS_BLOCK_SIZE \
587 ((1020 - sizeof (struct cons_block *)) / sizeof (struct Lisp_Cons))
588
589struct cons_block
590 {
591 struct cons_block *next;
592 struct Lisp_Cons conses[CONS_BLOCK_SIZE];
593 };
594
595struct cons_block *cons_block;
596int cons_block_index;
597
598struct Lisp_Cons *cons_free_list;
599
600void
601init_cons ()
602{
603 cons_block = (struct cons_block *) malloc (sizeof (struct cons_block));
604 cons_block->next = 0;
605 bzero (cons_block->conses, sizeof cons_block->conses);
606 cons_block_index = 0;
607 cons_free_list = 0;
608}
609
610/* Explicitly free a cons cell. */
611free_cons (ptr)
612 struct Lisp_Cons *ptr;
613{
85481507 614 *(struct Lisp_Cons **)&ptr->car = cons_free_list;
7146af97
JB
615 cons_free_list = ptr;
616}
617
618DEFUN ("cons", Fcons, Scons, 2, 2, 0,
619 "Create a new cons, give it CAR and CDR as components, and return it.")
620 (car, cdr)
621 Lisp_Object car, cdr;
622{
623 register Lisp_Object val;
624
625 if (cons_free_list)
626 {
45d12a89 627 XSETCONS (val, cons_free_list);
85481507 628 cons_free_list = *(struct Lisp_Cons **)&cons_free_list->car;
7146af97
JB
629 }
630 else
631 {
632 if (cons_block_index == CONS_BLOCK_SIZE)
633 {
9ac0d9e0 634 register struct cons_block *new = (struct cons_block *) xmalloc (sizeof (struct cons_block));
7146af97
JB
635 VALIDATE_LISP_STORAGE (new, sizeof *new);
636 new->next = cons_block;
637 cons_block = new;
638 cons_block_index = 0;
639 }
45d12a89 640 XSETCONS (val, &cons_block->conses[cons_block_index++]);
7146af97
JB
641 }
642 XCONS (val)->car = car;
643 XCONS (val)->cdr = cdr;
644 consing_since_gc += sizeof (struct Lisp_Cons);
645 return val;
646}
647
648DEFUN ("list", Flist, Slist, 0, MANY, 0,
649 "Return a newly created list with specified arguments as elements.\n\
650Any number of arguments, even zero arguments, are allowed.")
651 (nargs, args)
652 int nargs;
653 register Lisp_Object *args;
654{
655 register Lisp_Object len, val, val_tail;
656
67ba9986 657 XSETFASTINT (len, nargs);
7146af97
JB
658 val = Fmake_list (len, Qnil);
659 val_tail = val;
265a9e55 660 while (!NILP (val_tail))
7146af97
JB
661 {
662 XCONS (val_tail)->car = *args++;
663 val_tail = XCONS (val_tail)->cdr;
664 }
665 return val;
666}
667
668DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
669 "Return a newly created list of length LENGTH, with each element being INIT.")
670 (length, init)
671 register Lisp_Object length, init;
672{
673 register Lisp_Object val;
674 register int size;
675
c9dad5ed
KH
676 CHECK_NATNUM (length, 0);
677 size = XFASTINT (length);
7146af97
JB
678
679 val = Qnil;
680 while (size-- > 0)
681 val = Fcons (init, val);
682 return val;
683}
684\f
685/* Allocation of vectors */
686
687struct Lisp_Vector *all_vectors;
688
1825c68d
KH
689struct Lisp_Vector *
690allocate_vectorlike (len)
691 EMACS_INT len;
692{
693 struct Lisp_Vector *p;
694
695 p = (struct Lisp_Vector *)xmalloc (sizeof (struct Lisp_Vector)
696 + (len - 1) * sizeof (Lisp_Object));
697 VALIDATE_LISP_STORAGE (p, 0);
698 consing_since_gc += (sizeof (struct Lisp_Vector)
699 + (len - 1) * sizeof (Lisp_Object));
700
701 p->next = all_vectors;
702 all_vectors = p;
703 return p;
704}
705
7146af97
JB
706DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
707 "Return a newly created vector of length LENGTH, with each element being INIT.\n\
708See also the function `vector'.")
709 (length, init)
710 register Lisp_Object length, init;
711{
1825c68d
KH
712 Lisp_Object vector;
713 register EMACS_INT sizei;
714 register int index;
7146af97
JB
715 register struct Lisp_Vector *p;
716
c9dad5ed
KH
717 CHECK_NATNUM (length, 0);
718 sizei = XFASTINT (length);
7146af97 719
1825c68d 720 p = allocate_vectorlike (sizei);
7146af97 721 p->size = sizei;
7146af97
JB
722 for (index = 0; index < sizei; index++)
723 p->contents[index] = init;
724
1825c68d 725 XSETVECTOR (vector, p);
7146af97
JB
726 return vector;
727}
728
729DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
730 "Return a newly created vector with specified arguments as elements.\n\
731Any number of arguments, even zero arguments, are allowed.")
732 (nargs, args)
733 register int nargs;
734 Lisp_Object *args;
735{
736 register Lisp_Object len, val;
737 register int index;
738 register struct Lisp_Vector *p;
739
67ba9986 740 XSETFASTINT (len, nargs);
7146af97
JB
741 val = Fmake_vector (len, Qnil);
742 p = XVECTOR (val);
743 for (index = 0; index < nargs; index++)
744 p->contents[index] = args[index];
745 return val;
746}
747
748DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
749 "Create a byte-code object with specified arguments as elements.\n\
750The arguments should be the arglist, bytecode-string, constant vector,\n\
751stack size, (optional) doc string, and (optional) interactive spec.\n\
752The first four arguments are required; at most six have any\n\
753significance.")
754 (nargs, args)
755 register int nargs;
756 Lisp_Object *args;
757{
758 register Lisp_Object len, val;
759 register int index;
760 register struct Lisp_Vector *p;
761
67ba9986 762 XSETFASTINT (len, nargs);
265a9e55 763 if (!NILP (Vpurify_flag))
7146af97
JB
764 val = make_pure_vector (len);
765 else
766 val = Fmake_vector (len, Qnil);
767 p = XVECTOR (val);
768 for (index = 0; index < nargs; index++)
769 {
265a9e55 770 if (!NILP (Vpurify_flag))
7146af97
JB
771 args[index] = Fpurecopy (args[index]);
772 p->contents[index] = args[index];
773 }
169ee243 774 XSETCOMPILED (val, val);
7146af97
JB
775 return val;
776}
777\f
778/* Allocation of symbols.
779 Just like allocation of conses!
780
781 Each symbol_block is just under 1020 bytes long,
782 since malloc really allocates in units of powers of two
783 and uses 4 bytes for its own overhead. */
784
785#define SYMBOL_BLOCK_SIZE \
786 ((1020 - sizeof (struct symbol_block *)) / sizeof (struct Lisp_Symbol))
787
788struct symbol_block
789 {
790 struct symbol_block *next;
791 struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
792 };
793
794struct symbol_block *symbol_block;
795int symbol_block_index;
796
797struct Lisp_Symbol *symbol_free_list;
798
799void
800init_symbol ()
801{
802 symbol_block = (struct symbol_block *) malloc (sizeof (struct symbol_block));
803 symbol_block->next = 0;
804 bzero (symbol_block->symbols, sizeof symbol_block->symbols);
805 symbol_block_index = 0;
806 symbol_free_list = 0;
807}
808
809DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
810 "Return a newly allocated uninterned symbol whose name is NAME.\n\
811Its value and function definition are void, and its property list is nil.")
812 (str)
813 Lisp_Object str;
814{
815 register Lisp_Object val;
816 register struct Lisp_Symbol *p;
817
818 CHECK_STRING (str, 0);
819
820 if (symbol_free_list)
821 {
45d12a89 822 XSETSYMBOL (val, symbol_free_list);
85481507 823 symbol_free_list = *(struct Lisp_Symbol **)&symbol_free_list->value;
7146af97
JB
824 }
825 else
826 {
827 if (symbol_block_index == SYMBOL_BLOCK_SIZE)
828 {
9ac0d9e0 829 struct symbol_block *new = (struct symbol_block *) xmalloc (sizeof (struct symbol_block));
7146af97
JB
830 VALIDATE_LISP_STORAGE (new, sizeof *new);
831 new->next = symbol_block;
832 symbol_block = new;
833 symbol_block_index = 0;
834 }
45d12a89 835 XSETSYMBOL (val, &symbol_block->symbols[symbol_block_index++]);
7146af97
JB
836 }
837 p = XSYMBOL (val);
838 p->name = XSTRING (str);
839 p->plist = Qnil;
840 p->value = Qunbound;
841 p->function = Qunbound;
842 p->next = 0;
843 consing_since_gc += sizeof (struct Lisp_Symbol);
844 return val;
845}
846\f
a0a38eb7 847/* Allocation of markers and other objects that share that structure.
7146af97
JB
848 Works like allocation of conses. */
849
850#define MARKER_BLOCK_SIZE \
a0a38eb7 851 ((1020 - sizeof (struct marker_block *)) / sizeof (union Lisp_Misc))
7146af97
JB
852
853struct marker_block
854 {
855 struct marker_block *next;
a0a38eb7 856 union Lisp_Misc markers[MARKER_BLOCK_SIZE];
7146af97
JB
857 };
858
859struct marker_block *marker_block;
860int marker_block_index;
861
a0a38eb7 862union Lisp_Misc *marker_free_list;
7146af97
JB
863
864void
865init_marker ()
866{
867 marker_block = (struct marker_block *) malloc (sizeof (struct marker_block));
868 marker_block->next = 0;
869 bzero (marker_block->markers, sizeof marker_block->markers);
870 marker_block_index = 0;
871 marker_free_list = 0;
872}
873
a0a38eb7
KH
874/* Return a newly allocated Lisp_Misc object, with no substructure. */
875Lisp_Object
876allocate_misc ()
7146af97 877{
a0a38eb7 878 Lisp_Object val;
e065a56e 879
7146af97
JB
880 if (marker_free_list)
881 {
a0a38eb7
KH
882 XSETMISC (val, marker_free_list);
883 marker_free_list = marker_free_list->u_free.chain;
7146af97
JB
884 }
885 else
886 {
887 if (marker_block_index == MARKER_BLOCK_SIZE)
888 {
a0a38eb7
KH
889 struct marker_block *new
890 = (struct marker_block *) xmalloc (sizeof (struct marker_block));
7146af97
JB
891 VALIDATE_LISP_STORAGE (new, sizeof *new);
892 new->next = marker_block;
893 marker_block = new;
894 marker_block_index = 0;
895 }
a0a38eb7 896 XSETMISC (val, &marker_block->markers[marker_block_index++]);
7146af97 897 }
a0a38eb7
KH
898 consing_since_gc += sizeof (union Lisp_Misc);
899 return val;
900}
901
902DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
903 "Return a newly allocated marker which does not point at any place.")
904 ()
905{
906 register Lisp_Object val;
907 register struct Lisp_Marker *p;
908
909 val = allocate_misc ();
a5da44fe 910 XMISCTYPE (val) = Lisp_Misc_Marker;
7146af97
JB
911 p = XMARKER (val);
912 p->buffer = 0;
913 p->bufpos = 0;
914 p->chain = Qnil;
7146af97
JB
915 return val;
916}
917\f
918/* Allocation of strings */
919
920/* Strings reside inside of string_blocks. The entire data of the string,
921 both the size and the contents, live in part of the `chars' component of a string_block.
922 The `pos' component is the index within `chars' of the first free byte.
923
924 first_string_block points to the first string_block ever allocated.
925 Each block points to the next one with its `next' field.
926 The `prev' fields chain in reverse order.
927 The last one allocated is the one currently being filled.
928 current_string_block points to it.
929
930 The string_blocks that hold individual large strings
931 go in a separate chain, started by large_string_blocks. */
932
933
934/* String blocks contain this many useful bytes.
935 8188 is power of 2, minus 4 for malloc overhead. */
936#define STRING_BLOCK_SIZE (8188 - sizeof (struct string_block_head))
937
938/* A string bigger than this gets its own specially-made string block
939 if it doesn't fit in the current one. */
940#define STRING_BLOCK_OUTSIZE 1024
941
942struct string_block_head
943 {
944 struct string_block *next, *prev;
945 int pos;
946 };
947
948struct string_block
949 {
950 struct string_block *next, *prev;
42607681 951 EMACS_INT pos;
7146af97
JB
952 char chars[STRING_BLOCK_SIZE];
953 };
954
955/* This points to the string block we are now allocating strings. */
956
957struct string_block *current_string_block;
958
959/* This points to the oldest string block, the one that starts the chain. */
960
961struct string_block *first_string_block;
962
963/* Last string block in chain of those made for individual large strings. */
964
965struct string_block *large_string_blocks;
966
967/* If SIZE is the length of a string, this returns how many bytes
968 the string occupies in a string_block (including padding). */
969
970#define STRING_FULLSIZE(size) (((size) + sizeof (struct Lisp_String) + PAD) \
971 & ~(PAD - 1))
42607681 972#define PAD (sizeof (EMACS_INT))
7146af97
JB
973
974#if 0
975#define STRING_FULLSIZE(SIZE) \
42607681 976(((SIZE) + 2 * sizeof (EMACS_INT)) & ~(sizeof (EMACS_INT) - 1))
7146af97
JB
977#endif
978
979void
980init_strings ()
981{
982 current_string_block = (struct string_block *) malloc (sizeof (struct string_block));
983 first_string_block = current_string_block;
984 consing_since_gc += sizeof (struct string_block);
985 current_string_block->next = 0;
986 current_string_block->prev = 0;
987 current_string_block->pos = 0;
988 large_string_blocks = 0;
989}
990
991DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
992 "Return a newly created string of length LENGTH, with each element being INIT.\n\
993Both LENGTH and INIT must be numbers.")
994 (length, init)
995 Lisp_Object length, init;
996{
997 register Lisp_Object val;
998 register unsigned char *p, *end, c;
999
c9dad5ed 1000 CHECK_NATNUM (length, 0);
7146af97 1001 CHECK_NUMBER (init, 1);
c9dad5ed 1002 val = make_uninit_string (XFASTINT (length));
7146af97
JB
1003 c = XINT (init);
1004 p = XSTRING (val)->data;
1005 end = p + XSTRING (val)->size;
1006 while (p != end)
1007 *p++ = c;
1008 *p = 0;
1009 return val;
1010}
1011
1012Lisp_Object
1013make_string (contents, length)
1014 char *contents;
1015 int length;
1016{
1017 register Lisp_Object val;
1018 val = make_uninit_string (length);
1019 bcopy (contents, XSTRING (val)->data, length);
1020 return val;
1021}
1022
1023Lisp_Object
1024build_string (str)
1025 char *str;
1026{
1027 return make_string (str, strlen (str));
1028}
1029
1030Lisp_Object
1031make_uninit_string (length)
1032 int length;
1033{
1034 register Lisp_Object val;
1035 register int fullsize = STRING_FULLSIZE (length);
1036
1037 if (length < 0) abort ();
1038
1039 if (fullsize <= STRING_BLOCK_SIZE - current_string_block->pos)
1040 /* This string can fit in the current string block */
1041 {
45d12a89
KH
1042 XSETSTRING (val,
1043 ((struct Lisp_String *)
1044 (current_string_block->chars + current_string_block->pos)));
7146af97
JB
1045 current_string_block->pos += fullsize;
1046 }
1047 else if (fullsize > STRING_BLOCK_OUTSIZE)
1048 /* This string gets its own string block */
1049 {
1050 register struct string_block *new
9ac0d9e0 1051 = (struct string_block *) xmalloc (sizeof (struct string_block_head) + fullsize);
7146af97 1052 VALIDATE_LISP_STORAGE (new, 0);
7146af97
JB
1053 consing_since_gc += sizeof (struct string_block_head) + fullsize;
1054 new->pos = fullsize;
1055 new->next = large_string_blocks;
1056 large_string_blocks = new;
45d12a89
KH
1057 XSETSTRING (val,
1058 ((struct Lisp_String *)
1059 ((struct string_block_head *)new + 1)));
7146af97
JB
1060 }
1061 else
1062 /* Make a new current string block and start it off with this string */
1063 {
1064 register struct string_block *new
9ac0d9e0 1065 = (struct string_block *) xmalloc (sizeof (struct string_block));
7146af97
JB
1066 VALIDATE_LISP_STORAGE (new, sizeof *new);
1067 consing_since_gc += sizeof (struct string_block);
1068 current_string_block->next = new;
1069 new->prev = current_string_block;
1070 new->next = 0;
1071 current_string_block = new;
1072 new->pos = fullsize;
45d12a89
KH
1073 XSETSTRING (val,
1074 (struct Lisp_String *) current_string_block->chars);
7146af97
JB
1075 }
1076
1077 XSTRING (val)->size = length;
1078 XSTRING (val)->data[length] = 0;
d5e35230 1079 INITIALIZE_INTERVAL (XSTRING (val), NULL_INTERVAL);
7146af97
JB
1080
1081 return val;
1082}
1083
1084/* Return a newly created vector or string with specified arguments as
736471d1
RS
1085 elements. If all the arguments are characters that can fit
1086 in a string of events, make a string; otherwise, make a vector.
1087
1088 Any number of arguments, even zero arguments, are allowed. */
7146af97
JB
1089
1090Lisp_Object
736471d1 1091make_event_array (nargs, args)
7146af97
JB
1092 register int nargs;
1093 Lisp_Object *args;
1094{
1095 int i;
1096
1097 for (i = 0; i < nargs; i++)
736471d1 1098 /* The things that fit in a string
c9ca4659
RS
1099 are characters that are in 0...127,
1100 after discarding the meta bit and all the bits above it. */
e687453f 1101 if (!INTEGERP (args[i])
c9ca4659 1102 || (XUINT (args[i]) & ~(-CHAR_META)) >= 0200)
7146af97
JB
1103 return Fvector (nargs, args);
1104
1105 /* Since the loop exited, we know that all the things in it are
1106 characters, so we can make a string. */
1107 {
c13ccad2 1108 Lisp_Object result;
7146af97 1109
c13ccad2 1110 result = Fmake_string (nargs, make_number (0));
7146af97 1111 for (i = 0; i < nargs; i++)
736471d1
RS
1112 {
1113 XSTRING (result)->data[i] = XINT (args[i]);
1114 /* Move the meta bit to the right place for a string char. */
1115 if (XINT (args[i]) & CHAR_META)
1116 XSTRING (result)->data[i] |= 0x80;
1117 }
7146af97
JB
1118
1119 return result;
1120 }
1121}
1122\f
1a4f1e2c
JB
1123/* Pure storage management. */
1124
7146af97
JB
1125/* Must get an error if pure storage is full,
1126 since if it cannot hold a large string
1127 it may be able to hold conses that point to that string;
1128 then the string is not protected from gc. */
1129
1130Lisp_Object
1131make_pure_string (data, length)
1132 char *data;
1133 int length;
1134{
1135 register Lisp_Object new;
42607681 1136 register int size = sizeof (EMACS_INT) + INTERVAL_PTR_SIZE + length + 1;
7146af97
JB
1137
1138 if (pureptr + size > PURESIZE)
1139 error ("Pure Lisp storage exhausted");
45d12a89 1140 XSETSTRING (new, PUREBEG + pureptr);
7146af97
JB
1141 XSTRING (new)->size = length;
1142 bcopy (data, XSTRING (new)->data, length);
1143 XSTRING (new)->data[length] = 0;
06c5fe00
RS
1144
1145 /* We must give strings in pure storage some kind of interval. So we
1146 give them a null one. */
1147#if defined (USE_TEXT_PROPERTIES)
1148 XSTRING (new)->intervals = NULL_INTERVAL;
1149#endif
42607681
RS
1150 pureptr += (size + sizeof (EMACS_INT) - 1)
1151 / sizeof (EMACS_INT) * sizeof (EMACS_INT);
7146af97
JB
1152 return new;
1153}
1154
1155Lisp_Object
1156pure_cons (car, cdr)
1157 Lisp_Object car, cdr;
1158{
1159 register Lisp_Object new;
1160
1161 if (pureptr + sizeof (struct Lisp_Cons) > PURESIZE)
1162 error ("Pure Lisp storage exhausted");
45d12a89 1163 XSETCONS (new, PUREBEG + pureptr);
7146af97
JB
1164 pureptr += sizeof (struct Lisp_Cons);
1165 XCONS (new)->car = Fpurecopy (car);
1166 XCONS (new)->cdr = Fpurecopy (cdr);
1167 return new;
1168}
1169
1170#ifdef LISP_FLOAT_TYPE
1171
1172Lisp_Object
1173make_pure_float (num)
1174 double num;
1175{
1176 register Lisp_Object new;
1177
6d19f28a
JB
1178 /* Make sure that PUREBEG + pureptr is aligned on at least a sizeof
1179 (double) boundary. Some architectures (like the sparc) require
1180 this, and I suspect that floats are rare enough that it's no
1181 tragedy for those that do. */
1182 {
1183 int alignment;
1184 char *p = PUREBEG + pureptr;
1185
fe90ad97
JB
1186#ifdef __GNUC__
1187#if __GNUC__ >= 2
6d19f28a 1188 alignment = __alignof (struct Lisp_Float);
fe90ad97 1189#else
6d19f28a 1190 alignment = sizeof (struct Lisp_Float);
fe90ad97
JB
1191#endif
1192#else
6d19f28a 1193 alignment = sizeof (struct Lisp_Float);
fe90ad97 1194#endif
6d19f28a
JB
1195 p = (char *) (((unsigned long) p + alignment - 1) & - alignment);
1196 pureptr = p - PUREBEG;
1197 }
1a4f1e2c 1198
7146af97
JB
1199 if (pureptr + sizeof (struct Lisp_Float) > PURESIZE)
1200 error ("Pure Lisp storage exhausted");
45d12a89 1201 XSETFLOAT (new, PUREBEG + pureptr);
7146af97
JB
1202 pureptr += sizeof (struct Lisp_Float);
1203 XFLOAT (new)->data = num;
67ba9986 1204 XSETFASTINT (XFLOAT (new)->type, 0); /* bug chasing -wsr */
7146af97
JB
1205 return new;
1206}
1207
1208#endif /* LISP_FLOAT_TYPE */
1209
1210Lisp_Object
1211make_pure_vector (len)
42607681 1212 EMACS_INT len;
7146af97
JB
1213{
1214 register Lisp_Object new;
42607681 1215 register EMACS_INT size = sizeof (struct Lisp_Vector) + (len - 1) * sizeof (Lisp_Object);
7146af97
JB
1216
1217 if (pureptr + size > PURESIZE)
1218 error ("Pure Lisp storage exhausted");
1219
45d12a89 1220 XSETVECTOR (new, PUREBEG + pureptr);
7146af97
JB
1221 pureptr += size;
1222 XVECTOR (new)->size = len;
1223 return new;
1224}
1225
1226DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
1227 "Make a copy of OBJECT in pure storage.\n\
1228Recursively copies contents of vectors and cons cells.\n\
1229Does not copy symbols.")
1230 (obj)
1231 register Lisp_Object obj;
1232{
265a9e55 1233 if (NILP (Vpurify_flag))
7146af97
JB
1234 return obj;
1235
1236 if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE)
1237 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
1238 return obj;
1239
d6dd74bb
KH
1240 if (CONSP (obj))
1241 return pure_cons (XCONS (obj)->car, XCONS (obj)->cdr);
7146af97 1242#ifdef LISP_FLOAT_TYPE
d6dd74bb
KH
1243 else if (FLOATP (obj))
1244 return make_pure_float (XFLOAT (obj)->data);
7146af97 1245#endif /* LISP_FLOAT_TYPE */
d6dd74bb
KH
1246 else if (STRINGP (obj))
1247 return make_pure_string (XSTRING (obj)->data, XSTRING (obj)->size);
1248 else if (COMPILEDP (obj) || VECTORP (obj))
1249 {
1250 register struct Lisp_Vector *vec;
1251 register int i, size;
1252
1253 size = XVECTOR (obj)->size;
7d535c68
KH
1254 if (size & PSEUDOVECTOR_FLAG)
1255 size &= PSEUDOVECTOR_SIZE_MASK;
d6dd74bb
KH
1256 vec = XVECTOR (make_pure_vector (size));
1257 for (i = 0; i < size; i++)
1258 vec->contents[i] = Fpurecopy (XVECTOR (obj)->contents[i]);
1259 if (COMPILEDP (obj))
1260 XSETCOMPILED (obj, vec);
1261 else
1262 XSETVECTOR (obj, vec);
7146af97
JB
1263 return obj;
1264 }
d6dd74bb
KH
1265 else if (MARKERP (obj))
1266 error ("Attempt to copy a marker to pure storage");
1267 else
1268 return obj;
7146af97
JB
1269}
1270\f
1271/* Recording what needs to be marked for gc. */
1272
1273struct gcpro *gcprolist;
1274
4cb7d267 1275#define NSTATICS 768
7146af97
JB
1276
1277Lisp_Object *staticvec[NSTATICS] = {0};
1278
1279int staticidx = 0;
1280
1281/* Put an entry in staticvec, pointing at the variable whose address is given */
1282
1283void
1284staticpro (varaddress)
1285 Lisp_Object *varaddress;
1286{
1287 staticvec[staticidx++] = varaddress;
1288 if (staticidx >= NSTATICS)
1289 abort ();
1290}
1291
1292struct catchtag
1293 {
1294 Lisp_Object tag;
1295 Lisp_Object val;
1296 struct catchtag *next;
1297/* jmp_buf jmp; /* We don't need this for GC purposes */
1298 };
1299
1300struct backtrace
1301 {
1302 struct backtrace *next;
1303 Lisp_Object *function;
1304 Lisp_Object *args; /* Points to vector of args. */
1305 int nargs; /* length of vector */
1306 /* if nargs is UNEVALLED, args points to slot holding list of unevalled args */
1307 char evalargs;
1308 };
7146af97 1309\f
1a4f1e2c
JB
1310/* Garbage collection! */
1311
7146af97
JB
1312int total_conses, total_markers, total_symbols, total_string_size, total_vector_size;
1313int total_free_conses, total_free_markers, total_free_symbols;
1314#ifdef LISP_FLOAT_TYPE
1315int total_free_floats, total_floats;
1316#endif /* LISP_FLOAT_TYPE */
1317
e8197642
RS
1318/* Temporarily prevent garbage collection. */
1319
1320int
1321inhibit_garbage_collection ()
1322{
1323 int count = specpdl_ptr - specpdl;
26b926e1 1324 Lisp_Object number;
b580578b 1325 int nbits = min (VALBITS, INTBITS);
e8197642 1326
b580578b 1327 XSETINT (number, ((EMACS_INT) 1 << (nbits - 1)) - 1);
26b926e1
RS
1328
1329 specbind (Qgc_cons_threshold, number);
e8197642
RS
1330
1331 return count;
1332}
1333
7146af97
JB
1334DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
1335 "Reclaim storage for Lisp objects no longer needed.\n\
1336Returns info on amount of space in use:\n\
1337 ((USED-CONSES . FREE-CONSES) (USED-SYMS . FREE-SYMS)\n\
1338 (USED-MARKERS . FREE-MARKERS) USED-STRING-CHARS USED-VECTOR-SLOTS\n\
1339 (USED-FLOATS . FREE-FLOATS))\n\
1340Garbage collection happens automatically if you cons more than\n\
1341`gc-cons-threshold' bytes of Lisp data since previous garbage collection.")
1342 ()
1343{
1344 register struct gcpro *tail;
1345 register struct specbinding *bind;
1346 struct catchtag *catch;
1347 struct handler *handler;
1348 register struct backtrace *backlist;
1349 register Lisp_Object tem;
1350 char *omessage = echo_area_glyphs;
51056d11 1351 int omessage_length = echo_area_glyphs_length;
7146af97
JB
1352 char stack_top_variable;
1353 register int i;
1354
7146af97
JB
1355 /* Save a copy of the contents of the stack, for debugging. */
1356#if MAX_SAVE_STACK > 0
265a9e55 1357 if (NILP (Vpurify_flag))
7146af97
JB
1358 {
1359 i = &stack_top_variable - stack_bottom;
1360 if (i < 0) i = -i;
1361 if (i < MAX_SAVE_STACK)
1362 {
1363 if (stack_copy == 0)
9ac0d9e0 1364 stack_copy = (char *) xmalloc (stack_copy_size = i);
7146af97 1365 else if (stack_copy_size < i)
9ac0d9e0 1366 stack_copy = (char *) xrealloc (stack_copy, (stack_copy_size = i));
7146af97
JB
1367 if (stack_copy)
1368 {
42607681 1369 if ((EMACS_INT) (&stack_top_variable - stack_bottom) > 0)
7146af97
JB
1370 bcopy (stack_bottom, stack_copy, i);
1371 else
1372 bcopy (&stack_top_variable, stack_copy, i);
1373 }
1374 }
1375 }
1376#endif /* MAX_SAVE_STACK > 0 */
1377
1378 if (!noninteractive)
691c4285 1379 message1_nolog ("Garbage collecting...");
7146af97
JB
1380
1381 /* Don't keep command history around forever */
1382 tem = Fnthcdr (make_number (30), Vcommand_history);
1383 if (CONSP (tem))
1384 XCONS (tem)->cdr = Qnil;
ffd56f97 1385
7146af97
JB
1386 /* Likewise for undo information. */
1387 {
1388 register struct buffer *nextb = all_buffers;
1389
1390 while (nextb)
1391 {
ffd56f97
JB
1392 /* If a buffer's undo list is Qt, that means that undo is
1393 turned off in that buffer. Calling truncate_undo_list on
1394 Qt tends to return NULL, which effectively turns undo back on.
1395 So don't call truncate_undo_list if undo_list is Qt. */
1396 if (! EQ (nextb->undo_list, Qt))
1397 nextb->undo_list
502b9b64
JB
1398 = truncate_undo_list (nextb->undo_list, undo_limit,
1399 undo_strong_limit);
7146af97
JB
1400 nextb = nextb->next;
1401 }
1402 }
1403
1404 gc_in_progress = 1;
1405
1406/* clear_marks (); */
1407
1408 /* In each "large string", set the MARKBIT of the size field.
1409 That enables mark_object to recognize them. */
1410 {
1411 register struct string_block *b;
1412 for (b = large_string_blocks; b; b = b->next)
1413 ((struct Lisp_String *)(&b->chars[0]))->size |= MARKBIT;
1414 }
1415
1416 /* Mark all the special slots that serve as the roots of accessibility.
1417
1418 Usually the special slots to mark are contained in particular structures.
1419 Then we know no slot is marked twice because the structures don't overlap.
1420 In some cases, the structures point to the slots to be marked.
1421 For these, we use MARKBIT to avoid double marking of the slot. */
1422
1423 for (i = 0; i < staticidx; i++)
1424 mark_object (staticvec[i]);
1425 for (tail = gcprolist; tail; tail = tail->next)
1426 for (i = 0; i < tail->nvars; i++)
1427 if (!XMARKBIT (tail->var[i]))
1428 {
1429 mark_object (&tail->var[i]);
1430 XMARK (tail->var[i]);
1431 }
1432 for (bind = specpdl; bind != specpdl_ptr; bind++)
1433 {
1434 mark_object (&bind->symbol);
1435 mark_object (&bind->old_value);
1436 }
1437 for (catch = catchlist; catch; catch = catch->next)
1438 {
1439 mark_object (&catch->tag);
1440 mark_object (&catch->val);
1441 }
1442 for (handler = handlerlist; handler; handler = handler->next)
1443 {
1444 mark_object (&handler->handler);
1445 mark_object (&handler->var);
1446 }
1447 for (backlist = backtrace_list; backlist; backlist = backlist->next)
1448 {
1449 if (!XMARKBIT (*backlist->function))
1450 {
1451 mark_object (backlist->function);
1452 XMARK (*backlist->function);
1453 }
1454 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
1455 i = 0;
1456 else
1457 i = backlist->nargs - 1;
1458 for (; i >= 0; i--)
1459 if (!XMARKBIT (backlist->args[i]))
1460 {
1461 mark_object (&backlist->args[i]);
1462 XMARK (backlist->args[i]);
1463 }
1464 }
b875d3f7 1465 mark_kboards ();
7146af97
JB
1466
1467 gc_sweep ();
1468
1469 /* Clear the mark bits that we set in certain root slots. */
1470
1471 for (tail = gcprolist; tail; tail = tail->next)
1472 for (i = 0; i < tail->nvars; i++)
1473 XUNMARK (tail->var[i]);
1474 for (backlist = backtrace_list; backlist; backlist = backlist->next)
1475 {
1476 XUNMARK (*backlist->function);
1477 if (backlist->nargs == UNEVALLED || backlist->nargs == MANY)
1478 i = 0;
1479 else
1480 i = backlist->nargs - 1;
1481 for (; i >= 0; i--)
1482 XUNMARK (backlist->args[i]);
1483 }
1484 XUNMARK (buffer_defaults.name);
1485 XUNMARK (buffer_local_symbols.name);
1486
1487/* clear_marks (); */
1488 gc_in_progress = 0;
1489
1490 consing_since_gc = 0;
1491 if (gc_cons_threshold < 10000)
1492 gc_cons_threshold = 10000;
1493
7d385b05 1494 if (omessage || minibuf_level > 0)
691c4285 1495 message2_nolog (omessage, omessage_length);
7146af97 1496 else if (!noninteractive)
691c4285 1497 message1_nolog ("Garbage collecting...done");
7146af97 1498
7146af97
JB
1499 return Fcons (Fcons (make_number (total_conses),
1500 make_number (total_free_conses)),
1501 Fcons (Fcons (make_number (total_symbols),
1502 make_number (total_free_symbols)),
1503 Fcons (Fcons (make_number (total_markers),
1504 make_number (total_free_markers)),
1505 Fcons (make_number (total_string_size),
1506 Fcons (make_number (total_vector_size),
1507
1508#ifdef LISP_FLOAT_TYPE
1509 Fcons (Fcons (make_number (total_floats),
1510 make_number (total_free_floats)),
1511 Qnil)
1512#else /* not LISP_FLOAT_TYPE */
1513 Qnil
1514#endif /* not LISP_FLOAT_TYPE */
1515 )))));
1516}
1517\f
1518#if 0
1519static void
1520clear_marks ()
1521{
1522 /* Clear marks on all conses */
1523 {
1524 register struct cons_block *cblk;
1525 register int lim = cons_block_index;
1526
1527 for (cblk = cons_block; cblk; cblk = cblk->next)
1528 {
1529 register int i;
1530 for (i = 0; i < lim; i++)
1531 XUNMARK (cblk->conses[i].car);
1532 lim = CONS_BLOCK_SIZE;
1533 }
1534 }
1535 /* Clear marks on all symbols */
1536 {
1537 register struct symbol_block *sblk;
1538 register int lim = symbol_block_index;
1539
1540 for (sblk = symbol_block; sblk; sblk = sblk->next)
1541 {
1542 register int i;
1543 for (i = 0; i < lim; i++)
1544 {
1545 XUNMARK (sblk->symbols[i].plist);
1546 }
1547 lim = SYMBOL_BLOCK_SIZE;
1548 }
1549 }
1550 /* Clear marks on all markers */
1551 {
1552 register struct marker_block *sblk;
1553 register int lim = marker_block_index;
1554
1555 for (sblk = marker_block; sblk; sblk = sblk->next)
1556 {
1557 register int i;
1558 for (i = 0; i < lim; i++)
a5da44fe 1559 if (sblk->markers[i].u_marker.type == Lisp_Misc_Marker)
a0a38eb7 1560 XUNMARK (sblk->markers[i].u_marker.chain);
7146af97
JB
1561 lim = MARKER_BLOCK_SIZE;
1562 }
1563 }
1564 /* Clear mark bits on all buffers */
1565 {
1566 register struct buffer *nextb = all_buffers;
1567
1568 while (nextb)
1569 {
1570 XUNMARK (nextb->name);
1571 nextb = nextb->next;
1572 }
1573 }
1574}
1575#endif
1576\f
1a4f1e2c
JB
1577/* Mark reference to a Lisp_Object.
1578 If the object referred to has not been seen yet, recursively mark
1579 all the references contained in it.
7146af97 1580
eb8c3be9 1581 If the object referenced is a short string, the referencing slot
7146af97
JB
1582 is threaded into a chain of such slots, pointed to from
1583 the `size' field of the string. The actual string size
1584 lives in the last slot in the chain. We recognize the end
1585 because it is < (unsigned) STRING_BLOCK_SIZE. */
1586
785cd37f
RS
1587#define LAST_MARKED_SIZE 500
1588Lisp_Object *last_marked[LAST_MARKED_SIZE];
1589int last_marked_index;
1590
7146af97
JB
1591static void
1592mark_object (objptr)
1593 Lisp_Object *objptr;
1594{
1595 register Lisp_Object obj;
1596
9149e743 1597 loop:
7146af97 1598 obj = *objptr;
9149e743 1599 loop2:
7146af97
JB
1600 XUNMARK (obj);
1601
7146af97
JB
1602 if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE)
1603 && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
1604 return;
1605
785cd37f
RS
1606 last_marked[last_marked_index++] = objptr;
1607 if (last_marked_index == LAST_MARKED_SIZE)
1608 last_marked_index = 0;
1609
0220c518 1610 switch (SWITCH_ENUM_CAST (XGCTYPE (obj)))
7146af97
JB
1611 {
1612 case Lisp_String:
1613 {
1614 register struct Lisp_String *ptr = XSTRING (obj);
1615
d5e35230 1616 MARK_INTERVAL_TREE (ptr->intervals);
7146af97
JB
1617 if (ptr->size & MARKBIT)
1618 /* A large string. Just set ARRAY_MARK_FLAG. */
1619 ptr->size |= ARRAY_MARK_FLAG;
1620 else
1621 {
1622 /* A small string. Put this reference
1623 into the chain of references to it.
1fb577f7 1624 If the address includes MARKBIT, put that bit elsewhere
7146af97
JB
1625 when we store OBJPTR into the size field. */
1626
1627 if (XMARKBIT (*objptr))
1628 {
67ba9986 1629 XSETFASTINT (*objptr, ptr->size);
7146af97
JB
1630 XMARK (*objptr);
1631 }
1632 else
67ba9986 1633 XSETFASTINT (*objptr, ptr->size);
155ffe9c
RS
1634
1635 if ((EMACS_INT) objptr & DONT_COPY_FLAG)
1636 abort ();
1fb577f7
KH
1637 ptr->size = (EMACS_INT) objptr;
1638 if (ptr->size & MARKBIT)
1639 ptr->size ^= MARKBIT | DONT_COPY_FLAG;
7146af97
JB
1640 }
1641 }
1642 break;
1643
76437631 1644 case Lisp_Vectorlike:
30e3190a 1645 if (GC_BUFFERP (obj))
6b552283
KH
1646 {
1647 if (!XMARKBIT (XBUFFER (obj)->name))
1648 mark_buffer (obj);
1649 }
30e3190a 1650 else if (GC_SUBRP (obj))
169ee243
RS
1651 break;
1652 else if (GC_COMPILEDP (obj))
1653 /* We could treat this just like a vector, but it is better
1654 to save the COMPILED_CONSTANTS element for last and avoid recursion
1655 there. */
1656 {
1657 register struct Lisp_Vector *ptr = XVECTOR (obj);
1658 register EMACS_INT size = ptr->size;
1659 /* See comment above under Lisp_Vector. */
1660 struct Lisp_Vector *volatile ptr1 = ptr;
1661 register int i;
1662
1663 if (size & ARRAY_MARK_FLAG)
1664 break; /* Already marked */
1665 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
76437631 1666 size &= PSEUDOVECTOR_SIZE_MASK;
169ee243
RS
1667 for (i = 0; i < size; i++) /* and then mark its elements */
1668 {
1669 if (i != COMPILED_CONSTANTS)
1670 mark_object (&ptr1->contents[i]);
1671 }
1672 /* This cast should be unnecessary, but some Mips compiler complains
1673 (MIPS-ABI + SysVR4, DC/OSx, etc). */
1674 objptr = (Lisp_Object *) &ptr1->contents[COMPILED_CONSTANTS];
1675 goto loop;
1676 }
502b9b64 1677#ifdef MULTI_FRAME
169ee243
RS
1678 else if (GC_FRAMEP (obj))
1679 {
1680 /* See comment above under Lisp_Vector for why this is volatile. */
1681 register struct frame *volatile ptr = XFRAME (obj);
1682 register EMACS_INT size = ptr->size;
1683
1684 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1685 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1686
1687 mark_object (&ptr->name);
1688 mark_object (&ptr->focus_frame);
1689 mark_object (&ptr->selected_window);
1690 mark_object (&ptr->minibuffer_window);
1691 mark_object (&ptr->param_alist);
1692 mark_object (&ptr->scroll_bars);
1693 mark_object (&ptr->condemned_scroll_bars);
1694 mark_object (&ptr->menu_bar_items);
1695 mark_object (&ptr->face_alist);
1696 mark_object (&ptr->menu_bar_vector);
1697 mark_object (&ptr->buffer_predicate);
1698 }
12740e58 1699#endif /* MULTI_FRAME */
04ff9756 1700 else
169ee243
RS
1701 {
1702 register struct Lisp_Vector *ptr = XVECTOR (obj);
1703 register EMACS_INT size = ptr->size;
1704 /* The reason we use ptr1 is to avoid an apparent hardware bug
1705 that happens occasionally on the FSF's HP 300s.
1706 The bug is that a2 gets clobbered by recursive calls to mark_object.
1707 The clobberage seems to happen during function entry,
1708 perhaps in the moveml instruction.
1709 Yes, this is a crock, but we have to do it. */
1710 struct Lisp_Vector *volatile ptr1 = ptr;
1711 register int i;
1712
1713 if (size & ARRAY_MARK_FLAG) break; /* Already marked */
1714 ptr->size |= ARRAY_MARK_FLAG; /* Else mark it */
1715 if (size & PSEUDOVECTOR_FLAG)
1716 size &= PSEUDOVECTOR_SIZE_MASK;
1717 for (i = 0; i < size; i++) /* and then mark its elements */
1718 mark_object (&ptr1->contents[i]);
1719 }
1720 break;
7146af97 1721
7146af97
JB
1722 case Lisp_Symbol:
1723 {
41f54422
RS
1724 /* See comment above under Lisp_Vector for why this is volatile. */
1725 register struct Lisp_Symbol *volatile ptr = XSYMBOL (obj);
7146af97
JB
1726 struct Lisp_Symbol *ptrx;
1727
1728 if (XMARKBIT (ptr->plist)) break;
1729 XMARK (ptr->plist);
7146af97
JB
1730 mark_object ((Lisp_Object *) &ptr->value);
1731 mark_object (&ptr->function);
1732 mark_object (&ptr->plist);
8aaa7c8a
JB
1733 XSETTYPE (*(Lisp_Object *) &ptr->name, Lisp_String);
1734 mark_object (&ptr->name);
7146af97
JB
1735 ptr = ptr->next;
1736 if (ptr)
1737 {
9149e743
KH
1738 /* For the benefit of the last_marked log. */
1739 objptr = (Lisp_Object *)&XSYMBOL (obj)->next;
b0846f52 1740 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
7146af97 1741 XSETSYMBOL (obj, ptrx);
9149e743
KH
1742 /* We can't goto loop here because *objptr doesn't contain an
1743 actual Lisp_Object with valid datatype field. */
1744 goto loop2;
7146af97
JB
1745 }
1746 }
1747 break;
1748
a0a38eb7 1749 case Lisp_Misc:
a5da44fe 1750 switch (XMISCTYPE (obj))
a0a38eb7
KH
1751 {
1752 case Lisp_Misc_Marker:
1753 XMARK (XMARKER (obj)->chain);
1754 /* DO NOT mark thru the marker's chain.
1755 The buffer's markers chain does not preserve markers from gc;
1756 instead, markers are removed from the chain when freed by gc. */
1757 break;
1758
465edf35
KH
1759 case Lisp_Misc_Buffer_Local_Value:
1760 case Lisp_Misc_Some_Buffer_Local_Value:
1761 {
1762 register struct Lisp_Buffer_Local_Value *ptr
1763 = XBUFFER_LOCAL_VALUE (obj);
1764 if (XMARKBIT (ptr->car)) break;
1765 XMARK (ptr->car);
1766 /* If the cdr is nil, avoid recursion for the car. */
1767 if (EQ (ptr->cdr, Qnil))
1768 {
1769 objptr = &ptr->car;
1770 goto loop;
1771 }
1772 mark_object (&ptr->car);
1773 /* See comment above under Lisp_Vector for why not use ptr here. */
1774 objptr = &XBUFFER_LOCAL_VALUE (obj)->cdr;
1775 goto loop;
1776 }
1777
c8616056
KH
1778 case Lisp_Misc_Intfwd:
1779 case Lisp_Misc_Boolfwd:
1780 case Lisp_Misc_Objfwd:
1781 case Lisp_Misc_Buffer_Objfwd:
b875d3f7 1782 case Lisp_Misc_Kboard_Objfwd:
c8616056
KH
1783 /* Don't bother with Lisp_Buffer_Objfwd,
1784 since all markable slots in current buffer marked anyway. */
1785 /* Don't need to do Lisp_Objfwd, since the places they point
1786 are protected with staticpro. */
1787 break;
1788
e202fa34
KH
1789 case Lisp_Misc_Overlay:
1790 {
1791 struct Lisp_Overlay *ptr = XOVERLAY (obj);
1792 if (!XMARKBIT (ptr->plist))
1793 {
1794 XMARK (ptr->plist);
1795 mark_object (&ptr->start);
1796 mark_object (&ptr->end);
1797 objptr = &ptr->plist;
1798 goto loop;
1799 }
1800 }
1801 break;
1802
a0a38eb7
KH
1803 default:
1804 abort ();
1805 }
7146af97
JB
1806 break;
1807
1808 case Lisp_Cons:
7146af97
JB
1809 {
1810 register struct Lisp_Cons *ptr = XCONS (obj);
1811 if (XMARKBIT (ptr->car)) break;
1812 XMARK (ptr->car);
c54ca951
RS
1813 /* If the cdr is nil, avoid recursion for the car. */
1814 if (EQ (ptr->cdr, Qnil))
1815 {
1816 objptr = &ptr->car;
c54ca951
RS
1817 goto loop;
1818 }
7146af97 1819 mark_object (&ptr->car);
41f54422
RS
1820 /* See comment above under Lisp_Vector for why not use ptr here. */
1821 objptr = &XCONS (obj)->cdr;
7146af97
JB
1822 goto loop;
1823 }
1824
1825#ifdef LISP_FLOAT_TYPE
1826 case Lisp_Float:
1827 XMARK (XFLOAT (obj)->type);
1828 break;
1829#endif /* LISP_FLOAT_TYPE */
1830
7146af97 1831 case Lisp_Int:
7146af97
JB
1832 break;
1833
1834 default:
1835 abort ();
1836 }
1837}
1838
1839/* Mark the pointers in a buffer structure. */
1840
1841static void
1842mark_buffer (buf)
1843 Lisp_Object buf;
1844{
7146af97
JB
1845 register struct buffer *buffer = XBUFFER (buf);
1846 register Lisp_Object *ptr;
30e3190a 1847 Lisp_Object base_buffer;
7146af97
JB
1848
1849 /* This is the buffer's markbit */
1850 mark_object (&buffer->name);
1851 XMARK (buffer->name);
1852
30e3190a 1853 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
d5e35230 1854
7146af97
JB
1855#if 0
1856 mark_object (buffer->syntax_table);
1857
1858 /* Mark the various string-pointers in the buffer object.
1859 Since the strings may be relocated, we must mark them
1860 in their actual slots. So gc_sweep must convert each slot
1861 back to an ordinary C pointer. */
45d12a89 1862 XSETSTRING (*(Lisp_Object *)&buffer->upcase_table, buffer->upcase_table);
7146af97 1863 mark_object ((Lisp_Object *)&buffer->upcase_table);
45d12a89 1864 XSETSTRING (*(Lisp_Object *)&buffer->downcase_table, buffer->downcase_table);
7146af97
JB
1865 mark_object ((Lisp_Object *)&buffer->downcase_table);
1866
45d12a89 1867 XSETSTRING (*(Lisp_Object *)&buffer->sort_table, buffer->sort_table);
7146af97 1868 mark_object ((Lisp_Object *)&buffer->sort_table);
45d12a89 1869 XSETSTRING (*(Lisp_Object *)&buffer->folding_sort_table, buffer->folding_sort_table);
7146af97
JB
1870 mark_object ((Lisp_Object *)&buffer->folding_sort_table);
1871#endif
1872
1873 for (ptr = &buffer->name + 1;
1874 (char *)ptr < (char *)buffer + sizeof (struct buffer);
1875 ptr++)
1876 mark_object (ptr);
30e3190a
RS
1877
1878 /* If this is an indirect buffer, mark its base buffer. */
6b552283 1879 if (buffer->base_buffer && !XMARKBIT (buffer->base_buffer->name))
30e3190a
RS
1880 {
1881 XSETBUFFER (base_buffer, buffer->base_buffer);
1882 mark_buffer (base_buffer);
1883 }
7146af97 1884}
084b1a0c
KH
1885
1886
b875d3f7 1887/* Mark the pointers in the kboard objects. */
084b1a0c
KH
1888
1889static void
b875d3f7 1890mark_kboards ()
084b1a0c 1891{
b875d3f7 1892 KBOARD *kb;
b94daf1e 1893 Lisp_Object *p;
b875d3f7 1894 for (kb = all_kboards; kb; kb = kb->next_kboard)
084b1a0c 1895 {
b94daf1e
KH
1896 if (kb->kbd_macro_buffer)
1897 for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
1898 mark_object (p);
b875d3f7
KH
1899 mark_object (&kb->prefix_factor);
1900 mark_object (&kb->prefix_value);
1901 mark_object (&kb->kbd_queue);
1902 mark_object (&kb->Vlast_kbd_macro);
b94daf1e 1903 mark_object (&kb->Vsystem_key_alist);
084b1a0c
KH
1904 }
1905}
7146af97 1906\f
1a4f1e2c 1907/* Sweep: find all structures not marked, and free them. */
7146af97
JB
1908
1909static void
1910gc_sweep ()
1911{
1912 total_string_size = 0;
1913 compact_strings ();
1914
1915 /* Put all unmarked conses on free list */
1916 {
1917 register struct cons_block *cblk;
1918 register int lim = cons_block_index;
1919 register int num_free = 0, num_used = 0;
1920
1921 cons_free_list = 0;
1922
1923 for (cblk = cons_block; cblk; cblk = cblk->next)
1924 {
1925 register int i;
1926 for (i = 0; i < lim; i++)
1927 if (!XMARKBIT (cblk->conses[i].car))
1928 {
7146af97 1929 num_free++;
85481507 1930 *(struct Lisp_Cons **)&cblk->conses[i].car = cons_free_list;
7146af97
JB
1931 cons_free_list = &cblk->conses[i];
1932 }
1933 else
1934 {
1935 num_used++;
1936 XUNMARK (cblk->conses[i].car);
1937 }
1938 lim = CONS_BLOCK_SIZE;
1939 }
1940 total_conses = num_used;
1941 total_free_conses = num_free;
1942 }
1943
1944#ifdef LISP_FLOAT_TYPE
1945 /* Put all unmarked floats on free list */
1946 {
1947 register struct float_block *fblk;
1948 register int lim = float_block_index;
1949 register int num_free = 0, num_used = 0;
1950
1951 float_free_list = 0;
1952
1953 for (fblk = float_block; fblk; fblk = fblk->next)
1954 {
1955 register int i;
1956 for (i = 0; i < lim; i++)
1957 if (!XMARKBIT (fblk->floats[i].type))
1958 {
7146af97 1959 num_free++;
85481507 1960 *(struct Lisp_Float **)&fblk->floats[i].type = float_free_list;
7146af97
JB
1961 float_free_list = &fblk->floats[i];
1962 }
1963 else
1964 {
1965 num_used++;
1966 XUNMARK (fblk->floats[i].type);
1967 }
1968 lim = FLOAT_BLOCK_SIZE;
1969 }
1970 total_floats = num_used;
1971 total_free_floats = num_free;
1972 }
1973#endif /* LISP_FLOAT_TYPE */
1974
d5e35230
JA
1975#ifdef USE_TEXT_PROPERTIES
1976 /* Put all unmarked intervals on free list */
1977 {
1978 register struct interval_block *iblk;
1979 register int lim = interval_block_index;
1980 register int num_free = 0, num_used = 0;
1981
1982 interval_free_list = 0;
1983
1984 for (iblk = interval_block; iblk; iblk = iblk->next)
1985 {
1986 register int i;
1987
1988 for (i = 0; i < lim; i++)
1989 {
1990 if (! XMARKBIT (iblk->intervals[i].plist))
1991 {
1992 iblk->intervals[i].parent = interval_free_list;
1993 interval_free_list = &iblk->intervals[i];
1994 num_free++;
1995 }
1996 else
1997 {
1998 num_used++;
1999 XUNMARK (iblk->intervals[i].plist);
2000 }
2001 }
2002 lim = INTERVAL_BLOCK_SIZE;
2003 }
2004 total_intervals = num_used;
2005 total_free_intervals = num_free;
2006 }
2007#endif /* USE_TEXT_PROPERTIES */
2008
7146af97
JB
2009 /* Put all unmarked symbols on free list */
2010 {
2011 register struct symbol_block *sblk;
2012 register int lim = symbol_block_index;
2013 register int num_free = 0, num_used = 0;
2014
2015 symbol_free_list = 0;
2016
2017 for (sblk = symbol_block; sblk; sblk = sblk->next)
2018 {
2019 register int i;
2020 for (i = 0; i < lim; i++)
2021 if (!XMARKBIT (sblk->symbols[i].plist))
2022 {
85481507 2023 *(struct Lisp_Symbol **)&sblk->symbols[i].value = symbol_free_list;
7146af97
JB
2024 symbol_free_list = &sblk->symbols[i];
2025 num_free++;
2026 }
2027 else
2028 {
2029 num_used++;
2030 sblk->symbols[i].name
2031 = XSTRING (*(Lisp_Object *) &sblk->symbols[i].name);
2032 XUNMARK (sblk->symbols[i].plist);
2033 }
2034 lim = SYMBOL_BLOCK_SIZE;
2035 }
2036 total_symbols = num_used;
2037 total_free_symbols = num_free;
2038 }
2039
2040#ifndef standalone
2041 /* Put all unmarked markers on free list.
465edf35
KH
2042 Dechain each one first from the buffer it points into,
2043 but only if it's a real marker. */
7146af97
JB
2044 {
2045 register struct marker_block *mblk;
7146af97
JB
2046 register int lim = marker_block_index;
2047 register int num_free = 0, num_used = 0;
2048
2049 marker_free_list = 0;
2050
2051 for (mblk = marker_block; mblk; mblk = mblk->next)
2052 {
2053 register int i;
26b926e1 2054 EMACS_INT already_free = -1;
fa05e253 2055
7146af97 2056 for (i = 0; i < lim; i++)
465edf35
KH
2057 {
2058 Lisp_Object *markword;
a5da44fe 2059 switch (mblk->markers[i].u_marker.type)
465edf35
KH
2060 {
2061 case Lisp_Misc_Marker:
2062 markword = &mblk->markers[i].u_marker.chain;
2063 break;
2064 case Lisp_Misc_Buffer_Local_Value:
2065 case Lisp_Misc_Some_Buffer_Local_Value:
2066 markword = &mblk->markers[i].u_buffer_local_value.car;
2067 break;
e202fa34
KH
2068 case Lisp_Misc_Overlay:
2069 markword = &mblk->markers[i].u_overlay.plist;
2070 break;
fa05e253
RS
2071 case Lisp_Misc_Free:
2072 /* If the object was already free, keep it
2073 on the free list. */
2074 markword = &already_free;
2075 break;
465edf35
KH
2076 default:
2077 markword = 0;
e202fa34 2078 break;
465edf35
KH
2079 }
2080 if (markword && !XMARKBIT (*markword))
2081 {
2082 Lisp_Object tem;
a5da44fe 2083 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
465edf35
KH
2084 {
2085 /* tem1 avoids Sun compiler bug */
2086 struct Lisp_Marker *tem1 = &mblk->markers[i].u_marker;
2087 XSETMARKER (tem, tem1);
2088 unchain_marker (tem);
2089 }
fa05e253
RS
2090 /* Set the type of the freed object to Lisp_Misc_Free.
2091 We could leave the type alone, since nobody checks it,
465edf35 2092 but this might catch bugs faster. */
a5da44fe 2093 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
465edf35
KH
2094 mblk->markers[i].u_free.chain = marker_free_list;
2095 marker_free_list = &mblk->markers[i];
2096 num_free++;
2097 }
2098 else
2099 {
2100 num_used++;
2101 if (markword)
2102 XUNMARK (*markword);
2103 }
2104 }
7146af97
JB
2105 lim = MARKER_BLOCK_SIZE;
2106 }
2107
2108 total_markers = num_used;
2109 total_free_markers = num_free;
2110 }
2111
2112 /* Free all unmarked buffers */
2113 {
2114 register struct buffer *buffer = all_buffers, *prev = 0, *next;
2115
2116 while (buffer)
2117 if (!XMARKBIT (buffer->name))
2118 {
2119 if (prev)
2120 prev->next = buffer->next;
2121 else
2122 all_buffers = buffer->next;
2123 next = buffer->next;
9ac0d9e0 2124 xfree (buffer);
7146af97
JB
2125 buffer = next;
2126 }
2127 else
2128 {
2129 XUNMARK (buffer->name);
30e3190a 2130 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
7146af97
JB
2131
2132#if 0
2133 /* Each `struct Lisp_String *' was turned into a Lisp_Object
2134 for purposes of marking and relocation.
2135 Turn them back into C pointers now. */
2136 buffer->upcase_table
2137 = XSTRING (*(Lisp_Object *)&buffer->upcase_table);
2138 buffer->downcase_table
2139 = XSTRING (*(Lisp_Object *)&buffer->downcase_table);
2140 buffer->sort_table
2141 = XSTRING (*(Lisp_Object *)&buffer->sort_table);
2142 buffer->folding_sort_table
2143 = XSTRING (*(Lisp_Object *)&buffer->folding_sort_table);
2144#endif
2145
2146 prev = buffer, buffer = buffer->next;
2147 }
2148 }
2149
2150#endif /* standalone */
2151
2152 /* Free all unmarked vectors */
2153 {
2154 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
2155 total_vector_size = 0;
2156
2157 while (vector)
2158 if (!(vector->size & ARRAY_MARK_FLAG))
2159 {
2160 if (prev)
2161 prev->next = vector->next;
2162 else
2163 all_vectors = vector->next;
2164 next = vector->next;
9ac0d9e0 2165 xfree (vector);
7146af97
JB
2166 vector = next;
2167 }
2168 else
2169 {
2170 vector->size &= ~ARRAY_MARK_FLAG;
fa05e253
RS
2171 if (vector->size & PSEUDOVECTOR_FLAG)
2172 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
2173 else
2174 total_vector_size += vector->size;
7146af97
JB
2175 prev = vector, vector = vector->next;
2176 }
2177 }
2178
2179 /* Free all "large strings" not marked with ARRAY_MARK_FLAG. */
2180 {
2181 register struct string_block *sb = large_string_blocks, *prev = 0, *next;
e8720644 2182 struct Lisp_String *s;
7146af97
JB
2183
2184 while (sb)
e8720644
JB
2185 {
2186 s = (struct Lisp_String *) &sb->chars[0];
2187 if (s->size & ARRAY_MARK_FLAG)
2188 {
2189 ((struct Lisp_String *)(&sb->chars[0]))->size
1fb577f7 2190 &= ~ARRAY_MARK_FLAG & ~MARKBIT;
e8720644
JB
2191 UNMARK_BALANCE_INTERVALS (s->intervals);
2192 total_string_size += ((struct Lisp_String *)(&sb->chars[0]))->size;
2193 prev = sb, sb = sb->next;
2194 }
2195 else
2196 {
2197 if (prev)
2198 prev->next = sb->next;
2199 else
2200 large_string_blocks = sb->next;
2201 next = sb->next;
2202 xfree (sb);
2203 sb = next;
2204 }
2205 }
7146af97
JB
2206 }
2207}
2208\f
1a4f1e2c 2209/* Compactify strings, relocate references, and free empty string blocks. */
7146af97
JB
2210
2211static void
2212compact_strings ()
2213{
2214 /* String block of old strings we are scanning. */
2215 register struct string_block *from_sb;
2216 /* A preceding string block (or maybe the same one)
2217 where we are copying the still-live strings to. */
2218 register struct string_block *to_sb;
2219 int pos;
2220 int to_pos;
2221
2222 to_sb = first_string_block;
2223 to_pos = 0;
2224
2225 /* Scan each existing string block sequentially, string by string. */
2226 for (from_sb = first_string_block; from_sb; from_sb = from_sb->next)
2227 {
2228 pos = 0;
2229 /* POS is the index of the next string in the block. */
2230 while (pos < from_sb->pos)
2231 {
2232 register struct Lisp_String *nextstr
2233 = (struct Lisp_String *) &from_sb->chars[pos];
2234
2235 register struct Lisp_String *newaddr;
42607681 2236 register EMACS_INT size = nextstr->size;
7146af97
JB
2237
2238 /* NEXTSTR is the old address of the next string.
2239 Just skip it if it isn't marked. */
155ffe9c 2240 if (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
7146af97
JB
2241 {
2242 /* It is marked, so its size field is really a chain of refs.
2243 Find the end of the chain, where the actual size lives. */
155ffe9c 2244 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
7146af97 2245 {
155ffe9c
RS
2246 if (size & DONT_COPY_FLAG)
2247 size ^= MARKBIT | DONT_COPY_FLAG;
42607681 2248 size = *(EMACS_INT *)size & ~MARKBIT;
7146af97
JB
2249 }
2250
2251 total_string_size += size;
2252
2253 /* If it won't fit in TO_SB, close it out,
2254 and move to the next sb. Keep doing so until
2255 TO_SB reaches a large enough, empty enough string block.
2256 We know that TO_SB cannot advance past FROM_SB here
2257 since FROM_SB is large enough to contain this string.
2258 Any string blocks skipped here
2259 will be patched out and freed later. */
2260 while (to_pos + STRING_FULLSIZE (size)
2261 > max (to_sb->pos, STRING_BLOCK_SIZE))
2262 {
2263 to_sb->pos = to_pos;
2264 to_sb = to_sb->next;
2265 to_pos = 0;
2266 }
2267 /* Compute new address of this string
2268 and update TO_POS for the space being used. */
2269 newaddr = (struct Lisp_String *) &to_sb->chars[to_pos];
2270 to_pos += STRING_FULLSIZE (size);
2271
2272 /* Copy the string itself to the new place. */
2273 if (nextstr != newaddr)
42607681 2274 bcopy (nextstr, newaddr, size + 1 + sizeof (EMACS_INT)
d5e35230 2275 + INTERVAL_PTR_SIZE);
7146af97
JB
2276
2277 /* Go through NEXTSTR's chain of references
2278 and make each slot in the chain point to
2279 the new address of this string. */
2280 size = newaddr->size;
155ffe9c 2281 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
7146af97
JB
2282 {
2283 register Lisp_Object *objptr;
155ffe9c
RS
2284 if (size & DONT_COPY_FLAG)
2285 size ^= MARKBIT | DONT_COPY_FLAG;
7146af97
JB
2286 objptr = (Lisp_Object *)size;
2287
2288 size = XFASTINT (*objptr) & ~MARKBIT;
2289 if (XMARKBIT (*objptr))
2290 {
45d12a89 2291 XSETSTRING (*objptr, newaddr);
7146af97
JB
2292 XMARK (*objptr);
2293 }
2294 else
45d12a89 2295 XSETSTRING (*objptr, newaddr);
7146af97
JB
2296 }
2297 /* Store the actual size in the size field. */
2298 newaddr->size = size;
e8720644 2299
5f60ed47 2300#ifdef USE_TEXT_PROPERTIES
e8720644
JB
2301 /* Now that the string has been relocated, rebalance its
2302 interval tree, and update the tree's parent pointer. */
2303 if (! NULL_INTERVAL_P (newaddr->intervals))
2304 {
2305 UNMARK_BALANCE_INTERVALS (newaddr->intervals);
45d12a89
KH
2306 XSETSTRING (* (Lisp_Object *) &newaddr->intervals->parent,
2307 newaddr);
e8720644 2308 }
5f60ed47 2309#endif /* USE_TEXT_PROPERTIES */
7146af97
JB
2310 }
2311 pos += STRING_FULLSIZE (size);
2312 }
2313 }
2314
2315 /* Close out the last string block still used and free any that follow. */
2316 to_sb->pos = to_pos;
2317 current_string_block = to_sb;
2318
2319 from_sb = to_sb->next;
2320 to_sb->next = 0;
2321 while (from_sb)
2322 {
2323 to_sb = from_sb->next;
9ac0d9e0 2324 xfree (from_sb);
7146af97
JB
2325 from_sb = to_sb;
2326 }
2327
2328 /* Free any empty string blocks further back in the chain.
2329 This loop will never free first_string_block, but it is very
2330 unlikely that that one will become empty, so why bother checking? */
2331
2332 from_sb = first_string_block;
2333 while (to_sb = from_sb->next)
2334 {
2335 if (to_sb->pos == 0)
2336 {
2337 if (from_sb->next = to_sb->next)
2338 from_sb->next->prev = from_sb;
9ac0d9e0 2339 xfree (to_sb);
7146af97
JB
2340 }
2341 else
2342 from_sb = to_sb;
2343 }
2344}
2345\f
20d24714
JB
2346/* Debugging aids. */
2347
31ce1c91 2348DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
20d24714
JB
2349 "Return the address of the last byte Emacs has allocated, divided by 1024.\n\
2350This may be helpful in debugging Emacs's memory usage.\n\
e41ae81f 2351We divide the value by 1024 to make sure it fits in a Lisp integer.")
20d24714
JB
2352 ()
2353{
2354 Lisp_Object end;
2355
45d12a89 2356 XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
20d24714
JB
2357
2358 return end;
2359}
2360
2361\f
7146af97
JB
2362/* Initialization */
2363
2364init_alloc_once ()
2365{
2366 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
2367 pureptr = 0;
4c0be5f4
JB
2368#ifdef HAVE_SHM
2369 pure_size = PURESIZE;
2370#endif
7146af97
JB
2371 all_vectors = 0;
2372 ignore_warnings = 1;
2373 init_strings ();
2374 init_cons ();
2375 init_symbol ();
2376 init_marker ();
2377#ifdef LISP_FLOAT_TYPE
2378 init_float ();
2379#endif /* LISP_FLOAT_TYPE */
d5e35230
JA
2380 INIT_INTERVALS;
2381
276cbe5a
RS
2382#ifdef REL_ALLOC
2383 malloc_hysteresis = 32;
2384#else
2385 malloc_hysteresis = 0;
2386#endif
2387
2388 spare_memory = (char *) malloc (SPARE_MEMORY);
2389
7146af97
JB
2390 ignore_warnings = 0;
2391 gcprolist = 0;
2392 staticidx = 0;
2393 consing_since_gc = 0;
d32625c0 2394 gc_cons_threshold = 300000;
7146af97
JB
2395#ifdef VIRT_ADDR_VARIES
2396 malloc_sbrk_unused = 1<<22; /* A large number */
2397 malloc_sbrk_used = 100000; /* as reasonable as any number */
2398#endif /* VIRT_ADDR_VARIES */
2399}
2400
2401init_alloc ()
2402{
2403 gcprolist = 0;
2404}
2405
2406void
2407syms_of_alloc ()
2408{
2409 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
2410 "*Number of bytes of consing between garbage collections.\n\
2411Garbage collection can happen automatically once this many bytes have been\n\
2412allocated since the last garbage collection. All data types count.\n\n\
2413Garbage collection happens automatically only when `eval' is called.\n\n\
2414By binding this temporarily to a large number, you can effectively\n\
2415prevent garbage collection during a part of the program.");
2416
2417 DEFVAR_INT ("pure-bytes-used", &pureptr,
2418 "Number of bytes of sharable Lisp data allocated so far.");
2419
2420#if 0
2421 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used,
2422 "Number of bytes of unshared memory allocated in this session.");
2423
2424 DEFVAR_INT ("data-bytes-free", &malloc_sbrk_unused,
2425 "Number of bytes of unshared memory remaining available in this session.");
2426#endif
2427
2428 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
2429 "Non-nil means loading Lisp code in order to dump an executable.\n\
2430This means that certain objects should be allocated in shared (pure) space.");
2431
502b9b64 2432 DEFVAR_INT ("undo-limit", &undo_limit,
7146af97 2433 "Keep no more undo information once it exceeds this size.\n\
502b9b64 2434This limit is applied when garbage collection happens.\n\
7146af97
JB
2435The size is counted as the number of bytes occupied,\n\
2436which includes both saved text and other data.");
502b9b64 2437 undo_limit = 20000;
7146af97 2438
502b9b64 2439 DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
7146af97
JB
2440 "Don't keep more than this much size of undo information.\n\
2441A command which pushes past this size is itself forgotten.\n\
502b9b64 2442This limit is applied when garbage collection happens.\n\
7146af97
JB
2443The size is counted as the number of bytes occupied,\n\
2444which includes both saved text and other data.");
502b9b64 2445 undo_strong_limit = 30000;
7146af97 2446
bcb61d60
KH
2447 /* We build this in advance because if we wait until we need it, we might
2448 not be able to allocate the memory to hold it. */
cf3540e4 2449 memory_signal_data
276cbe5a 2450 = Fcons (Qerror, Fcons (build_string ("Memory exhausted--use M-x save-some-buffers RET"), Qnil));
bcb61d60
KH
2451 staticpro (&memory_signal_data);
2452
e8197642
RS
2453 staticpro (&Qgc_cons_threshold);
2454 Qgc_cons_threshold = intern ("gc-cons-threshold");
2455
7146af97
JB
2456 defsubr (&Scons);
2457 defsubr (&Slist);
2458 defsubr (&Svector);
2459 defsubr (&Smake_byte_code);
2460 defsubr (&Smake_list);
2461 defsubr (&Smake_vector);
2462 defsubr (&Smake_string);
7146af97
JB
2463 defsubr (&Smake_symbol);
2464 defsubr (&Smake_marker);
2465 defsubr (&Spurecopy);
2466 defsubr (&Sgarbage_collect);
20d24714 2467 defsubr (&Smemory_limit);
7146af97 2468}