Update copyright year.
[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);
7146af97
JB
2009 ptr = ptr->next;
2010 if (ptr)
2011 {
9149e743
KH
2012 /* For the benefit of the last_marked log. */
2013 objptr = (Lisp_Object *)&XSYMBOL (obj)->next;
b0846f52 2014 ptrx = ptr; /* Use of ptrx avoids compiler bug on Sun */
7146af97 2015 XSETSYMBOL (obj, ptrx);
9149e743
KH
2016 /* We can't goto loop here because *objptr doesn't contain an
2017 actual Lisp_Object with valid datatype field. */
2018 goto loop2;
7146af97
JB
2019 }
2020 }
2021 break;
2022
a0a38eb7 2023 case Lisp_Misc:
a5da44fe 2024 switch (XMISCTYPE (obj))
a0a38eb7
KH
2025 {
2026 case Lisp_Misc_Marker:
2027 XMARK (XMARKER (obj)->chain);
2028 /* DO NOT mark thru the marker's chain.
2029 The buffer's markers chain does not preserve markers from gc;
2030 instead, markers are removed from the chain when freed by gc. */
2031 break;
2032
465edf35
KH
2033 case Lisp_Misc_Buffer_Local_Value:
2034 case Lisp_Misc_Some_Buffer_Local_Value:
2035 {
2036 register struct Lisp_Buffer_Local_Value *ptr
2037 = XBUFFER_LOCAL_VALUE (obj);
2038 if (XMARKBIT (ptr->car)) break;
2039 XMARK (ptr->car);
2040 /* If the cdr is nil, avoid recursion for the car. */
2041 if (EQ (ptr->cdr, Qnil))
2042 {
2043 objptr = &ptr->car;
2044 goto loop;
2045 }
2046 mark_object (&ptr->car);
2047 /* See comment above under Lisp_Vector for why not use ptr here. */
2048 objptr = &XBUFFER_LOCAL_VALUE (obj)->cdr;
2049 goto loop;
2050 }
2051
c8616056
KH
2052 case Lisp_Misc_Intfwd:
2053 case Lisp_Misc_Boolfwd:
2054 case Lisp_Misc_Objfwd:
2055 case Lisp_Misc_Buffer_Objfwd:
b875d3f7 2056 case Lisp_Misc_Kboard_Objfwd:
c8616056
KH
2057 /* Don't bother with Lisp_Buffer_Objfwd,
2058 since all markable slots in current buffer marked anyway. */
2059 /* Don't need to do Lisp_Objfwd, since the places they point
2060 are protected with staticpro. */
2061 break;
2062
e202fa34
KH
2063 case Lisp_Misc_Overlay:
2064 {
2065 struct Lisp_Overlay *ptr = XOVERLAY (obj);
2066 if (!XMARKBIT (ptr->plist))
2067 {
2068 XMARK (ptr->plist);
2069 mark_object (&ptr->start);
2070 mark_object (&ptr->end);
2071 objptr = &ptr->plist;
2072 goto loop;
2073 }
2074 }
2075 break;
2076
a0a38eb7
KH
2077 default:
2078 abort ();
2079 }
7146af97
JB
2080 break;
2081
2082 case Lisp_Cons:
7146af97
JB
2083 {
2084 register struct Lisp_Cons *ptr = XCONS (obj);
2085 if (XMARKBIT (ptr->car)) break;
2086 XMARK (ptr->car);
c54ca951
RS
2087 /* If the cdr is nil, avoid recursion for the car. */
2088 if (EQ (ptr->cdr, Qnil))
2089 {
2090 objptr = &ptr->car;
c54ca951
RS
2091 goto loop;
2092 }
7146af97 2093 mark_object (&ptr->car);
41f54422
RS
2094 /* See comment above under Lisp_Vector for why not use ptr here. */
2095 objptr = &XCONS (obj)->cdr;
7146af97
JB
2096 goto loop;
2097 }
2098
2099#ifdef LISP_FLOAT_TYPE
2100 case Lisp_Float:
2101 XMARK (XFLOAT (obj)->type);
2102 break;
2103#endif /* LISP_FLOAT_TYPE */
2104
7146af97 2105 case Lisp_Int:
7146af97
JB
2106 break;
2107
2108 default:
2109 abort ();
2110 }
2111}
2112
2113/* Mark the pointers in a buffer structure. */
2114
2115static void
2116mark_buffer (buf)
2117 Lisp_Object buf;
2118{
7146af97
JB
2119 register struct buffer *buffer = XBUFFER (buf);
2120 register Lisp_Object *ptr;
30e3190a 2121 Lisp_Object base_buffer;
7146af97
JB
2122
2123 /* This is the buffer's markbit */
2124 mark_object (&buffer->name);
2125 XMARK (buffer->name);
2126
30e3190a 2127 MARK_INTERVAL_TREE (BUF_INTERVALS (buffer));
d5e35230 2128
7146af97
JB
2129#if 0
2130 mark_object (buffer->syntax_table);
2131
2132 /* Mark the various string-pointers in the buffer object.
2133 Since the strings may be relocated, we must mark them
2134 in their actual slots. So gc_sweep must convert each slot
2135 back to an ordinary C pointer. */
45d12a89 2136 XSETSTRING (*(Lisp_Object *)&buffer->upcase_table, buffer->upcase_table);
7146af97 2137 mark_object ((Lisp_Object *)&buffer->upcase_table);
45d12a89 2138 XSETSTRING (*(Lisp_Object *)&buffer->downcase_table, buffer->downcase_table);
7146af97
JB
2139 mark_object ((Lisp_Object *)&buffer->downcase_table);
2140
45d12a89 2141 XSETSTRING (*(Lisp_Object *)&buffer->sort_table, buffer->sort_table);
7146af97 2142 mark_object ((Lisp_Object *)&buffer->sort_table);
45d12a89 2143 XSETSTRING (*(Lisp_Object *)&buffer->folding_sort_table, buffer->folding_sort_table);
7146af97
JB
2144 mark_object ((Lisp_Object *)&buffer->folding_sort_table);
2145#endif
2146
2147 for (ptr = &buffer->name + 1;
2148 (char *)ptr < (char *)buffer + sizeof (struct buffer);
2149 ptr++)
2150 mark_object (ptr);
30e3190a
RS
2151
2152 /* If this is an indirect buffer, mark its base buffer. */
6b552283 2153 if (buffer->base_buffer && !XMARKBIT (buffer->base_buffer->name))
30e3190a
RS
2154 {
2155 XSETBUFFER (base_buffer, buffer->base_buffer);
2156 mark_buffer (base_buffer);
2157 }
7146af97 2158}
084b1a0c
KH
2159
2160
b875d3f7 2161/* Mark the pointers in the kboard objects. */
084b1a0c
KH
2162
2163static void
b875d3f7 2164mark_kboards ()
084b1a0c 2165{
b875d3f7 2166 KBOARD *kb;
b94daf1e 2167 Lisp_Object *p;
b875d3f7 2168 for (kb = all_kboards; kb; kb = kb->next_kboard)
084b1a0c 2169 {
b94daf1e
KH
2170 if (kb->kbd_macro_buffer)
2171 for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
2172 mark_object (p);
9671abc2 2173 mark_object (&kb->Vprefix_arg);
b875d3f7
KH
2174 mark_object (&kb->kbd_queue);
2175 mark_object (&kb->Vlast_kbd_macro);
b94daf1e 2176 mark_object (&kb->Vsystem_key_alist);
6d03a6fd 2177 mark_object (&kb->system_key_syms);
084b1a0c
KH
2178 }
2179}
7146af97 2180\f
1a4f1e2c 2181/* Sweep: find all structures not marked, and free them. */
7146af97
JB
2182
2183static void
2184gc_sweep ()
2185{
2186 total_string_size = 0;
2187 compact_strings ();
2188
2189 /* Put all unmarked conses on free list */
2190 {
2191 register struct cons_block *cblk;
6ca94ac9 2192 struct cons_block **cprev = &cons_block;
7146af97
JB
2193 register int lim = cons_block_index;
2194 register int num_free = 0, num_used = 0;
2195
2196 cons_free_list = 0;
2197
6ca94ac9 2198 for (cblk = cons_block; cblk; cblk = *cprev)
7146af97
JB
2199 {
2200 register int i;
6ca94ac9 2201 int this_free = 0;
7146af97
JB
2202 for (i = 0; i < lim; i++)
2203 if (!XMARKBIT (cblk->conses[i].car))
2204 {
7146af97 2205 num_free++;
6ca94ac9 2206 this_free++;
1cd5fe6a 2207 *(struct Lisp_Cons **)&cblk->conses[i].cdr = cons_free_list;
7146af97
JB
2208 cons_free_list = &cblk->conses[i];
2209 }
2210 else
2211 {
2212 num_used++;
2213 XUNMARK (cblk->conses[i].car);
2214 }
2215 lim = CONS_BLOCK_SIZE;
6ca94ac9
KH
2216 /* If this block contains only free conses and we have already
2217 seen more than two blocks worth of free conses then deallocate
2218 this block. */
2219 if (this_free == CONS_BLOCK_SIZE && num_free > 2*CONS_BLOCK_SIZE)
2220 {
2221 num_free -= CONS_BLOCK_SIZE;
2222 *cprev = cblk->next;
2223 /* Unhook from the free list. */
2224 cons_free_list = *(struct Lisp_Cons **) &cblk->conses[0].cdr;
2225 xfree (cblk);
2226 }
2227 else
2228 cprev = &cblk->next;
7146af97
JB
2229 }
2230 total_conses = num_used;
2231 total_free_conses = num_free;
2232 }
2233
2234#ifdef LISP_FLOAT_TYPE
2235 /* Put all unmarked floats on free list */
2236 {
2237 register struct float_block *fblk;
6ca94ac9 2238 struct float_block **fprev = &float_block;
7146af97
JB
2239 register int lim = float_block_index;
2240 register int num_free = 0, num_used = 0;
2241
2242 float_free_list = 0;
2243
6ca94ac9 2244 for (fblk = float_block; fblk; fblk = *fprev)
7146af97
JB
2245 {
2246 register int i;
6ca94ac9 2247 int this_free = 0;
7146af97
JB
2248 for (i = 0; i < lim; i++)
2249 if (!XMARKBIT (fblk->floats[i].type))
2250 {
7146af97 2251 num_free++;
6ca94ac9 2252 this_free++;
1cd5fe6a 2253 *(struct Lisp_Float **)&fblk->floats[i].data = float_free_list;
7146af97
JB
2254 float_free_list = &fblk->floats[i];
2255 }
2256 else
2257 {
2258 num_used++;
2259 XUNMARK (fblk->floats[i].type);
2260 }
2261 lim = FLOAT_BLOCK_SIZE;
6ca94ac9
KH
2262 /* If this block contains only free floats and we have already
2263 seen more than two blocks worth of free floats then deallocate
2264 this block. */
2265 if (this_free == FLOAT_BLOCK_SIZE && num_free > 2*FLOAT_BLOCK_SIZE)
2266 {
2267 num_free -= FLOAT_BLOCK_SIZE;
2268 *fprev = fblk->next;
2269 /* Unhook from the free list. */
2270 float_free_list = *(struct Lisp_Float **) &fblk->floats[0].data;
2271 xfree (fblk);
2272 }
2273 else
2274 fprev = &fblk->next;
7146af97
JB
2275 }
2276 total_floats = num_used;
2277 total_free_floats = num_free;
2278 }
2279#endif /* LISP_FLOAT_TYPE */
2280
d5e35230
JA
2281#ifdef USE_TEXT_PROPERTIES
2282 /* Put all unmarked intervals on free list */
2283 {
2284 register struct interval_block *iblk;
6ca94ac9 2285 struct interval_block **iprev = &interval_block;
d5e35230
JA
2286 register int lim = interval_block_index;
2287 register int num_free = 0, num_used = 0;
2288
2289 interval_free_list = 0;
2290
6ca94ac9 2291 for (iblk = interval_block; iblk; iblk = *iprev)
d5e35230
JA
2292 {
2293 register int i;
6ca94ac9 2294 int this_free = 0;
d5e35230
JA
2295
2296 for (i = 0; i < lim; i++)
2297 {
2298 if (! XMARKBIT (iblk->intervals[i].plist))
2299 {
2300 iblk->intervals[i].parent = interval_free_list;
2301 interval_free_list = &iblk->intervals[i];
2302 num_free++;
6ca94ac9 2303 this_free++;
d5e35230
JA
2304 }
2305 else
2306 {
2307 num_used++;
2308 XUNMARK (iblk->intervals[i].plist);
2309 }
2310 }
2311 lim = INTERVAL_BLOCK_SIZE;
6ca94ac9
KH
2312 /* If this block contains only free intervals and we have already
2313 seen more than two blocks worth of free intervals then
2314 deallocate this block. */
2315 if (this_free == INTERVAL_BLOCK_SIZE
2316 && num_free > 2*INTERVAL_BLOCK_SIZE)
2317 {
2318 num_free -= INTERVAL_BLOCK_SIZE;
2319 *iprev = iblk->next;
2320 /* Unhook from the free list. */
2321 interval_free_list = iblk->intervals[0].parent;
2322 xfree (iblk);
2323 }
2324 else
2325 iprev = &iblk->next;
d5e35230
JA
2326 }
2327 total_intervals = num_used;
2328 total_free_intervals = num_free;
2329 }
2330#endif /* USE_TEXT_PROPERTIES */
2331
7146af97
JB
2332 /* Put all unmarked symbols on free list */
2333 {
2334 register struct symbol_block *sblk;
6ca94ac9 2335 struct symbol_block **sprev = &symbol_block;
7146af97
JB
2336 register int lim = symbol_block_index;
2337 register int num_free = 0, num_used = 0;
2338
2339 symbol_free_list = 0;
2340
6ca94ac9 2341 for (sblk = symbol_block; sblk; sblk = *sprev)
7146af97
JB
2342 {
2343 register int i;
6ca94ac9 2344 int this_free = 0;
7146af97
JB
2345 for (i = 0; i < lim; i++)
2346 if (!XMARKBIT (sblk->symbols[i].plist))
2347 {
85481507 2348 *(struct Lisp_Symbol **)&sblk->symbols[i].value = symbol_free_list;
7146af97
JB
2349 symbol_free_list = &sblk->symbols[i];
2350 num_free++;
6ca94ac9 2351 this_free++;
7146af97
JB
2352 }
2353 else
2354 {
2355 num_used++;
2356 sblk->symbols[i].name
2357 = XSTRING (*(Lisp_Object *) &sblk->symbols[i].name);
2358 XUNMARK (sblk->symbols[i].plist);
2359 }
2360 lim = SYMBOL_BLOCK_SIZE;
6ca94ac9
KH
2361 /* If this block contains only free symbols and we have already
2362 seen more than two blocks worth of free symbols then deallocate
2363 this block. */
2364 if (this_free == SYMBOL_BLOCK_SIZE && num_free > 2*SYMBOL_BLOCK_SIZE)
2365 {
2366 num_free -= SYMBOL_BLOCK_SIZE;
2367 *sprev = sblk->next;
2368 /* Unhook from the free list. */
2369 symbol_free_list = *(struct Lisp_Symbol **)&sblk->symbols[0].value;
2370 xfree (sblk);
2371 }
2372 else
2373 sprev = &sblk->next;
7146af97
JB
2374 }
2375 total_symbols = num_used;
2376 total_free_symbols = num_free;
2377 }
2378
2379#ifndef standalone
2380 /* Put all unmarked markers on free list.
8e6208c5 2381 Unchain each one first from the buffer it points into,
465edf35 2382 but only if it's a real marker. */
7146af97
JB
2383 {
2384 register struct marker_block *mblk;
6ca94ac9 2385 struct marker_block **mprev = &marker_block;
7146af97
JB
2386 register int lim = marker_block_index;
2387 register int num_free = 0, num_used = 0;
2388
2389 marker_free_list = 0;
2390
6ca94ac9 2391 for (mblk = marker_block; mblk; mblk = *mprev)
7146af97
JB
2392 {
2393 register int i;
6ca94ac9 2394 int this_free = 0;
26b926e1 2395 EMACS_INT already_free = -1;
fa05e253 2396
7146af97 2397 for (i = 0; i < lim; i++)
465edf35
KH
2398 {
2399 Lisp_Object *markword;
a5da44fe 2400 switch (mblk->markers[i].u_marker.type)
465edf35
KH
2401 {
2402 case Lisp_Misc_Marker:
2403 markword = &mblk->markers[i].u_marker.chain;
2404 break;
2405 case Lisp_Misc_Buffer_Local_Value:
2406 case Lisp_Misc_Some_Buffer_Local_Value:
2407 markword = &mblk->markers[i].u_buffer_local_value.car;
2408 break;
e202fa34
KH
2409 case Lisp_Misc_Overlay:
2410 markword = &mblk->markers[i].u_overlay.plist;
2411 break;
fa05e253
RS
2412 case Lisp_Misc_Free:
2413 /* If the object was already free, keep it
2414 on the free list. */
74d84334 2415 markword = (Lisp_Object *) &already_free;
fa05e253 2416 break;
465edf35
KH
2417 default:
2418 markword = 0;
e202fa34 2419 break;
465edf35
KH
2420 }
2421 if (markword && !XMARKBIT (*markword))
2422 {
2423 Lisp_Object tem;
a5da44fe 2424 if (mblk->markers[i].u_marker.type == Lisp_Misc_Marker)
465edf35
KH
2425 {
2426 /* tem1 avoids Sun compiler bug */
2427 struct Lisp_Marker *tem1 = &mblk->markers[i].u_marker;
2428 XSETMARKER (tem, tem1);
2429 unchain_marker (tem);
2430 }
fa05e253
RS
2431 /* Set the type of the freed object to Lisp_Misc_Free.
2432 We could leave the type alone, since nobody checks it,
465edf35 2433 but this might catch bugs faster. */
a5da44fe 2434 mblk->markers[i].u_marker.type = Lisp_Misc_Free;
465edf35
KH
2435 mblk->markers[i].u_free.chain = marker_free_list;
2436 marker_free_list = &mblk->markers[i];
2437 num_free++;
6ca94ac9 2438 this_free++;
465edf35
KH
2439 }
2440 else
2441 {
2442 num_used++;
2443 if (markword)
2444 XUNMARK (*markword);
2445 }
2446 }
7146af97 2447 lim = MARKER_BLOCK_SIZE;
6ca94ac9
KH
2448 /* If this block contains only free markers and we have already
2449 seen more than two blocks worth of free markers then deallocate
2450 this block. */
2451 if (this_free == MARKER_BLOCK_SIZE && num_free > 2*MARKER_BLOCK_SIZE)
2452 {
2453 num_free -= MARKER_BLOCK_SIZE;
2454 *mprev = mblk->next;
2455 /* Unhook from the free list. */
2456 marker_free_list = mblk->markers[0].u_free.chain;
2457 xfree (mblk);
2458 }
2459 else
2460 mprev = &mblk->next;
7146af97
JB
2461 }
2462
2463 total_markers = num_used;
2464 total_free_markers = num_free;
2465 }
2466
2467 /* Free all unmarked buffers */
2468 {
2469 register struct buffer *buffer = all_buffers, *prev = 0, *next;
2470
2471 while (buffer)
2472 if (!XMARKBIT (buffer->name))
2473 {
2474 if (prev)
2475 prev->next = buffer->next;
2476 else
2477 all_buffers = buffer->next;
2478 next = buffer->next;
9ac0d9e0 2479 xfree (buffer);
7146af97
JB
2480 buffer = next;
2481 }
2482 else
2483 {
2484 XUNMARK (buffer->name);
30e3190a 2485 UNMARK_BALANCE_INTERVALS (BUF_INTERVALS (buffer));
7146af97
JB
2486
2487#if 0
2488 /* Each `struct Lisp_String *' was turned into a Lisp_Object
2489 for purposes of marking and relocation.
2490 Turn them back into C pointers now. */
2491 buffer->upcase_table
2492 = XSTRING (*(Lisp_Object *)&buffer->upcase_table);
2493 buffer->downcase_table
2494 = XSTRING (*(Lisp_Object *)&buffer->downcase_table);
2495 buffer->sort_table
2496 = XSTRING (*(Lisp_Object *)&buffer->sort_table);
2497 buffer->folding_sort_table
2498 = XSTRING (*(Lisp_Object *)&buffer->folding_sort_table);
2499#endif
2500
2501 prev = buffer, buffer = buffer->next;
2502 }
2503 }
2504
2505#endif /* standalone */
2506
2507 /* Free all unmarked vectors */
2508 {
2509 register struct Lisp_Vector *vector = all_vectors, *prev = 0, *next;
2510 total_vector_size = 0;
2511
2512 while (vector)
2513 if (!(vector->size & ARRAY_MARK_FLAG))
2514 {
2515 if (prev)
2516 prev->next = vector->next;
2517 else
2518 all_vectors = vector->next;
2519 next = vector->next;
9ac0d9e0 2520 xfree (vector);
7146af97
JB
2521 vector = next;
2522 }
2523 else
2524 {
2525 vector->size &= ~ARRAY_MARK_FLAG;
fa05e253
RS
2526 if (vector->size & PSEUDOVECTOR_FLAG)
2527 total_vector_size += (PSEUDOVECTOR_SIZE_MASK & vector->size);
2528 else
2529 total_vector_size += vector->size;
7146af97
JB
2530 prev = vector, vector = vector->next;
2531 }
2532 }
2533
2534 /* Free all "large strings" not marked with ARRAY_MARK_FLAG. */
2535 {
2536 register struct string_block *sb = large_string_blocks, *prev = 0, *next;
e8720644 2537 struct Lisp_String *s;
7146af97
JB
2538
2539 while (sb)
e8720644
JB
2540 {
2541 s = (struct Lisp_String *) &sb->chars[0];
2542 if (s->size & ARRAY_MARK_FLAG)
2543 {
2544 ((struct Lisp_String *)(&sb->chars[0]))->size
1fb577f7 2545 &= ~ARRAY_MARK_FLAG & ~MARKBIT;
e8720644
JB
2546 UNMARK_BALANCE_INTERVALS (s->intervals);
2547 total_string_size += ((struct Lisp_String *)(&sb->chars[0]))->size;
2548 prev = sb, sb = sb->next;
2549 }
2550 else
2551 {
2552 if (prev)
2553 prev->next = sb->next;
2554 else
2555 large_string_blocks = sb->next;
2556 next = sb->next;
2557 xfree (sb);
2558 sb = next;
2559 }
2560 }
7146af97
JB
2561 }
2562}
2563\f
1a4f1e2c 2564/* Compactify strings, relocate references, and free empty string blocks. */
7146af97
JB
2565
2566static void
2567compact_strings ()
2568{
2569 /* String block of old strings we are scanning. */
2570 register struct string_block *from_sb;
2571 /* A preceding string block (or maybe the same one)
2572 where we are copying the still-live strings to. */
2573 register struct string_block *to_sb;
2574 int pos;
2575 int to_pos;
2576
2577 to_sb = first_string_block;
2578 to_pos = 0;
2579
2580 /* Scan each existing string block sequentially, string by string. */
2581 for (from_sb = first_string_block; from_sb; from_sb = from_sb->next)
2582 {
2583 pos = 0;
2584 /* POS is the index of the next string in the block. */
2585 while (pos < from_sb->pos)
2586 {
2587 register struct Lisp_String *nextstr
2588 = (struct Lisp_String *) &from_sb->chars[pos];
2589
2590 register struct Lisp_String *newaddr;
42607681 2591 register EMACS_INT size = nextstr->size;
3f25e183 2592 EMACS_INT size_byte = nextstr->size_byte;
7146af97
JB
2593
2594 /* NEXTSTR is the old address of the next string.
2595 Just skip it if it isn't marked. */
155ffe9c 2596 if (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
7146af97
JB
2597 {
2598 /* It is marked, so its size field is really a chain of refs.
2599 Find the end of the chain, where the actual size lives. */
155ffe9c 2600 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
7146af97 2601 {
155ffe9c
RS
2602 if (size & DONT_COPY_FLAG)
2603 size ^= MARKBIT | DONT_COPY_FLAG;
42607681 2604 size = *(EMACS_INT *)size & ~MARKBIT;
7146af97
JB
2605 }
2606
3f25e183 2607 total_string_size += size_byte;
7146af97
JB
2608
2609 /* If it won't fit in TO_SB, close it out,
2610 and move to the next sb. Keep doing so until
2611 TO_SB reaches a large enough, empty enough string block.
2612 We know that TO_SB cannot advance past FROM_SB here
2613 since FROM_SB is large enough to contain this string.
2614 Any string blocks skipped here
2615 will be patched out and freed later. */
3f25e183 2616 while (to_pos + STRING_FULLSIZE (size_byte)
7146af97
JB
2617 > max (to_sb->pos, STRING_BLOCK_SIZE))
2618 {
2619 to_sb->pos = to_pos;
2620 to_sb = to_sb->next;
2621 to_pos = 0;
2622 }
2623 /* Compute new address of this string
2624 and update TO_POS for the space being used. */
2625 newaddr = (struct Lisp_String *) &to_sb->chars[to_pos];
3f25e183 2626 to_pos += STRING_FULLSIZE (size_byte);
7146af97
JB
2627
2628 /* Copy the string itself to the new place. */
2629 if (nextstr != newaddr)
3f25e183 2630 bcopy (nextstr, newaddr, STRING_FULLSIZE (size_byte));
7146af97
JB
2631
2632 /* Go through NEXTSTR's chain of references
2633 and make each slot in the chain point to
2634 the new address of this string. */
2635 size = newaddr->size;
155ffe9c 2636 while (((EMACS_UINT) size & ~DONT_COPY_FLAG) > STRING_BLOCK_SIZE)
7146af97
JB
2637 {
2638 register Lisp_Object *objptr;
155ffe9c
RS
2639 if (size & DONT_COPY_FLAG)
2640 size ^= MARKBIT | DONT_COPY_FLAG;
7146af97
JB
2641 objptr = (Lisp_Object *)size;
2642
2643 size = XFASTINT (*objptr) & ~MARKBIT;
2644 if (XMARKBIT (*objptr))
2645 {
45d12a89 2646 XSETSTRING (*objptr, newaddr);
7146af97
JB
2647 XMARK (*objptr);
2648 }
2649 else
45d12a89 2650 XSETSTRING (*objptr, newaddr);
7146af97
JB
2651 }
2652 /* Store the actual size in the size field. */
2653 newaddr->size = size;
e8720644 2654
5f60ed47 2655#ifdef USE_TEXT_PROPERTIES
e8720644
JB
2656 /* Now that the string has been relocated, rebalance its
2657 interval tree, and update the tree's parent pointer. */
2658 if (! NULL_INTERVAL_P (newaddr->intervals))
2659 {
2660 UNMARK_BALANCE_INTERVALS (newaddr->intervals);
45d12a89
KH
2661 XSETSTRING (* (Lisp_Object *) &newaddr->intervals->parent,
2662 newaddr);
e8720644 2663 }
5f60ed47 2664#endif /* USE_TEXT_PROPERTIES */
7146af97 2665 }
3f25e183 2666 pos += STRING_FULLSIZE (size_byte);
7146af97
JB
2667 }
2668 }
2669
2670 /* Close out the last string block still used and free any that follow. */
2671 to_sb->pos = to_pos;
2672 current_string_block = to_sb;
2673
2674 from_sb = to_sb->next;
2675 to_sb->next = 0;
2676 while (from_sb)
2677 {
2678 to_sb = from_sb->next;
9ac0d9e0 2679 xfree (from_sb);
7146af97
JB
2680 from_sb = to_sb;
2681 }
2682
2683 /* Free any empty string blocks further back in the chain.
2684 This loop will never free first_string_block, but it is very
2685 unlikely that that one will become empty, so why bother checking? */
2686
2687 from_sb = first_string_block;
2688 while (to_sb = from_sb->next)
2689 {
2690 if (to_sb->pos == 0)
2691 {
2692 if (from_sb->next = to_sb->next)
2693 from_sb->next->prev = from_sb;
9ac0d9e0 2694 xfree (to_sb);
7146af97
JB
2695 }
2696 else
2697 from_sb = to_sb;
2698 }
2699}
2700\f
20d24714
JB
2701/* Debugging aids. */
2702
31ce1c91 2703DEFUN ("memory-limit", Fmemory_limit, Smemory_limit, 0, 0, 0,
20d24714
JB
2704 "Return the address of the last byte Emacs has allocated, divided by 1024.\n\
2705This may be helpful in debugging Emacs's memory usage.\n\
e41ae81f 2706We divide the value by 1024 to make sure it fits in a Lisp integer.")
20d24714
JB
2707 ()
2708{
2709 Lisp_Object end;
2710
45d12a89 2711 XSETINT (end, (EMACS_INT) sbrk (0) / 1024);
20d24714
JB
2712
2713 return end;
2714}
2715
310ea200
RS
2716DEFUN ("memory-use-counts", Fmemory_use_counts, Smemory_use_counts, 0, 0, 0,
2717 "Return a list of counters that measure how much consing there has been.\n\
2718Each of these counters increments for a certain kind of object.\n\
2719The counters wrap around from the largest positive integer to zero.\n\
2720Garbage collection does not decrease them.\n\
2721The elements of the value are as follows:\n\
2722 (CONSES FLOATS VECTOR-CELLS SYMBOLS STRING-CHARS MISCS INTERVALS)\n\
2723All are in units of 1 = one object consed\n\
2724except for VECTOR-CELLS and STRING-CHARS, which count the total length of\n\
2725objects consed.\n\
2726MISCS include overlays, markers, and some internal types.\n\
2727Frames, windows, buffers, and subprocesses count as vectors\n\
2728 (but the contents of a buffer's text do not count here).")
2729 ()
2730{
2731 Lisp_Object lisp_cons_cells_consed;
2732 Lisp_Object lisp_floats_consed;
2733 Lisp_Object lisp_vector_cells_consed;
2734 Lisp_Object lisp_symbols_consed;
2735 Lisp_Object lisp_string_chars_consed;
2736 Lisp_Object lisp_misc_objects_consed;
2737 Lisp_Object lisp_intervals_consed;
2738
2739 XSETINT (lisp_cons_cells_consed,
290c8f1e 2740 cons_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
310ea200 2741 XSETINT (lisp_floats_consed,
290c8f1e 2742 floats_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
310ea200 2743 XSETINT (lisp_vector_cells_consed,
290c8f1e 2744 vector_cells_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
310ea200 2745 XSETINT (lisp_symbols_consed,
290c8f1e 2746 symbols_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
310ea200 2747 XSETINT (lisp_string_chars_consed,
290c8f1e 2748 string_chars_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
310ea200 2749 XSETINT (lisp_misc_objects_consed,
290c8f1e 2750 misc_objects_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
310ea200 2751 XSETINT (lisp_intervals_consed,
290c8f1e 2752 intervals_consed & ~(((EMACS_INT) 1) << (VALBITS - 1)));
310ea200
RS
2753
2754 return Fcons (lisp_cons_cells_consed,
2755 Fcons (lisp_floats_consed,
2756 Fcons (lisp_vector_cells_consed,
2757 Fcons (lisp_symbols_consed,
2758 Fcons (lisp_string_chars_consed,
2759 Fcons (lisp_misc_objects_consed,
2760 Fcons (lisp_intervals_consed,
2761 Qnil)))))));
2762}
20d24714 2763\f
7146af97
JB
2764/* Initialization */
2765
2766init_alloc_once ()
2767{
2768 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
2769 pureptr = 0;
4c0be5f4
JB
2770#ifdef HAVE_SHM
2771 pure_size = PURESIZE;
2772#endif
7146af97
JB
2773 all_vectors = 0;
2774 ignore_warnings = 1;
d1658221
RS
2775#ifdef DOUG_LEA_MALLOC
2776 mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */
2777 mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */
2778 mallopt (M_MMAP_MAX, 64); /* max. number of mmap'ed areas */
2779#endif
7146af97
JB
2780 init_strings ();
2781 init_cons ();
2782 init_symbol ();
2783 init_marker ();
2784#ifdef LISP_FLOAT_TYPE
2785 init_float ();
2786#endif /* LISP_FLOAT_TYPE */
d5e35230
JA
2787 INIT_INTERVALS;
2788
276cbe5a
RS
2789#ifdef REL_ALLOC
2790 malloc_hysteresis = 32;
2791#else
2792 malloc_hysteresis = 0;
2793#endif
2794
2795 spare_memory = (char *) malloc (SPARE_MEMORY);
2796
7146af97
JB
2797 ignore_warnings = 0;
2798 gcprolist = 0;
2799 staticidx = 0;
2800 consing_since_gc = 0;
7d179cea 2801 gc_cons_threshold = 100000 * sizeof (Lisp_Object);
7146af97
JB
2802#ifdef VIRT_ADDR_VARIES
2803 malloc_sbrk_unused = 1<<22; /* A large number */
2804 malloc_sbrk_used = 100000; /* as reasonable as any number */
2805#endif /* VIRT_ADDR_VARIES */
2806}
2807
2808init_alloc ()
2809{
2810 gcprolist = 0;
2811}
2812
2813void
2814syms_of_alloc ()
2815{
2816 DEFVAR_INT ("gc-cons-threshold", &gc_cons_threshold,
2817 "*Number of bytes of consing between garbage collections.\n\
2818Garbage collection can happen automatically once this many bytes have been\n\
2819allocated since the last garbage collection. All data types count.\n\n\
2820Garbage collection happens automatically only when `eval' is called.\n\n\
2821By binding this temporarily to a large number, you can effectively\n\
2822prevent garbage collection during a part of the program.");
2823
2824 DEFVAR_INT ("pure-bytes-used", &pureptr,
2825 "Number of bytes of sharable Lisp data allocated so far.");
2826
0819585c
RS
2827 DEFVAR_INT ("cons-cells-consed", &cons_cells_consed,
2828 "Number of cons cells that have been consed so far.");
2829
2830 DEFVAR_INT ("floats-consed", &floats_consed,
2831 "Number of floats that have been consed so far.");
2832
2833 DEFVAR_INT ("vector-cells-consed", &vector_cells_consed,
2834 "Number of vector cells that have been consed so far.");
2835
2836 DEFVAR_INT ("symbols-consed", &symbols_consed,
2837 "Number of symbols that have been consed so far.");
2838
2839 DEFVAR_INT ("string-chars-consed", &string_chars_consed,
2840 "Number of string characters that have been consed so far.");
2841
2842 DEFVAR_INT ("misc-objects-consed", &misc_objects_consed,
2843 "Number of miscellaneous objects that have been consed so far.");
2844
2845 DEFVAR_INT ("intervals-consed", &intervals_consed,
2846 "Number of intervals that have been consed so far.");
2847
7146af97
JB
2848#if 0
2849 DEFVAR_INT ("data-bytes-used", &malloc_sbrk_used,
2850 "Number of bytes of unshared memory allocated in this session.");
2851
2852 DEFVAR_INT ("data-bytes-free", &malloc_sbrk_unused,
2853 "Number of bytes of unshared memory remaining available in this session.");
2854#endif
2855
2856 DEFVAR_LISP ("purify-flag", &Vpurify_flag,
2857 "Non-nil means loading Lisp code in order to dump an executable.\n\
2858This means that certain objects should be allocated in shared (pure) space.");
2859
502b9b64 2860 DEFVAR_INT ("undo-limit", &undo_limit,
7146af97 2861 "Keep no more undo information once it exceeds this size.\n\
502b9b64 2862This limit is applied when garbage collection happens.\n\
7146af97
JB
2863The size is counted as the number of bytes occupied,\n\
2864which includes both saved text and other data.");
502b9b64 2865 undo_limit = 20000;
7146af97 2866
502b9b64 2867 DEFVAR_INT ("undo-strong-limit", &undo_strong_limit,
7146af97
JB
2868 "Don't keep more than this much size of undo information.\n\
2869A command which pushes past this size is itself forgotten.\n\
502b9b64 2870This limit is applied when garbage collection happens.\n\
7146af97
JB
2871The size is counted as the number of bytes occupied,\n\
2872which includes both saved text and other data.");
502b9b64 2873 undo_strong_limit = 30000;
7146af97 2874
299585ee
RS
2875 DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
2876 "Non-nil means display messages at start and end of garbage collection.");
2877 garbage_collection_messages = 0;
2878
bcb61d60
KH
2879 /* We build this in advance because if we wait until we need it, we might
2880 not be able to allocate the memory to hold it. */
cf3540e4 2881 memory_signal_data
276cbe5a 2882 = Fcons (Qerror, Fcons (build_string ("Memory exhausted--use M-x save-some-buffers RET"), Qnil));
bcb61d60
KH
2883 staticpro (&memory_signal_data);
2884
e8197642
RS
2885 staticpro (&Qgc_cons_threshold);
2886 Qgc_cons_threshold = intern ("gc-cons-threshold");
2887
a59de17b
RS
2888 staticpro (&Qchar_table_extra_slots);
2889 Qchar_table_extra_slots = intern ("char-table-extra-slots");
2890
7146af97
JB
2891 defsubr (&Scons);
2892 defsubr (&Slist);
2893 defsubr (&Svector);
2894 defsubr (&Smake_byte_code);
2895 defsubr (&Smake_list);
2896 defsubr (&Smake_vector);
7b07587b 2897 defsubr (&Smake_char_table);
7146af97 2898 defsubr (&Smake_string);
7b07587b 2899 defsubr (&Smake_bool_vector);
7146af97
JB
2900 defsubr (&Smake_symbol);
2901 defsubr (&Smake_marker);
2902 defsubr (&Spurecopy);
2903 defsubr (&Sgarbage_collect);
20d24714 2904 defsubr (&Smemory_limit);
310ea200 2905 defsubr (&Smemory_use_counts);
7146af97 2906}