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