diff options
| author | Paul Eggert | 2019-07-21 12:31:51 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-07-21 12:32:16 -0700 |
| commit | 5d4dd552c29279b8a9e6ed269a2dc3afc36f73b9 (patch) | |
| tree | 95edeff83e756072c35f974f6271ba8c191d8436 /src/eval.c | |
| parent | d02c2f7f6507105605ed0596a7e26acd5b3b8122 (diff) | |
| download | emacs-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.c | 16 |
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 | ||
| 3397 | void | 3398 | void |
| 3399 | record_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 | |||
| 3407 | void | ||
| 3398 | record_unwind_protect_excursion (void) | 3408 | record_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 | ||