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