comparison src/events.c @ 5307:c096d8051f89

Have NATNUMP give t for positive bignums; check limits appropriately. src/ChangeLog addition: 2010-11-20 Aidan Kehoe <kehoea@parhasard.net> * abbrev.c (Fexpand_abbrev): * alloc.c: * alloc.c (Fmake_list): * alloc.c (Fmake_vector): * alloc.c (Fmake_bit_vector): * alloc.c (Fmake_byte_code): * alloc.c (Fmake_string): * alloc.c (vars_of_alloc): * bytecode.c (UNUSED): * bytecode.c (Fbyte_code): * chartab.c (decode_char_table_range): * cmds.c (Fself_insert_command): * data.c (check_integer_range): * data.c (Fnatnump): * data.c (Fnonnegativep): * data.c (Fstring_to_number): * elhash.c (hash_table_size_validate): * elhash.c (decode_hash_table_size): * eval.c (Fbacktrace_frame): * event-stream.c (lisp_number_to_milliseconds): * event-stream.c (Faccept_process_output): * event-stream.c (Frecent_keys): * event-stream.c (Fdispatch_event): * events.c (Fmake_event): * events.c (Fevent_timestamp): * events.c (Fevent_timestamp_lessp): * events.h: * events.h (struct command_builder): * file-coding.c (gzip_putprop): * fns.c: * fns.c (check_sequence_range): * fns.c (Frandom): * fns.c (Fnthcdr): * fns.c (Flast): * fns.c (Fnbutlast): * fns.c (Fbutlast): * fns.c (Fmember): * fns.c (Ffill): * fns.c (Freduce): * fns.c (replace_string_range_1): * fns.c (Freplace): * font-mgr.c (Ffc_pattern_get): * frame-msw.c (msprinter_set_frame_properties): * glyphs.c (check_valid_xbm_inline): * indent.c (Fmove_to_column): * intl-win32.c (mswindows_multibyte_to_unicode_putprop): * lisp.h: * lisp.h (ARRAY_DIMENSION_LIMIT): * lread.c (decode_mode_1): * mule-ccl.c (ccl_get_compiled_code): * number.h: * process-unix.c (unix_open_multicast_group): * process.c (Fset_process_window_size): * profile.c (Fstart_profiling): * unicode.c (Funicode_to_char): Change NATNUMP to return 1 for positive bignums; changes uses of it and of CHECK_NATNUM appropriately, usually by checking for an integer in an appropriate range. Add array-dimension-limit and use it in #'make-vector, #'make-string. Add array-total-size-limit, array-rank-limit while we're at it, for the sake of any Common Lisp-oriented code that uses these limits. Rename check_int_range to check_integer_range, have it take Lisp_Objects (and thus bignums) instead. Remove bignum_butlast(), just set int_n to an appropriately large integer if N is a bignum. Accept bignums in check_sequence_range(), change the functions that use check_sequence_range() appropriately. Move the definition of NATNUMP() to number.h; document why it's a reasonable name, contradicting an old comment. tests/ChangeLog addition: 2010-11-20 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: * automated/lisp-tests.el (featurep): * automated/lisp-tests.el (wrong-type-argument): * automated/mule-tests.el (featurep): Check for args-out-of-range errors instead of wrong-type-argument errors in various places when code is handed a large bignum instead of a fixnum. Also check for the wrong-type-argument errors when giving the same code a non-integer value.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 20 Nov 2010 16:49:11 +0000
parents 71ee43b8a74d
children 8d29f1c4bb98
comparison
equal deleted inserted replaced
5306:cde1608596d0 5307:c096d8051f89
639 break; 639 break;
640 } 640 }
641 } 641 }
642 else if (EQ (keyword, Qbutton)) 642 else if (EQ (keyword, Qbutton))
643 { 643 {
644 CHECK_NATNUM (value); 644 check_integer_range (value, Qzero, make_int (26));
645 check_int_range (XINT (value), 0, 7);
646 645
647 switch (EVENT_TYPE (e)) 646 switch (EVENT_TYPE (e))
648 { 647 {
649 case button_press_event: 648 case button_press_event:
650 case button_release_event: 649 case button_release_event:
735 break; 734 break;
736 } 735 }
737 } 736 }
738 else if (EQ (keyword, Qtimestamp)) 737 else if (EQ (keyword, Qtimestamp))
739 { 738 {
740 CHECK_NATNUM (value); 739 #ifdef HAVE_BIGNUM
741 SET_EVENT_TIMESTAMP (e, XINT (value)); 740 check_integer_range (value, Qzero, make_integer (UINT_MAX));
741 if (BIGNUMP (value))
742 {
743 SET_EVENT_TIMESTAMP (e, bignum_to_uint (XBIGNUM_DATA (value)));
744 }
745 #else
746 check_integer_range (value, Qzero, make_integer (EMACS_INT_MAX));
747 #endif
748 if (INTP (value))
749 {
750 SET_EVENT_TIMESTAMP (e, XINT (value));
751 }
752 else
753 {
754 ABORT ();
755 }
742 } 756 }
743 else if (EQ (keyword, Qfunction)) 757 else if (EQ (keyword, Qfunction))
744 { 758 {
745 switch (EVENT_TYPE (e)) 759 switch (EVENT_TYPE (e))
746 { 760 {
1745 */ 1759 */
1746 (event)) 1760 (event))
1747 { 1761 {
1748 CHECK_LIVE_EVENT (event); 1762 CHECK_LIVE_EVENT (event);
1749 /* This junk is so that timestamps don't get to be negative, but contain 1763 /* This junk is so that timestamps don't get to be negative, but contain
1750 as many bits as this particular emacs will allow. 1764 as many bits as this particular emacs will allow. We could return
1765 bignums on builds that support them, but that involves consing and
1766 doesn't work on builds that don't support bignums.
1751 */ 1767 */
1752 return make_int (EMACS_INT_MAX & XEVENT_TIMESTAMP (event)); 1768 return make_int (EMACS_INT_MAX & XEVENT_TIMESTAMP (event));
1753 } 1769 }
1754 1770
1755 #define TIMESTAMP_HALFSPACE (1L << (INT_VALBITS - 2)) 1771 #define TIMESTAMP_HALFSPACE (1L << (INT_VALBITS - 2))
1761 */ 1777 */
1762 (time1, time2)) 1778 (time1, time2))
1763 { 1779 {
1764 EMACS_INT t1, t2; 1780 EMACS_INT t1, t2;
1765 1781
1766 CHECK_NATNUM (time1); 1782 check_integer_range (time1, Qzero, make_integer (EMACS_INT_MAX));
1767 CHECK_NATNUM (time2); 1783 check_integer_range (time2, Qzero, make_integer (EMACS_INT_MAX));
1784
1768 t1 = XINT (time1); 1785 t1 = XINT (time1);
1769 t2 = XINT (time2); 1786 t2 = XINT (time2);
1770 1787
1771 if (t1 < t2) 1788 if (t1 < t2)
1772 return t2 - t1 < TIMESTAMP_HALFSPACE ? Qt : Qnil; 1789 return t2 - t1 < TIMESTAMP_HALFSPACE ? Qt : Qnil;