aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2018-10-30 20:57:46 -0700
committerPaul Eggert2018-10-30 20:58:48 -0700
commitcf486a7a920d3d95fa9aa98d7b03ebc61b17518a (patch)
treefa50f7b87708463c36e714078012706b4cefdb23 /src
parentb9cbdd045f2d086390b3d0e4412ebac0b19aaead (diff)
downloademacs-cf486a7a920d3d95fa9aa98d7b03ebc61b17518a.tar.gz
emacs-cf486a7a920d3d95fa9aa98d7b03ebc61b17518a.zip
Improve fix for Bug#33014
Although the previously-applied fix worked for its platform, it doesn’t suffice in general. * src/bytecode.c (exec_byte_code): Save VECTOR into stack slot so that it survives GC. The stack slot was otherwise unused, so this doesn’t cost us memory, only a store insn. * src/eval.c (Ffuncall): Do not make FUN volatile, reverting 2018-10-14T19:12:04Z!gazally@runbox.com. Adding ‘volatile’ does not suffice, since storage for a volatile local can be reclaimed after its last access (e.g., by tail recursion elimination), which would make VECTOR invisible to GC.
Diffstat (limited to 'src')
-rw-r--r--src/bytecode.c1
-rw-r--r--src/eval.c7
2 files changed, 3 insertions, 5 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 17457fc5742..40389e08f0e 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -369,6 +369,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
369 ptrdiff_t item_bytes = stack_items * word_size; 369 ptrdiff_t item_bytes = stack_items * word_size;
370 Lisp_Object *stack_base = ptr_bounds_clip (alloc, item_bytes); 370 Lisp_Object *stack_base = ptr_bounds_clip (alloc, item_bytes);
371 Lisp_Object *top = stack_base; 371 Lisp_Object *top = stack_base;
372 *top = vector; /* Ensure VECTOR survives GC (Bug#33014). */
372 Lisp_Object *stack_lim = stack_base + stack_items; 373 Lisp_Object *stack_lim = stack_base + stack_items;
373 unsigned char *bytestr_data = alloc; 374 unsigned char *bytestr_data = alloc;
374 bytestr_data = ptr_bounds_clip (bytestr_data + item_bytes, bytestr_length); 375 bytestr_data = ptr_bounds_clip (bytestr_data + item_bytes, bytestr_length);
diff --git a/src/eval.c b/src/eval.c
index 32cfda24d8c..a51d0c90831 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2820,11 +2820,8 @@ Thus, (funcall \\='cons \\='x \\='y) returns (x . y).
2820usage: (funcall FUNCTION &rest ARGUMENTS) */) 2820usage: (funcall FUNCTION &rest ARGUMENTS) */)
2821 (ptrdiff_t nargs, Lisp_Object *args) 2821 (ptrdiff_t nargs, Lisp_Object *args)
2822{ 2822{
2823 /* Use 'volatile' here to cause optimizing compilers to keep a 2823 Lisp_Object fun, original_fun;
2824 reference on the stack to the function's bytecode object. See 2824 Lisp_Object funcar;
2825 Bug#33014. */
2826 Lisp_Object volatile fun;
2827 Lisp_Object original_fun, funcar;
2828 ptrdiff_t numargs = nargs - 1; 2825 ptrdiff_t numargs = nargs - 1;
2829 Lisp_Object val; 2826 Lisp_Object val;
2830 ptrdiff_t count; 2827 ptrdiff_t count;