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