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