diff options
| author | Paul Eggert | 2012-08-03 13:55:27 -0700 |
|---|---|---|
| committer | Paul Eggert | 2012-08-03 13:55:27 -0700 |
| commit | 8834c57aab03fb7ea9d92f9e995844ff7ce64b7b (patch) | |
| tree | bfc986a2271505769d2daaaaacdd57891477c624 /src | |
| parent | ef834897aaf3259cbf1b7286fe237fb39b2cdf6d (diff) | |
| download | emacs-8834c57aab03fb7ea9d92f9e995844ff7ce64b7b.tar.gz emacs-8834c57aab03fb7ea9d92f9e995844ff7ce64b7b.zip | |
Improve fix for macroexp crash with debugging.
* lisp.h (ASET) [ENABLE_CHECKING]: Pay attention to
ARRAY_MARK_FLAG when checking subscripts, because ASET is
not supposed to be invoked from the garbage collector.
See Andreas Schwab in <http://bugs.gnu.org/12118#25>.
(gc_aset): New function, which is like ASET but can be
used in the garbage collector.
(set_hash_key, set_hash_value, set_hash_next, set_hash_hash)
(set_hash_index): Use it instead of ASET.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 12 | ||||
| -rw-r--r-- | src/lisp.h | 20 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 3ba80f69749..4aa0dcb022e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,15 @@ | |||
| 1 | 2012-08-03 Paul Eggert <eggert@cs.ucla.edu> | ||
| 2 | |||
| 3 | Improve fix for macroexp crash with debugging (Bug#12118). | ||
| 4 | * lisp.h (ASET) [ENABLE_CHECKING]: Pay attention to | ||
| 5 | ARRAY_MARK_FLAG when checking subscripts, because ASET is | ||
| 6 | not supposed to be invoked from the garbage collector. | ||
| 7 | See Andreas Schwab in <http://bugs.gnu.org/12118#25>. | ||
| 8 | (gc_aset): New function, which is like ASET but can be | ||
| 9 | used in the garbage collector. | ||
| 10 | (set_hash_key, set_hash_value, set_hash_next, set_hash_hash) | ||
| 11 | (set_hash_index): Use it instead of ASET. | ||
| 12 | |||
| 1 | 2012-08-03 Eli Zaretskii <eliz@gnu.org> | 13 | 2012-08-03 Eli Zaretskii <eliz@gnu.org> |
| 2 | 14 | ||
| 3 | Support symlinks on latest versions of MS-Windows. | 15 | Support symlinks on latest versions of MS-Windows. |
diff --git a/src/lisp.h b/src/lisp.h index 3d00f4dde78..e77b76005cd 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -608,7 +608,7 @@ clip_to_bounds (ptrdiff_t lower, EMACS_INT num, ptrdiff_t upper) | |||
| 608 | /* The IDX==IDX tries to detect when the macro argument is side-effecting. */ | 608 | /* The IDX==IDX tries to detect when the macro argument is side-effecting. */ |
| 609 | #define ASET(ARRAY, IDX, VAL) \ | 609 | #define ASET(ARRAY, IDX, VAL) \ |
| 610 | (eassert ((IDX) == (IDX)), \ | 610 | (eassert ((IDX) == (IDX)), \ |
| 611 | eassert ((IDX) >= 0 && (IDX) < (ASIZE (ARRAY) & ~ARRAY_MARK_FLAG)), \ | 611 | eassert ((IDX) >= 0 && (IDX) < ASIZE (ARRAY)), \ |
| 612 | XVECTOR (ARRAY)->contents[IDX] = (VAL)) | 612 | XVECTOR (ARRAY)->contents[IDX] = (VAL)) |
| 613 | 613 | ||
| 614 | /* Convenience macros for dealing with Lisp strings. */ | 614 | /* Convenience macros for dealing with Lisp strings. */ |
| @@ -2356,33 +2356,41 @@ aref_addr (Lisp_Object array, ptrdiff_t idx) | |||
| 2356 | } | 2356 | } |
| 2357 | 2357 | ||
| 2358 | LISP_INLINE void | 2358 | LISP_INLINE void |
| 2359 | gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object val) | ||
| 2360 | { | ||
| 2361 | /* Like ASET, but also can be used in the garbage collector. */ | ||
| 2362 | eassert (0 <= idx && idx < (ASIZE (array) & ~ARRAY_MARK_FLAG)); | ||
| 2363 | XVECTOR (array)->contents[idx] = val; | ||
| 2364 | } | ||
| 2365 | |||
| 2366 | LISP_INLINE void | ||
| 2359 | set_hash_key (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) | 2367 | set_hash_key (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) |
| 2360 | { | 2368 | { |
| 2361 | ASET (h->key_and_value, 2 * idx, val); | 2369 | gc_aset (h->key_and_value, 2 * idx, val); |
| 2362 | } | 2370 | } |
| 2363 | 2371 | ||
| 2364 | LISP_INLINE void | 2372 | LISP_INLINE void |
| 2365 | set_hash_value (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) | 2373 | set_hash_value (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) |
| 2366 | { | 2374 | { |
| 2367 | ASET (h->key_and_value, 2 * idx + 1, val); | 2375 | gc_aset (h->key_and_value, 2 * idx + 1, val); |
| 2368 | } | 2376 | } |
| 2369 | 2377 | ||
| 2370 | LISP_INLINE void | 2378 | LISP_INLINE void |
| 2371 | set_hash_next (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) | 2379 | set_hash_next (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) |
| 2372 | { | 2380 | { |
| 2373 | ASET (h->next, idx, val); | 2381 | gc_aset (h->next, idx, val); |
| 2374 | } | 2382 | } |
| 2375 | 2383 | ||
| 2376 | LISP_INLINE void | 2384 | LISP_INLINE void |
| 2377 | set_hash_hash (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) | 2385 | set_hash_hash (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) |
| 2378 | { | 2386 | { |
| 2379 | ASET (h->hash, idx, val); | 2387 | gc_aset (h->hash, idx, val); |
| 2380 | } | 2388 | } |
| 2381 | 2389 | ||
| 2382 | LISP_INLINE void | 2390 | LISP_INLINE void |
| 2383 | set_hash_index (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) | 2391 | set_hash_index (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) |
| 2384 | { | 2392 | { |
| 2385 | ASET (h->index, idx, val); | 2393 | gc_aset (h->index, idx, val); |
| 2386 | } | 2394 | } |
| 2387 | 2395 | ||
| 2388 | /* Defined in data.c. */ | 2396 | /* Defined in data.c. */ |