Compare commits

...

2 commits

Author SHA1 Message Date
Pip Cet
b6a526361b Remove purespace and ancillary code
Now that purespace is not used any more, remove it, along with the functions
used to allocate into it.  Use equivalent functions allocating into the
normal heap.
Remove calls to PURE_P since they always return false.

* src/puresize.h: Delete file.

* src/alloc.c: Don't include `puresize.h` any more.
(pure, purebeg, pure_size, pure_bytes_used_before_overflow)
(pure_bytes_used_lisp, pure_bytes_used_non_lisp, symbol_block_pinned)
(pinned_objects): Delete vars.
(PUREBEG): Delete macro.
(pointer_align): Move after definition of USE_ALIGNED_ALLOC and only
define it if USE_ALIGNED_ALLOC is not used.
(cons_listn): Remove `cons` arg, hardcode `Fcons` instead.
(pure_listn, pure_alloc, check_pure_size, make_pure_string)
(make_pure_c_string, pure_cons): Delete functions.
(init_symbol): Don't set `pinned` any more.
(mark_pinned_objects, mark_pinned_symbols): Delete functions.
(garbage_collect): Don't call them any more.
(init_alloc_once_for_pdumper): Don't initialize purebeg and pure_size.

* src/print.c (print_object) <PVEC_HASH_TABLE>: Don't print `purecopy`.

* src/pdumper.c (dump_symbol, dump_hash_table): Update sig hash.
(dump_symbol): Don't dump `pinned`.
(dump_hash_table): Don't dump `purecopy`.

* src/lread.c (readevalloop, read_internal_start): Adjust call to
`make_hash_table`.
(read0, intern_c_string_1, define_symbol, Fintern): Don't purify
symbol names.
(string): Avoid `pure_cons` and `build_pure_c_string`.

* src/lisp.h (struct Lisp_Symbol): Remove `pinned` field.
(struct Lisp_Hash_Table): Remove `purecopy` field.
(check_pure_size, pure_listn, pure_list, make_pure_string)
(make_pure_c_string, pure_cons): Remove prototypes.
(build_pure_c_string): Delete function.

* src/keymap.c: Don't include `puresize.h` any more.
(Fmake_sparse_keymap): Don't purecopy the menu name.
(Fset_keymap_parent, store_in_keymap): Don't `CHECK_IMPURE` any more.
(syms_of_keymap): Avoid `pure_cons` and `build_pure_c_string`.

* src/intervals.c: Don't include `puresize.h` any more.
(create_root_interval): Don't `CHECK_IMPURE` any more.

* src/fns.c: Don't include `puresize.h` any more.
(Ffillarray, Fclear_string): Don't `CHECK_IMPURE` any more.
(make_hash_table): Remove `purecopy` arg.
(Fmake_hash_table): Remove `:purecopy` keyword argument.

* src/eval.c (Finternal__define_uninitialized_variable): Don't purecopy
the doc any more.
(Fdefconst_1): Don't purecopy the initvalue any more.
(Fautoload): Get rid of hack needed when we used hash-consing.
(syms_of_eval): Avoid `build_pure_c_string`.

* src/emacs.c: Don't include `puresize.h` any more.
(Fdump_emacs): Don't `check_pure_size`.

* src/doc.c (Fsnarf_documentation): Don't purecopy the build files.

* src/deps.mk: Remove puresize.h.

* src/data.c: Don't include `puresize.h` any more.
(pure_write_error): Delete function.
(Fsetcar, Fsetcdr): Don't `CHECK_IMPURE` any more.
(Fdefalias): Don't purecopy the definition any more.
(Faset): Don't `CHECK_IMPURE` any more.
(syms_of_data): Avoid `pure_cons` and `build_pure_c_string`.

* src/conf_post.h (SYSTEM_PURESIZE_EXTRA): Delete macro.

* src/comp.c: Don't include `puresize.h` any more.
(helper_link_table): Remove `pure_write_error`.
(define_CHECK_IMPURE): Delete function.
(maybe_defer_native_compilation, syms_of_comp):
Avoid `build_pure_c_string`.

* src/category.c (hash_get_category_set): Update call to `make_hash_table`.
(Fdefine_category): Don't purecopy the docstring any more.

* src/bytecode.c: Don't include `puresize.h` any more.
(Bsetcar, Bsetcdr): Don't `CHECK_IMPURE` any more.

* doc/lispref/internals.texi (Pure Storage): Delete section.
(Garbage Collection): Remove note about purespace overflow.

* src/xfaces.c (syms_of_xfaces):
* src/emacs-module.c (syms_of_module):
* src/frame.c (make_frame, make_initial_frame):
* src/fileio.c (syms_of_fileio):
* src/image.c (xpm_make_color_table_h):
* src/process.c (ADD_SUBFEATURE, syms_of_process):
* src/profiler.c (make_log):
* src/json.c (define_error):
* src/xterm.c (syms_of_xterm):
* src/xfns.c (syms_of_xfns):
* src/xdisp.c (syms_of_xdisp):
* src/w32fns.c (syms_of_w32fns):
* src/syntax.c (syms_of_syntax):
* src/sqlite.c (syms_of_sqlite):
* src/search.c (syms_of_search):
* src/keyboard.c (syms_of_keyboard):
* src/fontset.c (syms_of_fontset):
* src/dbusbind.c (syms_of_dbusbind):
* src/coding.c (syms_of_coding):
* src/callint.c (syms_of_callint):
* src/buffer.c (init_buffer_once, syms_of_buffer):
Avoid `build_pure_c_string`, `Fpurecopy`, `pure_cons`, and `pure_list`,
and adjust calls to `make_hash_table`.
2022-07-01 18:59:35 -04:00
Stefan Monnier
3daf833ff3 src/alloc.c: Remove all uses of pure_alloc
First step of removal of the purespace: stop using it.
The more delicate parts are the handling of 0-length strings and
vectors which we used to allocate in purespace but now need to be
allocated elsewhere, but the existing code makes us work harder to
allocate them in the normal way.

* src/alloc.c: Remove all uses of `pure_alloc`.
(init_strings): Alloc empty strings in the normal heap.
(init_vectors): Allocate the zero_vector in the normal heap.
(make_pure_string, make_pure_c_string, pure_cons): Rewrite to create
normal heap objects.
(find_string_data_in_pure, make_pure_float, make_pure_bignum)
(make_pure_vector, purecopy_hash_table): Delete functions.
(purecopy): Return without purecopying.
2022-07-01 18:59:29 -04:00
42 changed files with 245 additions and 1050 deletions

View file

@ -1626,7 +1626,6 @@ Tips and Conventions
GNU Emacs Internals
* Building Emacs:: How the dumped Emacs is made.
* Pure Storage:: Kludge to make preloaded Lisp functions shareable.
* Garbage Collection:: Reclaiming space for Lisp objects no longer used.
* Stack-allocated Objects:: Temporary conses and strings on C stack.
* Memory Usage:: Info about total size of Lisp objects made so far.

View file

@ -12,7 +12,6 @@ internal aspects of GNU Emacs that may be of interest to C programmers.
@menu
* Building Emacs:: How the dumped Emacs is made.
* Pure Storage:: Kludge to make preloaded Lisp functions shareable.
* Garbage Collection:: Reclaiming space for Lisp objects no longer used.
* Stack-allocated Objects:: Temporary conses and strings on C stack.
* Memory Usage:: Info about total size of Lisp objects made so far.
@ -251,71 +250,6 @@ If the current session was not restored from a dump file, the
value is nil.
@end defun
@node Pure Storage
@section Pure Storage
@cindex pure storage
Emacs Lisp uses two kinds of storage for user-created Lisp objects:
@dfn{normal storage} and @dfn{pure storage}. Normal storage is where
all the new data created during an Emacs session are kept
(@pxref{Garbage Collection}). Pure storage is used for certain data
in the preloaded standard Lisp files---data that should never change
during actual use of Emacs.
Pure storage is allocated only while @command{temacs} is loading the
standard preloaded Lisp libraries. In the file @file{emacs}, it is
marked as read-only (on operating systems that permit this), so that
the memory space can be shared by all the Emacs jobs running on the
machine at once. Pure storage is not expandable; a fixed amount is
allocated when Emacs is compiled, and if that is not sufficient for
the preloaded libraries, @file{temacs} allocates dynamic memory for
the part that didn't fit. If Emacs will be dumped using the
@code{pdump} method (@pxref{Building Emacs}), the pure-space overflow
is of no special importance (it just means some of the preloaded stuff
cannot be shared with other Emacs jobs). However, if Emacs will be
dumped using the now obsolete @code{unexec} method, the resulting
image will work, but garbage collection (@pxref{Garbage Collection})
is disabled in this situation, causing a memory leak. Such an
overflow normally won't happen unless you try to preload additional
libraries or add features to the standard ones. Emacs will display a
warning about the overflow when it starts, if it was dumped using
@code{unexec}. If this happens, you should increase the compilation
parameter @code{SYSTEM_PURESIZE_EXTRA} in the file
@file{src/puresize.h} and rebuild Emacs.
@defun purecopy object
This function makes a copy in pure storage of @var{object}, and returns
it. It copies a string by simply making a new string with the same
characters, but without text properties, in pure storage. It
recursively copies the contents of vectors and cons cells. It does
not make copies of other objects such as symbols, but just returns
them unchanged. It signals an error if asked to copy markers.
This function is a no-op except while Emacs is being built and dumped;
it is usually called only in preloaded Lisp files.
@end defun
@defvar pure-bytes-used
The value of this variable is the number of bytes of pure storage
allocated so far. Typically, in a dumped Emacs, this number is very
close to the total amount of pure storage available---if it were not,
we would preallocate less.
@end defvar
@defvar purify-flag
This variable determines whether @code{defun} should make a copy of the
function definition in pure storage. If it is non-@code{nil}, then the
function definition is copied into pure storage.
This flag is @code{t} while loading all of the basic functions for
building Emacs initially (allowing those functions to be shareable and
non-collectible). Dumping Emacs as an executable always writes
@code{nil} in this variable, regardless of the value it actually has
before and after dumping.
You should not change this flag in a running Emacs.
@end defvar
@node Garbage Collection
@section Garbage Collection
@ -526,12 +460,6 @@ Total heap size, in @var{unit-size} units.
@item free-size
Heap space which is not currently used, in @var{unit-size} units.
@end table
If there was overflow in pure space (@pxref{Pure Storage}), and Emacs
was dumped using the (now obsolete) @code{unexec} method
(@pxref{Building Emacs}), then @code{garbage-collect} returns
@code{nil}, because a real garbage collection cannot be done in that
case.
@end deffn
@defopt garbage-collection-messages
@ -950,7 +878,6 @@ improves user experience.
the variables are never written once Emacs is dumped. These variables
with initializers are allocated in an area of memory that becomes
read-only (on certain operating systems) as a result of dumping Emacs.
@xref{Pure Storage}.
@cindex @code{defsubr}, Lisp symbol for a primitive
Defining the C function is not enough to make a Lisp primitive

View file

@ -596,8 +596,7 @@ modes. @xref{Setting Hooks}.
If the value is non-@code{nil}, the named function is considered to be
pure (@pxref{What Is a Function}). Calls with constant arguments can
be evaluated at compile time. This may shift run time errors to
compile time. Not to be confused with pure storage (@pxref{Pure
Storage}).
compile time.
@item risky-local-variable
If the value is non-@code{nil}, the named variable is considered risky

View file

