Mercurial > hg > xemacs-beta
comparison src/eval.c @ 5027:22179cd0fe15
merge
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Wed, 10 Feb 2010 07:25:19 -0600 |
parents | 2ade80e8c640 |
children | 6f2158fa75ed b5df3737028a |
comparison
equal
deleted
inserted
replaced
5026:46cf825f6158 | 5027:22179cd0fe15 |
---|---|
4721 { | 4721 { |
4722 result = args[i]; | 4722 result = args[i]; |
4723 if (MULTIPLE_VALUEP (result)) | 4723 if (MULTIPLE_VALUEP (result)) |
4724 { | 4724 { |
4725 Lisp_Object val; | 4725 Lisp_Object val; |
4726 Elemcount i, count = XMULTIPLE_VALUE_COUNT (result); | 4726 Elemcount j, count = XMULTIPLE_VALUE_COUNT (result); |
4727 | 4727 |
4728 for (i = 0; i < count; i++) | 4728 for (j = 0; j < count; j++) |
4729 { | 4729 { |
4730 val = multiple_value_aref (result, i); | 4730 val = multiple_value_aref (result, j); |
4731 assert (!UNBOUNDP (val)); | 4731 assert (!UNBOUNDP (val)); |
4732 | 4732 |
4733 XSETCDR (list_offset, Fcons (val, Qnil)); | 4733 XSETCDR (list_offset, Fcons (val, Qnil)); |
4734 list_offset = XCDR (list_offset); | 4734 list_offset = XCDR (list_offset); |
4735 } | 4735 } |
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. */ |