comparison src/eval.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 5663ae9a8989
children 39304a35b6b3 8d29f1c4bb98
comparison
equal deleted inserted replaced
5306:cde1608596d0 5307:c096d8051f89
4921 Fsignal (Qwrong_number_of_arguments, 4921 Fsignal (Qwrong_number_of_arguments,
4922 list2 (Qmultiple_value_list_internal, make_int (nargs))); 4922 list2 (Qmultiple_value_list_internal, make_int (nargs)));
4923 } 4923 }
4924 4924
4925 argv[0] = IGNORE_MULTIPLE_VALUES (Feval (XCAR (args))); 4925 argv[0] = IGNORE_MULTIPLE_VALUES (Feval (XCAR (args)));
4926 CHECK_NATNUM (argv[0]);
4927 first = XINT (argv[0]);
4928 4926
4929 GCPRO1 (argv[0]); 4927 GCPRO1 (argv[0]);
4930 gcpro1.nvars = 1; 4928 gcpro1.nvars = 1;
4931 4929
4932 args = XCDR (args); 4930 args = XCDR (args);
4933
4934 argv[1] = IGNORE_MULTIPLE_VALUES (Feval (XCAR (args))); 4931 argv[1] = IGNORE_MULTIPLE_VALUES (Feval (XCAR (args)));
4935 CHECK_NATNUM (argv[1]); 4932
4933 check_integer_range (argv[1], Qzero, make_int (EMACS_INT_MAX));
4934 check_integer_range (argv[0], Qzero, argv[1]);
4935
4936 upper = XINT (argv[1]); 4936 upper = XINT (argv[1]);
4937 first = XINT (argv[0]);
4938
4937 gcpro1.nvars = 2; 4939 gcpro1.nvars = 2;
4938 4940
4939 /* The unintuitive order of things here is for the sake of the bytecode; 4941 /* The unintuitive order of things here is for the sake of the bytecode;
4940 the alternative would be to encode the number of arguments in the 4942 the alternative would be to encode the number of arguments in the
4941 bytecode stream, which complicates things if we have more than 255 4943 bytecode stream, which complicates things if we have more than 255
7203 { 7205 {
7204 REGISTER struct backtrace *backlist = backtrace_list; 7206 REGISTER struct backtrace *backlist = backtrace_list;
7205 REGISTER int i; 7207 REGISTER int i;
7206 Lisp_Object tem; 7208 Lisp_Object tem;
7207 7209
7208 CHECK_NATNUM (nframes); 7210 check_integer_range (nframes, Qzero, make_integer (EMACS_INT_MAX));
7209 7211
7210 /* Find the frame requested. */ 7212 /* Find the frame requested. */
7211 for (i = XINT (nframes); backlist && (i-- > 0);) 7213 for (i = XINT (nframes); backlist && (i-- > 0);)
7212 backlist = backlist->next; 7214 backlist = backlist->next;
7213 7215