@ -34,7 +34,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "bignum.h"
#include "dispextern.h"
#include "intervals.h"
#include "puresize.h"
#include "sheap.h"
#include "sysstdio.h"
#include "systime.h"
@ -334,33 +333,6 @@ static char *spare_memory[7];
#define SPARE_MEMORY (1 << 14)
/* Initialize it to a nonzero value to force it into data space
(rather than bss space). That way unexec will remap it into text
space (pure), on some systems. We have not implemented the
remapping on more recent systems because this is less important
nowadays than in the days of small memories and timesharing. */
EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,};
#define PUREBEG (char *) pure
/* Pointer to the pure area, and its size. */
static char *purebeg;
static ptrdiff_t pure_size;
/* Number of bytes of pure storage used before pure storage overflowed.
If this is non-zero, this implies that an overflow occurred. */
static ptrdiff_t pure_bytes_used_before_overflow;
/* Index in pure at which next pure Lisp object will be allocated.. */
static ptrdiff_t pure_bytes_used_lisp;
/* Number of bytes allocated for non-Lisp objects in pure storage. */
static ptrdiff_t pure_bytes_used_non_lisp;
/* If positive, garbage collection is inhibited. Otherwise, zero. */
static intptr_t garbage_collection_inhibited;
@ -435,7 +407,6 @@ no_sanitize_memcpy (void *dest, void const *src, size_t size)
static void unchain_finalizer (struct Lisp_Finalizer *);
static void mark_terminals (void);
static void gc_sweep (void);
static Lisp_Object make_pure_vector (ptrdiff_t);
static void mark_buffer (struct buffer *);
#if !defined REL_ALLOC || defined SYSTEM_MALLOC || defined HYBRID_MALLOC
@ -562,16 +533,6 @@ Lisp_Object const *staticvec[NSTATICS]
int staticidx;
static void *pure_alloc (size_t, int);
/* Return PTR rounded up to the next multiple of ALIGNMENT. */
static void *
pointer_align (void *ptr, int alignment)
{
return (void *) ROUNDUP ((uintptr_t) ptr, alignment);
}
/* Extract the pointer hidden within O. */
static ATTRIBUTE_NO_SANITIZE_UNDEFINED void *
@ -1153,6 +1114,16 @@ struct ablocks
(1 & (intptr_t) ABLOCKS_BUSY (abase) ? abase : ((void **) (abase))[-1])
#endif
/* Return PTR rounded up to the next multiple of ALIGNMENT. */
#ifndef USE_ALIGNED_ALLOC
static void *
pointer_align (void *ptr, int alignment)
{
return (void *) ROUNDUP ((uintptr_t) ptr, alignment);
}
#endif
/* The list of free ablock. */
static struct ablock *free_ablock;
@ -1674,12 +1645,30 @@ static ptrdiff_t const STRING_BYTES_MAX =
/* Initialize string allocation. Called from init_alloc_once. */
static struct Lisp_String *allocate_string (void);
static void
allocate_string_data (struct Lisp_String *s,
EMACS_INT nchars, EMACS_INT nbytes, bool clearit,
bool immovable);
static void
init_strings (void)
{
empty_unibyte_string = make_pure_string ("", 0, 0, 0);
/* String allocation code will return one of 'empty_*ibyte_string'
when asked to construct a new 0-length string, so in order to build
those special cases, we have to do it "by hand". */
struct Lisp_String *ems = allocate_string ();
struct Lisp_String *eus = allocate_string ();
ems->u.s.intervals = NULL;
eus->u.s.intervals = NULL;
allocate_string_data (ems, 0, 0, false, false);
allocate_string_data (eus, 0, 0, false, false);
/* We can't use 'STRING_SET_UNIBYTE' because this one includes a hack
* to redirect its arg to 'empty_unibyte_string' when nbytes == 0. */
eus->u.s.size_byte = -1;
XSETSTRING (empty_multibyte_string, ems);
XSETSTRING (empty_unibyte_string, eus);
staticpro (&empty_unibyte_string);
empty_multibyte_string = make_pure_string ("", 0, 0, 1);
staticpro (&empty_multibyte_string);
}
@ -1697,7 +1686,7 @@ string_bytes (struct Lisp_String *s)
ptrdiff_t nbytes =
(s->u.s.size_byte < 0 ? s->u.s.size & ~ARRAY_MARK_FLAG : s->u.s.size_byte);
if (!PURE_P (s) && !pdumper_object_p (s) && s->u.s.data
if (!pdumper_object_p (s) && s->u.s.data
&& nbytes != SDATA_NBYTES (SDATA_OF_STRING (s)))
emacs_abort ();
return nbytes;
@ -2512,7 +2501,7 @@ pin_string (Lisp_Object string)
unsigned char *data = s->u.s.data;
if (!(size > LARGE_STRING_BYTES
|| PURE_P (data) || pdumper_object_p (data)
|| pdumper_object_p (data)
|| s->u.s.size_byte == -3))
{
eassert (s->u.s.size_byte == -1);
@ -2772,17 +2761,16 @@ list5 (Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3, Lisp_Object arg4,
}
/* Make a list of COUNT Lisp_Objects, where ARG is the first one.
Use CONS to construct the pairs. AP has any remaining args. */
AP has any remaining args. */
static Lisp_Object
cons_listn (ptrdiff_t count, Lisp_Object arg,
Lisp_Object (*cons) (Lisp_Object, Lisp_Object), va_list ap)
cons_listn (ptrdiff_t count, Lisp_Object arg, va_list ap)
{
eassume (0 < count);
Lisp_Object val = cons (arg, Qnil);
Lisp_Object val = Fcons (arg, Qnil);
Lisp_Object tail = val;
for (ptrdiff_t i = 1; i < count; i++)
{
Lisp_Object elem = cons (va_arg (ap, Lisp_Object), Qnil);
Lisp_Object elem = Fcons (va_arg (ap, Lisp_Object), Qnil);
XSETCDR (tail, elem);
tail = elem;
}
@ -2795,18 +2783,7 @@ listn (ptrdiff_t count, Lisp_Object arg1, ...)
{
va_list ap;
va_start (ap, arg1);
Lisp_Object val = cons_listn (count, arg1, Fcons, ap);
va_end (ap);
return val;
}
/* Make a pure list of COUNT Lisp_Objects, where ARG1 is the first one. */
Lisp_Object
pure_listn (ptrdiff_t count, Lisp_Object arg1, ...)
{
va_list ap;
va_start (ap, arg1);
Lisp_Object val = cons_listn (count, arg1, pure_cons, ap);
Lisp_Object val = cons_listn (count, arg1, ap);
va_end (ap);
return val;
}
@ -2972,7 +2949,7 @@ static struct Lisp_Vector *vector_free_lists[VECTOR_MAX_FREE_LIST_INDEX];
static struct large_vector *large_vectors;
/* The only vector with 0 slots, allocated from pure space. */
/* The only vector with 0 slots. */
Lisp_Object zero_vector;
@ -3008,12 +2985,25 @@ allocate_vector_block (void)
return block;
}
static struct Lisp_Vector *
allocate_vector_from_block (ptrdiff_t nbytes);
/* Called once to initialize vector allocation. */
static void
init_vectors (void)
{
zero_vector = make_pure_vector (0);
/* The normal vector allocation code refuses to allocate a 0-length vector
because we use the first field of vectors internally when they're on
the free list, so we can't put a zero-length vector on the free list.
This is not a problem for 'zero_vector' since it's always reachable.
An alternative approach would be to allocate zero_vector outside of the
normal heap, e.g. as a static object, and then to "hide" it from the GC,
for example by marking it by hand at the beginning of the GC and unmarking
it by hand at the end. */
struct Lisp_Vector *zv = allocate_vector_from_block (vroundup (header_size));
zv->header.size = 0;
zero_vector = make_lisp_ptr (zv, Lisp_Vectorlike);
staticpro (&zero_vector);
}
@ -3598,13 +3588,6 @@ struct symbol_block
static struct symbol_block *symbol_block;
static int symbol_block_index = SYMBOL_BLOCK_SIZE;
/* Pointer to the first symbol_block that contains pinned symbols.
Tests for 24.4 showed that at dump-time, Emacs contains about 15K symbols,
10K of which are pinned (and all but 250 of them are interned in obarray),
whereas a "typical session" has in the order of 30K symbols.
`symbol_block_pinned' lets mark_pinned_symbols scan only 15K symbols rather
than 30K to find the 10K symbols we need to mark. */
static struct symbol_block *symbol_block_pinned;
/* List of free symbols. */
@ -3630,7 +3613,6 @@ init_symbol (Lisp_Object val, Lisp_Object name)
p->u.s.interned = SYMBOL_UNINTERNED;
p->u.s.trapped_write = SYMBOL_UNTRAPPED_WRITE;
p->u.s.declared_special = false;
p->u.s.pinned = false;
}
DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
@ -5238,8 +5220,6 @@ valid_lisp_object_p (Lisp_Object obj)
return 1;
void *p = XPNTR (obj);
if (PURE_P (p))
return 1;
if (BARE_SYMBOL_P (obj) && c_symbol_p (p))
return ((char *) p - (char *) lispsym) % sizeof lispsym[0] == 0;
@ -5295,297 +5275,8 @@ valid_lisp_object_p (Lisp_Object obj)
return 0;
}
/***********************************************************************
Pure Storage Management
***********************************************************************/
/* Allocate room for SIZE bytes from pure Lisp storage and return a
pointer to it. TYPE is the Lisp type for which the memory is
allocated. TYPE < 0 means it's not used for a Lisp object,
and that the result should have an alignment of -TYPE.
The bytes are initially zero.
If pure space is exhausted, allocate space from the heap. This is
merely an expedient to let Emacs warn that pure space was exhausted
and that Emacs should be rebuilt with a larger pure space. */
static void *
pure_alloc (size_t size, int type)
{
void *result;
again:
if (type >= 0)
{
/* Allocate space for a Lisp object from the beginning of the free
space with taking account of alignment. */
result = pointer_align (purebeg + pure_bytes_used_lisp, LISP_ALIGNMENT);
pure_bytes_used_lisp = ((char *)result - (char *)purebeg) + size;
}
else
{
/* Allocate space for a non-Lisp object from the end of the free
space. */
ptrdiff_t unaligned_non_lisp = pure_bytes_used_non_lisp + size;
char *unaligned = purebeg + pure_size - unaligned_non_lisp;
int decr = (intptr_t) unaligned & (-1 - type);
pure_bytes_used_non_lisp = unaligned_non_lisp + decr;
result = unaligned - decr;
}
pure_bytes_used = pure_bytes_used_lisp + pure_bytes_used_non_lisp;
if (pure_bytes_used <= pure_size)
return result;
/* Don't allocate a large amount here,
because it might get mmap'd and then its address
might not be usable. */
int small_amount = 10000;
eassert (size <= small_amount - LISP_ALIGNMENT);
purebeg = xzalloc (small_amount);
pure_size = small_amount;
pure_bytes_used_before_overflow += pure_bytes_used - size;
pure_bytes_used = 0;
pure_bytes_used_lisp = pure_bytes_used_non_lisp = 0;
/* Can't GC if pure storage overflowed because we can't determine
if something is a pure object or not. */
garbage_collection_inhibited++;
goto again;
}
#ifdef HAVE_UNEXEC
/* Print a warning if PURESIZE is too small. */
void
check_pure_size (void)
{
if (pure_bytes_used_before_overflow)
message (("emacs:0:Pure Lisp storage overflow (approx. %"pI"d"
" bytes needed)"),
pure_bytes_used + pure_bytes_used_before_overflow);
}
#endif
/* Find the byte sequence {DATA[0], ..., DATA[NBYTES-1], '\0'} from
the non-Lisp data pool of the pure storage, and return its start
address. Return NULL if not found. */
static char *
find_string_data_in_pure (const char *data, ptrdiff_t nbytes)
{
int i;
ptrdiff_t skip, bm_skip[256], last_char_skip, infinity, start, start_max;
const unsigned char *p;
char *non_lisp_beg;
if (pure_bytes_used_non_lisp <= nbytes)
return NULL;
/* Set up the Boyer-Moore table. */
skip = nbytes + 1;
for (i = 0; i < 256; i++)
bm_skip[i] = skip;
p = (const unsigned char *) data;
while (--skip > 0)
bm_skip[*p++] = skip;
last_char_skip = bm_skip['\0'];
non_lisp_beg = purebeg + pure_size - pure_bytes_used_non_lisp;
start_max = pure_bytes_used_non_lisp - (nbytes + 1);
/* See the comments in the function `boyer_moore' (search.c) for the
use of `infinity'. */
infinity = pure_bytes_used_non_lisp + 1;
bm_skip['\0'] = infinity;
p = (const unsigned char *) non_lisp_beg + nbytes;
start = 0;
do
{
/* Check the last character (== '\0'). */
do
{
start += bm_skip[*(p + start)];
}
while (start <= start_max);
if (start < infinity)
/* Couldn't find the last character. */
return NULL;
/* No less than `infinity' means we could find the last
character at `p[start - infinity]'. */
start -= infinity;
/* Check the remaining characters. */
if (memcmp (data, non_lisp_beg + start, nbytes) == 0)
/* Found. */
return non_lisp_beg + start;
start += last_char_skip;
}
while (start <= start_max);
return NULL;
}
/* Return a string allocated in pure space. DATA is a buffer holding
NCHARS characters, and NBYTES bytes of string data. MULTIBYTE
means make the result string multibyte.
Must get an error if pure storage is full, since if it cannot hold
a large string it may be able to hold conses that point to that
string; then the string is not protected from gc. */
Lisp_Object
make_pure_string (const char *data,
ptrdiff_t nchars, ptrdiff_t nbytes, bool multibyte)
{
Lisp_Object string;
struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
s->u.s.data = (unsigned char *) find_string_data_in_pure (data, nbytes);
if (s->u.s.data == NULL)
{
s->u.s.data = pure_alloc (nbytes + 1, -1);
memcpy (s->u.s.data, data, nbytes);
s->u.s.data[nbytes] = '\0';
}
s->u.s.size = nchars;
s->u.s.size_byte = multibyte ? nbytes : -1;
s->u.s.intervals = NULL;
XSETSTRING (string, s);
return string;
}
/* Return a string allocated in pure space. Do not
allocate the string data, just point to DATA. */
Lisp_Object
make_pure_c_string (const char *data, ptrdiff_t nchars)
{
Lisp_Object string;
struct Lisp_String *s = pure_alloc (sizeof *s, Lisp_String);
s->u.s.size = nchars;
s->u.s.size_byte = -2;
s->u.s.data = (unsigned char *) data;
s->u.s.intervals = NULL;
XSETSTRING (string, s);
return string;
}
static Lisp_Object purecopy (Lisp_Object obj);
/* Return a cons allocated from pure space. Give it pure copies
of CAR as car and CDR as cdr. */
Lisp_Object
pure_cons (Lisp_Object car, Lisp_Object cdr)
{
Lisp_Object new;
struct Lisp_Cons *p = pure_alloc (sizeof *p, Lisp_Cons);
XSETCONS (new, p);
XSETCAR (new, purecopy (car));
XSETCDR (new, purecopy (cdr));
return new;
}
/* Value is a float object with value NUM allocated from pure space. */
static Lisp_Object
make_pure_float (double num)
{
Lisp_Object new;
struct Lisp_Float *p = pure_alloc (sizeof *p, Lisp_Float);
XSETFLOAT (new, p);
XFLOAT_INIT (new, num);
return new;
}
/* Value is a bignum object with value VALUE allocated from pure
space. */
static Lisp_Object
make_pure_bignum (Lisp_Object value)
{
mpz_t const *n = xbignum_val (value);
size_t i, nlimbs = mpz_size (*n);
size_t nbytes = nlimbs * sizeof (mp_limb_t);
mp_limb_t *pure_limbs;
mp_size_t new_size;
struct Lisp_Bignum *b = pure_alloc (sizeof *b, Lisp_Vectorlike);
XSETPVECTYPESIZE (b, PVEC_BIGNUM, 0, VECSIZE (struct Lisp_Bignum));
int limb_alignment = alignof (mp_limb_t);
pure_limbs = pure_alloc (nbytes, - limb_alignment);
for (i = 0; i < nlimbs; ++i)
pure_limbs[i] = mpz_getlimbn (*n, i);
new_size = nlimbs;
if (mpz_sgn (*n) < 0)
new_size = -new_size;
mpz_roinit_n (b->value, pure_limbs, new_size);
return make_lisp_ptr (b, Lisp_Vectorlike);
}
/* Return a vector with room for LEN Lisp_Objects allocated from
pure space. */
static Lisp_Object
make_pure_vector (ptrdiff_t len)
{
Lisp_Object new;
size_t size = header_size + len * word_size;
struct Lisp_Vector *p = pure_alloc (size, Lisp_Vectorlike);
XSETVECTOR (new, p);
XVECTOR (new)->header.size = len;
return new;
}
/* Copy all contents and parameters of TABLE to a new table allocated
from pure space, return the purified table. */
static struct Lisp_Hash_Table *
purecopy_hash_table (struct Lisp_Hash_Table *table)
{
eassert (NILP (table->weak));
eassert (table->purecopy);
struct Lisp_Hash_Table *pure = pure_alloc (sizeof *pure, Lisp_Vectorlike);
struct hash_table_test pure_test = table->test;
/* Purecopy the hash table test. */
pure_test.name = purecopy (table->test.name);
pure_test.user_hash_function = purecopy (table->test.user_hash_function);
pure_test.user_cmp_function = purecopy (table->test.user_cmp_function);
pure->header = table->header;
pure->weak = purecopy (Qnil);
pure->hash = purecopy (table->hash);
pure->next = purecopy (table->next);
pure->index = purecopy (table->index);
pure->count = table->count;
pure->next_free = table->next_free;
pure->purecopy = table->purecopy;
eassert (!pure->mutable);
pure->rehash_threshold = table->rehash_threshold;
pure->rehash_size = table->rehash_size;
pure->key_and_value = purecopy (table->key_and_value);
pure->test = pure_test;
return pure;
}
DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0,
doc: /* Make a copy of object OBJ in pure storage.
Recursively copies contents of vectors and cons cells.
@ -5601,104 +5292,23 @@ Does not copy symbols. Copies strings without text properties. */)
return purecopy (obj);
}
/* Pinned objects are marked before every GC cycle. */
static struct pinned_object
{
Lisp_Object object;
struct pinned_object *next;
} *pinned_objects;
static Lisp_Object
purecopy (Lisp_Object obj)
{
if (FIXNUMP (obj)
|| (! SYMBOLP (obj) && PURE_P (XPNTR (obj)))
|| SUBRP (obj))
if (FIXNUMP (obj) || SUBRP (obj))
return obj; /* Already pure. */
if (STRINGP (obj) && XSTRING (obj)->u.s.intervals)
message_with_string ("Dropping text-properties while making string `%s' pure",
obj, true);
if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
{
Lisp_Object tmp = Fgethash (obj, Vpurify_flag, Qnil);
if (!NILP (tmp))
return tmp;
Fputhash (obj, obj, Vpurify_flag);
}
if (CONSP (obj))
obj = pure_cons (XCAR (obj), XCDR (obj));
else if (FLOATP (obj))
obj = make_pure_float (XFLOAT_DATA (obj));
else if (STRINGP (obj))
obj = make_pure_string (SSDATA (obj), SCHARS (obj),
SBYTES (obj),
STRING_MULTIBYTE (obj));
else if (HASH_TABLE_P (obj))
{
struct Lisp_Hash_Table *table = XHASH_TABLE (obj);
/* Do not purify hash tables which haven't been defined with
:purecopy as non-nil or are weak - they aren't guaranteed to
not change. */
if (!NILP (table->weak) || !table->purecopy)
{
/* Instead, add the hash table to the list of pinned objects,
so that it will be marked during GC. */
struct pinned_object *o = xmalloc (sizeof *o);
o->object = obj;
o->next = pinned_objects;
pinned_objects = o;
return obj; /* Don't hash cons it. */
}
struct Lisp_Hash_Table *h = purecopy_hash_table (table);
XSET_HASH_TABLE (obj, h);
}
else if (COMPILEDP (obj) || VECTORP (obj) || RECORDP (obj))
{
struct Lisp_Vector *objp = XVECTOR (obj);
ptrdiff_t nbytes = vector_nbytes (objp);
struct Lisp_Vector *vec = pure_alloc (nbytes, Lisp_Vectorlike);
register ptrdiff_t i;
ptrdiff_t size = ASIZE (obj);
if (size & PSEUDOVECTOR_FLAG)
size &= PSEUDOVECTOR_SIZE_MASK;
memcpy (vec, objp, nbytes);
for (i = 0; i < size; i++)
vec->contents[i] = purecopy (vec->contents[i]);
// Byte code strings must be pinned.
if (COMPILEDP (obj) && size >= 2 && STRINGP (vec->contents[1])
&& !STRING_MULTIBYTE (vec->contents[1]))
pin_string (vec->contents[1]);
XSETVECTOR (obj, vec);
}
else if (BARE_SYMBOL_P (obj))
{
if (!XBARE_SYMBOL (obj)->u.s.pinned && !c_symbol_p (XBARE_SYMBOL (obj)))
{ /* We can't purify them, but they appear in many pure objects.
Mark them as `pinned' so we know to mark them at every GC cycle. */
XBARE_SYMBOL (obj)->u.s.pinned = true;
symbol_block_pinned = symbol_block;
}
/* Don't hash-cons it. */
return obj;
}
else if (BIGNUMP (obj))
obj = make_pure_bignum (obj);
else
{
AUTO_STRING (fmt, "Don't know how to purify: %S");
Fsignal (Qerror, list1 (CALLN (Fformat, fmt, obj)));
}
if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */
Fputhash (obj, obj, Vpurify_flag);
return obj;
}
/***********************************************************************
Protection from GC
@ -5889,31 +5499,6 @@ compact_undo_list (Lisp_Object list)
return list;
}
static void
mark_pinned_objects (void)
{
for (struct pinned_object *pobj = pinned_objects; pobj; pobj = pobj->next)
mark_object (pobj->object);
}
static void
mark_pinned_symbols (void)
{
struct symbol_block *sblk;
int lim = (symbol_block_pinned == symbol_block
? symbol_block_index : SYMBOL_BLOCK_SIZE);
for (sblk = symbol_block_pinned; sblk; sblk = sblk->next)
{
struct Lisp_Symbol *sym = sblk->symbols, *end = sym + lim;
for (; sym < end; ++sym)
if (sym->u.s.pinned)
mark_object (make_lisp_symbol (sym));
lim = SYMBOL_BLOCK_SIZE;
}
}
static void
visit_vectorlike_root (struct gc_root_visitor visitor,
struct Lisp_Vector *ptr,
@ -6178,8 +5763,6 @@ garbage_collect (void)
struct gc_root_visitor visitor = { .visit = mark_object_root_visitor };
visit_static_gc_roots (visitor);
mark_pinned_objects ();
mark_pinned_symbols ();
mark_lread ();
mark_terminals ();
mark_kboards ();
@ -6306,10 +5889,6 @@ where each entry has the form (NAME SIZE USED FREE), where:
keeps around for future allocations (maybe because it does not know how
to return them to the OS).
However, if there was overflow in pure space, and Emacs was dumped
using the \"unexec\" method, `garbage-collect' returns nil, because
real GC can't be done.
Note that calling this function does not guarantee that absolutely all
unreachable objects will be garbage-collected. Emacs uses a
mark-and-sweep garbage collector, but is conservative when it comes to
@ -6737,8 +6316,6 @@ process_mark_stack (ptrdiff_t base_sp)
Lisp_Object obj = mark_stack_pop ();
mark_obj: ;
void *po = XPNTR (obj);
if (PURE_P (po))
continue;
#if GC_REMEMBER_LAST_MARKED
last_marked[last_marked_index++] = obj;
@ -6964,8 +6541,7 @@ process_mark_stack (ptrdiff_t base_sp)
break;
default: emacs_abort ();
}
if (!PURE_P (XSTRING (ptr->u.s.name)))
set_string_marked (XSTRING (ptr->u.s.name));
set_string_marked (XSTRING (ptr->u.s.name));
mark_interval_tree (string_intervals (ptr->u.s.name));
/* Inner loop to mark next symbol in this bucket, if any. */
po = ptr = ptr->u.s.next;
@ -7099,7 +6675,7 @@ survives_gc_p (Lisp_Object obj)
emacs_abort ();
}
return survives_p || PURE_P (XPNTR (obj));
return survives_p;
}
@ -7700,7 +7276,7 @@ init_alloc_once (void)
{
gc_cons_threshold = GC_DEFAULT_THRESHOLD;
/* Even though Qt's contents are not set up, its address is known. */
Vpurify_flag = Qt;
Vpurify_flag = Qt; /* FIXME: Redundant with setting in lread.c. */
PDUMPER_REMEMBER_SCALAR (buffer_defaults.header);
PDUMPER_REMEMBER_SCALAR (buffer_local_symbols.header);
@ -7719,8 +7295,6 @@ init_alloc_once (void)
static void
init_alloc_once_for_pdumper (void)
{
purebeg = PUREBEG;
pure_size = PURESIZE;
mem_init ();
#ifdef DOUG_LEA_MALLOC
@ -7764,7 +7338,7 @@ If this portion is smaller than `gc-cons-threshold', this is ignored. */);
Vgc_cons_percentage = make_float (0.1);
DEFVAR_INT ("pure-bytes-used", pure_bytes_used,
doc: /* Number of bytes of shareable Lisp data allocated so far. */);
doc: /* No longer used. */);
DEFVAR_INT ("cons-cells-consed", cons_cells_consed,
doc: /* Number of cons cells that have been consed so far. */);
@ -7790,9 +7364,13 @@ If this portion is smaller than `gc-cons-threshold', this is ignored. */);
DEFVAR_LISP ("purify-flag", Vpurify_flag,
doc: /* Non-nil means loading Lisp code in order to dump an executable.
This means that certain objects should be allocated in shared (pure) space.
It can also be set to a hash-table, in which case this table is used to
do hash-consing of the objects allocated to pure space. */);
This used to mean that certain objects should be allocated in shared (pure)
space. It can also be set to a hash-table, in which case this table is used
to do hash-consing of the objects allocated to pure space.
The hash-consing may still apply, but objects are not allocated in purespace
any more.
This flag is still used in a few places not to decide where objects are
allocated but to know if we're in the preload phase of Emacs's build. */);
DEFVAR_BOOL ("garbage-collection-messages", garbage_collection_messages,
doc: /* Non-nil means display messages at start and end of garbage collection. */);
@ -7808,10 +7386,10 @@ do hash-consing of the objects allocated to pure space. */);
/* We build this in advance because if we wait until we need it, we might
not be able to allocate the memory to hold it. */
Vmemory_signal_data
= pure_list (Qerror,
build_pure_c_string ("Memory exhausted--use"
" M-x save-some-buffers then"
" exit and restart Emacs"));
= list (Qerror,
build_string ("Memory exhausted--use"
" M-x save-some-buffers then"
" exit and restart Emacs"));
DEFVAR_LISP ("memory-full", Vmemory_full,
doc: /* Non-nil means Emacs cannot get much more Lisp memory. */);

