Mercurial > hg > xemacs-beta
comparison src/eval.c @ 5013:ae48681c47fa
changes to VOID_TO_LISP et al.
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-08 Ben Wing <ben@xemacs.org>
* casetab.c (compute_canon_mapper):
* casetab.c (initialize_identity_mapper):
* casetab.c (compute_up_or_eqv_mapper):
* casetab.c (recompute_case_table):
* casetab.c (set_case_table):
* chartab.c (copy_mapper):
* chartab.c (copy_char_table_range):
* chartab.c (get_range_char_table_1):
* console.c (find_nonminibuffer_frame_not_on_console_predicate):
* console.c (find_nonminibuffer_frame_not_on_console):
* console.c (nuke_all_console_slots):
* device.c:
* device.c (find_nonminibuffer_frame_not_on_device_predicate):
* device.c (find_nonminibuffer_frame_not_on_device):
* dialog-msw.c (dialog_proc):
* dialog-msw.c (handle_question_dialog_box):
* dialog-x.c (maybe_run_dbox_text_callback):
* eval.c:
* eval.c (safe_run_hook_trapping_problems_1):
* eval.c (safe_run_hook_trapping_problems):
* event-msw.c:
* event-msw.c (mswindows_wnd_proc):
* event-msw.c (mswindows_find_frame):
* faces.c (update_face_inheritance_mapper):
* frame-msw.c (mswindows_init_frame_1):
* frame-msw.c (mswindows_get_mouse_position):
* frame-msw.c (mswindows_get_frame_parent):
* glade.c (connector):
* glade.c (Fglade_xml_signal_connect):
* glade.c (Fglade_xml_signal_autoconnect):
* glade.c (Fglade_xml_textdomain):
* glyphs-msw.c (mswindows_subwindow_instantiate):
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs.c (check_instance_cache_mapper):
* glyphs.c (check_window_subwindow_cache):
* glyphs.c (check_image_instance_structure):
* gui-x.c (snarf_widget_value_mapper):
* gui-x.c (popup_selection_callback):
* gui-x.c (button_item_to_widget_value):
* keymap.c (map_keymap_mapper):
* keymap.c (Fmap_keymap):
* menubar-gtk.c (__torn_off_sir):
* menubar-gtk.c (__activate_menu):
* menubar-gtk.c (menu_convert):
* menubar-gtk.c (__generic_button_callback):
* menubar-gtk.c (menu_descriptor_to_widget_1):
* menubar-msw.c:
* menubar-msw.c (EMPTY_ITEM_ID):
* menubar-x.c (menu_item_descriptor_to_widget_value_1):
* menubar-x.c (pre_activate_callback):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar-x.c (command_builder_find_menu_accelerator):
* print.c (print_internal):
* process-unix.c (close_process_descs_mapfun):
* process.c (get_process_from_usid):
* process.c (init_process_io_handles):
* profile.c (sigprof_handler):
* profile.c (get_profiling_info_timing_maphash):
* profile.c (Fget_profiling_info):
* profile.c (set_profiling_info_timing_maphash):
* profile.c (mark_profiling_info_maphash):
* scrollbar-msw.c (mswindows_create_scrollbar_instance):
* scrollbar-msw.c (mswindows_free_scrollbar_instance):
* scrollbar-msw.c (mswindows_handle_scrollbar_event):
* specifier.c (recompute_cached_specifier_everywhere_mapfun):
* specifier.c (recompute_cached_specifier_everywhere):
* syntax.c (copy_to_mirrortab):
* syntax.c (copy_if_not_already_present):
* syntax.c (update_just_this_syntax_table):
* text.c (new_dfc_convert_now_damn_it):
* text.h (LISP_STRING_TO_EXTERNAL):
* tooltalk.c:
* tooltalk.c (tooltalk_message_callback):
* tooltalk.c (tooltalk_pattern_callback):
* tooltalk.c (Fcreate_tooltalk_message):
* tooltalk.c (Fcreate_tooltalk_pattern):
* ui-byhand.c (__generic_toolbar_callback):
* ui-byhand.c (generic_toolbar_insert_item):
* ui-byhand.c (__emacs_gtk_ctree_recurse_internal):
* ui-byhand.c (Fgtk_ctree_recurse):
* ui-gtk.c (__internal_callback_destroy):
* ui-gtk.c (__internal_callback_marshal):
* ui-gtk.c (Fgtk_signal_connect):
* ui-gtk.c (gtk_type_to_lisp):
* ui-gtk.c (lisp_to_gtk_type):
* ui-gtk.c (lisp_to_gtk_ret_type):
* lisp-disunion.h:
* lisp-disunion.h (NON_LVALUE):
* lisp-union.h:
* lisp.h (LISP_HASH):
Rename:
LISP_TO_VOID -> STORE_LISP_IN_VOID
VOID_TO_LISP -> GET_LISP_FROM_VOID
These new names are meant to clearly identify that the Lisp object
is the source and void the sink, and that they can't be used the
other way around -- they aren't exact opposites despite the old
names. The names are also important given the new functions
created just below. Also, clarify comments in lisp-union.h and
lisp-disunion.h about the use of the functions.
* lisp.h:
New functions STORE_VOID_IN_LISP and GET_VOID_FROM_LISP. These
are different from the above in that the source is a void *
(previously, you had to use make_opaque_ptr()).
* eval.c (restore_lisp_object):
* eval.c (record_unwind_protect_restoring_lisp_object):
* eval.c (struct restore_int):
* eval.c (restore_int):
* eval.c (record_unwind_protect_restoring_int):
* eval.c (free_pointer):
* eval.c (record_unwind_protect_freeing):
* eval.c (free_dynarr):
* eval.c (record_unwind_protect_freeing_dynarr):
* eval.c (unbind_to_1):
Use STORE_VOID_IN_LISP and GET_VOID_FROM_LISP to eliminate the
use of make_opaque_ptr() and mostly eliminate Lisp consing
entirely in the use of these various record_unwind_protect_*
functions as well as internal_bind_* (e.g. internal_bind_int).
* tests.c:
* tests.c (Ftest_store_void_in_lisp):
* tests.c (syms_of_tests):
* tests.c (vars_of_tests):
Add an C-assert-style test to test STORE_VOID_IN_LISP and
GET_VOID_FROM_LISP to make sure the same value comes back that
was put in.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 08 Feb 2010 06:42:16 -0600 |
parents | 3c3c1d139863 |
children | 2ade80e8c640 |
comparison
equal
deleted
inserted
replaced
5012:f68b2ec914e3 | 5013:ae48681c47fa |
---|---|
6339 } | 6339 } |
6340 | 6340 |
6341 static Lisp_Object | 6341 static Lisp_Object |
6342 safe_run_hook_trapping_problems_1 (void *puta) | 6342 safe_run_hook_trapping_problems_1 (void *puta) |
6343 { | 6343 { |
6344 Lisp_Object hook = VOID_TO_LISP (puta); | 6344 Lisp_Object hook = GET_LISP_FROM_VOID (puta); |
6345 | 6345 |
6346 run_hook (hook); | 6346 run_hook (hook); |
6347 return Qnil; | 6347 return Qnil; |
6348 } | 6348 } |
6349 | 6349 |
6367 GCPRO2 (hook_symbol, tem); | 6367 GCPRO2 (hook_symbol, tem); |
6368 tem = call_trapping_problems (Qerror, NULL, | 6368 tem = call_trapping_problems (Qerror, NULL, |
6369 flags | POSTPONE_WARNING_ISSUE, | 6369 flags | POSTPONE_WARNING_ISSUE, |
6370 &prob, | 6370 &prob, |
6371 safe_run_hook_trapping_problems_1, | 6371 safe_run_hook_trapping_problems_1, |
6372 LISP_TO_VOID (hook_symbol)); | 6372 STORE_LISP_IN_VOID (hook_symbol)); |
6373 { | 6373 { |
6374 Lisp_Object hook_name = XSYMBOL_NAME (hook_symbol); | 6374 Lisp_Object hook_name = XSYMBOL_NAME (hook_symbol); |
6375 Ibyte *hook_str = XSTRING_DATA (hook_name); | 6375 Ibyte *hook_str = XSTRING_DATA (hook_name); |
6376 Ibyte *err = alloca_ibytes (XSTRING_LENGTH (hook_name) + 100); | 6376 Ibyte *err = alloca_ibytes (XSTRING_LENGTH (hook_name) + 100); |
6377 | 6377 |
6699 } | 6699 } |
6700 | 6700 |
6701 static Lisp_Object | 6701 static Lisp_Object |
6702 restore_lisp_object (Lisp_Object cons) | 6702 restore_lisp_object (Lisp_Object cons) |
6703 { | 6703 { |
6704 Lisp_Object opaque = XCAR (cons); | 6704 Lisp_Object laddr = XCAR (cons); |
6705 Lisp_Object *addr = (Lisp_Object *) get_opaque_ptr (opaque); | 6705 Lisp_Object *addr = (Lisp_Object *) GET_VOID_FROM_LISP (laddr); |
6706 *addr = XCDR (cons); | 6706 *addr = XCDR (cons); |
6707 free_opaque_ptr (opaque); | |
6708 free_cons (cons); | 6707 free_cons (cons); |
6709 return Qnil; | 6708 return Qnil; |
6710 } | 6709 } |
6711 | 6710 |
6712 /* Establish an unwind-protect which will restore the Lisp_Object pointed to | 6711 /* Establish an unwind-protect which will restore the Lisp_Object pointed to |
6713 by ADDR with the value VAL. */ | 6712 by ADDR with the value VAL. */ |
6714 static int | 6713 static int |
6715 record_unwind_protect_restoring_lisp_object (Lisp_Object *addr, | 6714 record_unwind_protect_restoring_lisp_object (Lisp_Object *addr, |
6716 Lisp_Object val) | 6715 Lisp_Object val) |
6717 { | 6716 { |
6718 Lisp_Object opaque = make_opaque_ptr (addr); | 6717 /* We use a cons rather than a malloc()ed structure because we want the |
6718 Lisp object to have garbage-collection protection */ | |
6719 Lisp_Object laddr = STORE_VOID_IN_LISP (addr); | |
6719 return record_unwind_protect (restore_lisp_object, | 6720 return record_unwind_protect (restore_lisp_object, |
6720 noseeum_cons (opaque, val)); | 6721 noseeum_cons (laddr, val)); |
6721 } | 6722 } |
6722 | 6723 |
6723 /* Similar to specbind() but for any C variable whose value is a | 6724 /* Similar to specbind() but for any C variable whose value is a |
6724 Lisp_Object. Sets up an unwind-protect to restore the variable | 6725 Lisp_Object. Sets up an unwind-protect to restore the variable |
6725 pointed to by ADDR to its existing value, and then changes its | 6726 pointed to by ADDR to its existing value, and then changes its |
6732 record_unwind_protect_restoring_lisp_object (addr, *addr); | 6733 record_unwind_protect_restoring_lisp_object (addr, *addr); |
6733 *addr = newval; | 6734 *addr = newval; |
6734 return count; | 6735 return count; |
6735 } | 6736 } |
6736 | 6737 |
6738 struct restore_int | |
6739 { | |
6740 int *addr; | |
6741 int val; | |
6742 }; | |
6743 | |
6737 static Lisp_Object | 6744 static Lisp_Object |
6738 restore_int (Lisp_Object cons) | 6745 restore_int (Lisp_Object obj) |
6739 { | 6746 { |
6740 Lisp_Object opaque = XCAR (cons); | 6747 struct restore_int *ri = (struct restore_int *) GET_VOID_FROM_LISP (obj); |
6741 Lisp_Object lval = XCDR (cons); | 6748 *(ri->addr) = ri->val; |
6742 int *addr = (int *) get_opaque_ptr (opaque); | 6749 xfree (ri); |
6743 int val; | |
6744 | |
6745 /* In the event that a C integer will always fit in an Emacs int, we | |
6746 haven't ever stored a C integer as an opaque pointer. This #ifdef | |
6747 eliminates a warning on AMD 64, where EMACS_INT has 63 value bits and C | |
6748 integers have 32 value bits. */ | |
6749 #if INT_VALBITS < INTBITS | |
6750 if (INTP (lval)) | |
6751 { | |
6752 val = XINT (lval); | |
6753 } | |
6754 else | |
6755 { | |
6756 val = (int) get_opaque_ptr (lval); | |
6757 free_opaque_ptr (lval); | |
6758 } | |
6759 #else /* !(INT_VALBITS < INTBITS) */ | |
6760 val = XINT(lval); | |
6761 #endif /* INT_VALBITS < INTBITS */ | |
6762 | |
6763 *addr = val; | |
6764 free_opaque_ptr (opaque); | |
6765 free_cons (cons); | |
6766 return Qnil; | 6750 return Qnil; |
6767 } | 6751 } |
6768 | 6752 |
6769 /* Establish an unwind-protect which will restore the int pointed to | 6753 /* Establish an unwind-protect which will restore the int pointed to |
6770 by ADDR with the value VAL. This function works correctly with | 6754 by ADDR with the value VAL. This function works correctly with |
6771 all ints, even those that don't fit into a Lisp integer. */ | 6755 all ints, even those that don't fit into a Lisp integer. */ |
6772 int | 6756 int |
6773 record_unwind_protect_restoring_int (int *addr, int val) | 6757 record_unwind_protect_restoring_int (int *addr, int val) |
6774 { | 6758 { |
6775 Lisp_Object opaque = make_opaque_ptr (addr); | 6759 struct restore_int *ri = xnew (struct restore_int); |
6776 Lisp_Object lval; | 6760 ri->addr = addr; |
6777 | 6761 ri->val = val; |
6778 /* In the event that a C integer will always fit in an Emacs int, we don't | 6762 return record_unwind_protect (restore_int, STORE_VOID_IN_LISP (ri)); |
6779 ever want to store a C integer as an opaque pointer. This #ifdef | |
6780 eliminates a warning on AMD 64, where EMACS_INT has 63 value bits and C | |
6781 integers have 32 value bits. */ | |
6782 #if INT_VALBITS <= INTBITS | |
6783 if (NUMBER_FITS_IN_AN_EMACS_INT (val)) | |
6784 lval = make_int (val); | |
6785 else | |
6786 lval = make_opaque_ptr ((void *) val); | |
6787 #else /* !(INT_VALBITS < INTBITS) */ | |
6788 lval = make_int (val); | |
6789 #endif /* INT_VALBITS <= INTBITS */ | |
6790 | |
6791 return record_unwind_protect (restore_int, noseeum_cons (opaque, lval)); | |
6792 } | 6763 } |
6793 | 6764 |
6794 /* Similar to specbind() but for any C variable whose value is an int. | 6765 /* Similar to specbind() but for any C variable whose value is an int. |
6795 Sets up an unwind-protect to restore the variable pointed to by | 6766 Sets up an unwind-protect to restore the variable pointed to by |
6796 ADDR to its existing value, and then changes its value to NEWVAL. | 6767 ADDR to its existing value, and then changes its value to NEWVAL. |
6807 } | 6778 } |
6808 | 6779 |
6809 static Lisp_Object | 6780 static Lisp_Object |
6810 free_pointer (Lisp_Object opaque) | 6781 free_pointer (Lisp_Object opaque) |
6811 { | 6782 { |
6812 xfree (get_opaque_ptr (opaque)); | 6783 void *ptr = GET_VOID_FROM_LISP (opaque); |
6813 free_opaque_ptr (opaque); | 6784 xfree (ptr); |
6814 return Qnil; | 6785 return Qnil; |
6815 } | 6786 } |
6816 | 6787 |
6817 /* Establish an unwind-protect which will free the specified block. | 6788 /* Establish an unwind-protect which will free the specified block. |
6818 */ | 6789 */ |
6819 int | 6790 int |
6820 record_unwind_protect_freeing (void *ptr) | 6791 record_unwind_protect_freeing (void *ptr) |
6821 { | 6792 { |
6822 Lisp_Object opaque = make_opaque_ptr (ptr); | 6793 return record_unwind_protect (free_pointer, STORE_VOID_IN_LISP (ptr)); |
6823 return record_unwind_protect (free_pointer, opaque); | |
6824 } | 6794 } |
6825 | 6795 |
6826 static Lisp_Object | 6796 static Lisp_Object |
6827 free_dynarr (Lisp_Object opaque) | 6797 free_dynarr (Lisp_Object opaque) |
6828 { | 6798 { |
6829 Dynarr_free (get_opaque_ptr (opaque)); | 6799 Dynarr_free (GET_VOID_FROM_LISP (opaque)); |
6830 free_opaque_ptr (opaque); | |
6831 return Qnil; | 6800 return Qnil; |
6832 } | 6801 } |
6833 | 6802 |
6834 int | 6803 int |
6835 record_unwind_protect_freeing_dynarr (void *ptr) | 6804 record_unwind_protect_freeing_dynarr (void *ptr) |
6836 { | 6805 { |
6837 Lisp_Object opaque = make_opaque_ptr (ptr); | 6806 return record_unwind_protect (free_dynarr, STORE_VOID_IN_LISP (ptr)); |
6838 return record_unwind_protect (free_dynarr, opaque); | |
6839 } | 6807 } |
6840 | 6808 |
6841 /* Unwind the stack till specpdl_depth() == COUNT. | 6809 /* Unwind the stack till specpdl_depth() == COUNT. |
6842 VALUE is not used, except that, purely as a convenience to the | 6810 VALUE is not used, except that, purely as a convenience to the |
6843 caller, it is protected from garbage-protection and returned. */ | 6811 caller, it is protected from garbage-protection and returned. */ |