aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorPaul Eggert2019-07-21 12:31:51 -0700
committerPaul Eggert2019-07-21 12:32:16 -0700
commit5d4dd552c29279b8a9e6ed269a2dc3afc36f73b9 (patch)
tree95edeff83e756072c35f974f6271ba8c191d8436 /src/eval.c
parentd02c2f7f6507105605ed0596a7e26acd5b3b8122 (diff)
downloademacs-5d4dd552c29279b8a9e6ed269a2dc3afc36f73b9.tar.gz
emacs-5d4dd552c29279b8a9e6ed269a2dc3afc36f73b9.zip
Fix lifetime error in previous patch
Problem reported by Pip Cet in: https://lists.gnu.org/r/emacs-devel/2019-07/msg00520.html * src/alloc.c (inhibit_garbage_collection): Use new function. (allow_garbage_collection): Accept intmax_t, not pointer. * src/eval.c (default_toplevel_binding, do_one_unbind) (backtrace_eval_unrewind, Fbacktrace__locals, mark_specpdl): Support SPECPDL_UNWIND_INTMAX. (record_unwind_protect_excursion): New function. * src/lisp.h (enum specbind_tag): New constant SPECPDL_UNWIND_INTMAX. (union specbinding): New member unwind_intmax.
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c
index 02a6c3555a9..b890aa6f7f2 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -674,6 +674,7 @@ default_toplevel_binding (Lisp_Object symbol)
674 case SPECPDL_UNWIND_ARRAY: 674 case SPECPDL_UNWIND_ARRAY:
675 case SPECPDL_UNWIND_PTR: 675 case SPECPDL_UNWIND_PTR:
676 case SPECPDL_UNWIND_INT: 676 case SPECPDL_UNWIND_INT:
677 case SPECPDL_UNWIND_INTMAX:
677 case SPECPDL_UNWIND_EXCURSION: 678 case SPECPDL_UNWIND_EXCURSION:
678 case SPECPDL_UNWIND_VOID: 679 case SPECPDL_UNWIND_VOID:
679 case SPECPDL_BACKTRACE: 680 case SPECPDL_BACKTRACE:
@@ -3395,6 +3396,15 @@ record_unwind_protect_int (void (*function) (int), int arg)
3395} 3396}
3396 3397
3397void 3398void
3399record_unwind_protect_intmax (void (*function) (intmax_t), intmax_t arg)
3400{
3401 specpdl_ptr->unwind_intmax.kind = SPECPDL_UNWIND_INTMAX;
3402 specpdl_ptr->unwind_intmax.func = function;
3403 specpdl_ptr->unwind_intmax.arg = arg;
3404 grow_specpdl ();
3405}
3406
3407void
3398record_unwind_protect_excursion (void) 3408record_unwind_protect_excursion (void)
3399{ 3409{
3400 specpdl_ptr->unwind_excursion.kind = SPECPDL_UNWIND_EXCURSION; 3410 specpdl_ptr->unwind_excursion.kind = SPECPDL_UNWIND_EXCURSION;
@@ -3448,6 +3458,9 @@ do_one_unbind (union specbinding *this_binding, bool unwinding,
3448 case SPECPDL_UNWIND_INT: 3458 case SPECPDL_UNWIND_INT:
3449 this_binding->unwind_int.func (this_binding->unwind_int.arg); 3459 this_binding->unwind_int.func (this_binding->unwind_int.arg);
3450 break; 3460 break;
3461 case SPECPDL_UNWIND_INTMAX:
3462 this_binding->unwind_intmax.func (this_binding->unwind_intmax.arg);
3463 break;
3451 case SPECPDL_UNWIND_VOID: 3464 case SPECPDL_UNWIND_VOID:
3452 this_binding->unwind_void.func (); 3465 this_binding->unwind_void.func ();
3453 break; 3466 break;
@@ -3784,6 +3797,7 @@ backtrace_eval_unrewind (int distance)
3784 case SPECPDL_UNWIND_ARRAY: 3797 case SPECPDL_UNWIND_ARRAY:
3785 case SPECPDL_UNWIND_PTR: 3798 case SPECPDL_UNWIND_PTR:
3786 case SPECPDL_UNWIND_INT: 3799 case SPECPDL_UNWIND_INT:
3800 case SPECPDL_UNWIND_INTMAX:
3787 case SPECPDL_UNWIND_VOID: 3801 case SPECPDL_UNWIND_VOID:
3788 case SPECPDL_BACKTRACE: 3802 case SPECPDL_BACKTRACE:
3789 break; 3803 break;
@@ -3917,6 +3931,7 @@ NFRAMES and BASE specify the activation frame to use, as in `backtrace-frame'.
3917 case SPECPDL_UNWIND_ARRAY: 3931 case SPECPDL_UNWIND_ARRAY:
3918 case SPECPDL_UNWIND_PTR: 3932 case SPECPDL_UNWIND_PTR:
3919 case SPECPDL_UNWIND_INT: 3933 case SPECPDL_UNWIND_INT:
3934 case SPECPDL_UNWIND_INTMAX:
3920 case SPECPDL_UNWIND_EXCURSION: 3935 case SPECPDL_UNWIND_EXCURSION:
3921 case SPECPDL_UNWIND_VOID: 3936 case SPECPDL_UNWIND_VOID:
3922 case SPECPDL_BACKTRACE: 3937 case SPECPDL_BACKTRACE:
@@ -3979,6 +3994,7 @@ mark_specpdl (union specbinding *first, union specbinding *ptr)
3979 3994
3980 case SPECPDL_UNWIND_PTR: 3995 case SPECPDL_UNWIND_PTR:
3981 case SPECPDL_UNWIND_INT: 3996 case SPECPDL_UNWIND_INT:
3997 case SPECPDL_UNWIND_INTMAX:
3982 case SPECPDL_UNWIND_VOID: 3998 case SPECPDL_UNWIND_VOID:
3983 break; 3999 break;
3984 4000