View file

@ -5308,8 +5308,8 @@ init_buffer_once (void)
set_buffer_intervals (&buffer_defaults, NULL);
set_buffer_intervals (&buffer_local_symbols, NULL);
/* This is not strictly necessary, but let's make them initialized. */
bset_name (&buffer_defaults, build_pure_c_string (" *buffer-defaults*"));
bset_name (&buffer_local_symbols, build_pure_c_string (" *buffer-local-symbols*"));
bset_name (&buffer_defaults, build_string (" *buffer-defaults*"));
bset_name (&buffer_local_symbols, build_string (" *buffer-local-symbols*"));
BUFFER_PVEC_INIT (&buffer_defaults);
BUFFER_PVEC_INIT (&buffer_local_symbols);
@ -5317,7 +5317,7 @@ init_buffer_once (void)
/* Must do these before making the first buffer! */
/* real setup is done in bindings.el */
bset_mode_line_format (&buffer_defaults, build_pure_c_string ("%-"));
bset_mode_line_format (&buffer_defaults, build_string ("%-"));
bset_header_line_format (&buffer_defaults, Qnil);
bset_tab_line_format (&buffer_defaults, Qnil);
bset_abbrev_mode (&buffer_defaults, Qnil);
@ -5384,7 +5384,7 @@ init_buffer_once (void)
current_buffer = 0;
pdumper_remember_lv_ptr_raw (&current_buffer, Lisp_Vectorlike);
QSFundamental = build_pure_c_string ("Fundamental");
QSFundamental = build_string ("Fundamental");
DEFSYM (Qfundamental_mode, "fundamental-mode");
bset_major_mode (&buffer_defaults, Qfundamental_mode);
@ -5398,10 +5398,10 @@ init_buffer_once (void)
/* Super-magic invisible buffer. */
Vprin1_to_string_buffer =
Fget_buffer_create (build_pure_c_string (" prin1"), Qt);
Fget_buffer_create (build_string (" prin1"), Qt);
Vbuffer_alist = Qnil;
Fset_buffer (Fget_buffer_create (build_pure_c_string ("*scratch*"), Qnil));
Fset_buffer (Fget_buffer_create (build_string ("*scratch*"), Qnil));
inhibit_modification_hooks = 0;
}
@ -5584,9 +5584,9 @@ syms_of_buffer (void)
Qoverwrite_mode_binary));
Fput (Qprotected_field, Qerror_conditions,
pure_list (Qprotected_field, Qerror));
list (Qprotected_field, Qerror));
Fput (Qprotected_field, Qerror_message,
build_pure_c_string ("Attempt to modify a protected field"));
build_string ("Attempt to modify a protected field"));
DEFSYM (Qclone_indirect_buffer_hook, "clone-indirect-buffer-hook");

