[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master ddc4371: Fix recently-introduced SAFE_FREE bug
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] master ddc4371: Fix recently-introduced SAFE_FREE bug |
Date: |
Thu, 28 Jun 2018 16:51:14 -0400 (EDT) |
branch: master
commit ddc4371a89e5500e0203bed4b0ad453925b1c74f
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
Fix recently-introduced SAFE_FREE bug
Problem reported by Andy Moreton (Bug#31996).
* src/lisp.h (union specbinding.unwind_array):
Remove unused member func. Move array after nelts, as this is
likely to generate more efficient code in safe_free, which can
call xfree with the same value either way.
(safe_free): Also handle SPECPDL_UNWIND_AWAY.
---
src/lisp.h | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/lisp.h b/src/lisp.h
index b544d81..cf7b8c0 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3058,9 +3058,8 @@ union specbinding
} unwind;
struct {
ENUM_BF (specbind_tag) kind : CHAR_BIT;
- void (*func) (Lisp_Object);
- Lisp_Object *array;
ptrdiff_t nelts;
+ Lisp_Object *array;
} unwind_array;
struct {
ENUM_BF (specbind_tag) kind : CHAR_BIT;
@@ -4543,9 +4542,16 @@ safe_free (ptrdiff_t sa_count)
while (specpdl_ptr != specpdl + sa_count)
{
specpdl_ptr--;
- eassert (specpdl_ptr->kind == SPECPDL_UNWIND_PTR
- && specpdl_ptr->unwind_ptr.func == xfree);
- xfree (specpdl_ptr->unwind_ptr.arg);
+ if (specpdl_ptr->kind == SPECPDL_UNWIND_PTR)
+ {
+ eassert (specpdl_ptr->unwind_ptr.func == xfree);
+ xfree (specpdl_ptr->unwind_ptr.arg);
+ }
+ else
+ {
+ eassert (specpdl_ptr->kind == SPECPDL_UNWIND_ARRAY);
+ xfree (specpdl_ptr->unwind_array.array);
+ }
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master ddc4371: Fix recently-introduced SAFE_FREE bug,
Paul Eggert <=