plist module
[bpt/emacs.git] / src / alloc.c
CommitLineData
7146af97 1/* Storage allocation and gc for GNU Emacs Lisp interpreter.
999dd333 2
ba318903 3Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2014 Free Software
ab422c4d 4Foundation, Inc.
7146af97
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
7146af97 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
7146af97
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
7146af97 20
18160b98 21#include <config.h>
f162bcc3 22
e9b309ac 23#include <stdio.h>
92939d31 24
bc8000ff 25#ifdef ENABLE_CHECKING
b09cca6a 26#include <signal.h> /* For SIGABRT. */
bc8000ff
EZ
27#endif
28
ae9e757a 29#ifdef HAVE_PTHREAD
aa477689
JD
30#include <pthread.h>
31#endif
32
d90fb7af
RT
33#include <gc.h>
34
7146af97 35#include "lisp.h"
ece93c02 36#include "process.h"
d5e35230 37#include "intervals.h"
e5560ff7 38#include "character.h"
7146af97
JB
39#include "buffer.h"
40#include "window.h"
2538fae4 41#include "keyboard.h"
502b9b64 42#include "frame.h"
4a729fd8 43#include "termhooks.h" /* For struct terminal. */
d141d701
DA
44#ifdef HAVE_WINDOW_SYSTEM
45#include TERM_HEADER
46#endif /* HAVE_WINDOW_SYSTEM */
0328b6de 47
0065d054 48#include <verify.h>
608a4502 49#include <execinfo.h> /* For backtrace. */
01ae0fbf 50
009581fa
PE
51#if (defined ENABLE_CHECKING \
52 && defined HAVE_VALGRIND_VALGRIND_H \
53 && !defined USE_VALGRIND)
54# define USE_VALGRIND 1
55#endif
56
a84683fd
DC
57#if USE_VALGRIND
58#include <valgrind/valgrind.h>
59#include <valgrind/memcheck.h>
d160dd0c 60static bool valgrind_p;
a84683fd
DC
61#endif
62
bf952fb6 63#include <unistd.h>
de7124a7 64#include <fcntl.h>
de7124a7 65
a411ac43
PE
66#ifdef USE_GTK
67# include "gtkutil.h"
68#endif
69666f77 69#ifdef WINDOWSNT
f892cf9c 70#include "w32.h"
62aba0d4 71#include "w32heap.h" /* for sbrk */
69666f77
EZ
72#endif
73
0dd6d66d
DA
74/* Default value of gc_cons_threshold (see below). */
75
663e2b3f 76#define GC_DEFAULT_THRESHOLD (100000 * word_size)
0dd6d66d 77
29208e82
TT
78/* Global variables. */
79struct emacs_globals globals;
80
2e471eb5
GM
81/* Number of bytes of consing done since the last gc. */
82
dac616ff 83EMACS_INT consing_since_gc;
7146af97 84
974aae61
RS
85/* Similar minimum, computed from Vgc_cons_percentage. */
86
dac616ff 87EMACS_INT gc_relative_threshold;
310ea200 88
24d8a105
RS
89/* Minimum number of bytes of consing since GC before next GC,
90 when memory is full. */
91
c6b04f6b 92EMACS_INT memory_full_cons_threshold = 1 << 10;
24d8a105 93
fce31d69 94/* True during GC. */
2e471eb5 95
fce31d69 96bool gc_in_progress;
7146af97 97
fce31d69 98/* True means abort if try to GC.
3de0effb
RS
99 This is for code which is written on the assumption that
100 no GC will happen, so as to verify that assumption. */
101
fce31d69 102bool abort_on_gc;
3de0effb 103
34400008
GM
104/* Number of live and free conses etc. */
105
3ab6e069 106static EMACS_INT total_conses, total_markers, total_symbols, total_buffers;
c0c5c8ae 107static EMACS_INT total_free_conses, total_free_markers, total_free_symbols;
3ab6e069 108static EMACS_INT total_free_floats, total_floats;
fd27a537 109
2e471eb5 110/* Points to memory space allocated as "spare", to be freed if we run
c6b04f6b 111 out of memory. */
2e471eb5 112
c6b04f6b 113static void *spare_memory;
276cbe5a 114
2b6148e4
PE
115/* Amount of spare memory to keep in large reserve block, or to see
116 whether this much is available when malloc fails on a larger request. */
2e471eb5 117
c6b04f6b 118#define SPARE_MEMORY (1 << 15)
4d09bcf6 119
2e471eb5
GM
120/* If nonzero, this is a warning delivered by malloc and not yet
121 displayed. */
122
a8fe7202 123const char *pending_malloc_warning;
7146af97 124
955cbe7b
PE
125static Lisp_Object Qgc_cons_threshold;
126Lisp_Object Qchar_table_extra_slots;
e8197642 127
9e713715
GM
128/* Hook run after GC has finished. */
129
955cbe7b 130static Lisp_Object Qpost_gc_hook;
2c5bd608 131
69003fd8
PE
132#if !defined REL_ALLOC || defined SYSTEM_MALLOC
133static void refill_memory_reserve (void);
134#endif
836d0c80 135static Lisp_Object make_empty_string (int);
196e41e4 136extern Lisp_Object which_symbols (Lisp_Object, EMACS_INT) EXTERNALLY_VISIBLE;
34400008 137
ca78dc43
PE
138#ifndef DEADP
139# define DEADP(x) 0
140#endif
141
1f0b3fd2
GM
142/* Recording what needs to be marked for gc. */
143
144struct gcpro *gcprolist;
7146af97 145\f
34400008
GM
146/************************************************************************
147 Malloc
148 ************************************************************************/
149
4455ad75 150/* Function malloc calls this if it finds we are near exhausting storage. */
d457598b
AS
151
152void
a8fe7202 153malloc_warning (const char *str)
7146af97
JB
154{
155 pending_malloc_warning = str;
156}
157
34400008 158
4455ad75 159/* Display an already-pending malloc warning. */
34400008 160
d457598b 161void
971de7fb 162display_malloc_warning (void)
7146af97 163{
4455ad75
RS
164 call3 (intern ("display-warning"),
165 intern ("alloc"),
166 build_string (pending_malloc_warning),
167 intern ("emergency"));
7146af97 168 pending_malloc_warning = 0;
7146af97 169}
49efed3a 170\f
276cbe5a
RS
171/* Called if we can't allocate relocatable space for a buffer. */
172
173void
d311d28c 174buffer_memory_full (ptrdiff_t nbytes)
276cbe5a 175{
2e471eb5
GM
176 /* If buffers use the relocating allocator, no need to free
177 spare_memory, because we may have plenty of malloc space left
178 that we could get, and if we don't, the malloc that fails will
179 itself cause spare_memory to be freed. If buffers don't use the
180 relocating allocator, treat this like any other failing
181 malloc. */
276cbe5a
RS
182
183#ifndef REL_ALLOC
531b0165 184 memory_full (nbytes);
d9df6f40 185#else
2e471eb5
GM
186 /* This used to call error, but if we've run out of memory, we could
187 get infinite recursion trying to build the string. */
9b306d37 188 xsignal (Qnil, Vmemory_signal_data);
d9df6f40 189#endif
7146af97
JB
190}
191
d90fb7af 192/* Like GC_MALLOC but check for no memory. */
7146af97 193
261cb4bb 194void *
971de7fb 195xmalloc (size_t size)
7146af97 196{
d90fb7af 197 void *val = GC_MALLOC (size);
2e471eb5 198 if (!val && size)
531b0165 199 memory_full (size);
7146af97
JB
200 return val;
201}
202
23f86fce
DA
203/* Like the above, but zeroes out the memory just allocated. */
204
205void *
206xzalloc (size_t size)
207{
d90fb7af 208 return xmalloc (size);
23f86fce 209}
34400008 210
d90fb7af 211/* Like GC_REALLOC but check for no memory. */
34400008 212
261cb4bb
PE
213void *
214xrealloc (void *block, size_t size)
7146af97 215{
d90fb7af 216 void *val = GC_REALLOC (block, size);
531b0165
PE
217 if (!val && size)
218 memory_full (size);
7146af97
JB
219 return val;
220}
9ac0d9e0
JB
221
222void
261cb4bb 223xfree (void *block)
9ac0d9e0 224{
d90fb7af 225 return;
9ac0d9e0
JB
226}
227
c6b8a15b
RT
228/* Allocate pointerless memory. */
229
230void *
231xmalloc_atomic (size_t size)
232{
233 void *val = GC_MALLOC_ATOMIC (size);
234 if (! val && size)
235 memory_full (size);
236 return val;
237}
238
239void *
240xzalloc_atomic (size_t size)
241{
242 return xmalloc_atomic (size);
243}
244
902fe370
BT
245/* Allocate uncollectable memory. */
246
247void *
248xmalloc_uncollectable (size_t size)
249{
250 void *val = GC_MALLOC_UNCOLLECTABLE (size);
251 if (! val && size)
252 memory_full (size);
253 return val;
254}
255
c308c819
RT
256/* Allocate memory, but if memory is exhausted, return NULL instead of
257 signalling an error. */
258
259void *
260xmalloc_unsafe (size_t size)
261{
262 return GC_MALLOC (size);
263}
c8099634 264
c6b8a15b
RT
265/* Allocate pointerless memory, but if memory is exhausted, return
266 NULL instead of signalling an error. */
267
268void *
269xmalloc_atomic_unsafe (size_t size)
270{
271 return GC_MALLOC_ATOMIC (size);
272}
273
0065d054
PE
274/* Other parts of Emacs pass large int values to allocator functions
275 expecting ptrdiff_t. This is portable in practice, but check it to
276 be safe. */
277verify (INT_MAX <= PTRDIFF_MAX);
278
279
280/* Allocate an array of NITEMS items, each of size ITEM_SIZE.
d90fb7af 281 Signal an error on memory exhaustion. */
0065d054
PE
282
283void *
284xnmalloc (ptrdiff_t nitems, ptrdiff_t item_size)
285{
a54e2c05 286 eassert (0 <= nitems && 0 < item_size);
0065d054
PE
287 if (min (PTRDIFF_MAX, SIZE_MAX) / item_size < nitems)
288 memory_full (SIZE_MAX);
289 return xmalloc (nitems * item_size);
290}
291
c6b8a15b
RT
292/* Like xnmalloc for pointerless objects. */
293
294void *
295xnmalloc_atomic (ptrdiff_t nitems, ptrdiff_t item_size)
296{
297 eassert (0 <= nitems && 0 < item_size);
298 if (min (PTRDIFF_MAX, SIZE_MAX) / item_size < nitems)
299 memory_full (SIZE_MAX);
300 return xmalloc_atomic (nitems * item_size);
301}
0065d054
PE
302
303/* Reallocate an array PA to make it of NITEMS items, each of size ITEM_SIZE.
d90fb7af 304 Signal an error on memory exhaustion. */
0065d054
PE
305
306void *
307xnrealloc (void *pa, ptrdiff_t nitems, ptrdiff_t item_size)
308{
a54e2c05 309 eassert (0 <= nitems && 0 < item_size);
0065d054
PE
310 if (min (PTRDIFF_MAX, SIZE_MAX) / item_size < nitems)
311 memory_full (SIZE_MAX);
312 return xrealloc (pa, nitems * item_size);
313}
314
315
316/* Grow PA, which points to an array of *NITEMS items, and return the
317 location of the reallocated array, updating *NITEMS to reflect its
318 new size. The new array will contain at least NITEMS_INCR_MIN more
319 items, but will not contain more than NITEMS_MAX items total.
320 ITEM_SIZE is the size of each item, in bytes.
321
322 ITEM_SIZE and NITEMS_INCR_MIN must be positive. *NITEMS must be
323 nonnegative. If NITEMS_MAX is -1, it is treated as if it were
324 infinity.
325
326 If PA is null, then allocate a new array instead of reallocating
2dd2e622 327 the old one.
0065d054 328
d90fb7af
RT
329 If memory exhaustion occurs, set *NITEMS to zero if PA is null, and
330 signal an error (i.e., do not return).
2dd2e622
PE
331
332 Thus, to grow an array A without saving its old contents, do
333 { xfree (A); A = NULL; A = xpalloc (NULL, &AITEMS, ...); }.
334 The A = NULL avoids a dangling pointer if xpalloc exhausts memory
335 and signals an error, and later this code is reexecuted and
336 attempts to free A. */
0065d054
PE
337
338void *
339xpalloc (void *pa, ptrdiff_t *nitems, ptrdiff_t nitems_incr_min,
340 ptrdiff_t nitems_max, ptrdiff_t item_size)
341{
342 /* The approximate size to use for initial small allocation
343 requests. This is the largest "small" request for the GNU C
344 library malloc. */
345 enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
346
347 /* If the array is tiny, grow it to about (but no greater than)
348 DEFAULT_MXFAST bytes. Otherwise, grow it by about 50%. */
349 ptrdiff_t n = *nitems;
350 ptrdiff_t tiny_max = DEFAULT_MXFAST / item_size - n;
351 ptrdiff_t half_again = n >> 1;
352 ptrdiff_t incr_estimate = max (tiny_max, half_again);
353
354 /* Adjust the increment according to three constraints: NITEMS_INCR_MIN,
355 NITEMS_MAX, and what the C language can represent safely. */
356 ptrdiff_t C_language_max = min (PTRDIFF_MAX, SIZE_MAX) / item_size;
357 ptrdiff_t n_max = (0 <= nitems_max && nitems_max < C_language_max
358 ? nitems_max : C_language_max);
359 ptrdiff_t nitems_incr_max = n_max - n;
360 ptrdiff_t incr = max (nitems_incr_min, min (incr_estimate, nitems_incr_max));
361
7216e43b 362 eassert (0 < item_size && 0 < nitems_incr_min && 0 <= n && -1 <= nitems_max);
0065d054
PE
363 if (! pa)
364 *nitems = 0;
365 if (nitems_incr_max < incr)
366 memory_full (SIZE_MAX);
367 n += incr;
368 pa = xrealloc (pa, n * item_size);
369 *nitems = n;
370 return pa;
371}
372
373
dca7c6a8
GM
374/* Like strdup, but uses xmalloc. */
375
376char *
971de7fb 377xstrdup (const char *s)
dca7c6a8 378{
9acc1074 379 ptrdiff_t size;
309f24d1 380 eassert (s);
9acc1074 381 size = strlen (s) + 1;
a0a9ac13 382 return memcpy (xmalloc_atomic (size), s, size);
dca7c6a8
GM
383}
384
5b71542d
DA
385/* Like above, but duplicates Lisp string to C string. */
386
387char *
388xlispstrdup (Lisp_Object string)
389{
390 ptrdiff_t size = SBYTES (string) + 1;
a0a9ac13 391 return memcpy (xmalloc_atomic (size), SSDATA (string), size);
5b71542d
DA
392}
393
8268febf
PE
394/* Assign to *PTR a copy of STRING, freeing any storage *PTR formerly
395 pointed to. If STRING is null, assign it without copying anything.
396 Allocate before freeing, to avoid a dangling pointer if allocation
397 fails. */
398
399void
400dupstring (char **ptr, char const *string)
401{
402 char *old = *ptr;
403 *ptr = string ? xstrdup (string) : 0;
404 xfree (old);
405}
406
407
5745a7df
PE
408/* Like putenv, but (1) use the equivalent of xmalloc and (2) the
409 argument is a const pointer. */
410
411void
412xputenv (char const *string)
413{
414 if (putenv ((char *) string) != 0)
415 memory_full (0);
416}
d90fb7af
RT
417\f
418/***********************************************************************
419 Interval Allocation
420 ***********************************************************************/
98c6f1e3 421
d90fb7af 422/* Return a new interval. */
f61bef8b 423
d90fb7af
RT
424INTERVAL
425make_interval (void)
c8099634 426{
d90fb7af
RT
427 INTERVAL val = xmalloc (sizeof (struct interval));
428 RESET_INTERVAL (val);
c8099634
RS
429 return val;
430}
431
d90fb7af
RT
432/***********************************************************************
433 String Allocation
434 ***********************************************************************/
435
436/* Initialize string allocation. Called from init_alloc_once. */
34400008 437
bf952fb6 438static void
d90fb7af 439init_strings (void)
c8099634 440{
836d0c80
RT
441 empty_unibyte_string = make_empty_string (0);
442 empty_multibyte_string = make_empty_string (1);
c8099634 443}
34400008 444
d90fb7af 445/* Return a new Lisp_String. */
e76119d7 446
d90fb7af
RT
447static struct Lisp_String *
448allocate_string (void)
aea07e2c 449{
2316e1d3
BT
450 struct Lisp_String *p;
451
452 p = xmalloc (sizeof *p);
453 SCM_NEWSMOB (p->self, lisp_string_tag, p);
454 return p;
aea07e2c 455}
ab6780cd 456
ab6780cd 457
d90fb7af
RT
458/* Set up Lisp_String S for holding NCHARS characters, NBYTES bytes,
459 plus a NUL byte at the end. Allocate an sdata structure for S, and
460 set S->data to its `u.data' member. Store a NUL byte at the end of
461 S->data. Set S->size to NCHARS and S->size_byte to NBYTES. Free
462 S->data if it was initially non-null. */
ab6780cd 463
d90fb7af
RT
464void
465allocate_string_data (struct Lisp_String *s,
466 EMACS_INT nchars, EMACS_INT nbytes)
467{
468 unsigned char *data;
ab6780cd 469
d90fb7af
RT
470 if (STRING_BYTES_BOUND < nbytes)
471 string_overflow ();
ab6780cd 472
d90fb7af
RT
473 data = GC_MALLOC_ATOMIC (nbytes + 1);
474 s->data = data;
475 s->size = nchars;
476 s->size_byte = nbytes;
477 s->data[nbytes] = '\0';
478}
ab6780cd 479
d90fb7af
RT
480void
481string_overflow (void)
ab6780cd 482{
d90fb7af
RT
483 error ("Maximum string size exceeded");
484}
ab6780cd 485
836d0c80
RT
486static Lisp_Object
487make_empty_string (int multibyte)
488{
489 Lisp_Object string;
490 struct Lisp_String *s;
491
492 s = allocate_string ();
493 allocate_string_data (s, 0, 0);
494 XSETSTRING (string, s);
495 if (! multibyte)
496 STRING_SET_UNIBYTE (string);
497
498 return string;
499}
500
d90fb7af
RT
501DEFUN ("make-string", Fmake_string, Smake_string, 2, 2, 0,
502 doc: /* Return a newly created string of length LENGTH, with INIT in each element.
503LENGTH must be an integer.
504INIT must be an integer that represents a character. */)
505 (Lisp_Object length, Lisp_Object init)
506{
507 register Lisp_Object val;
508 int c;
509 EMACS_INT nbytes;
ab6780cd 510
d90fb7af
RT
511 CHECK_NATNUM (length);
512 CHECK_CHARACTER (init);
ab6780cd 513
d90fb7af
RT
514 c = XFASTINT (init);
515 if (ASCII_CHAR_P (c))
ab6780cd 516 {
d90fb7af
RT
517 nbytes = XINT (length);
518 val = make_uninit_string (nbytes);
519 memset (SDATA (val), c, nbytes);
520 SDATA (val)[nbytes] = 0;
521 }
522 else
523 {
524 unsigned char str[MAX_MULTIBYTE_LENGTH];
525 ptrdiff_t len = CHAR_STRING (c, str);
526 EMACS_INT string_len = XINT (length);
527 unsigned char *p, *beg, *end;
ab6780cd 528
d90fb7af
RT
529 if (string_len > STRING_BYTES_BOUND / len)
530 string_overflow ();
531 nbytes = len * string_len;
532 val = make_uninit_multibyte_string (string_len, nbytes);
533 for (beg = SDATA (val), p = beg, end = beg + nbytes; p < end; p += len)
8f924df7 534 {
d90fb7af
RT
535 /* First time we just copy `str' to the data of `val'. */
536 if (p == beg)
537 memcpy (p, str, len);
538 else
8f924df7 539 {
d90fb7af
RT
540 /* Next time we copy largest possible chunk from
541 initialized to uninitialized part of `val'. */
542 len = min (p - beg, end - p);
543 memcpy (p, beg, len);
8f924df7
KH
544 }
545 }
d90fb7af 546 *p = 0;
ab6780cd
SM
547 }
548
ab6780cd
SM
549 return val;
550}
551
d90fb7af
RT
552/* Fill A with 1 bits if INIT is non-nil, and with 0 bits otherwise.
553 Return A. */
ab6780cd 554
d90fb7af
RT
555Lisp_Object
556bool_vector_fill (Lisp_Object a, Lisp_Object init)
557{
558 EMACS_INT nbits = bool_vector_size (a);
559 if (0 < nbits)
560 {
561 unsigned char *data = bool_vector_uchar_data (a);
562 int pattern = NILP (init) ? 0 : (1 << BOOL_VECTOR_BITS_PER_CHAR) - 1;
563 ptrdiff_t nbytes = bool_vector_bytes (nbits);
564 int last_mask = ~ (~0u << ((nbits - 1) % BOOL_VECTOR_BITS_PER_CHAR + 1));
565 memset (data, pattern, nbytes - 1);
566 data[nbytes - 1] = pattern & last_mask;
ab6780cd 567 }
d90fb7af 568 return a;
ab6780cd 569}
1a4f1e2c 570
d90fb7af 571/* Return a newly allocated, uninitialized bool vector of size NBITS. */
34400008 572
d90fb7af
RT
573Lisp_Object
574make_uninit_bool_vector (EMACS_INT nbits)
2e471eb5 575{
d90fb7af
RT
576 Lisp_Object val;
577 EMACS_INT words = bool_vector_words (nbits);
578 EMACS_INT word_bytes = words * sizeof (bits_word);
579 EMACS_INT needed_elements = ((bool_header_size - header_size + word_bytes
580 + word_size - 1)
581 / word_size);
582 struct Lisp_Bool_Vector *p
583 = (struct Lisp_Bool_Vector *) allocate_vector (needed_elements);
584 XSETVECTOR (val, p);
585 XSETPVECTYPESIZE (XVECTOR (val), PVEC_BOOL_VECTOR, 0, 0);
586 p->size = nbits;
d5e35230 587
d90fb7af
RT
588 /* Clear padding at the end. */
589 if (words)
590 p->data[words - 1] = 0;
34400008 591
d90fb7af
RT
592 return val;
593}
34400008 594
d90fb7af
RT
595DEFUN ("make-bool-vector", Fmake_bool_vector, Smake_bool_vector, 2, 2, 0,
596 doc: /* Return a new bool-vector of length LENGTH, using INIT for each element.
597LENGTH must be a number. INIT matters only in whether it is t or nil. */)
598 (Lisp_Object length, Lisp_Object init)
599{
600 Lisp_Object val;
34400008 601
d90fb7af
RT
602 CHECK_NATNUM (length);
603 val = make_uninit_bool_vector (XFASTINT (length));
604 return bool_vector_fill (val, init);
605}
34400008 606
d90fb7af
RT
607DEFUN ("bool-vector", Fbool_vector, Sbool_vector, 0, MANY, 0,
608 doc: /* Return a new bool-vector with specified arguments as elements.
609Any number of arguments, even zero arguments, are allowed.
610usage: (bool-vector &rest OBJECTS) */)
611 (ptrdiff_t nargs, Lisp_Object *args)
612{
613 ptrdiff_t i;
614 Lisp_Object vector;
d5e35230 615
d90fb7af
RT
616 vector = make_uninit_bool_vector (nargs);
617 for (i = 0; i < nargs; i++)
618 bool_vector_set (vector, i, !NILP (args[i]));
34400008 619
d90fb7af
RT
620 return vector;
621}
d5e35230 622
d90fb7af
RT
623/* Make a string from NBYTES bytes at CONTENTS, and compute the number
624 of characters from the contents. This string may be unibyte or
625 multibyte, depending on the contents. */
d5e35230 626
d90fb7af
RT
627Lisp_Object
628make_string (const char *contents, ptrdiff_t nbytes)
d5e35230 629{
d90fb7af
RT
630 register Lisp_Object val;
631 ptrdiff_t nchars, multibyte_nbytes;
d5e35230 632
d90fb7af
RT
633 parse_str_as_multibyte ((const unsigned char *) contents, nbytes,
634 &nchars, &multibyte_nbytes);
635 if (nbytes == nchars || nbytes != multibyte_nbytes)
636 /* CONTENTS contains no multibyte sequences or contains an invalid
637 multibyte sequence. We must make unibyte string. */
638 val = make_unibyte_string (contents, nbytes);
d5e35230 639 else
d90fb7af 640 val = make_multibyte_string (contents, nchars, nbytes);
d5e35230
JA
641 return val;
642}
643
34400008 644
d90fb7af 645/* Make an unibyte string from LENGTH bytes at CONTENTS. */
d5e35230 646
d90fb7af
RT
647Lisp_Object
648make_unibyte_string (const char *contents, ptrdiff_t length)
d5e35230 649{
d90fb7af
RT
650 register Lisp_Object val;
651 val = make_uninit_string (length);
652 memcpy (SDATA (val), contents, length);
653 return val;
d5e35230
JA
654}
655
34400008 656
d90fb7af
RT
657/* Make a multibyte string from NCHARS characters occupying NBYTES
658 bytes at CONTENTS. */
1a4f1e2c 659
d90fb7af
RT
660Lisp_Object
661make_multibyte_string (const char *contents,
662 ptrdiff_t nchars, ptrdiff_t nbytes)
663{
664 register Lisp_Object val;
665 val = make_uninit_multibyte_string (nchars, nbytes);
666 memcpy (SDATA (val), contents, nbytes);
667 return val;
668}
7146af97 669
7146af97 670
d90fb7af
RT
671/* Make a string from NCHARS characters occupying NBYTES bytes at
672 CONTENTS. It is a multibyte string if NBYTES != NCHARS. */
7146af97 673
d90fb7af
RT
674Lisp_Object
675make_string_from_bytes (const char *contents,
676 ptrdiff_t nchars, ptrdiff_t nbytes)
677{
678 register Lisp_Object val;
679 val = make_uninit_multibyte_string (nchars, nbytes);
680 memcpy (SDATA (val), contents, nbytes);
681 if (SBYTES (val) == SCHARS (val))
682 STRING_SET_UNIBYTE (val);
683 return val;
684}
7146af97 685
7146af97 686
d90fb7af
RT
687/* Make a string from NCHARS characters occupying NBYTES bytes at
688 CONTENTS. The argument MULTIBYTE controls whether to label the
689 string as multibyte. If NCHARS is negative, it counts the number of
690 characters by itself. */
c8099634 691
d90fb7af
RT
692Lisp_Object
693make_specified_string (const char *contents,
694 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
695{
696 Lisp_Object val;
7146af97 697
d90fb7af
RT
698 if (nchars < 0)
699 {
700 if (multibyte)
701 nchars = multibyte_chars_in_text ((const unsigned char *) contents,
702 nbytes);
703 else
704 nchars = nbytes;
705 }
706 val = make_uninit_multibyte_string (nchars, nbytes);
707 memcpy (SDATA (val), contents, nbytes);
708 if (!multibyte)
709 STRING_SET_UNIBYTE (val);
710 return val;
711}
2e471eb5 712
2e471eb5 713
d90fb7af
RT
714/* Return an unibyte Lisp_String set up to hold LENGTH characters
715 occupying LENGTH bytes. */
91f2d272 716
d90fb7af
RT
717Lisp_Object
718make_uninit_string (EMACS_INT length)
fbe9e0b9 719{
d90fb7af 720 Lisp_Object val;
2e471eb5 721
d90fb7af
RT
722 if (!length)
723 return empty_unibyte_string;
724 val = make_uninit_multibyte_string (length, length);
725 STRING_SET_UNIBYTE (val);
726 return val;
727}
177c0ea7 728
31d929e5 729
d90fb7af
RT
730/* Return a multibyte Lisp_String set up to hold NCHARS characters
731 which occupy NBYTES bytes. */
2e471eb5 732
d90fb7af
RT
733Lisp_Object
734make_uninit_multibyte_string (EMACS_INT nchars, EMACS_INT nbytes)
7146af97 735{
d90fb7af
RT
736 Lisp_Object string;
737 struct Lisp_String *s;
2e471eb5 738
d90fb7af
RT
739 if (nchars < 0)
740 emacs_abort ();
741 if (!nbytes)
742 return empty_multibyte_string;
2e471eb5 743
d90fb7af
RT
744 s = allocate_string ();
745 s->intervals = NULL;
746 allocate_string_data (s, nchars, nbytes);
747 XSETSTRING (string, s);
748 return string;
749}
2e471eb5 750
d90fb7af
RT
751/* Print arguments to BUF according to a FORMAT, then return
752 a Lisp_String initialized with the data from BUF. */
2e471eb5 753
d90fb7af
RT
754Lisp_Object
755make_formatted_string (char *buf, const char *format, ...)
7146af97 756{
d90fb7af
RT
757 va_list ap;
758 int length;
7146af97 759
d90fb7af
RT
760 va_start (ap, format);
761 length = vsprintf (buf, format, ap);
762 va_end (ap);
763 return make_string (buf, length);
764}
3c06d205 765
d90fb7af
RT
766\f
767/***********************************************************************
768 Float Allocation
769 ***********************************************************************/
7146af97 770
d90fb7af 771/* Return a new float object with value FLOAT_VALUE. */
7146af97 772
d90fb7af
RT
773Lisp_Object
774make_float (double float_value)
775{
195e507c 776 return scm_from_double (float_value);
d90fb7af 777}
7146af97 778
d90fb7af
RT
779\f
780/***********************************************************************
781 Cons Allocation
782 ***********************************************************************/
7146af97 783
d90fb7af
RT
784DEFUN ("cons", Fcons, Scons, 2, 2, 0,
785 doc: /* Create a new cons, give it CAR and CDR as components, and return it. */)
786 (Lisp_Object car, Lisp_Object cdr)
787{
ffd1b8f8 788 return scm_cons (car, cdr);
d90fb7af 789}
7146af97 790
d90fb7af 791/* Make a list of 1, 2, 3, 4 or 5 specified objects. */
c8099634 792
d90fb7af
RT
793Lisp_Object
794list1 (Lisp_Object arg1)
795{
796 return Fcons (arg1, Qnil);
797}
7146af97 798
d90fb7af
RT
799Lisp_Object
800list2 (Lisp_Object arg1, Lisp_Object arg2)
801{
802 return Fcons (arg1, Fcons (arg2, Qnil));
803}
2e471eb5 804
2e471eb5 805
d90fb7af
RT
806Lisp_Object
807list3 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
808{
809 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Qnil)));
810}
2e471eb5 811
2e471eb5 812
d90fb7af
RT
813Lisp_Object
814list4 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4)
815{
816 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4, Qnil))));
817}
177c0ea7 818
31d929e5 819
d90fb7af
RT
820Lisp_Object
821list5 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
822{
823 return Fcons (arg1, Fcons (arg2, Fcons (arg3, Fcons (arg4,
824 Fcons (arg5, Qnil)))));
825}
2e471eb5 826
d90fb7af
RT
827/* Make a list of COUNT Lisp_Objects, where ARG is the
828 first one. Allocate conses from pure space if TYPE
829 is CONSTYPE_PURE, or allocate as usual if type is CONSTYPE_HEAP. */
f2d3008d 830
d90fb7af
RT
831Lisp_Object
832listn (enum constype type, ptrdiff_t count, Lisp_Object arg, ...)
833{
834 va_list ap;
835 ptrdiff_t i;
836 Lisp_Object val, *objp;
31d929e5 837
d90fb7af
RT
838 /* Change to SAFE_ALLOCA if you hit this eassert. */
839 eassert (count <= MAX_ALLOCA / word_size);
c9d624c6 840
d90fb7af
RT
841 objp = alloca (count * word_size);
842 objp[0] = arg;
843 va_start (ap, arg);
844 for (i = 1; i < count; i++)
845 objp[i] = va_arg (ap, Lisp_Object);
846 va_end (ap);
d457598b 847
d90fb7af
RT
848 for (val = Qnil, i = count - 1; i >= 0; i--)
849 {
850 if (type == CONSTYPE_PURE)
851 val = pure_cons (objp[i], val);
852 else if (type == CONSTYPE_HEAP)
853 val = Fcons (objp[i], val);
854 else
855 emacs_abort ();
856 }
857 return val;
7146af97
JB
858}
859
d90fb7af
RT
860DEFUN ("list", Flist, Slist, 0, MANY, 0,
861 doc: /* Return a newly created list with specified arguments as elements.
862Any number of arguments, even zero arguments, are allowed.
863usage: (list &rest OBJECTS) */)
864 (ptrdiff_t nargs, Lisp_Object *args)
7146af97 865{
d90fb7af
RT
866 register Lisp_Object val;
867 val = Qnil;
7146af97 868
d90fb7af 869 while (nargs > 0)
7146af97 870 {
d90fb7af
RT
871 nargs--;
872 val = Fcons (args[nargs], val);
7146af97 873 }
d90fb7af
RT
874 return val;
875}
c0f51373 876
c0f51373 877
d90fb7af
RT
878DEFUN ("make-list", Fmake_list, Smake_list, 2, 2, 0,
879 doc: /* Return a newly created list of length LENGTH, with each element being INIT. */)
880 (register Lisp_Object length, Lisp_Object init)
881{
882 register Lisp_Object val;
883 register EMACS_INT size;
c0f51373 884
d90fb7af
RT
885 CHECK_NATNUM (length);
886 size = XFASTINT (length);
7146af97 887
d90fb7af
RT
888 val = Qnil;
889 while (size > 0)
890 {
891 val = Fcons (init, val);
892 --size;
7146af97 893
d90fb7af
RT
894 if (size > 0)
895 {
896 val = Fcons (init, val);
897 --size;
7146af97 898
d90fb7af
RT
899 if (size > 0)
900 {
901 val = Fcons (init, val);
902 --size;
7146af97 903
d90fb7af
RT
904 if (size > 0)
905 {
906 val = Fcons (init, val);
907 --size;
c9d624c6 908
d90fb7af
RT
909 if (size > 0)
910 {
911 val = Fcons (init, val);
912 --size;
913 }
914 }
915 }
916 }
917
918 QUIT;
b7ffe040 919 }
e2984df0 920
d90fb7af
RT
921 return val;
922}
2e471eb5 923
2e471eb5 924
d90fb7af
RT
925\f
926/***********************************************************************
927 Vector Allocation
928 ***********************************************************************/
177c0ea7 929
d90fb7af 930/* The only vector with 0 slots, allocated from pure space. */
177c0ea7 931
d90fb7af 932Lisp_Object zero_vector;
5c5fecb3 933
d90fb7af 934/* Called once to initialize vector allocation. */
a0b08700 935
d90fb7af
RT
936static void
937init_vectors (void)
938{
2316e1d3
BT
939 struct Lisp_Vector *p = xmalloc (header_size);
940
941 SCM_NEWSMOB (p->header.self, lisp_vectorlike_tag, p);
942 p->header.size = 0;
943 XSETVECTOR (zero_vector, p);
d90fb7af 944}
b7ffe040 945
d90fb7af
RT
946/* Value is a pointer to a newly allocated Lisp_Vector structure
947 with room for LEN Lisp_Objects. */
b7ffe040 948
d90fb7af
RT
949static struct Lisp_Vector *
950allocate_vectorlike (ptrdiff_t len)
951{
2316e1d3
BT
952 struct Lisp_Vector *p;
953
d90fb7af 954 if (len == 0)
2316e1d3 955 p = XVECTOR (zero_vector);
d90fb7af 956 else
2316e1d3
BT
957 {
958 p = xmalloc (header_size + len * word_size);
959 SCM_NEWSMOB (p->header.self, lisp_vectorlike_tag, p);
960 }
961
962 return p;
2e471eb5
GM
963}
964
965
d90fb7af 966/* Allocate a vector with LEN slots. */
2e471eb5 967
d90fb7af
RT
968struct Lisp_Vector *
969allocate_vector (EMACS_INT len)
2e471eb5 970{
d90fb7af
RT
971 struct Lisp_Vector *v;
972 ptrdiff_t nbytes_max = min (PTRDIFF_MAX, SIZE_MAX);
177c0ea7 973
d90fb7af
RT
974 if (min ((nbytes_max - header_size) / word_size, MOST_POSITIVE_FIXNUM) < len)
975 memory_full (SIZE_MAX);
976 v = allocate_vectorlike (len);
977 v->header.size = len;
978 return v;
979}
2e471eb5 980
2e471eb5 981
d90fb7af 982/* Allocate other vector-like structures. */
2e471eb5 983
d90fb7af
RT
984struct Lisp_Vector *
985allocate_pseudovector (int memlen, int lisplen, enum pvec_type tag)
986{
987 struct Lisp_Vector *v = allocate_vectorlike (memlen);
988 int i;
2e471eb5 989
d90fb7af
RT
990 /* Catch bogus values. */
991 eassert (tag <= PVEC_FONT);
992 eassert (memlen - lisplen <= (1 << PSEUDOVECTOR_REST_BITS) - 1);
993 eassert (lisplen <= (1 << PSEUDOVECTOR_SIZE_BITS) - 1);
177c0ea7 994
d90fb7af
RT
995 /* Only the first lisplen slots will be traced normally by the GC. */
996 for (i = 0; i < lisplen; ++i)
997 v->contents[i] = Qnil;
2e471eb5 998
d90fb7af
RT
999 XSETPVECTYPESIZE (v, tag, lisplen, memlen - lisplen);
1000 return v;
1001}
2e471eb5 1002
d90fb7af
RT
1003struct buffer *
1004allocate_buffer (void)
1005{
1006 struct buffer *b = xmalloc (sizeof *b);
2e471eb5 1007
2316e1d3 1008 SCM_NEWSMOB (b->header.self, lisp_vectorlike_tag, b);
d90fb7af
RT
1009 BUFFER_PVEC_INIT (b);
1010 /* Put B on the chain of all buffers including killed ones. */
1011 b->next = all_buffers;
1012 all_buffers = b;
1013 /* Note that the rest fields of B are not initialized. */
1014 return b;
2e471eb5
GM
1015}
1016
d90fb7af
RT
1017struct Lisp_Hash_Table *
1018allocate_hash_table (void)
1019{
1020 return ALLOCATE_PSEUDOVECTOR (struct Lisp_Hash_Table, count, PVEC_HASH_TABLE);
1021}
2e471eb5 1022
d90fb7af
RT
1023struct window *
1024allocate_window (void)
2e471eb5 1025{
d90fb7af 1026 struct window *w;
177c0ea7 1027
d90fb7af
RT
1028 w = ALLOCATE_PSEUDOVECTOR (struct window, current_matrix, PVEC_WINDOW);
1029 /* Users assumes that non-Lisp data is zeroed. */
1030 memset (&w->current_matrix, 0,
1031 sizeof (*w) - offsetof (struct window, current_matrix));
1032 return w;
1033}
2e471eb5 1034
d90fb7af
RT
1035struct terminal *
1036allocate_terminal (void)
1037{
1038 struct terminal *t;
2e471eb5 1039
d90fb7af
RT
1040 t = ALLOCATE_PSEUDOVECTOR (struct terminal, next_terminal, PVEC_TERMINAL);
1041 /* Users assumes that non-Lisp data is zeroed. */
1042 memset (&t->next_terminal, 0,
1043 sizeof (*t) - offsetof (struct terminal, next_terminal));
1044 return t;
2e471eb5
GM
1045}
1046
d90fb7af
RT
1047struct frame *
1048allocate_frame (void)
1049{
1050 struct frame *f;
2e471eb5 1051
d90fb7af
RT
1052 f = ALLOCATE_PSEUDOVECTOR (struct frame, face_cache, PVEC_FRAME);
1053 /* Users assumes that non-Lisp data is zeroed. */
1054 memset (&f->face_cache, 0,
1055 sizeof (*f) - offsetof (struct frame, face_cache));
1056 return f;
1057}
2e471eb5 1058
d90fb7af
RT
1059struct Lisp_Process *
1060allocate_process (void)
2e471eb5 1061{
d90fb7af 1062 struct Lisp_Process *p;
177c0ea7 1063
d90fb7af
RT
1064 p = ALLOCATE_PSEUDOVECTOR (struct Lisp_Process, pid, PVEC_PROCESS);
1065 /* Users assumes that non-Lisp data is zeroed. */
1066 memset (&p->pid, 0,
1067 sizeof (*p) - offsetof (struct Lisp_Process, pid));
1068 return p;
1069}
2e471eb5 1070
d90fb7af
RT
1071DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
1072 doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
1073See also the function `vector'. */)
1074 (register Lisp_Object length, Lisp_Object init)
1075{
1076 Lisp_Object vector;
1077 register ptrdiff_t sizei;
1078 register ptrdiff_t i;
1079 register struct Lisp_Vector *p;
212f33f1 1080
d90fb7af 1081 CHECK_NATNUM (length);
177c0ea7 1082
d90fb7af
RT
1083 p = allocate_vector (XFASTINT (length));
1084 sizei = XFASTINT (length);
1085 for (i = 0; i < sizei; i++)
1086 p->contents[i] = init;
177c0ea7 1087
d90fb7af
RT
1088 XSETVECTOR (vector, p);
1089 return vector;
1090}
2e471eb5 1091
2e471eb5 1092
d90fb7af
RT
1093DEFUN ("vector", Fvector, Svector, 0, MANY, 0,
1094 doc: /* Return a newly created vector with specified arguments as elements.
1095Any number of arguments, even zero arguments, are allowed.
1096usage: (vector &rest OBJECTS) */)
1097 (ptrdiff_t nargs, Lisp_Object *args)
1098{
1099 ptrdiff_t i;
1100 register Lisp_Object val = make_uninit_vector (nargs);
1101 register struct Lisp_Vector *p = XVECTOR (val);
2e471eb5 1102
d90fb7af
RT
1103 for (i = 0; i < nargs; i++)
1104 p->contents[i] = args[i];
1105 return val;
2e471eb5
GM
1106}
1107
cb93f9be 1108void
d90fb7af 1109make_byte_code (struct Lisp_Vector *v)
2e471eb5 1110{
d90fb7af
RT
1111 /* Don't allow the global zero_vector to become a byte code object. */
1112 eassert (0 < v->header.size);
2e471eb5 1113
d90fb7af
RT
1114 if (v->header.size > 1 && STRINGP (v->contents[1])
1115 && STRING_MULTIBYTE (v->contents[1]))
1116 /* BYTECODE-STRING must have been produced by Emacs 20.2 or the
1117 earlier because they produced a raw 8-bit string for byte-code
1118 and now such a byte-code string is loaded as multibyte while
1119 raw 8-bit characters converted to multibyte form. Thus, now we
1120 must convert them back to the original unibyte form. */
1121 v->contents[1] = Fstring_as_unibyte (v->contents[1]);
1122 XSETPVECTYPE (v, PVEC_COMPILED);
1123}
2e471eb5 1124
d90fb7af
RT
1125DEFUN ("make-byte-code", Fmake_byte_code, Smake_byte_code, 4, MANY, 0,
1126 doc: /* Create a byte-code object with specified arguments as elements.
1127The arguments should be the ARGLIST, bytecode-string BYTE-CODE, constant
1128vector CONSTANTS, maximum stack size DEPTH, (optional) DOCSTRING,
1129and (optional) INTERACTIVE-SPEC.
1130The first four arguments are required; at most six have any
1131significance.
1132The ARGLIST can be either like the one of `lambda', in which case the arguments
1133will be dynamically bound before executing the byte code, or it can be an
1134integer of the form NNNNNNNRMMMMMMM where the 7bit MMMMMMM specifies the
1135minimum number of arguments, the 7-bit NNNNNNN specifies the maximum number
1136of arguments (ignoring &rest) and the R bit specifies whether there is a &rest
1137argument to catch the left-over arguments. If such an integer is used, the
1138arguments will not be dynamically bound but will be instead pushed on the
1139stack before executing the byte-code.
1140usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INTERACTIVE-SPEC &rest ELEMENTS) */)
2bcf0551
DA
1141 (ptrdiff_t nargs, Lisp_Object *args)
1142{
1143 ptrdiff_t i;
d90fb7af
RT
1144 register Lisp_Object val = make_uninit_vector (nargs);
1145 register struct Lisp_Vector *p = XVECTOR (val);
2e471eb5 1146
d90fb7af
RT
1147 /* We used to purecopy everything here, if purify-flag was set. This worked
1148 OK for Emacs-23, but with Emacs-24's lexical binding code, it can be
1149 dangerous, since make-byte-code is used during execution to build
1150 closures, so any closure built during the preload phase would end up
1151 copied into pure space, including its free variables, which is sometimes
1152 just wasteful and other times plainly wrong (e.g. those free vars may want
1153 to be setcar'd). */
4d774b0f 1154
d90fb7af
RT
1155 for (i = 0; i < nargs; i++)
1156 p->contents[i] = args[i];
1157 make_byte_code (p);
1158 XSETCOMPILED (val, p);
2e471eb5 1159 return val;
d90fb7af 1160}
2e471eb5 1161
3ab6e069 1162
d90fb7af
RT
1163\f
1164/***********************************************************************
1165 Symbol Allocation
1166 ***********************************************************************/
3ab6e069 1167
d90fb7af
RT
1168static void
1169set_symbol_name (Lisp_Object sym, Lisp_Object name)
1170{
1171 XSYMBOL (sym)->name = name;
1172}
3ab6e069 1173
5359af0e
BT
1174void
1175initialize_symbol (Lisp_Object val, Lisp_Object name)
d90fb7af 1176{
5359af0e 1177 struct Lisp_Symbol *p = xmalloc (sizeof *p);
3ab6e069 1178
5359af0e 1179 scm_module_define (symbol_module, val, scm_from_pointer (p, NULL));
d90fb7af 1180 p = XSYMBOL (val);
5359af0e 1181 p->self = val;
d90fb7af 1182 set_symbol_name (val, name);
30f667fb 1183 scm_module_define (plist_module, val, Qnil);
d90fb7af
RT
1184 p->redirect = SYMBOL_PLAINVAL;
1185 SET_SYMBOL_VAL (p, Qunbound);
d8ccbf1a 1186 scm_module_define (function_module, val, Qnil);
d90fb7af
RT
1187 p->interned = SYMBOL_UNINTERNED;
1188 p->constant = 0;
1189 p->declared_special = false;
5359af0e
BT
1190}
1191
1192DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
1193 doc: /* Return a newly allocated uninterned symbol whose name is NAME.
1194Its value is void, and its function definition and property list are nil. */)
1195 (Lisp_Object name)
1196{
1197 register Lisp_Object val;
1198
1199 CHECK_STRING (name);
1200
1201 val = scm_make_symbol (scm_from_utf8_stringn (SSDATA (name),
1202 SBYTES (name)));
1203 initialize_symbol (val, name);
d90fb7af
RT
1204 return val;
1205}
5b835e1d 1206
5b835e1d 1207
d90fb7af
RT
1208\f
1209/***********************************************************************
1210 Marker (Misc) Allocation
1211 ***********************************************************************/
3ab6e069 1212
d90fb7af 1213/* Return a newly allocated Lisp_Misc object of specified TYPE. */
3ab6e069 1214
d90fb7af
RT
1215static Lisp_Object
1216allocate_misc (enum Lisp_Misc_Type type)
1217{
1218 Lisp_Object val;
2316e1d3 1219 union Lisp_Misc *p;
2e471eb5 1220
2316e1d3
BT
1221 p = xmalloc (sizeof *p);
1222 SCM_NEWSMOB (p->u_any.self, lisp_misc_tag, p);
1223 XSETMISC (val, p);
d90fb7af
RT
1224 XMISCANY (val)->type = type;
1225 return val;
1226}
f8643a6b 1227
d90fb7af 1228/* Free a Lisp_Misc object. */
7146af97 1229
d90fb7af
RT
1230void
1231free_misc (Lisp_Object misc)
1232{
1233 return;
1234}
2c5bd608 1235
d90fb7af
RT
1236/* Verify properties of Lisp_Save_Value's representation
1237 that are assumed here and elsewhere. */
d35af63c 1238
d90fb7af
RT
1239verify (SAVE_UNUSED == 0);
1240verify (((SAVE_INTEGER | SAVE_POINTER | SAVE_FUNCPOINTER | SAVE_OBJECT)
1241 >> SAVE_SLOT_BITS)
1242 == 0);
2c5bd608 1243
d90fb7af
RT
1244/* Return Lisp_Save_Value objects for the various combinations
1245 that callers need. */
12b3895d 1246
d90fb7af
RT
1247Lisp_Object
1248make_save_int_int_int (ptrdiff_t a, ptrdiff_t b, ptrdiff_t c)
1249{
1250 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
1251 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1252 p->save_type = SAVE_TYPE_INT_INT_INT;
1253 p->data[0].integer = a;
1254 p->data[1].integer = b;
1255 p->data[2].integer = c;
1256 return val;
7146af97 1257}
34400008 1258
d90fb7af
RT
1259Lisp_Object
1260make_save_obj_obj_obj_obj (Lisp_Object a, Lisp_Object b, Lisp_Object c,
1261 Lisp_Object d)
c94e3311 1262{
d90fb7af
RT
1263 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
1264 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1265 p->save_type = SAVE_TYPE_OBJ_OBJ_OBJ_OBJ;
1266 p->data[0].object = a;
1267 p->data[1].object = b;
1268 p->data[2].object = c;
1269 p->data[3].object = d;
1270 return val;
1271}
c94e3311 1272
d90fb7af
RT
1273Lisp_Object
1274make_save_ptr (void *a)
1275{
1276 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
1277 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1278 p->save_type = SAVE_POINTER;
1279 p->data[0].pointer = a;
1280 return val;
c94e3311 1281}
41c28a37 1282
d90fb7af
RT
1283Lisp_Object
1284make_save_ptr_int (void *a, ptrdiff_t b)
1285{
1286 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
1287 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1288 p->save_type = SAVE_TYPE_PTR_INT;
1289 p->data[0].pointer = a;
1290 p->data[1].integer = b;
1291 return val;
1292}
41c28a37 1293
d90fb7af
RT
1294#if ! (defined USE_X_TOOLKIT || defined USE_GTK)
1295Lisp_Object
1296make_save_ptr_ptr (void *a, void *b)
41c28a37 1297{
d90fb7af
RT
1298 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
1299 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1300 p->save_type = SAVE_TYPE_PTR_PTR;
1301 p->data[0].pointer = a;
1302 p->data[1].pointer = b;
1303 return val;
1304}
1305#endif
41c28a37 1306
d90fb7af
RT
1307Lisp_Object
1308make_save_funcptr_ptr_obj (void (*a) (void), void *b, Lisp_Object c)
1309{
1310 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
1311 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1312 p->save_type = SAVE_TYPE_FUNCPTR_PTR_OBJ;
1313 p->data[0].funcpointer = a;
1314 p->data[1].pointer = b;
1315 p->data[2].object = c;
1316 return val;
41c28a37
GM
1317}
1318
d90fb7af
RT
1319/* Return a Lisp_Save_Value object that represents an array A
1320 of N Lisp objects. */
7146af97 1321
d90fb7af
RT
1322Lisp_Object
1323make_save_memory (Lisp_Object *a, ptrdiff_t n)
1324{
1325 Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value);
1326 struct Lisp_Save_Value *p = XSAVE_VALUE (val);
1327 p->save_type = SAVE_TYPE_MEMORY;
1328 p->data[0].pointer = a;
1329 p->data[1].integer = n;
1330 return val;
1331}
785cd37f 1332
d90fb7af
RT
1333/* Free a Lisp_Save_Value object. Do not use this function
1334 if SAVE contains pointer other than returned by xmalloc. */
1342fc6f 1335
d90fb7af
RT
1336void
1337free_save_value (Lisp_Object save)
d2029e5b 1338{
d90fb7af
RT
1339 xfree (XSAVE_POINTER (save, 0));
1340 free_misc (save);
d2029e5b
SM
1341}
1342
d90fb7af 1343/* Return a Lisp_Misc_Overlay object with specified START, END and PLIST. */
58026347 1344
d90fb7af
RT
1345Lisp_Object
1346build_overlay (Lisp_Object start, Lisp_Object end, Lisp_Object plist)
58026347 1347{
d90fb7af 1348 register Lisp_Object overlay;
58026347 1349
d90fb7af
RT
1350 overlay = allocate_misc (Lisp_Misc_Overlay);
1351 OVERLAY_START (overlay) = start;
1352 OVERLAY_END (overlay) = end;
1353 set_overlay_plist (overlay, plist);
1354 XOVERLAY (overlay)->next = NULL;
1355 return overlay;
58026347
KH
1356}
1357
d90fb7af
RT
1358DEFUN ("make-marker", Fmake_marker, Smake_marker, 0, 0, 0,
1359 doc: /* Return a newly allocated marker which does not point at any place. */)
1360 (void)
83f14500 1361{
d90fb7af
RT
1362 register Lisp_Object val;
1363 register struct Lisp_Marker *p;
15684f52 1364
d90fb7af
RT
1365 val = allocate_misc (Lisp_Misc_Marker);
1366 p = XMARKER (val);
1367 p->buffer = 0;
1368 p->bytepos = 0;
1369 p->charpos = 0;
1370 p->next = NULL;
1371 p->insertion_type = 0;
1372 p->need_adjustment = 0;
1373 return val;
83f14500
DA
1374}
1375
d90fb7af
RT
1376/* Return a newly allocated marker which points into BUF
1377 at character position CHARPOS and byte position BYTEPOS. */
36429c89 1378
d90fb7af
RT
1379Lisp_Object
1380build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos)
36429c89 1381{
d90fb7af
RT
1382 Lisp_Object obj;
1383 struct Lisp_Marker *m;
1384
1385 /* No dead buffers here. */
1386 eassert (BUFFER_LIVE_P (buf));
1387
1388 /* Every character is at least one byte. */
1389 eassert (charpos <= bytepos);
1390
1391 obj = allocate_misc (Lisp_Misc_Marker);
1392 m = XMARKER (obj);
1393 m->buffer = buf;
1394 m->charpos = charpos;
1395 m->bytepos = bytepos;
1396 m->insertion_type = 0;
1397 m->need_adjustment = 0;
1398 m->next = BUF_MARKERS (buf);
1399 BUF_MARKERS (buf) = m;
1400 return obj;
36429c89 1401}
d90fb7af
RT
1402\f
1403/* Return a newly created vector or string with specified arguments as
1404 elements. If all the arguments are characters that can fit
1405 in a string of events, make a string; otherwise, make a vector.
36429c89 1406
d90fb7af 1407 Any number of arguments, even zero arguments, are allowed. */
cf5c0175 1408
d90fb7af
RT
1409Lisp_Object
1410make_event_array (ptrdiff_t nargs, Lisp_Object *args)
cf5c0175 1411{
d90fb7af
RT
1412 ptrdiff_t i;
1413
1414 for (i = 0; i < nargs; i++)
1415 /* The things that fit in a string
1416 are characters that are in 0...127,
1417 after discarding the meta bit and all the bits above it. */
1418 if (!INTEGERP (args[i])
1419 || (XINT (args[i]) & ~(-CHAR_META)) >= 0200)
1420 return Fvector (nargs, args);
1421
1422 /* Since the loop exited, we know that all the things in it are
1423 characters, so we can make a string. */
1424 {
1425 Lisp_Object result;
cf5c0175 1426
d90fb7af
RT
1427 result = Fmake_string (make_number (nargs), make_number (0));
1428 for (i = 0; i < nargs; i++)
1429 {
1430 SSET (result, i, XINT (args[i]));
1431 /* Move the meta bit to the right place for a string char. */
1432 if (XINT (args[i]) & CHAR_META)
1433 SSET (result, i, SREF (result, i) | 0x80);
1434 }
cf5c0175 1435
d90fb7af
RT
1436 return result;
1437 }
1438}
cf5c0175 1439
cf5c0175 1440
d90fb7af
RT
1441\f
1442/************************************************************************
1443 Memory Full Handling
1444 ************************************************************************/
cf5c0175 1445
cf5c0175 1446
d90fb7af
RT
1447/* Called if xmalloc (NBYTES) returns zero. If NBYTES == SIZE_MAX,
1448 there may have been size_t overflow so that xmalloc was never
1449 called, or perhaps xmalloc was invoked successfully but the
1450 resulting pointer had problems fitting into a tagged EMACS_INT. In
1451 either case this counts as memory being full even though xmalloc
1452 did not fail. */
fc54bdd5 1453
d90fb7af
RT
1454void
1455memory_full (size_t nbytes)
fc54bdd5 1456{
d90fb7af
RT
1457 /* Do not go into hysterics merely because a large request failed. */
1458 bool enough_free_memory = 0;
1459 if (SPARE_MEMORY < nbytes)
fc54bdd5 1460 {
a0a9ac13 1461 void *p = xmalloc_atomic_unsafe (SPARE_MEMORY);
d90fb7af 1462 if (p)
fc54bdd5 1463 {
d90fb7af
RT
1464 xfree (p);
1465 enough_free_memory = 1;
fc54bdd5
DA
1466 }
1467 }
83f14500 1468
d90fb7af 1469 if (! enough_free_memory)
2c70e6b0 1470 {
d90fb7af 1471 Vmemory_full = Qt;
d73e321c 1472
d90fb7af
RT
1473 /* The first time we get here, free the spare memory. */
1474 if (spare_memory)
1475 {
1476 xfree (spare_memory);
1477 spare_memory = NULL;
1478 }
d73e321c 1479 }
d90fb7af
RT
1480
1481 /* This used to call error, but if we've run out of memory, we could
1482 get infinite recursion trying to build the string. */
1483 xsignal (Qnil, Vmemory_signal_data);
d73e321c
DA
1484}
1485
d90fb7af
RT
1486/* If we released our reserve (due to running out of memory),
1487 and we have a fair amount free once again,
1488 try to set aside another reserve in case we run out once more.
2c70e6b0 1489
d90fb7af
RT
1490 This is called when a relocatable block is freed in ralloc.c,
1491 and also directly from this file, in case we're not using ralloc.c. */
cf5c0175 1492
41c28a37 1493void
d90fb7af 1494refill_memory_reserve (void)
7146af97 1495{
d90fb7af 1496 if (spare_memory == NULL)
a0a9ac13 1497 spare_memory = xmalloc_atomic_unsafe (SPARE_MEMORY);
7146af97 1498
d90fb7af
RT
1499 if (spare_memory)
1500 Vmemory_full = Qnil;
1501}
1502\f
1503/* Determine whether it is safe to access memory at address P. */
1504static int
1505valid_pointer_p (void *p)
1506{
1507#ifdef WINDOWSNT
1508 return w32_valid_pointer_p (p, 16);
1509#else
1510 int fd[2];
7146af97 1511
d90fb7af
RT
1512 /* Obviously, we cannot just access it (we would SEGV trying), so we
1513 trick the o/s to tell us whether p is a valid pointer.
1514 Unfortunately, we cannot use NULL_DEVICE here, as emacs_write may
1515 not validate p in that case. */
785cd37f 1516
d90fb7af 1517 if (emacs_pipe (fd) == 0)
7146af97 1518 {
d90fb7af
RT
1519 bool valid = emacs_write (fd[1], p, 16) == 16;
1520 emacs_close (fd[1]);
1521 emacs_close (fd[0]);
1522 return valid;
1523 }
df24a230 1524
d90fb7af 1525 return -1;
df24a230 1526#endif
d90fb7af 1527}
cf5c0175 1528
d90fb7af
RT
1529/* Return 2 if OBJ is a killed or special buffer object, 1 if OBJ is a
1530 valid lisp object, 0 if OBJ is NOT a valid lisp object, or -1 if we
1531 cannot validate OBJ. This function can be quite slow, so its primary
1532 use is the manual debugging. The only exception is print_object, where
1533 we use it to check whether the memory referenced by the pointer of
1534 Lisp_Save_Value object contains valid objects. */
5779a1dc 1535
d90fb7af
RT
1536int
1537valid_lisp_object_p (Lisp_Object obj)
1538{
1539 void *p;
e99f70c8 1540
2316e1d3 1541 if (SCM_IMP (obj))
d90fb7af 1542 return 1;
e99f70c8 1543
2316e1d3 1544 p = (void *) SCM2PTR (obj);
cf5c0175 1545
d90fb7af
RT
1546 if (p == &buffer_defaults || p == &buffer_local_symbols)
1547 return 2;
cf5c0175 1548
d90fb7af
RT
1549 return valid_pointer_p (p);
1550}
cf5c0175 1551
d90fb7af
RT
1552/* If GC_MARK_STACK, return 1 if STR is a relocatable data of Lisp_String
1553 (i.e. there is a non-pure Lisp_Object X so that SDATA (X) == STR) and 0
1554 if not. Otherwise we can't rely on valid_lisp_object_p and return -1.
1555 This function is slow and should be used for debugging purposes. */
cf5c0175 1556
d90fb7af
RT
1557int
1558relocatable_string_data_p (const char *str)
1559{
d90fb7af
RT
1560 return -1;
1561}
cf5c0175 1562
d90fb7af 1563/***********************************************************************
836d0c80 1564 Pure Storage Compatibility Functions
d90fb7af 1565 ***********************************************************************/
cf5c0175 1566
d90fb7af
RT
1567void
1568check_pure_size (void)
4a729fd8 1569{
836d0c80 1570 return;
41c28a37
GM
1571}
1572
d90fb7af
RT
1573Lisp_Object
1574make_pure_string (const char *data,
1575 ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
1576{
836d0c80 1577 return make_specified_string (data, nchars, nbytes, multibyte);
b029599f 1578}
7146af97 1579
d90fb7af
RT
1580Lisp_Object
1581make_pure_c_string (const char *data, ptrdiff_t nchars)
b029599f 1582{
836d0c80 1583 return build_string (data);
d90fb7af 1584}
177c0ea7 1585
d90fb7af
RT
1586Lisp_Object
1587pure_cons (Lisp_Object car, Lisp_Object cdr)
b029599f 1588{
836d0c80 1589 return Fcons (car, cdr);
d90fb7af 1590}
177c0ea7 1591
d90fb7af 1592DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
836d0c80 1593 doc: /* Return OBJ. */)
d90fb7af
RT
1594 (register Lisp_Object obj)
1595{
d90fb7af 1596 return obj;
7146af97 1597}
7146af97 1598\f
d90fb7af
RT
1599/***********************************************************************
1600 Protection from GC
1601 ***********************************************************************/
20d24714 1602
d90fb7af
RT
1603void
1604staticpro (Lisp_Object *varaddress)
310ea200 1605{
eb6a5d03 1606 return;
310ea200 1607}
d90fb7af
RT
1608\f
1609DEFUN ("garbage-collect", Fgarbage_collect, Sgarbage_collect, 0, 0, "",
1610 doc: /* Reclaim storage for Lisp objects no longer needed.
1611Garbage collection happens automatically if you cons more than
1612`gc-cons-threshold' bytes of Lisp data since previous garbage collection.
1613`garbage-collect' normally returns a list with info on amount of space in use,
1614where each entry has the form (NAME SIZE USED FREE), where:
1615- NAME is a symbol describing the kind of objects this entry represents,
1616- SIZE is the number of bytes used by each one,
1617- USED is the number of those objects that were found live in the heap,
1618- FREE is the number of those objects that are not live but that Emacs
1619 keeps around for future allocations (maybe because it does not know how
1620 to return them to the OS).
1621However, if there was overflow in pure space, `garbage-collect'
1622returns nil, because real GC can't be done.
1623See Info node `(elisp)Garbage Collection'. */)
1624 (void)
8b058d44 1625{
d90fb7af
RT
1626 GC_gcollect ();
1627 return Qt;
8b058d44 1628}
d90fb7af 1629\f
244ed907 1630#ifdef ENABLE_CHECKING
f4a681b0 1631
fce31d69 1632bool suppress_checking;
d3d47262 1633
e0b8c689 1634void
971de7fb 1635die (const char *msg, const char *file, int line)
e0b8c689 1636{
5013fc08 1637 fprintf (stderr, "\r\n%s:%d: Emacs fatal error: assertion failed: %s\r\n",
e0b8c689 1638 file, line, msg);
4d7e6e51 1639 terminate_due_to_signal (SIGABRT, INT_MAX);
e0b8c689 1640}
244ed907 1641#endif
20d24714 1642\f
b09cca6a 1643/* Initialization. */
7146af97 1644
dfcf069d 1645void
971de7fb 1646init_alloc_once (void)
7146af97 1647{
2316e1d3
BT
1648 lisp_misc_tag = scm_make_smob_type ("elisp-misc", 0);
1649 lisp_string_tag = scm_make_smob_type ("elisp-string", 0);
1650 lisp_vectorlike_tag = scm_make_smob_type ("elisp-vectorlike", 0);
2316e1d3 1651
7146af97 1652 /* Used to do Vpurify_flag = Qt here, but Qt isn't set up yet! */
ab6780cd 1653
7146af97 1654 init_strings ();
f3372c87 1655 init_vectors ();
d5e35230 1656
24d8a105 1657 refill_memory_reserve ();
0dd6d66d 1658 gc_cons_threshold = GC_DEFAULT_THRESHOLD;
7146af97
JB
1659}
1660
dfcf069d 1661void
971de7fb 1662init_alloc (void)
7146af97
JB
1663{
1664 gcprolist = 0;
2c5bd608
DL
1665 Vgc_elapsed = make_float (0.0);
1666 gcs_done = 0;
a84683fd
DC
1667
1668#if USE_VALGRIND
d160dd0c 1669 valgrind_p = RUNNING_ON_VALGRIND != 0;
a84683fd 1670#endif
7146af97
JB
1671}
1672
1673void
971de7fb 1674syms_of_alloc (void)
7146af97 1675{
172a66a1
BT
1676#include "alloc.x"
1677
29208e82 1678 DEFVAR_INT ("gc-cons-threshold", gc_cons_threshold,
fb7ada5f 1679 doc: /* Number of bytes of consing between garbage collections.
228299fa
GM
1680Garbage collection can happen automatically once this many bytes have been
1681allocated since the last garbage collection. All data types count.
7146af97 1682
228299fa 1683Garbage collection happens automatically only when `eval' is called.
7146af97 1684
228299fa 1685By binding this temporarily to a large number, you can effectively
96f077ad
SM
1686prevent garbage collection during a part of the program.
1687See also `gc-cons-percentage'. */);
1688
29208e82 1689 DEFVAR_LISP ("gc-cons-percentage", Vgc_cons_percentage,
fb7ada5f 1690 doc: /* Portion of the heap used for allocation.
96f077ad
SM
1691Garbage collection can happen automatically once this portion of the heap
1692has been allocated since the last garbage collection.
1693If this portion is smaller than `gc-cons-threshold', this is ignored. */);
1694 Vgc_cons_percentage = make_float (0.1);
0819585c 1695
29208e82 1696 DEFVAR_INT ("pure-bytes-used", pure_bytes_used,
333f9019 1697 doc: /* Number of bytes of shareable Lisp data allocated so far. */);
0819585c 1698
29208e82 1699 DEFVAR_LISP ("purify-flag", Vpurify_flag,
a6266d23 1700 doc: /* Non-nil means loading Lisp code in order to dump an executable.
e9515805
SM
1701This means that certain objects should be allocated in shared (pure) space.
1702It can also be set to a hash-table, in which case this table is used to
1703do hash-consing of the objects allocated to pure space. */);
228299fa 1704
29208e82 1705 DEFVAR_BOOL ("garbage-collection-messages", garbage_collection_messages,
a6266d23 1706 doc: /* Non-nil means display messages at start and end of garbage collection. */);
299585ee
RS
1707 garbage_collection_messages = 0;
1708
29208e82 1709 DEFVAR_LISP ("post-gc-hook", Vpost_gc_hook,
a6266d23 1710 doc: /* Hook run after garbage collection has finished. */);
9e713715 1711 Vpost_gc_hook = Qnil;
cd3520a4 1712 DEFSYM (Qpost_gc_hook, "post-gc-hook");
9e713715 1713
29208e82 1714 DEFVAR_LISP ("memory-signal-data", Vmemory_signal_data,
74a54b04 1715 doc: /* Precomputed `signal' argument for memory-full error. */);
bcb61d60
KH
1716 /* We build this in advance because if we wait until we need it, we might
1717 not be able to allocate the memory to hold it. */
74a54b04 1718 Vmemory_signal_data
3438fe21 1719 = listn (CONSTYPE_PURE, 2, Qerror,
694b6c97 1720 build_pure_c_string ("Memory exhausted--use M-x save-some-buffers then exit and restart Emacs"));
74a54b04 1721
29208e82 1722 DEFVAR_LISP ("memory-full", Vmemory_full,
24d8a105 1723 doc: /* Non-nil means Emacs cannot get much more Lisp memory. */);
74a54b04 1724 Vmemory_full = Qnil;
bcb61d60 1725
cd3520a4
JB
1726 DEFSYM (Qgc_cons_threshold, "gc-cons-threshold");
1727 DEFSYM (Qchar_table_extra_slots, "char-table-extra-slots");
a59de17b 1728
29208e82 1729 DEFVAR_LISP ("gc-elapsed", Vgc_elapsed,
2c5bd608 1730 doc: /* Accumulated time elapsed in garbage collections.
e7415487 1731The time is in seconds as a floating point value. */);
29208e82 1732 DEFVAR_INT ("gcs-done", gcs_done,
e7415487 1733 doc: /* Accumulated number of garbage collections done. */);
7146af97 1734}
5eceb8fb 1735
4706125e
PE
1736/* When compiled with GCC, GDB might say "No enum type named
1737 pvec_type" if we don't have at least one symbol with that type, and
1738 then xbacktrace could fail. Similarly for the other enums and
62aba0d4
FP
1739 their values. Some non-GCC compilers don't like these constructs. */
1740#ifdef __GNUC__
4706125e
PE
1741union
1742{
03a660a6
PE
1743 enum CHARTAB_SIZE_BITS CHARTAB_SIZE_BITS;
1744 enum CHAR_TABLE_STANDARD_SLOTS CHAR_TABLE_STANDARD_SLOTS;
1745 enum char_bits char_bits;
03a660a6 1746 enum DEFAULT_HASH_SIZE DEFAULT_HASH_SIZE;
4706125e 1747 enum Lisp_Bits Lisp_Bits;
03a660a6
PE
1748 enum Lisp_Compiled Lisp_Compiled;
1749 enum maxargs maxargs;
1750 enum MAX_ALLOCA MAX_ALLOCA;
4706125e
PE
1751 enum More_Lisp_Bits More_Lisp_Bits;
1752 enum pvec_type pvec_type;
1753} const EXTERNALLY_VISIBLE gdb_make_enums_visible = {0};
62aba0d4 1754#endif /* __GNUC__ */