View file

@ -27,7 +27,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "keyboard.h"
#include "syntax.h"
#include "window.h"
#include "puresize.h"
/* Work around GCC bug 54561. */
#if GNUC_PREREQ (4, 3, 0)
@ -1582,7 +1581,6 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
Lisp_Object newval = POP;
Lisp_Object cell = TOP;
CHECK_CONS (cell);
CHECK_IMPURE (cell, XCONS (cell));
XSETCAR (cell, newval);
TOP = newval;
NEXT;
@ -1593,7 +1591,6 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
Lisp_Object newval = POP;
Lisp_Object cell = TOP;
CHECK_CONS (cell);
CHECK_IMPURE (cell, XCONS (cell));
XSETCDR (cell, newval);
TOP = newval;
NEXT;

View file

@ -862,10 +862,10 @@ syms_of_callint (void)
callint_message = Qnil;
staticpro (&callint_message);
preserved_fns = pure_list (intern_c_string ("region-beginning"),
intern_c_string ("region-end"),
intern_c_string ("point"),
intern_c_string ("mark"));
preserved_fns = list (intern_c_string ("region-beginning"),
intern_c_string ("region-end"),
intern_c_string ("point"),
intern_c_string ("mark"));
staticpro (&preserved_fns);
DEFSYM (Qlist, "list");

View file

@ -53,7 +53,7 @@ hash_get_category_set (Lisp_Object table, Lisp_Object category_set)
(table, 1,
make_hash_table (hashtest_equal, DEFAULT_HASH_SIZE,
DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
Qnil, false));
Qnil));
struct Lisp_Hash_Table *h = XHASH_TABLE (XCHAR_TABLE (table)->extras[1]);
Lisp_Object hash;
ptrdiff_t i = hash_lookup (h, category_set, &hash);
@ -120,8 +120,6 @@ the current buffer's category table. */)
if (!NILP (CATEGORY_DOCSTRING (table, XFIXNAT (category))))
error ("Category `%c' is already defined", (int) XFIXNAT (category));
if (!NILP (Vpurify_flag))
docstring = Fpurecopy (docstring);
SET_CATEGORY_DOCSTRING (table, XFIXNAT (category), docstring);
return Qnil;

View file

@ -11682,7 +11682,7 @@ syms_of_coding (void)
Vcode_conversion_reused_workbuf = Qnil;
staticpro (&Vcode_conversion_workbuf_name);
Vcode_conversion_workbuf_name = build_pure_c_string (" *code-conversion-work*");
Vcode_conversion_workbuf_name = build_string (" *code-conversion-work*");
reused_workbuf_in_use = false;
PDUMPER_REMEMBER_SCALAR (reused_workbuf_in_use);
@ -11746,9 +11746,9 @@ syms_of_coding (void)
/* Error signaled when there's a problem with detecting a coding system. */
DEFSYM (Qcoding_system_error, "coding-system-error");
Fput (Qcoding_system_error, Qerror_conditions,
pure_list (Qcoding_system_error, Qerror));
list (Qcoding_system_error, Qerror));
Fput (Qcoding_system_error, Qerror_message,
build_pure_c_string ("Invalid coding system"));
build_string ("Invalid coding system"));
DEFSYM (Qtranslation_table, "translation-table");
Fput (Qtranslation_table, Qchar_table_extra_slots, make_fixnum (2));
@ -12023,22 +12023,22 @@ encoding standard output and error streams. */);
DEFVAR_LISP ("eol-mnemonic-unix", eol_mnemonic_unix,
doc: /*
String displayed in mode line for UNIX-like (LF) end-of-line format. */);
eol_mnemonic_unix = build_pure_c_string (":");
eol_mnemonic_unix = build_string (":");
DEFVAR_LISP ("eol-mnemonic-dos", eol_mnemonic_dos,
doc: /*
String displayed in mode line for DOS-like (CRLF) end-of-line format. */);
eol_mnemonic_dos = build_pure_c_string ("\\");
eol_mnemonic_dos = build_string ("\\");
DEFVAR_LISP ("eol-mnemonic-mac", eol_mnemonic_mac,
doc: /*
String displayed in mode line for MAC-like (CR) end-of-line format. */);
eol_mnemonic_mac = build_pure_c_string ("/");
eol_mnemonic_mac = build_string ("/");
DEFVAR_LISP ("eol-mnemonic-undecided", eol_mnemonic_undecided,
doc: /*
String displayed in mode line when end-of-line format is not yet determined. */);
eol_mnemonic_undecided = build_pure_c_string (":");
eol_mnemonic_undecided = build_string (":");
DEFVAR_LISP ("enable-character-translation", Venable_character_translation,
doc: /*
@ -12178,7 +12178,7 @@ internal character representation. */);
intern_c_string (":for-unibyte"),
args[coding_arg_for_unibyte] = Qt,
intern_c_string (":docstring"),
(build_pure_c_string
(build_string
("Do no conversion.\n"
"\n"
"When you visit a file with this coding, the file is read into a\n"
@ -12198,7 +12198,7 @@ internal character representation. */);
plist[8] = intern_c_string (":charset-list");
plist[9] = args[coding_arg_charset_list] = list1 (Qascii);
plist[11] = args[coding_arg_for_unibyte] = Qnil;
plist[13] = build_pure_c_string ("No conversion on encoding, "
plist[13] = build_string ("No conversion on encoding, "
"automatic conversion on decoding.");
plist[15] = args[coding_arg_eol_type] = Qnil;
args[coding_arg_plist] = CALLMANY (Flist, plist);

View file

@ -31,7 +31,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include <libgccjit.h>
#include <epaths.h>
#include "puresize.h"
#include "window.h"
#include "dynlib.h"
#include "buffer.h"
@ -676,7 +675,6 @@ helper_GET_SYMBOL_WITH_POSITION (Lisp_Object);
static void *helper_link_table[] =
{ wrong_type_argument,
helper_PSEUDOVECTOR_TYPEP_XUNTAG,
pure_write_error,
push_handler,
record_unwind_protect_excursion,
helper_unbind_n,
@ -3945,52 +3943,6 @@ static void define_SYMBOL_WITH_POS_SYM (void)
comp.lisp_symbol_with_position_sym));
}
static void
define_CHECK_IMPURE (void)
{
gcc_jit_param *param[] =
{ gcc_jit_context_new_param (comp.ctxt,
NULL,
comp.lisp_obj_type,
"obj"),
gcc_jit_context_new_param (comp.ctxt,
NULL,
comp.void_ptr_type,
"ptr") };
comp.check_impure =
gcc_jit_context_new_function (comp.ctxt, NULL,
GCC_JIT_FUNCTION_INTERNAL,
comp.void_type,
"CHECK_IMPURE",
2,
param,
0);
DECL_BLOCK (entry_block, comp.check_impure);
DECL_BLOCK (err_block, comp.check_impure);
DECL_BLOCK (ok_block, comp.check_impure);
comp.block = entry_block;
comp.func = comp.check_impure;
emit_cond_jump (emit_PURE_P (gcc_jit_param_as_rvalue (param[0])), /* FIXME */
err_block,
ok_block);
gcc_jit_block_end_with_void_return (ok_block, NULL);
gcc_jit_rvalue *pure_write_error_arg =
gcc_jit_param_as_rvalue (param[0]);
comp.block = err_block;
gcc_jit_block_add_eval (comp.block,
NULL,
emit_call (intern_c_string ("pure_write_error"),
comp.void_type, 1,&pure_write_error_arg,
false));
gcc_jit_block_end_with_void_return (err_block, NULL);
}
static void
define_maybe_gc_or_quit (void)
{
@ -5114,10 +5066,10 @@ maybe_defer_native_compilation (Lisp_Object function_name,
Lisp_Object src =
concat2 (CALL1I (file-name-sans-extension, Vload_true_file_name),
build_pure_c_string (".el"));
build_string (".el"));
if (NILP (Ffile_exists_p (src)))
{
src = concat2 (src, build_pure_c_string (".gz"));
src = concat2 (src, build_string (".gz"));
if (NILP (Ffile_exists_p (src)))
return;
}
@ -5317,10 +5269,6 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
comp_u->data_vec = load_static_obj (comp_u, TEXT_DATA_RELOC_SYM);
comp_u->data_impure_vec =
load_static_obj (comp_u, TEXT_DATA_RELOC_IMPURE_SYM);
if (!NILP (Vpurify_flag))
/* Non impure can be copied into pure space. */
comp_u->data_vec = Fpurecopy (comp_u->data_vec);
}
EMACS_INT d_vec_len = XFIXNUM (Flength (comp_u->data_vec));
@ -5690,40 +5638,40 @@ compiled one. */);
Fput (Qnative_compiler_error, Qerror_conditions,
pure_list (Qnative_compiler_error, Qerror));
Fput (Qnative_compiler_error, Qerror_message,
build_pure_c_string ("Native compiler error"));
build_string ("Native compiler error"));
DEFSYM (Qnative_ice, "native-ice");
Fput (Qnative_ice, Qerror_conditions,
pure_list (Qnative_ice, Qnative_compiler_error, Qerror));
Fput (Qnative_ice, Qerror_message,
build_pure_c_string ("Internal native compiler error"));
build_string ("Internal native compiler error"));
/* By the load machinery. */
DEFSYM (Qnative_lisp_load_failed, "native-lisp-load-failed");
Fput (Qnative_lisp_load_failed, Qerror_conditions,
pure_list (Qnative_lisp_load_failed, Qerror));
Fput (Qnative_lisp_load_failed, Qerror_message,
build_pure_c_string ("Native elisp load failed"));
build_string ("Native elisp load failed"));
DEFSYM (Qnative_lisp_wrong_reloc, "native-lisp-wrong-reloc");
Fput (Qnative_lisp_wrong_reloc, Qerror_conditions,
pure_list (Qnative_lisp_wrong_reloc, Qnative_lisp_load_failed, Qerror));
Fput (Qnative_lisp_wrong_reloc, Qerror_message,
build_pure_c_string ("Primitive redefined or wrong relocation"));
build_string ("Primitive redefined or wrong relocation"));
DEFSYM (Qwrong_register_subr_call, "wrong-register-subr-call");
Fput (Qwrong_register_subr_call, Qerror_conditions,
pure_list (Qwrong_register_subr_call, Qnative_lisp_load_failed, Qerror));
Fput (Qwrong_register_subr_call, Qerror_message,
build_pure_c_string ("comp--register-subr can only be called during "
"native lisp load phase."));
build_string ("comp--register-subr can only be called during "
"native lisp load phase."));
DEFSYM (Qnative_lisp_file_inconsistent, "native-lisp-file-inconsistent");
Fput (Qnative_lisp_file_inconsistent, Qerror_conditions,
pure_list (Qnative_lisp_file_inconsistent, Qnative_lisp_load_failed, Qerror));
Fput (Qnative_lisp_file_inconsistent, Qerror_message,
build_pure_c_string ("eln file inconsistent with current runtime "
"configuration, please recompile"));
build_string ("eln file inconsistent with current runtime "
"configuration, please recompile"));
defsubr (&Scomp__subr_signature);
defsubr (&Scomp_el_to_eln_rel_filename);

View file

@ -210,41 +210,8 @@ You lose; /* Emacs for DOS must be compiled with DJGPP */
/* DATA_START is needed by vm-limit.c and unexcoff.c. */
#define DATA_START (&etext + 1)
/* Define one of these for easier conditionals. */
#ifdef HAVE_X_WINDOWS
/* We need a little extra space, see ../../lisp/loadup.el and the
commentary below, in the non-X branch. The 140KB number was
measured on GNU/Linux and on MS-Windows. */
#define SYSTEM_PURESIZE_EXTRA (-170000+140000)
#else
/* We need a little extra space, see ../../lisp/loadup.el.
As of 20091024, DOS-specific files use up 62KB of pure space. But
overall, we end up wasting 130KB of pure space, because
BASE_PURESIZE starts at 1.47MB, while we need only 1.3MB (including
non-DOS specific files and load history; the latter is about 55K,
but depends on the depth of the top-level Emacs directory in the
directory tree). Given the unknown policy of different DPMI
hosts regarding loading of untouched pages, I'm not going to risk
enlarging Emacs footprint by another 100+ KBytes. */
#define SYSTEM_PURESIZE_EXTRA (-170000+90000)
#endif
#endif /* MSDOS */
/* macOS / GNUstep need a bit more pure memory. Of the existing knobs,
SYSTEM_PURESIZE_EXTRA seems like the least likely to cause problems. */
#ifdef HAVE_NS
#if defined NS_IMPL_GNUSTEP
# define SYSTEM_PURESIZE_EXTRA 30000
#elif defined DARWIN_OS
# define SYSTEM_PURESIZE_EXTRA 200000
#endif
#endif
#ifdef CYGWIN
#define SYSTEM_PURESIZE_EXTRA 50000
#endif
#if defined HAVE_NTGUI && !defined DebPrint
# ifdef EMACSDEBUG
extern void _DebPrint (const char *fmt, ...);

View file

