diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 17 | ||||
| -rw-r--r-- | src/alloc.c | 97 | ||||
| -rw-r--r-- | src/editfns.c | 5 | ||||
| -rw-r--r-- | src/fileio.c | 3 | ||||
| -rw-r--r-- | src/font.c | 2 | ||||
| -rw-r--r-- | src/ftfont.c | 2 | ||||
| -rw-r--r-- | src/keymap.c | 4 | ||||
| -rw-r--r-- | src/lisp.h | 43 | ||||
| -rw-r--r-- | src/nsterm.m | 2 | ||||
| -rw-r--r-- | src/w32fns.c | 2 | ||||
| -rw-r--r-- | src/xmenu.c | 3 |
11 files changed, 108 insertions, 72 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 81b23bccc8b..73fc64f37c5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,20 @@ | |||
| 1 | 2013-07-19 Paul Eggert <eggert@cs.ucla.edu> | ||
| 2 | |||
| 3 | Fix obscure porting bug with varargs functions. | ||
| 4 | The code assumed that int is treated like ptrdiff_t in a vararg | ||
| 5 | function, which is not a portable assumption. There was a similar | ||
| 6 | -- though these days less likely -- porting problem with various | ||
| 7 | assumptions that pointers of different types all smell the same as | ||
| 8 | far as vararg functions is conserved. To make this problem less | ||
| 9 | likely in the future, redo the API to use varargs functions. | ||
| 10 | * alloc.c (make_save_value): Remove this vararg function. | ||
| 11 | All uses changed to ... | ||
| 12 | (make_save_int_int_int, make_save_obj_obj_obj_obj) | ||
| 13 | (make_save_ptr_int, make_save_funcptr_ptr_obj, make_save_memory): | ||
| 14 | New functions. | ||
| 15 | (make_save_ptr): Rename from make_save_pointer, for consistency with | ||
| 16 | the above. Define only on platforms that need it. All uses changed. | ||
| 17 | |||
| 1 | 2013-07-18 Paul Eggert <eggert@cs.ucla.edu> | 18 | 2013-07-18 Paul Eggert <eggert@cs.ucla.edu> |
| 2 | 19 | ||
| 3 | * keyboard.c: Try to fix typos in previous change. | 20 | * keyboard.c: Try to fix typos in previous change. |
diff --git a/src/alloc.c b/src/alloc.c index 39f6a82b138..11245741bd5 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -3342,62 +3342,81 @@ verify (((SAVE_INTEGER | SAVE_POINTER | SAVE_FUNCPOINTER | SAVE_OBJECT) | |||
| 3342 | >> SAVE_SLOT_BITS) | 3342 | >> SAVE_SLOT_BITS) |
| 3343 | == 0); | 3343 | == 0); |
| 3344 | 3344 | ||
| 3345 | /* Return a Lisp_Save_Value object with the data saved according to | 3345 | /* Return Lisp_Save_Value objects for the various combinations |
| 3346 | DATA_TYPE. DATA_TYPE should be one of SAVE_TYPE_INT_INT, etc. */ | 3346 | that callers need. */ |
| 3347 | 3347 | ||
| 3348 | Lisp_Object | 3348 | Lisp_Object |
| 3349 | make_save_value (enum Lisp_Save_Type save_type, ...) | 3349 | make_save_int_int_int (ptrdiff_t a, ptrdiff_t b, ptrdiff_t c) |
| 3350 | { | 3350 | { |
| 3351 | va_list ap; | ||
| 3352 | int i; | ||
| 3353 | Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value); | 3351 | Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value); |
| 3354 | struct Lisp_Save_Value *p = XSAVE_VALUE (val); | 3352 | struct Lisp_Save_Value *p = XSAVE_VALUE (val); |
| 3353 | p->save_type = SAVE_TYPE_INT_INT_INT; | ||
| 3354 | p->data[0].integer = a; | ||
| 3355 | p->data[1].integer = b; | ||
| 3356 | p->data[2].integer = c; | ||
| 3357 | return val; | ||
| 3358 | } | ||
| 3355 | 3359 | ||
| 3356 | eassert (0 < save_type | 3360 | Lisp_Object |
| 3357 | && (save_type < 1 << (SAVE_TYPE_BITS - 1) | 3361 | make_save_obj_obj_obj_obj (Lisp_Object a, Lisp_Object b, Lisp_Object c, |
| 3358 | || save_type == SAVE_TYPE_MEMORY)); | 3362 | Lisp_Object d) |
| 3359 | p->save_type = save_type; | 3363 | { |
| 3360 | va_start (ap, save_type); | 3364 | Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value); |
| 3361 | save_type &= ~ (1 << (SAVE_TYPE_BITS - 1)); | 3365 | struct Lisp_Save_Value *p = XSAVE_VALUE (val); |
| 3362 | 3366 | p->save_type = SAVE_TYPE_OBJ_OBJ_OBJ_OBJ; | |
| 3363 | for (i = 0; save_type; i++, save_type >>= SAVE_SLOT_BITS) | 3367 | p->data[0].object = a; |
| 3364 | switch (save_type & ((1 << SAVE_SLOT_BITS) - 1)) | 3368 | p->data[1].object = b; |
| 3365 | { | 3369 | p->data[2].object = c; |
| 3366 | case SAVE_POINTER: | 3370 | p->data[3].object = d; |
| 3367 | p->data[i].pointer = va_arg (ap, void *); | 3371 | return val; |
| 3368 | break; | 3372 | } |
| 3369 | |||
| 3370 | case SAVE_FUNCPOINTER: | ||
| 3371 | p->data[i].funcpointer = va_arg (ap, voidfuncptr); | ||
| 3372 | break; | ||
| 3373 | |||
| 3374 | case SAVE_INTEGER: | ||
| 3375 | p->data[i].integer = va_arg (ap, ptrdiff_t); | ||
| 3376 | break; | ||
| 3377 | 3373 | ||
| 3378 | case SAVE_OBJECT: | 3374 | #if defined HAVE_NS || defined DOS_NT |
| 3379 | p->data[i].object = va_arg (ap, Lisp_Object); | 3375 | Lisp_Object |
| 3380 | break; | 3376 | make_save_ptr (void *a) |
| 3377 | { | ||
| 3378 | Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value); | ||
| 3379 | struct Lisp_Save_Value *p = XSAVE_VALUE (val); | ||
| 3380 | p->save_type = SAVE_POINTER; | ||
| 3381 | p->data[0].pointer = a; | ||
| 3382 | return val; | ||
| 3383 | } | ||
| 3384 | #endif | ||
| 3381 | 3385 | ||
| 3382 | default: | 3386 | Lisp_Object |
| 3383 | emacs_abort (); | 3387 | make_save_ptr_int (void *a, ptrdiff_t b) |
| 3384 | } | 3388 | { |
| 3389 | Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value); | ||
| 3390 | struct Lisp_Save_Value *p = XSAVE_VALUE (val); | ||
| 3391 | p->save_type = SAVE_TYPE_PTR_INT; | ||
| 3392 | p->data[0].pointer = a; | ||
| 3393 | p->data[1].integer = b; | ||
| 3394 | return val; | ||
| 3395 | } | ||
| 3385 | 3396 | ||
| 3386 | va_end (ap); | 3397 | Lisp_Object |
| 3398 | make_save_funcptr_ptr_obj (void (*a) (void), void *b, Lisp_Object c) | ||
| 3399 | { | ||
| 3400 | Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value); | ||
| 3401 | struct Lisp_Save_Value *p = XSAVE_VALUE (val); | ||
| 3402 | p->save_type = SAVE_TYPE_FUNCPTR_PTR_OBJ; | ||
| 3403 | p->data[0].funcpointer = a; | ||
| 3404 | p->data[1].pointer = b; | ||
| 3405 | p->data[2].object = c; | ||
| 3387 | return val; | 3406 | return val; |
| 3388 | } | 3407 | } |
| 3389 | 3408 | ||
| 3390 | /* Save just one C pointer. record_unwind_protect_ptr is simpler and | 3409 | /* Return a Lisp_Save_Value object that represents an array A |
| 3391 | faster than combining this with record_unwind_protect, but | 3410 | of N Lisp objects. */ |
| 3392 | occasionally this function is useful for other reasons. */ | ||
| 3393 | 3411 | ||
| 3394 | Lisp_Object | 3412 | Lisp_Object |
| 3395 | make_save_pointer (void *pointer) | 3413 | make_save_memory (Lisp_Object *a, ptrdiff_t n) |
| 3396 | { | 3414 | { |
| 3397 | Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value); | 3415 | Lisp_Object val = allocate_misc (Lisp_Misc_Save_Value); |
| 3398 | struct Lisp_Save_Value *p = XSAVE_VALUE (val); | 3416 | struct Lisp_Save_Value *p = XSAVE_VALUE (val); |
| 3399 | p->save_type = SAVE_POINTER; | 3417 | p->save_type = SAVE_TYPE_MEMORY; |
| 3400 | p->data[0].pointer = pointer; | 3418 | p->data[0].pointer = a; |
| 3419 | p->data[1].integer = n; | ||
| 3401 | return val; | 3420 | return val; |
| 3402 | } | 3421 | } |
| 3403 | 3422 | ||
diff --git a/src/editfns.c b/src/editfns.c index a4dea203a22..50bde90788d 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -838,9 +838,8 @@ This function does not move point. */) | |||
| 838 | Lisp_Object | 838 | Lisp_Object |
| 839 | save_excursion_save (void) | 839 | save_excursion_save (void) |
| 840 | { | 840 | { |
| 841 | return make_save_value | 841 | return make_save_obj_obj_obj_obj |
| 842 | (SAVE_TYPE_OBJ_OBJ_OBJ_OBJ, | 842 | (Fpoint_marker (), |
| 843 | Fpoint_marker (), | ||
| 844 | /* Do not copy the mark if it points to nowhere. */ | 843 | /* Do not copy the mark if it points to nowhere. */ |
| 845 | (XMARKER (BVAR (current_buffer, mark))->buffer | 844 | (XMARKER (BVAR (current_buffer, mark))->buffer |
| 846 | ? Fcopy_marker (BVAR (current_buffer, mark), Qnil) | 845 | ? Fcopy_marker (BVAR (current_buffer, mark), Qnil) |
diff --git a/src/fileio.c b/src/fileio.c index 5fe359d58bb..a19fcd9f663 100644 --- a/src/fileio.c +++ b/src/fileio.c | |||
| @@ -4215,8 +4215,7 @@ by calling `format-decode', which see. */) | |||
| 4215 | to be signaled after decoding the text we read. */ | 4215 | to be signaled after decoding the text we read. */ |
| 4216 | nbytes = internal_condition_case_1 | 4216 | nbytes = internal_condition_case_1 |
| 4217 | (read_non_regular, | 4217 | (read_non_regular, |
| 4218 | make_save_value (SAVE_TYPE_INT_INT_INT, (ptrdiff_t) fd, | 4218 | make_save_int_int_int (fd, inserted, trytry), |
| 4219 | inserted, trytry), | ||
| 4220 | Qerror, read_non_regular_quit); | 4219 | Qerror, read_non_regular_quit); |
| 4221 | 4220 | ||
| 4222 | if (NILP (nbytes)) | 4221 | if (NILP (nbytes)) |
diff --git a/src/font.c b/src/font.c index 80b4b76c4e4..124d5f9bd9e 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -1861,7 +1861,7 @@ otf_open (Lisp_Object file) | |||
| 1861 | else | 1861 | else |
| 1862 | { | 1862 | { |
| 1863 | otf = STRINGP (file) ? OTF_open (SSDATA (file)) : NULL; | 1863 | otf = STRINGP (file) ? OTF_open (SSDATA (file)) : NULL; |
| 1864 | val = make_save_pointer (otf); | 1864 | val = make_save_ptr (otf); |
| 1865 | otf_list = Fcons (Fcons (file, val), otf_list); | 1865 | otf_list = Fcons (Fcons (file, val), otf_list); |
| 1866 | } | 1866 | } |
| 1867 | return otf; | 1867 | return otf; |
diff --git a/src/ftfont.c b/src/ftfont.c index 7c9534d5ae7..10090cb3bda 100644 --- a/src/ftfont.c +++ b/src/ftfont.c | |||
| @@ -393,7 +393,7 @@ ftfont_lookup_cache (Lisp_Object key, enum ftfont_cache_for cache_for) | |||
| 393 | cache_data = xmalloc (sizeof *cache_data); | 393 | cache_data = xmalloc (sizeof *cache_data); |
| 394 | cache_data->ft_face = NULL; | 394 | cache_data->ft_face = NULL; |
| 395 | cache_data->fc_charset = NULL; | 395 | cache_data->fc_charset = NULL; |
| 396 | val = make_save_value (SAVE_TYPE_PTR_INT, cache_data, 0); | 396 | val = make_save_ptr_int (cache_data, 0); |
| 397 | cache = Fcons (Qnil, val); | 397 | cache = Fcons (Qnil, val); |
| 398 | Fputhash (key, cache, ft_face_cache); | 398 | Fputhash (key, cache, ft_face_cache); |
| 399 | } | 399 | } |
diff --git a/src/keymap.c b/src/keymap.c index e1268c8a06c..d13a6274347 100644 --- a/src/keymap.c +++ b/src/keymap.c | |||
| @@ -617,8 +617,8 @@ map_keymap_internal (Lisp_Object map, | |||
| 617 | } | 617 | } |
| 618 | else if (CHAR_TABLE_P (binding)) | 618 | else if (CHAR_TABLE_P (binding)) |
| 619 | map_char_table (map_keymap_char_table_item, Qnil, binding, | 619 | map_char_table (map_keymap_char_table_item, Qnil, binding, |
| 620 | make_save_value (SAVE_TYPE_FUNCPTR_PTR_OBJ, | 620 | make_save_funcptr_ptr_obj ((voidfuncptr) fun, data, |
| 621 | (voidfuncptr) fun, data, args)); | 621 | args)); |
| 622 | } | 622 | } |
| 623 | UNGCPRO; | 623 | UNGCPRO; |
| 624 | return tail; | 624 | return tail; |
diff --git a/src/lisp.h b/src/lisp.h index 518de9db0ff..254ead231b9 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -441,8 +441,7 @@ enum Lisp_Fwd_Type | |||
| 441 | displayed to users. These are Lisp_Save_Value, a Lisp_Misc | 441 | displayed to users. These are Lisp_Save_Value, a Lisp_Misc |
| 442 | subtype; and PVEC_OTHER, a kind of vectorlike object. The former | 442 | subtype; and PVEC_OTHER, a kind of vectorlike object. The former |
| 443 | is suitable for temporarily stashing away pointers and integers in | 443 | is suitable for temporarily stashing away pointers and integers in |
| 444 | a Lisp object (see the existing uses of make_save_value and | 444 | a Lisp object. The latter is useful for vector-like Lisp objects |
| 445 | XSAVE_VALUE). The latter is useful for vector-like Lisp objects | ||
| 446 | that need to be used as part of other objects, but which are never | 445 | that need to be used as part of other objects, but which are never |
| 447 | shown to users or Lisp code (search for PVEC_OTHER in xterm.c for | 446 | shown to users or Lisp code (search for PVEC_OTHER in xterm.c for |
| 448 | an example). | 447 | an example). |
| @@ -1815,30 +1814,26 @@ enum Lisp_Save_Type | |||
| 1815 | 1814 | ||
| 1816 | This is mostly used to package C integers and pointers to call | 1815 | This is mostly used to package C integers and pointers to call |
| 1817 | record_unwind_protect when two or more values need to be saved. | 1816 | record_unwind_protect when two or more values need to be saved. |
| 1818 | make_save_value lets you pack up to SAVE_VALUE_SLOTS integers, pointers, | 1817 | For example: |
| 1819 | function pointers or Lisp_Objects and conveniently get them back | ||
| 1820 | with XSAVE_INTEGER, XSAVE_POINTER, XSAVE_FUNCPOINTER, and | ||
| 1821 | XSAVE_OBJECT macros: | ||
| 1822 | 1818 | ||
| 1823 | ... | 1819 | ... |
| 1824 | struct my_data *md = get_my_data (); | 1820 | struct my_data *md = get_my_data (); |
| 1825 | Lisp_Object my_object = get_my_object (); | 1821 | ptrdiff_t mi = get_my_integer (); |
| 1826 | record_unwind_protect | 1822 | record_unwind_protect (my_unwind, make_save_ptr_int (md, mi)); |
| 1827 | (my_unwind, make_save_value (SAVE_TYPE_PTR_OBJ, md, my_object)); | ||
| 1828 | ... | 1823 | ... |
| 1829 | 1824 | ||
| 1830 | Lisp_Object my_unwind (Lisp_Object arg) | 1825 | Lisp_Object my_unwind (Lisp_Object arg) |
| 1831 | { | 1826 | { |
| 1832 | struct my_data *md = XSAVE_POINTER (arg, 0); | 1827 | struct my_data *md = XSAVE_POINTER (arg, 0); |
| 1833 | Lisp_Object my_object = XSAVE_OBJECT (arg, 1); | 1828 | ptrdiff_t mi = XSAVE_INTEGER (arg, 1); |
| 1834 | ... | 1829 | ... |
| 1835 | } | 1830 | } |
| 1836 | 1831 | ||
| 1837 | If ENABLE_CHECKING is in effect, XSAVE_xxx macros do type checking of the | 1832 | If ENABLE_CHECKING is in effect, XSAVE_xxx macros do type checking of the |
| 1838 | saved objects and raise eassert if type of the saved object doesn't match | 1833 | saved objects and raise eassert if type of the saved object doesn't match |
| 1839 | the type which is extracted. In the example above, XSAVE_INTEGER (arg, 2) | 1834 | the type which is extracted. In the example above, XSAVE_INTEGER (arg, 2) |
| 1840 | or XSAVE_OBJECT (arg, 0) are wrong because nothing was saved in slot 2 and | 1835 | and XSAVE_OBJECT (arg, 0) are wrong because nothing was saved in slot 2 and |
| 1841 | Lisp_Object was saved in slot 1 of ARG. */ | 1836 | slot 0 is a pointer. */ |
| 1842 | 1837 | ||
| 1843 | typedef void (*voidfuncptr) (void); | 1838 | typedef void (*voidfuncptr) (void); |
| 1844 | 1839 | ||
| @@ -1848,12 +1843,13 @@ struct Lisp_Save_Value | |||
| 1848 | unsigned gcmarkbit : 1; | 1843 | unsigned gcmarkbit : 1; |
| 1849 | int spacer : 32 - (16 + 1 + SAVE_TYPE_BITS); | 1844 | int spacer : 32 - (16 + 1 + SAVE_TYPE_BITS); |
| 1850 | 1845 | ||
| 1851 | /* DATA[N] may hold up to SAVE_VALUE_SLOTS entries. The type of | 1846 | /* V->data may hold up to SAVE_VALUE_SLOTS entries. The type of |
| 1852 | V's Ith entry is given by save_type (V, I). E.g., if save_type | 1847 | V's data entries are determined by V->save_type. E.g., if |
| 1853 | (V, 3) == SAVE_INTEGER, V->data[3].integer is in use. | 1848 | V->save_type == SAVE_TYPE_PTR_OBJ, V->data[0] is a pointer, |
| 1849 | V->data[1] is an integer, and V's other data entries are unused. | ||
| 1854 | 1850 | ||
| 1855 | If SAVE_TYPE == SAVE_TYPE_MEMORY, DATA[0].pointer is the address of | 1851 | If V->save_type == SAVE_TYPE_MEMORY, V->data[0].pointer is the address of |
| 1856 | a memory area containing DATA[1].integer potential Lisp_Objects. */ | 1852 | a memory area containing V->data[1].integer potential Lisp_Objects. */ |
| 1857 | ENUM_BF (Lisp_Save_Type) save_type : SAVE_TYPE_BITS; | 1853 | ENUM_BF (Lisp_Save_Type) save_type : SAVE_TYPE_BITS; |
| 1858 | union { | 1854 | union { |
| 1859 | void *pointer; | 1855 | void *pointer; |
| @@ -3580,8 +3576,15 @@ extern bool abort_on_gc; | |||
| 3580 | extern Lisp_Object make_float (double); | 3576 | extern Lisp_Object make_float (double); |
| 3581 | extern void display_malloc_warning (void); | 3577 | extern void display_malloc_warning (void); |
| 3582 | extern ptrdiff_t inhibit_garbage_collection (void); | 3578 | extern ptrdiff_t inhibit_garbage_collection (void); |
| 3583 | extern Lisp_Object make_save_value (enum Lisp_Save_Type, ...); | 3579 | extern Lisp_Object make_save_int_int_int (ptrdiff_t, ptrdiff_t, ptrdiff_t); |
| 3584 | extern Lisp_Object make_save_pointer (void *); | 3580 | extern Lisp_Object make_save_obj_obj_obj_obj (Lisp_Object, Lisp_Object, |
| 3581 | Lisp_Object, Lisp_Object); | ||
| 3582 | extern Lisp_Object make_save_ptr (void *); | ||
| 3583 | extern Lisp_Object make_save_ptr_int (void *, ptrdiff_t); | ||
| 3584 | extern Lisp_Object make_save_ptr_ptr (void *, void *); | ||
| 3585 | extern Lisp_Object make_save_funcptr_ptr_obj (void (*) (void), void *, | ||
| 3586 | Lisp_Object); | ||
| 3587 | extern Lisp_Object make_save_memory (Lisp_Object *, ptrdiff_t); | ||
| 3585 | extern void free_save_value (Lisp_Object); | 3588 | extern void free_save_value (Lisp_Object); |
| 3586 | extern Lisp_Object build_overlay (Lisp_Object, Lisp_Object, Lisp_Object); | 3589 | extern Lisp_Object build_overlay (Lisp_Object, Lisp_Object, Lisp_Object); |
| 3587 | extern void free_marker (Lisp_Object); | 3590 | extern void free_marker (Lisp_Object); |
| @@ -4314,7 +4317,7 @@ extern void *record_xmalloc (size_t); | |||
| 4314 | { \ | 4317 | { \ |
| 4315 | Lisp_Object arg_; \ | 4318 | Lisp_Object arg_; \ |
| 4316 | buf = xmalloc ((nelt) * word_size); \ | 4319 | buf = xmalloc ((nelt) * word_size); \ |
| 4317 | arg_ = make_save_value (SAVE_TYPE_MEMORY, buf, nelt); \ | 4320 | arg_ = make_save_memory (buf, nelt); \ |
| 4318 | sa_must_free = 1; \ | 4321 | sa_must_free = 1; \ |
| 4319 | record_unwind_protect (free_save_value, arg_); \ | 4322 | record_unwind_protect (free_save_value, arg_); \ |
| 4320 | } \ | 4323 | } \ |
diff --git a/src/nsterm.m b/src/nsterm.m index c91e68f37a9..f3c35e95bfe 100644 --- a/src/nsterm.m +++ b/src/nsterm.m | |||
| @@ -3777,7 +3777,7 @@ ns_set_vertical_scroll_bar (struct window *window, | |||
| 3777 | } | 3777 | } |
| 3778 | 3778 | ||
| 3779 | bar = [[EmacsScroller alloc] initFrame: r window: win]; | 3779 | bar = [[EmacsScroller alloc] initFrame: r window: win]; |
| 3780 | wset_vertical_scroll_bar (window, make_save_pointer (bar)); | 3780 | wset_vertical_scroll_bar (window, make_save_ptr (bar)); |
| 3781 | } | 3781 | } |
| 3782 | else | 3782 | else |
| 3783 | { | 3783 | { |
diff --git a/src/w32fns.c b/src/w32fns.c index 5d9200bdd7b..675b716f3b0 100644 --- a/src/w32fns.c +++ b/src/w32fns.c | |||
| @@ -4916,7 +4916,7 @@ w32_monitor_enum (HMONITOR monitor, HDC hdc, RECT *rcMonitor, LPARAM dwData) | |||
| 4916 | { | 4916 | { |
| 4917 | Lisp_Object *monitor_list = (Lisp_Object *) dwData; | 4917 | Lisp_Object *monitor_list = (Lisp_Object *) dwData; |
| 4918 | 4918 | ||
| 4919 | *monitor_list = Fcons (make_save_pointer (monitor), *monitor_list); | 4919 | *monitor_list = Fcons (make_save_ptr (monitor), *monitor_list); |
| 4920 | 4920 | ||
| 4921 | return TRUE; | 4921 | return TRUE; |
| 4922 | } | 4922 | } |
diff --git a/src/xmenu.c b/src/xmenu.c index 1151dea440e..6c0e3dd78a6 100644 --- a/src/xmenu.c +++ b/src/xmenu.c | |||
| @@ -2465,8 +2465,7 @@ xmenu_show (FRAME_PTR f, int x, int y, bool for_click, bool keymaps, | |||
| 2465 | XMenuActivateSetWaitFunction (x_menu_wait_for_event, FRAME_X_DISPLAY (f)); | 2465 | XMenuActivateSetWaitFunction (x_menu_wait_for_event, FRAME_X_DISPLAY (f)); |
| 2466 | #endif | 2466 | #endif |
| 2467 | 2467 | ||
| 2468 | record_unwind_protect (pop_down_menu, | 2468 | record_unwind_protect (pop_down_menu, make_save_ptr_ptr (f, menu)); |
| 2469 | make_save_value (SAVE_TYPE_PTR_PTR, f, menu)); | ||
| 2470 | 2469 | ||
| 2471 | /* Help display under X won't work because XMenuActivate contains | 2470 | /* Help display under X won't work because XMenuActivate contains |
| 2472 | a loop that doesn't give Emacs a chance to process it. */ | 2471 | a loop that doesn't give Emacs a chance to process it. */ |