]> git.eshelyaron.com Git - emacs.git/commit
Pin bytecode strings to avoid copy at call time
authorMattias Engdegård <mattiase@acm.org>
Fri, 31 Dec 2021 16:24:31 +0000 (17:24 +0100)
committerMattias Engdegård <mattiase@acm.org>
Mon, 24 Jan 2022 10:41:46 +0000 (11:41 +0100)
commit65caf5b205d22f76bb4ec85cfe597b621a83afb3
tree8a4b71295d56f76ad0fee6c4471aa036c6e7e226
parentce1de3a8d9723305f48fd4527fbceaff3cec50ba
Pin bytecode strings to avoid copy at call time

Avoid making a copy (in the interpreter C stack frame) of the bytecode
string by making sure it won't be moved by the GC.  This is done by
reallocating it to the heap normally only used for large strings,
which isn't compacted.

This requires that we retain an explicit reference to the bytecode
string object (`bytestr`) lest it be GCed away should all other
references vanish during execution.  We allocate an extra stack slot
for that, as we already do for the constant vector object.

* src/alloc.c (allocate_string_data): Add `immovable` argument.
(resize_string_data, make_clear_multibyte_string): Use it.
(pin_string): New.
* src/pdumper.c (dump_string): Fix incorrect comment.
Update hash for Lisp_String (only comments changed, not contents).
* src/lread.c (read1):
* src/alloc.c (Fmake_byte_code, purecopy):
* src/bytecode.c (Fbyte_code): Pin bytecode on object creation.
(exec_byte_code): Don't copy bytecode.  Retain `bytestr` explicitly.
* src/lisp.h (Lisp_String): Explain special size_byte values.
(string_immovable_p): New.
src/alloc.c
src/bytecode.c
src/lisp.h
src/lread.c
src/pdumper.c