@ -30,7 +30,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "lisp.h"
#include "bignum.h"
#include "puresize.h"
#include "character.h"
#include "buffer.h"
#include "keyboard.h"
@ -143,12 +142,6 @@ wrong_type_argument (Lisp_Object predicate, Lisp_Object value)
xsignal2 (Qwrong_type_argument, predicate, value);
}
void
pure_write_error (Lisp_Object obj)
{
xsignal2 (Qerror, build_string ("Attempt to modify read-only object"), obj);
}
void
args_out_of_range (Lisp_Object a1, Lisp_Object a2)
{
@ -645,7 +638,6 @@ DEFUN ("setcar", Fsetcar, Ssetcar, 2, 2, 0,
(register Lisp_Object cell, Lisp_Object newcar)
{
CHECK_CONS (cell);
CHECK_IMPURE (cell, XCONS (cell));
XSETCAR (cell, newcar);
return newcar;
}
@ -655,7 +647,6 @@ DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2, 0,
(register Lisp_Object cell, Lisp_Object newcdr)
{
CHECK_CONS (cell);
CHECK_IMPURE (cell, XCONS (cell));
XSETCDR (cell, newcdr);
return newcdr;
}
@ -943,10 +934,6 @@ The return value is undefined. */)
(register Lisp_Object symbol, Lisp_Object definition, Lisp_Object docstring)
{
CHECK_SYMBOL (symbol);
if (!NILP (Vpurify_flag)
/* If `definition' is a keymap, immutable (and copying) is wrong. */
&& !KEYMAPP (definition))
definition = Fpurecopy (definition);
defalias (symbol, definition);
@ -2590,7 +2577,6 @@ bool-vector. IDX starts at 0. */)
if (VECTORP (array))
{
CHECK_IMPURE (array, XVECTOR (array));
if (idxval < 0 || idxval >= ASIZE (array))
args_out_of_range (array, idx);
ASET (array, idxval, newelt);
@ -2614,7 +2600,6 @@ bool-vector. IDX starts at 0. */)
}
else /* STRINGP */
{
CHECK_IMPURE (array, XSTRING (array));
if (idxval < 0 || idxval >= SCHARS (array))
args_out_of_range (array, idx);
CHECK_CHARACTER (newelt);
@ -4143,7 +4128,7 @@ syms_of_data (void)
DEFSYM (Qcdr, "cdr");
error_tail = pure_cons (Qerror, Qnil);
error_tail = Fcons (Qerror, Qnil);
/* ERROR is used as a signaler for random errors for which nothing else is
right. */
@ -4151,14 +4136,14 @@ syms_of_data (void)
Fput (Qerror, Qerror_conditions,
error_tail);
Fput (Qerror, Qerror_message,
build_pure_c_string ("error"));
build_string ("error"));
#define PUT_ERROR(sym, tail, msg) \
Fput (sym, Qerror_conditions, pure_cons (sym, tail)); \
Fput (sym, Qerror_message, build_pure_c_string (msg))
Fput (sym, Qerror_conditions, Fcons (sym, tail)); \
Fput (sym, Qerror_message, build_string (msg))
PUT_ERROR (Qquit, Qnil, "Quit");
PUT_ERROR (Qminibuffer_quit, pure_cons (Qquit, Qnil), "Quit");
PUT_ERROR (Qminibuffer_quit, Fcons (Qquit, Qnil), "Quit");
PUT_ERROR (Quser_error, error_tail, "");
PUT_ERROR (Qwrong_length_argument, error_tail, "Wrong length argument");
@ -4184,14 +4169,14 @@ syms_of_data (void)
PUT_ERROR (Qno_catch, error_tail, "No catch for tag");
PUT_ERROR (Qend_of_file, error_tail, "End of file during parsing");
arith_tail = pure_cons (Qarith_error, error_tail);
arith_tail = Fcons (Qarith_error, error_tail);
Fput (Qarith_error, Qerror_conditions, arith_tail);
Fput (Qarith_error, Qerror_message, build_pure_c_string ("Arithmetic error"));
Fput (Qarith_error, Qerror_message, build_string ("Arithmetic error"));
PUT_ERROR (Qbeginning_of_buffer, error_tail, "Beginning of buffer");
PUT_ERROR (Qend_of_buffer, error_tail, "End of buffer");
PUT_ERROR (Qbuffer_read_only, error_tail, "Buffer is read-only");
PUT_ERROR (Qtext_read_only, pure_cons (Qbuffer_read_only, error_tail),
PUT_ERROR (Qtext_read_only, Fcons (Qbuffer_read_only, error_tail),
"Text is read-only");
PUT_ERROR (Qinhibited_interaction, error_tail,
"User interaction while inhibited");
@ -4214,10 +4199,10 @@ syms_of_data (void)
PUT_ERROR (Qunderflow_error, Fcons (Qrange_error, arith_tail),
"Arithmetic underflow error");
recursion_tail = pure_cons (Qrecursion_error, error_tail);
recursion_tail = Fcons (Qrecursion_error, error_tail);
Fput (Qrecursion_error, Qerror_conditions, recursion_tail);
Fput (Qrecursion_error, Qerror_message, build_pure_c_string
("Excessive recursive calling error"));
Fput (Qrecursion_error, Qerror_message,
build_string ("Excessive recursive calling error"));
PUT_ERROR (Qexcessive_variable_binding, recursion_tail,
"Variable binding depth exceeds max-specpdl-size");

View file

@ -1869,7 +1869,7 @@ syms_of_dbusbind (void)
Fput (Qdbus_error, Qerror_conditions,
list2 (Qdbus_error, Qerror));
Fput (Qdbus_error, Qerror_message,
build_pure_c_string ("D-Bus error"));
build_string ("D-Bus error"));
/* Lisp symbols of the system and session buses. */
DEFSYM (QCsystem, ":system");
@ -1912,7 +1912,7 @@ syms_of_dbusbind (void)
Vdbus_compiled_version,
doc: /* The version of D-Bus Emacs is compiled against. */);
#ifdef DBUS_VERSION_STRING
Vdbus_compiled_version = build_pure_c_string (DBUS_VERSION_STRING);
Vdbus_compiled_version = build_string (DBUS_VERSION_STRING);
#else
Vdbus_compiled_version = Qnil;
#endif

View file

@ -132,10 +132,10 @@ insdel.o: insdel.c window.h buffer.h $(INTERVALS_H) blockinput.h character.h \
keyboard.o: keyboard.c termchar.h termhooks.h termopts.h buffer.h character.h \
commands.h frame.h window.h macros.h disptab.h keyboard.h syssignal.h \
systime.h syntax.h $(INTERVALS_H) blockinput.h atimer.h composite.h \
xterm.h puresize.h msdos.h keymap.h w32term.h nsterm.h nsgui.h coding.h \
xterm.h msdos.h keymap.h w32term.h nsterm.h nsgui.h coding.h \
process.h ../lib/unistd.h gnutls.h lisp.h globals.h $(config_h)
keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinput.h \
atimer.h systime.h puresize.h character.h charset.h $(INTERVALS_H) \
atimer.h systime.h character.h charset.h $(INTERVALS_H) \
keymap.h window.h coding.h frame.h lisp.h globals.h $(config_h)
lastfile.o: lastfile.c $(config_h)
macros.o: macros.c window.h buffer.h commands.h macros.h keyboard.h msdos.h \
@ -267,12 +267,12 @@ xsettings.o: xterm.h xsettings.h lisp.h frame.h termhooks.h $(config_h) \
atimer.h termopts.h globals.h
## The files of Lisp proper.
alloc.o: alloc.c process.h frame.h window.h buffer.h puresize.h syssignal.h \
alloc.o: alloc.c process.h frame.h window.h buffer.h syssignal.h \
keyboard.h blockinput.h atimer.h systime.h character.h lisp.h $(config_h) \
$(INTERVALS_H) termhooks.h gnutls.h coding.h ../lib/unistd.h globals.h
bytecode.o: bytecode.c buffer.h syntax.h character.h window.h dispextern.h \
lisp.h globals.h $(config_h) msdos.h
data.o: data.c buffer.h puresize.h character.h syssignal.h keyboard.h frame.h \
data.o: data.c buffer.h character.h syssignal.h keyboard.h frame.h \
termhooks.h systime.h coding.h composite.h dispextern.h font.h ccl.h \
lisp.h globals.h $(config_h) msdos.h
eval.o: eval.c commands.h keyboard.h blockinput.h atimer.h systime.h frame.h \
@ -295,7 +295,7 @@ lread.o: lread.c commands.h keyboard.h buffer.h epaths.h character.h \
composite.o: composite.c composite.h buffer.h character.h coding.h font.h \
ccl.h frame.h termhooks.h $(INTERVALS_H) window.h \
lisp.h globals.h $(config_h)
intervals.o: intervals.c buffer.h $(INTERVALS_H) keyboard.h puresize.h \
intervals.o: intervals.c buffer.h $(INTERVALS_H) keyboard.h \
keymap.h lisp.h globals.h $(config_h) systime.h coding.h
textprop.o: textprop.c buffer.h window.h $(INTERVALS_H) \
lisp.h globals.h $(config_h)

View file

@ -450,8 +450,6 @@ store_function_docstring (Lisp_Object obj, EMACS_INT offset)
{
tem = Fcdr (Fcdr (fun));
if (CONSP (tem) && FIXNUMP (XCAR (tem)))
/* FIXME: This modifies typically pure hash-cons'd data, so its
correctness is quite delicate. */
XSETCAR (tem, make_fixnum (offset));
}
}
@ -541,7 +539,6 @@ the same file name is found in the `doc-directory'. */)
int i = ARRAYELTS (buildobj);
while (0 <= --i)
Vbuild_files = Fcons (build_string (buildobj[i]), Vbuild_files);
Vbuild_files = Fpurecopy (Vbuild_files);
}
fd = emacs_open (name, O_RDONLY, 0);

View file

@ -1598,44 +1598,44 @@ syms_of_module (void)
Vmodule_refs_hash
= make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE,
DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
Qnil, false);
Qnil);
DEFSYM (Qmodule_load_failed, "module-load-failed");
Fput (Qmodule_load_failed, Qerror_conditions,
pure_list (Qmodule_load_failed, Qerror));
list (Qmodule_load_failed, Qerror));
Fput (Qmodule_load_failed, Qerror_message,
build_pure_c_string ("Module load failed"));
build_string ("Module load failed"));
DEFSYM (Qmodule_open_failed, "module-open-failed");
Fput (Qmodule_open_failed, Qerror_conditions,
pure_list (Qmodule_open_failed, Qmodule_load_failed, Qerror));
list (Qmodule_open_failed, Qmodule_load_failed, Qerror));
Fput (Qmodule_open_failed, Qerror_message,
build_pure_c_string ("Module could not be opened"));
build_string ("Module could not be opened"));
DEFSYM (Qmodule_not_gpl_compatible, "module-not-gpl-compatible");
Fput (Qmodule_not_gpl_compatible, Qerror_conditions,
pure_list (Qmodule_not_gpl_compatible, Qmodule_load_failed, Qerror));
list (Qmodule_not_gpl_compatible, Qmodule_load_failed, Qerror));
Fput (Qmodule_not_gpl_compatible, Qerror_message,
build_pure_c_string ("Module is not GPL compatible"));
build_string ("Module is not GPL compatible"));
DEFSYM (Qmissing_module_init_function, "missing-module-init-function");
Fput (Qmissing_module_init_function, Qerror_conditions,
pure_list (Qmissing_module_init_function, Qmodule_load_failed,
Qerror));
list (Qmissing_module_init_function, Qmodule_load_failed,
Qerror));
Fput (Qmissing_module_init_function, Qerror_message,
build_pure_c_string ("Module does not export an "
build_string ("Module does not export an "
"initialization function"));
DEFSYM (Qmodule_init_failed, "module-init-failed");
Fput (Qmodule_init_failed, Qerror_conditions,
pure_list (Qmodule_init_failed, Qmodule_load_failed, Qerror));
list (Qmodule_init_failed, Qmodule_load_failed, Qerror));
Fput (Qmodule_init_failed, Qerror_message,
build_pure_c_string ("Module initialization failed"));
build_string ("Module initialization failed"));
DEFSYM (Qinvalid_arity, "invalid-arity");
Fput (Qinvalid_arity, Qerror_conditions, pure_list (Qinvalid_arity, Qerror));
Fput (Qinvalid_arity, Qerror_conditions, list (Qinvalid_arity, Qerror));
Fput (Qinvalid_arity, Qerror_message,
build_pure_c_string ("Invalid function arity"));
build_string ("Invalid function arity"));
DEFSYM (Qmodule_function_p, "module-function-p");
DEFSYM (Qunicode_string_p, "unicode-string-p");

View file

@ -104,7 +104,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "syntax.h"
#include "sysselect.h"
#include "systime.h"
#include "puresize.h"
#include "getpagesize.h"
#include "gnutls.h"
@ -3029,8 +3028,6 @@ You must run Emacs in batch mode in order to dump it. */)
Lisp_Object symbol;
specpdl_ref count = SPECPDL_INDEX ();
check_pure_size ();
if (! noninteractive)
error ("Dumping Emacs works only in batch mode");

View file

@ -748,8 +748,6 @@ value. */)
XSYMBOL (symbol)->u.s.declared_special = true;
if (!NILP (doc))
{
if (!NILP (Vpurify_flag))
doc = Fpurecopy (doc);
Fput (symbol, Qvariable_documentation, doc);
}
LOADHIST_ATTACH (symbol);
@ -892,8 +890,6 @@ More specifically, behaves like (defconst SYM 'INITVALUE DOCSTRING). */)
CHECK_SYMBOL (sym);
Lisp_Object tem = initvalue;
Finternal__define_uninitialized_variable (sym, docstring);
if (!NILP (Vpurify_flag))
tem = Fpurecopy (tem);
Fset_default (sym, tem); /* FIXME: set-default-toplevel-value? */
Fput (sym, Qrisky_local_variable, Qt); /* FIXME: Why? */
return sym;
@ -2195,12 +2191,6 @@ this does nothing and returns nil. */)
&& !AUTOLOADP (XSYMBOL (function)->u.s.function))
return Qnil;
if (!NILP (Vpurify_flag) && BASE_EQ (docstring, make_fixnum (0)))
/* `read1' in lread.c has found the docstring starting with "\
and assumed the docstring will be provided by Snarf-documentation, so it
passed us 0 instead. But that leads to accidental sharing in purecopy's
hash-consing, so we use a (hopefully) unique integer instead. */
docstring = make_ufixnum (XHASH (function));
return Fdefalias (function,
list5 (Qautoload, file, docstring, interactive, type),
Qnil);
@ -4360,7 +4350,7 @@ alist of active lexical bindings. */);
also use something like Fcons (Qnil, Qnil), but json.c treats any
cons cell as error data, so use an uninterned symbol instead. */
Qcatch_all_memory_full
= Fmake_symbol (build_pure_c_string ("catch-all-memory-full"));
= Fmake_symbol (build_string ("catch-all-memory-full"));
defsubr (&Sor);
defsubr (&Sand);

