Mercurial > hg > xemacs-beta
comparison src/event-stream.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 | 6f10ac29bf40 8d29f1c4bb98 |
comparison
equal
deleted
inserted
replaced
5306:cde1608596d0 | 5307:c096d8051f89 |
---|---|
1236 /**** Lisp-level timeout functions. ****/ | 1236 /**** Lisp-level timeout functions. ****/ |
1237 | 1237 |
1238 static unsigned long | 1238 static unsigned long |
1239 lisp_number_to_milliseconds (Lisp_Object secs, int allow_0) | 1239 lisp_number_to_milliseconds (Lisp_Object secs, int allow_0) |
1240 { | 1240 { |
1241 double fsecs; | 1241 Lisp_Object args[] = { allow_0 ? Qzero : make_int (1), |
1242 CHECK_INT_OR_FLOAT (secs); | 1242 secs, |
1243 fsecs = XFLOATINT (secs); | 1243 /* (((unsigned int) 0xFFFFFFFF) / 1000) - 1 */ |
1244 if (fsecs < 0) | 1244 make_int (4294967 - 1) }; |
1245 invalid_argument ("timeout is negative", secs); | 1245 |
1246 if (!allow_0 && fsecs == 0) | 1246 if (!allow_0 && FLOATP (secs) && XFLOAT_DATA (secs) > 0) |
1247 invalid_argument ("timeout is non-positive", secs); | 1247 { |
1248 if (fsecs >= (((unsigned int) 0xFFFFFFFF) / 1000)) | 1248 args[0] = secs; |
1249 invalid_argument | 1249 } |
1250 ("timeout would exceed 32 bits when represented in milliseconds", secs); | 1250 |
1251 | 1251 if (NILP (Fleq (countof (args), args))) |
1252 return (unsigned long) (1000 * fsecs); | 1252 { |
1253 args_out_of_range_3 (secs, args[0], args[2]); | |
1254 } | |
1255 | |
1256 args[0] = make_int (1000); | |
1257 args[0] = Ftimes (2, args); | |
1258 | |
1259 if (INTP (args[0])) | |
1260 { | |
1261 return XINT (args[0]); | |
1262 } | |
1263 | |
1264 return (unsigned long) extract_float (args[0]); | |
1253 } | 1265 } |
1254 | 1266 |
1255 DEFUN ("add-timeout", Fadd_timeout, 3, 4, 0, /* | 1267 DEFUN ("add-timeout", Fadd_timeout, 3, 4, 0, /* |
1256 Add a timeout, to be signaled after the timeout period has elapsed. | 1268 Add a timeout, to be signaled after the timeout period has elapsed. |
1257 SECS is a number of seconds, expressed as an integer or a float. | 1269 SECS is a number of seconds, expressed as an integer or a float. |
2613 unsigned long msecs = 0; | 2625 unsigned long msecs = 0; |
2614 if (!NILP (timeout_secs)) | 2626 if (!NILP (timeout_secs)) |
2615 msecs = lisp_number_to_milliseconds (timeout_secs, 1); | 2627 msecs = lisp_number_to_milliseconds (timeout_secs, 1); |
2616 if (!NILP (timeout_msecs)) | 2628 if (!NILP (timeout_msecs)) |
2617 { | 2629 { |
2618 CHECK_NATNUM (timeout_msecs); | 2630 check_integer_range (timeout_msecs, Qzero, |
2631 make_integer (EMACS_INT_MAX)); | |
2619 msecs += XINT (timeout_msecs); | 2632 msecs += XINT (timeout_msecs); |
2620 } | 2633 } |
2621 if (msecs) | 2634 if (msecs) |
2622 { | 2635 { |
2623 timeout_id = event_stream_generate_wakeup (msecs, 0, Qnil, Qnil, 0); | 2636 timeout_id = event_stream_generate_wakeup (msecs, 0, Qnil, Qnil, 0); |
3702 | 3715 |
3703 if (NILP (number)) | 3716 if (NILP (number)) |
3704 nwanted = recent_keys_ring_size; | 3717 nwanted = recent_keys_ring_size; |
3705 else | 3718 else |
3706 { | 3719 { |
3707 CHECK_NATNUM (number); | 3720 check_integer_range (number, Qzero, |
3721 make_integer (ARRAY_DIMENSION_LIMIT)); | |
3708 nwanted = XINT (number); | 3722 nwanted = XINT (number); |
3709 } | 3723 } |
3710 | 3724 |
3711 /* Create the keys ring vector, if none present. */ | 3725 /* Create the keys ring vector, if none present. */ |
3712 if (NILP (Vrecent_keys_ring)) | 3726 if (NILP (Vrecent_keys_ring)) |
4517 reset_this_command_keys (console, 1); | 4531 reset_this_command_keys (console, 1); |
4518 } | 4532 } |
4519 else /* key sequence is bound to a command */ | 4533 else /* key sequence is bound to a command */ |
4520 { | 4534 { |
4521 int magic_undo = 0; | 4535 int magic_undo = 0; |
4522 int magic_undo_count = 20; | 4536 Elemcount magic_undo_count = 20; |
4523 | 4537 |
4524 Vthis_command = leaf; | 4538 Vthis_command = leaf; |
4525 | 4539 |
4526 /* Don't push an undo boundary if the command set the prefix arg, | 4540 /* Don't push an undo boundary if the command set the prefix arg, |
4527 or if we are executing a keyboard macro, or if in the | 4541 or if we are executing a keyboard macro, or if in the |
4537 | 4551 |
4538 if (SYMBOLP (leaf)) | 4552 if (SYMBOLP (leaf)) |
4539 { | 4553 { |
4540 Lisp_Object prop = Fget (leaf, Qself_insert_defer_undo, Qnil); | 4554 Lisp_Object prop = Fget (leaf, Qself_insert_defer_undo, Qnil); |
4541 if (NATNUMP (prop)) | 4555 if (NATNUMP (prop)) |
4542 magic_undo = 1, magic_undo_count = XINT (prop); | 4556 { |
4557 magic_undo = 1; | |
4558 if (INTP (prop)) | |
4559 { | |
4560 magic_undo_count = XINT (prop); | |
4561 } | |
4562 #ifdef HAVE_BIGNUM | |
4563 else if (BIGNUMP (prop) | |
4564 && bignum_fits_emacs_int_p (XBIGNUM_DATA (prop))) | |
4565 { | |
4566 magic_undo_count | |
4567 = bignum_to_emacs_int (XBIGNUM_DATA (prop)); | |
4568 } | |
4569 #endif | |
4570 } | |
4543 else if (!NILP (prop)) | 4571 else if (!NILP (prop)) |
4544 magic_undo = 1; | 4572 magic_undo = 1; |
4545 else if (EQ (leaf, Qself_insert_command)) | 4573 else if (EQ (leaf, Qself_insert_command)) |
4546 magic_undo = 1; | 4574 magic_undo = 1; |
4547 } | 4575 } |