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