View file

@ -6462,39 +6462,39 @@ behaves as if file names were encoded in `utf-8'. */);
DEFSYM (Qcar_less_than_car, "car-less-than-car");
Fput (Qfile_error, Qerror_conditions,
Fpurecopy (list2 (Qfile_error, Qerror)));
list2 (Qfile_error, Qerror));
Fput (Qfile_error, Qerror_message,
build_pure_c_string ("File error"));
build_string ("File error"));
Fput (Qfile_already_exists, Qerror_conditions,
Fpurecopy (list3 (Qfile_already_exists, Qfile_error, Qerror)));
list3 (Qfile_already_exists, Qfile_error, Qerror));
Fput (Qfile_already_exists, Qerror_message,
build_pure_c_string ("File already exists"));
build_string ("File already exists"));
Fput (Qfile_date_error, Qerror_conditions,
Fpurecopy (list3 (Qfile_date_error, Qfile_error, Qerror)));
list3 (Qfile_date_error, Qfile_error, Qerror));
Fput (Qfile_date_error, Qerror_message,
build_pure_c_string ("Cannot set file date"));
build_string ("Cannot set file date"));
Fput (Qfile_missing, Qerror_conditions,
Fpurecopy (list3 (Qfile_missing, Qfile_error, Qerror)));
list3 (Qfile_missing, Qfile_error, Qerror));
Fput (Qfile_missing, Qerror_message,
build_pure_c_string ("File is missing"));
build_string ("File is missing"));
Fput (Qpermission_denied, Qerror_conditions,
Fpurecopy (list3 (Qpermission_denied, Qfile_error, Qerror)));
list3 (Qpermission_denied, Qfile_error, Qerror));
Fput (Qpermission_denied, Qerror_message,
build_pure_c_string ("Cannot access file or directory"));
build_string ("Cannot access file or directory"));
Fput (Qfile_notify_error, Qerror_conditions,
Fpurecopy (list3 (Qfile_notify_error, Qfile_error, Qerror)));
list3 (Qfile_notify_error, Qfile_error, Qerror));
Fput (Qfile_notify_error, Qerror_message,
build_pure_c_string ("File notification error"));
build_string ("File notification error"));
Fput (Qremote_file_error, Qerror_conditions,
Fpurecopy (list3 (Qremote_file_error, Qfile_error, Qerror)));
list3 (Qremote_file_error, Qfile_error, Qerror));
Fput (Qremote_file_error, Qerror_message,
build_pure_c_string ("Remote file error"));
build_string ("Remote file error"));
DEFVAR_LISP ("file-name-handler-alist", Vfile_name_handler_alist,
doc: /* Alist of elements (REGEXP . HANDLER) for file names handled specially.

View file

@ -36,7 +36,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "buffer.h"
#include "intervals.h"
#include "window.h"
#include "puresize.h"
#include "gnutls.h"
enum equal_kind { EQUAL_NO_QUIT, EQUAL_PLAIN, EQUAL_INCLUDING_PROPERTIES };
@ -2653,7 +2652,6 @@ ARRAY is a vector, string, char-table, or bool-vector. */)
size = SCHARS (array);
if (size != 0)
{
CHECK_IMPURE (array, XSTRING (array));
unsigned char str[MAX_MULTIBYTE_LENGTH];
int len;
if (STRING_MULTIBYTE (array))
@ -2695,7 +2693,6 @@ This makes STRING unibyte and may change its length. */)
ptrdiff_t len = SBYTES (string);
if (len != 0 || STRING_MULTIBYTE (string))
{
CHECK_IMPURE (string, XSTRING (string));
memset (SDATA (string), 0, len);
STRING_SET_CHARS (string, len);
STRING_SET_UNIBYTE (string);
@ -4263,16 +4260,12 @@ hash_index_size (struct Lisp_Hash_Table *h, ptrdiff_t size)
size exceeds REHASH_THRESHOLD.
WEAK specifies the weakness of the table. If non-nil, it must be
one of the symbols `key', `value', `key-or-value', or `key-and-value'.
If PURECOPY is non-nil, the table can be copied to pure storage via
`purecopy' when Emacs is being dumped. Such tables can no longer be
changed after purecopy. */
one of the symbols `key', `value', `key-or-value', or `key-and-value'. */
Lisp_Object
make_hash_table (struct hash_table_test test, EMACS_INT size,
float rehash_size, float rehash_threshold,
Lisp_Object weak, bool purecopy)
Lisp_Object weak)
{
struct Lisp_Hash_Table *h;
Lisp_Object table;
@ -4301,7 +4294,6 @@ make_hash_table (struct hash_table_test test, EMACS_INT size,
h->next = make_vector (size, make_fixnum (-1));
h->index = make_vector (hash_index_size (h, size), make_fixnum (-1));
h->next_weak = NULL;
h->purecopy = purecopy;
h->mutable = true;
/* Set up the free list. */
@ -4402,11 +4394,6 @@ maybe_resize_hash_table (struct Lisp_Hash_Table *h)
set_hash_next_slot (h, i, HASH_INDEX (h, start_of_bucket));
set_hash_index_slot (h, start_of_bucket, i);
}
#ifdef ENABLE_CHECKING
if (HASH_TABLE_P (Vpurify_flag) && XHASH_TABLE (Vpurify_flag) == h)
message ("Growing hash table to: %"pD"d", next_size);
#endif
}
}
@ -4470,7 +4457,6 @@ check_mutable_hash_table (Lisp_Object obj, struct Lisp_Hash_Table *h)
{
if (!h->mutable)
signal_error ("hash table test modifies table", obj);
eassert (!PURE_P (h));
}
static void
@ -4998,16 +4984,10 @@ key, value, one of key or value, or both key and value, depending on
WEAK. WEAK t is equivalent to `key-and-value'. Default value of WEAK
is nil.
:purecopy PURECOPY -- If PURECOPY is non-nil, the table can be copied
to pure storage when Emacs is being dumped, making the contents of the
table read only. Any further changes to purified tables will result
in an error.
usage: (make-hash-table &rest KEYWORD-ARGS) */)
(ptrdiff_t nargs, Lisp_Object *args)
{
Lisp_Object test, weak;
bool purecopy;
struct hash_table_test testdesc;
ptrdiff_t i;
USE_SAFE_ALLOCA;
@ -5041,9 +5021,9 @@ usage: (make-hash-table &rest KEYWORD-ARGS) */)
testdesc.cmpfn = cmpfn_user_defined;
}
/* See if there's a `:purecopy PURECOPY' argument. */
i = get_key_arg (QCpurecopy, nargs, args, used);
purecopy = i && !NILP (args[i]);
/* Ignore a `:purecopy PURECOPY' argument. We used to accept those, but
they were only meaningful when we had the purespace. */
get_key_arg (QCpurecopy, nargs, args, used);
/* See if there's a `:size SIZE' argument. */
i = get_key_arg (QCsize, nargs, args, used);
Lisp_Object size_arg = i ? args[i] : Qnil;
@ -5093,8 +5073,7 @@ usage: (make-hash-table &rest KEYWORD-ARGS) */)
signal_error ("Invalid argument list", args[i]);
SAFE_FREE ();
return make_hash_table (testdesc, size, rehash_size, rehash_threshold, weak,
purecopy);
return make_hash_table (testdesc, size, rehash_size, rehash_threshold, weak);
}

View file

@ -2138,7 +2138,7 @@ syms_of_fontset (void)
set_fontset_id (Vdefault_fontset, make_fixnum (0));
set_fontset_name
(Vdefault_fontset,
build_pure_c_string ("-*-*-*-*-*-*-*-*-*-*-*-*-fontset-default"));
build_string ("-*-*-*-*-*-*-*-*-*-*-*-*-fontset-default"));
ASET (Vfontset_table, 0, Vdefault_fontset);
next_fontset_id = 1;
PDUMPER_REMEMBER_SCALAR (next_fontset_id);
@ -2196,7 +2196,7 @@ alternate fontnames (if any) are tried instead. */);
doc: /* Alist of fontset names vs the aliases. */);
Vfontset_alias_alist
= list1 (Fcons (FONTSET_NAME (Vdefault_fontset),
build_pure_c_string ("fontset-default")));
build_string ("fontset-default")));
DEFVAR_LISP ("vertical-centering-font-regexp",
Vvertical_centering_font_regexp,

View file

@ -1028,7 +1028,7 @@ make_frame (bool mini_p)
fset_face_hash_table
(f, make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
DEFAULT_REHASH_THRESHOLD, Qnil, false));
DEFAULT_REHASH_THRESHOLD, Qnil));
if (mini_p)
{
@ -1192,7 +1192,7 @@ make_initial_frame (void)
Vframe_list = Fcons (frame, Vframe_list);
tty_frame_count = 1;
fset_name (f, build_pure_c_string ("F1"));
fset_name (f, build_string ("F1"));
SET_FRAME_VISIBLE (f, 1);

View file

@ -5442,7 +5442,7 @@ xpm_make_color_table_h (void (**put_func) (Lisp_Object, const char *, int,
*get_func = xpm_get_color_table_h;
return make_hash_table (hashtest_equal, DEFAULT_HASH_SIZE,
DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
Qnil, false);
Qnil);
}
static void

View file

@ -44,7 +44,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "lisp.h"
#include "intervals.h"
#include "buffer.h"
#include "puresize.h"
#include "keymap.h"
/* Test for membership, allowing for t (actually any non-cons) to mean the
@ -101,7 +100,6 @@ create_root_interval (Lisp_Object parent)
}
else
{
CHECK_IMPURE (parent, XSTRING (parent));
new->total_length = SCHARS (parent);
eassert (TOTAL_LENGTH (new) >= 0);
set_string_intervals (parent, new);

View file

@ -1102,8 +1102,8 @@ define_error (Lisp_Object name, const char *message, Lisp_Object parent)
eassert (CONSP (parent_conditions));
eassert (!NILP (Fmemq (parent, parent_conditions)));
eassert (NILP (Fmemq (name, parent_conditions)));
Fput (name, Qerror_conditions, pure_cons (name, parent_conditions));
Fput (name, Qerror_message, build_pure_c_string (message));
Fput (name, Qerror_conditions, Fcons (name, parent_conditions));
Fput (name, Qerror_message, build_string (message));
}
void

View file

@ -12045,14 +12045,14 @@ syms_of_keyboard (void)
pending_funcalls = Qnil;
staticpro (&pending_funcalls);
Vlispy_mouse_stem = build_pure_c_string ("mouse");
Vlispy_mouse_stem = build_string ("mouse");
staticpro (&Vlispy_mouse_stem);
regular_top_level_message = build_pure_c_string ("Back to top level");
regular_top_level_message = build_string ("Back to top level");
staticpro (&regular_top_level_message);
#ifdef HAVE_STACK_OVERFLOW_HANDLING
recover_top_level_message
= build_pure_c_string ("Re-entering top level after C stack overflow");
= build_string ("Re-entering top level after C stack overflow");
staticpro (&recover_top_level_message);
#endif
DEFVAR_LISP ("internal--top-level-message", Vinternal__top_level_message,

View file

@ -50,7 +50,6 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include "keyboard.h"
#include "termhooks.h"
#include "blockinput.h"
#include "puresize.h"
#include "intervals.h"
#include "keymap.h"
#include "window.h"
@ -121,8 +120,6 @@ in case you use it as a menu with `x-popup-menu'. */)
{
if (!NILP (string))
{
if (!NILP (Vpurify_flag))
string = Fpurecopy (string);
return list2 (Qkeymap, string);
}
return list1 (Qkeymap);
@ -301,7 +298,6 @@ Return PARENT. PARENT should be nil or another keymap. */)
If we came to the end, add the parent in PREV. */
if (!CONSP (list) || KEYMAPP (list))
{
CHECK_IMPURE (prev, XCONS (prev));
XSETCDR (prev, parent);
return parent;
}
@ -744,7 +740,7 @@ store_in_keymap (Lisp_Object keymap, register Lisp_Object idx,
/* If we are preparing to dump, and DEF is a menu element
with a menu item indicator, copy it to ensure it is not pure. */
if (CONSP (def) && PURE_P (XCONS (def))
if (CONSP (def)
&& (EQ (XCAR (def), Qmenu_item) || STRINGP (XCAR (def))))
def = Fcons (XCAR (def), XCDR (def));
@ -788,7 +784,6 @@ store_in_keymap (Lisp_Object keymap, register Lisp_Object idx,
{
if (FIXNATP (idx) && XFIXNAT (idx) < ASIZE (elt))
{
CHECK_IMPURE (elt, XVECTOR (elt));
ASET (elt, XFIXNAT (idx), def);
return def;
}
@ -846,7 +841,6 @@ store_in_keymap (Lisp_Object keymap, register Lisp_Object idx,
}
else if (EQ (idx, XCAR (elt)))
{
CHECK_IMPURE (elt, XCONS (elt));
if (remove)
/* Remove the element. */
insertion_point = Fdelq (elt, insertion_point);
@ -900,7 +894,6 @@ store_in_keymap (Lisp_Object keymap, register Lisp_Object idx,
}
else
elt = Fcons (idx, def);
CHECK_IMPURE (insertion_point, XCONS (insertion_point));
XSETCDR (insertion_point, Fcons (elt, XCDR (insertion_point)));
}
}
@ -3340,12 +3333,12 @@ syms_of_keymap (void)
current_global_map = Qnil;
staticpro (&current_global_map);
exclude_keys = pure_list
(pure_cons (build_pure_c_string ("DEL"), build_pure_c_string ("\\d")),
pure_cons (build_pure_c_string ("TAB"), build_pure_c_string ("\\t")),
pure_cons (build_pure_c_string ("RET"), build_pure_c_string ("\\r")),
pure_cons (build_pure_c_string ("ESC"), build_pure_c_string ("\\e")),
pure_cons (build_pure_c_string ("SPC"), build_pure_c_string (" ")));
exclude_keys = list
(Fcons (build_string ("DEL"), build_string ("\\d")),
Fcons (build_string ("TAB"), build_string ("\\t")),
Fcons (build_string ("RET"), build_string ("\\r")),
Fcons (build_string ("ESC"), build_string ("\\e")),
Fcons (build_string ("SPC"), build_string (" ")));
staticpro (&exclude_keys);
DEFVAR_LISP ("minibuffer-local-map", Vminibuffer_local_map,
@ -3407,13 +3400,13 @@ that describe key bindings. That is why the default is nil. */);
DEFSYM (Qmode_line, "mode-line");
staticpro (&Vmouse_events);
Vmouse_events = pure_list (Qmenu_bar, Qtab_bar, Qtool_bar,
Qtab_line, Qheader_line, Qmode_line,
intern_c_string ("mouse-1"),
intern_c_string ("mouse-2"),
intern_c_string ("mouse-3"),
intern_c_string ("mouse-4"),
intern_c_string ("mouse-5"));
Vmouse_events = list (Qmenu_bar, Qtab_bar, Qtool_bar, Qtab_line,
Qheader_line, Qmode_line,
intern_c_string ("mouse-1"),
intern_c_string ("mouse-2"),
intern_c_string ("mouse-3"),
intern_c_string ("mouse-4"),
intern_c_string ("mouse-5"));
/* Keymap used for minibuffers when doing completion. */
/* Keymap used for minibuffers when doing completion and require a match. */

View file

@ -859,9 +859,6 @@ struct Lisp_Symbol
special (with `defvar' etc), and shouldn't be lexically bound. */
bool_bf declared_special : 1;
/* True if pointed to from purespace and hence can't be GC'd. */
bool_bf pinned : 1;
/* The symbol's name, as a Lisp string. */
Lisp_Object name;
@ -2426,12 +2423,8 @@ struct Lisp_Hash_Table
/* Index of first free entry in free list, or -1 if none. */
ptrdiff_t next_free;
/* True if the table can be purecopied. The table cannot be
changed afterwards. */
bool purecopy;
/* True if the table is mutable. Ordinarily tables are mutable, but
pure tables are not, and while a table is being mutated it is
some tables are not, and while a table is being mutated it is
immutable for recursive attempts to mutate it. */
bool mutable;
@ -4010,7 +4003,7 @@ EMACS_UINT hash_string (char const *, ptrdiff_t);
EMACS_UINT sxhash (Lisp_Object);
Lisp_Object hashfn_user_defined (Lisp_Object, struct Lisp_Hash_Table *);
Lisp_Object make_hash_table (struct hash_table_test, EMACS_INT, float, float,
Lisp_Object, bool);
Lisp_Object);
ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object *);
ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
Lisp_Object);
@ -4177,7 +4170,6 @@ extern void parse_str_as_multibyte (const unsigned char *, ptrdiff_t,
/* Defined in alloc.c. */
extern void *my_heap_start (void);
extern void check_pure_size (void);
unsigned char *resize_string_data (Lisp_Object, ptrdiff_t, int, int);
extern void malloc_warning (const char *);
extern AVOID memory_full (size_t);
@ -4236,11 +4228,8 @@ extern Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
extern Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
Lisp_Object);
extern Lisp_Object listn (ptrdiff_t, Lisp_Object, ...);
extern Lisp_Object pure_listn (ptrdiff_t, Lisp_Object, ...);
#define list(...) \
listn (ARRAYELTS (((Lisp_Object []) {__VA_ARGS__})), __VA_ARGS__)
#define pure_list(...) \
pure_listn (ARRAYELTS (((Lisp_Object []) {__VA_ARGS__})), __VA_ARGS__)
enum gc_root_type
{
@ -4313,18 +4302,8 @@ extern Lisp_Object make_uninit_multibyte_string (EMACS_INT, EMACS_INT);
extern Lisp_Object make_string_from_bytes (const char *, ptrdiff_t, ptrdiff_t);
extern Lisp_Object make_specified_string (const char *,
ptrdiff_t, ptrdiff_t, bool);
extern Lisp_Object make_pure_string (const char *, ptrdiff_t, ptrdiff_t, bool);
extern Lisp_Object make_pure_c_string (const char *, ptrdiff_t);
extern void pin_string (Lisp_Object string);
/* Make a string allocated in pure space, use STR as string data. */
INLINE Lisp_Object
build_pure_c_string (const char *str)
{
return make_pure_c_string (str, strlen (str));
}
/* Make a string from the data at STR, treating it as multibyte if the
data warrants. */
@ -4334,7 +4313,6 @@ build_string (const char *str)
return make_string (str, strlen (str));
}
extern Lisp_Object pure_cons (Lisp_Object, Lisp_Object);
extern Lisp_Object make_vector (ptrdiff_t, Lisp_Object);
extern struct Lisp_Vector *allocate_nil_vector (ptrdiff_t)
ATTRIBUTE_RETURNS_NONNULL;

View file

@ -1537,7 +1537,7 @@ Return t if the file exists and loads successfully. */)
}
if (! NILP (Vpurify_flag))
Vpreloaded_file_list = Fcons (Fpurecopy (file), Vpreloaded_file_list);
Vpreloaded_file_list = Fcons (file, Vpreloaded_file_list);
if (NILP (nomessage) || force_load_messages)
{
@ -2288,36 +2288,32 @@ readevalloop (Lisp_Object readcharfun,
read_objects_map
= make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE,
DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
Qnil, false);
Qnil);
if (! HASH_TABLE_P (read_objects_completed)
|| XHASH_TABLE (read_objects_completed)->count)
read_objects_completed
= make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE,
DEFAULT_REHASH_SIZE, DEFAULT_REHASH_THRESHOLD,
Qnil, false);
if (!NILP (Vpurify_flag) && c == '(')
val = read0 (readcharfun, false);
else
Qnil);
if (!NILP (readfun))
{
if (!NILP (readfun))
{
val = call1 (readfun, readcharfun);
val = call1 (readfun, readcharfun);
/* If READCHARFUN has set point to ZV, we should
/* If READCHARFUN has set point to ZV, we should
stop reading, even if the form read sets point
to a different value when evaluated. */
if (BUFFERP (readcharfun))
{
struct buffer *buf = XBUFFER (readcharfun);
if (BUF_PT (buf) == BUF_ZV (buf))
continue_reading_p = 0;
}
if (BUFFERP (readcharfun))
{
struct buffer *buf = XBUFFER (readcharfun);
if (BUF_PT (buf) == BUF_ZV (buf))
continue_reading_p = 0;
}
else if (! NILP (Vload_read_function))
val = call1 (Vload_read_function, readcharfun);
else
val = read_internal_start (readcharfun, Qnil, Qnil, false);
}
else if (! NILP (Vload_read_function))
val = call1 (Vload_read_function, readcharfun);
else
val = read_internal_start (readcharfun, Qnil, Qnil, false);
/* Empty hashes can be reused; otherwise, reset on next call. */
if (HASH_TABLE_P (read_objects_map)
&& XHASH_TABLE (read_objects_map)->count > 0)
@ -2539,12 +2535,12 @@ read_internal_start (Lisp_Object stream, Lisp_Object start, Lisp_Object end,
|| XHASH_TABLE (read_objects_map)->count)
read_objects_map
= make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
DEFAULT_REHASH_THRESHOLD, Qnil, false);
DEFAULT_REHASH_THRESHOLD, Qnil);
if (! HASH_TABLE_P (read_objects_completed)
|| XHASH_TABLE (read_objects_completed)->count)
read_objects_completed
= make_hash_table (hashtest_eq, DEFAULT_HASH_SIZE, DEFAULT_REHASH_SIZE,
DEFAULT_REHASH_THRESHOLD, Qnil, false);
DEFAULT_REHASH_THRESHOLD, Qnil);
if (STRINGP (stream)
|| ((CONSP (stream) && STRINGP (XCAR (stream)))))
@ -4150,10 +4146,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms)
if (uninterned_symbol)
{
Lisp_Object name
= (!NILP (Vpurify_flag)
? make_pure_string (read_buffer, nchars, nbytes, multibyte)
: make_specified_string (read_buffer, nchars, nbytes,
multibyte));
= make_specified_string (read_buffer, nchars, nbytes, multibyte);
result = Fmake_symbol (name);
}
else
@ -4645,16 +4638,8 @@ intern_c_string_1 (const char *str, ptrdiff_t len)
Lisp_Object tem = oblookup (obarray, str, len, len);
if (!SYMBOLP (tem))
{
Lisp_Object string;
tem = intern_driver (make_string (str, len), obarray, tem);
if (NILP (Vpurify_flag))
string = make_string (str, len);
else
string = make_pure_c_string (str, len);
tem = intern_driver (string, obarray, tem);
}
return tem;
}
@ -4662,7 +4647,7 @@ static void
define_symbol (Lisp_Object sym, char const *str)
{
ptrdiff_t len = strlen (str);
Lisp_Object string = make_pure_c_string (str, len);
Lisp_Object string = make_string (str, len);
init_symbol (sym, string);
/* Qunbound is uninterned, so that it's not confused with any symbol
@ -4706,8 +4691,7 @@ it defaults to the value of `obarray'. */)
xfree (longhand);
}
else
tem = intern_driver (NILP (Vpurify_flag) ? string : Fpurecopy (string),
obarray, tem);
tem = intern_driver (string, obarray, tem);
}
return tem;
}
@ -5002,7 +4986,7 @@ init_obarray_once (void)
XSYMBOL (Qt)->u.s.declared_special = true;
/* Qt is correct even if not dumping. loadup.el will set to nil at end. */
Vpurify_flag = Qt;
Vpurify_flag = Qt; /* FIXME: Redundant with setting in alloc.c. */
DEFSYM (Qvariable_documentation, "variable-documentation");
}
@ -5019,7 +5003,7 @@ defsubr (union Aligned_Lisp_Subr *aname)
set_symbol_function (sym, tem);
#ifdef HAVE_NATIVE_COMP
eassert (NILP (Vcomp_abi_hash));
Vcomp_subr_list = Fpurecopy (Fcons (tem, Vcomp_subr_list));
Vcomp_subr_list = Fcons (tem, Vcomp_subr_list);
#endif
}
@ -5412,20 +5396,20 @@ This list includes suffixes for both compiled and source Emacs Lisp files.
This list should not include the empty string.
`load' and related functions try to append these suffixes, in order,
to the specified file name if a suffix is allowed or required. */);
Vload_suffixes = list2 (build_pure_c_string (".elc"),
build_pure_c_string (".el"));
Vload_suffixes = list2 (build_string (".elc"),
build_string (".el"));
#ifdef HAVE_MODULES
Vload_suffixes = Fcons (build_pure_c_string (MODULES_SUFFIX), Vload_suffixes);
Vload_suffixes = Fcons (build_string (MODULES_SUFFIX), Vload_suffixes);
#ifdef MODULES_SECONDARY_SUFFIX
Vload_suffixes =
Fcons (build_pure_c_string (MODULES_SECONDARY_SUFFIX), Vload_suffixes);
Fcons (build_string (MODULES_SECONDARY_SUFFIX), Vload_suffixes);
#endif
#endif
DEFVAR_LISP ("module-file-suffix", Vmodule_file_suffix,
doc: /* Suffix of loadable module file, or nil if modules are not supported. */);
#ifdef HAVE_MODULES
Vmodule_file_suffix = build_pure_c_string (MODULES_SUFFIX);
Vmodule_file_suffix = build_string (MODULES_SUFFIX);
#else
Vmodule_file_suffix = Qnil;
#endif
@ -5575,7 +5559,7 @@ from the file, and matches them against this regular expression.
When the regular expression matches, the file is considered to be safe
to load. */);
Vbytecomp_version_regexp
= build_pure_c_string ("^;;;.\\(in Emacs version\\|bytecomp version FSF\\)");
= build_string ("^;;;.\\(in Emacs version\\|bytecomp version FSF\\)");
DEFSYM (Qlexical_binding, "lexical-binding");
DEFVAR_LISP ("lexical-binding", Vlexical_binding,

View file

@ -2412,7 +2412,7 @@ dump_symbol (struct dump_context *ctx,
Lisp_Object object,
dump_off offset)
{
#if CHECK_STRUCTS && !defined HASH_Lisp_Symbol_999DC26DEC
#if CHECK_STRUCTS && !defined HASH_Lisp_Symbol_DD2E6013B4
# error "Lisp_Symbol changed. See CHECK_STRUCTS comment in config.h."
#endif
#if CHECK_STRUCTS && !defined (HASH_symbol_redirect_ADB4F5B113)
@ -2449,7 +2449,6 @@ dump_symbol (struct dump_context *ctx,
DUMP_FIELD_COPY (&out, symbol, u.s.trapped_write);
DUMP_FIELD_COPY (&out, symbol, u.s.interned);
DUMP_FIELD_COPY (&out, symbol, u.s.declared_special);
DUMP_FIELD_COPY (&out, symbol, u.s.pinned);
dump_field_lv (ctx, &out, symbol, &symbol->u.s.name, WEIGHT_STRONG);
switch (symbol->u.s.redirect)
{
@ -2666,7 +2665,7 @@ dump_hash_table (struct dump_context *ctx,
Lisp_Object object,
dump_off offset)
{
#if CHECK_STRUCTS && !defined HASH_Lisp_Hash_Table_6D63EDB618
#if CHECK_STRUCTS && !defined HASH_Lisp_Hash_Table_203821C7EF
# error "Lisp_Hash_Table changed. See CHECK_STRUCTS comment in config.h."
#endif
const struct Lisp_Hash_Table *hash_in = XHASH_TABLE (object);
@ -2682,7 +2681,6 @@ dump_hash_table (struct dump_context *ctx,
them as close to the hash table as possible. */
DUMP_FIELD_COPY (out, hash, count);
DUMP_FIELD_COPY (out, hash, next_free);
DUMP_FIELD_COPY (out, hash, purecopy);
DUMP_FIELD_COPY (out, hash, mutable);
DUMP_FIELD_COPY (out, hash, rehash_threshold);
DUMP_FIELD_COPY (out, hash, rehash_size);

View file

@ -2509,9 +2509,6 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag)
print_object (Fhash_table_rehash_threshold (obj),
printcharfun, escapeflag);
if (h->purecopy)
print_c_string (" purecopy t", printcharfun);
print_c_string (" data (", printcharfun);
ptrdiff_t size = h->count;

View file

@ -8750,7 +8750,7 @@ sentinel or a process filter function has an error. */);
const struct socket_options *sopt;
#define ADD_SUBFEATURE(key, val) \
subfeatures = pure_cons (pure_cons (key, pure_cons (val, Qnil)), subfeatures)
subfeatures = Fcons (Fcons (key, Fcons (val, Qnil)), subfeatures)
ADD_SUBFEATURE (QCnowait, Qt);
#ifdef DATAGRAM_SOCKETS
@ -8772,7 +8772,7 @@ sentinel or a process filter function has an error. */);
ADD_SUBFEATURE (QCserver, Qt);
for (sopt = socket_options; sopt->name; sopt++)
subfeatures = pure_cons (intern_c_string (sopt->name), subfeatures);
subfeatures = Fcons (intern_c_string (sopt->name), subfeatures);
Fprovide (intern_c_string ("make-network-process"), subfeatures);
}

View file

@ -63,7 +63,7 @@ make_log (void)
Lisp_Object log = make_hash_table (hashtest_profiler, heap_size,
DEFAULT_REHASH_SIZE,
DEFAULT_REHASH_THRESHOLD,
Qnil, false);
Qnil);
struct Lisp_Hash_Table *h = XHASH_TABLE (log);
/* What is special about our hash-tables is that the values are pre-filled

View file

@ -1,115 +0,0 @@
/* How much read-only Lisp storage a dumped Emacs needs.
Copyright (C) 1993, 2001-2022 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#ifndef EMACS_PURESIZE_H
#define EMACS_PURESIZE_H
#include "lisp.h"
INLINE_HEADER_BEGIN
/* Define PURESIZE, the number of bytes of pure Lisp code to leave space for.
At one point, this was defined in config.h, meaning that changing
PURESIZE would make Make recompile all of Emacs. But only a few
files actually use PURESIZE, so we split it out to its own .h file.
Make sure to include this file after config.h, since that tells us
whether we are running X windows, which tells us how much pure
storage to allocate. */
/* First define a measure of the amount of data we have. */
/* A system configuration file may set this to request a certain extra
amount of storage. This is a lot more update-robust that defining
BASE_PURESIZE or even PURESIZE directly. */
#ifndef SYSTEM_PURESIZE_EXTRA
#define SYSTEM_PURESIZE_EXTRA 0
#endif
#ifndef SITELOAD_PURESIZE_EXTRA
#define SITELOAD_PURESIZE_EXTRA 0
#endif
#ifndef BASE_PURESIZE
#define BASE_PURESIZE (2000000 + SYSTEM_PURESIZE_EXTRA + SITELOAD_PURESIZE_EXTRA)
#endif
/* Increase BASE_PURESIZE by a ratio depending on the machine's word size. */
#ifndef PURESIZE_RATIO
#if EMACS_INT_MAX >> 31 != 0
#if PTRDIFF_MAX >> 31 != 0
#define PURESIZE_RATIO 10 / 6 /* Don't surround with `()'. */
#else
#define PURESIZE_RATIO 8 / 6 /* Don't surround with `()'. */
#endif
#else
#define PURESIZE_RATIO 1
#endif
#endif
#ifdef ENABLE_CHECKING
/* ENABLE_CHECKING somehow increases the purespace used, probably because
it tends to cause some macro arguments to be evaluated twice. This is
a bug, but it's difficult to track it down. */
#define PURESIZE_CHECKING_RATIO 12 / 10 /* Don't surround with `()'. */
#else
#define PURESIZE_CHECKING_RATIO 1
#endif
/* This is the actual size in bytes to allocate. */
#ifndef PURESIZE
#define PURESIZE (BASE_PURESIZE * PURESIZE_RATIO * PURESIZE_CHECKING_RATIO)
#endif
extern AVOID pure_write_error (Lisp_Object);
extern EMACS_INT pure[];
/* The puresize_h_* macros are private to this include file. */
/* True if PTR is pure. */
#define puresize_h_PURE_P(ptr) \
((uintptr_t) (ptr) - (uintptr_t) pure <= PURESIZE)
INLINE bool
PURE_P (void *ptr)
{
return puresize_h_PURE_P (ptr);
}
/* Signal an error if OBJ is pure. PTR is OBJ untagged. */
#define puresize_h_CHECK_IMPURE(obj, ptr) \
(PURE_P (ptr) ? pure_write_error (obj) : (void) 0)
INLINE void
CHECK_IMPURE (Lisp_Object obj, void *ptr)
{
puresize_h_CHECK_IMPURE (obj, ptr);
}
#if DEFINE_KEY_OPS_AS_MACROS
# define PURE_P(ptr) puresize_h_PURE_P (ptr)
# define CHECK_IMPURE(obj, ptr) puresize_h_CHECK_IMPURE (obj, ptr)
#endif
INLINE_HEADER_END
#endif /* EMACS_PURESIZE_H */

View file

@ -3385,19 +3385,19 @@ syms_of_search (void)
DEFSYM (Qinvalid_regexp, "invalid-regexp");
Fput (Qsearch_failed, Qerror_conditions,
pure_list (Qsearch_failed, Qerror));
list (Qsearch_failed, Qerror));
Fput (Qsearch_failed, Qerror_message,
build_pure_c_string ("Search failed"));
build_string ("Search failed"));
Fput (Quser_search_failed, Qerror_conditions,
pure_list (Quser_search_failed, Quser_error, Qsearch_failed, Qerror));
list (Quser_search_failed, Quser_error, Qsearch_failed, Qerror));
Fput (Quser_search_failed, Qerror_message,
build_pure_c_string ("Search failed"));
build_string ("Search failed"));
Fput (Qinvalid_regexp, Qerror_conditions,
pure_list (Qinvalid_regexp, Qerror));
list (Qinvalid_regexp, Qerror));
Fput (Qinvalid_regexp, Qerror_message,
build_pure_c_string ("Invalid regexp"));
build_string ("Invalid regexp"));
re_match_object = Qnil;
staticpro (&re_match_object);

View file

@ -769,9 +769,9 @@ syms_of_sqlite (void)
DEFSYM (Qsqlite_locked_error, "sqlite-locked-error");
Fput (Qsqlite_locked_error, Qerror_conditions,
Fpurecopy (list2 (Qsqlite_locked_error, Qerror)));
list2 (Qsqlite_locked_error, Qerror));
Fput (Qsqlite_locked_error, Qerror_message,
build_pure_c_string ("Database locked"));
build_string ("Database locked"));
DEFSYM (Qsqlitep, "sqlitep");
DEFSYM (Qfalse, "false");

View file

@ -3750,9 +3750,9 @@ syms_of_syntax (void)
DEFSYM (Qscan_error, "scan-error");
Fput (Qscan_error, Qerror_conditions,
pure_list (Qscan_error, Qerror));
list (Qscan_error, Qerror));
Fput (Qscan_error, Qerror_message,
build_pure_c_string ("Scan error"));
build_string ("Scan error"));
DEFVAR_BOOL ("parse-sexp-ignore-comments", parse_sexp_ignore_comments,
doc: /* Non-nil means `forward-sexp', etc., should treat comments as whitespace. */);

View file

@ -10554,9 +10554,9 @@ syms_of_w32fns (void)
DEFSYM (Qjson, "json");
Fput (Qundefined_color, Qerror_conditions,
pure_list (Qundefined_color, Qerror));
list (Qundefined_color, Qerror));
Fput (Qundefined_color, Qerror_message,
build_pure_c_string ("Undefined color"));
build_string ("Undefined color"));
staticpro (&w32_grabbed_keys);
w32_grabbed_keys = Qnil;

View file

@ -36064,7 +36064,7 @@ See also `overlay-arrow-string'. */);
DEFVAR_LISP ("overlay-arrow-string", Voverlay_arrow_string,
doc: /* String to display as an arrow in non-window frames.
See also `overlay-arrow-position'. */);
Voverlay_arrow_string = build_pure_c_string ("=>");
Voverlay_arrow_string = build_string ("=>");
DEFVAR_LISP ("overlay-arrow-variable-list", Voverlay_arrow_variable_list,
doc: /* List of variables (symbols) which hold markers for overlay arrows.
@ -36194,17 +36194,17 @@ which no explicit name has been set (see `modify-frame-parameters'). */);
This variable has the same structure as `mode-line-format' (which see),
and is used only on frames for which no explicit name has been set
\(see `modify-frame-parameters'). */);
/* Do not nest calls to pure_list. This works around a bug in
/* Do not nest calls to list. This works around a bug in
Oracle Developer Studio 12.6. */
Lisp_Object icon_title_name_format
= pure_list (empty_unibyte_string,
build_pure_c_string ("%b - GNU Emacs at "),
intern_c_string ("system-name"));
= list (empty_unibyte_string,
build_string ("%b - GNU Emacs at "),
intern_c_string ("system-name"));
Vicon_title_format
= Vframe_title_format
= pure_list (intern_c_string ("multiple-frames"),
build_pure_c_string ("%b"),
icon_title_name_format);
= list (intern_c_string ("multiple-frames"),
build_string ("%b"),
icon_title_name_format);
DEFVAR_LISP ("message-log-max", Vmessage_log_max,
doc: /* Maximum number of lines to keep in the message log buffer.

View file

@ -7122,14 +7122,14 @@ only for this purpose. */);
Vface_new_frame_defaults =
/* 33 entries is enough to fit all basic faces */
make_hash_table (hashtest_eq, 33, DEFAULT_REHASH_SIZE,
DEFAULT_REHASH_THRESHOLD, Qnil, false);
DEFAULT_REHASH_THRESHOLD, Qnil);
DEFVAR_LISP ("face-default-stipple", Vface_default_stipple,
doc: /* Default stipple pattern used on monochrome displays.
This stipple pattern is used on monochrome displays
instead of shades of gray for a face background color.
See `set-face-stipple' for possible values for this variable. */);
Vface_default_stipple = build_pure_c_string ("gray3");
Vface_default_stipple = build_string ("gray3");
DEFVAR_LISP ("tty-defined-color-alist", Vtty_defined_color_alist,
doc: /* An alist of defined terminal colors and their RGB values.

View file

@ -9690,9 +9690,9 @@ syms_of_xfns (void)
DEFSYM (QXdndActionPrivate, "XdndActionPrivate");
Fput (Qundefined_color, Qerror_conditions,
pure_list (Qundefined_color, Qerror));
list (Qundefined_color, Qerror));
Fput (Qundefined_color, Qerror_message,
build_pure_c_string ("Undefined color"));
build_string ("Undefined color"));
DEFVAR_LISP ("x-pointer-shape", Vx_pointer_shape,
doc: /* The shape of the pointer when over text.
@ -9903,7 +9903,7 @@ eliminated in future versions of Emacs. */);
char gtk_version[sizeof ".." + 3 * INT_STRLEN_BOUND (int)];
int len = sprintf (gtk_version, "%d.%d.%d",
GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
Vgtk_version_string = make_pure_string (gtk_version, len, len, false);
Vgtk_version_string = make_specified_string (gtk_version, len, len, false);
}
#endif /* USE_GTK */
@ -9917,7 +9917,8 @@ eliminated in future versions of Emacs. */);
int len = sprintf (cairo_version, "%d.%d.%d",
CAIRO_VERSION_MAJOR, CAIRO_VERSION_MINOR,
CAIRO_VERSION_MICRO);
Vcairo_version_string = make_pure_string (cairo_version, len, len, false);
Vcairo_version_string = make_specified_string (cairo_version, len, len,
false);
}
#endif

View file

@ -27815,7 +27815,7 @@ syms_of_xterm (void)
DEFSYM (Qx_dnd_targets_list, "x-dnd-targets-list");
#ifdef USE_GTK
xg_default_icon_file = build_pure_c_string ("icons/hicolor/scalable/apps/emacs.svg");
xg_default_icon_file = build_string ("icons/hicolor/scalable/apps/emacs.svg");
staticpro (&xg_default_icon_file);
DEFSYM (Qx_gtk_map_stock, "x-gtk-map-stock");
@ -27950,7 +27950,7 @@ If set to a non-float value, there will be no wait at all. */);
Vx_keysym_table = make_hash_table (hashtest_eql, 900,
DEFAULT_REHASH_SIZE,
DEFAULT_REHASH_THRESHOLD,
Qnil, false);
Qnil);
DEFVAR_BOOL ("x-frame-normalize-before-maximize",
x_frame_normalize_before_maximize,