comparison src/number.h @ 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 7e535575bf6d
children 8d29f1c4bb98
comparison
equal deleted inserted replaced
5306:cde1608596d0 5307:c096d8051f89
150 150
151 extern Fixnum Vmost_negative_fixnum, Vmost_positive_fixnum; 151 extern Fixnum Vmost_negative_fixnum, Vmost_positive_fixnum;
152 EXFUN (Fintegerp, 1); 152 EXFUN (Fintegerp, 1);
153 EXFUN (Fevenp, 1); 153 EXFUN (Fevenp, 1);
154 EXFUN (Foddp, 1); 154 EXFUN (Foddp, 1);
155
156 /* There are varying mathematical definitions of what a natural number is,
157 differing about whether 0 is inside or outside the set. The Oxford
158 English Dictionary, second edition, does say that they are whole numbers,
159 not fractional, but it doesn't give a bound, and gives a quotation
160 talking about the natural numbers from 1 to 100. Since 100 is certainly
161 *not* the upper bound on natural numbers, we can't take 1 as the lower
162 bound from that example. The Real Academia Española's dictionary, not of
163 English but certainly sharing the western academic tradition, says of
164 "número natural":
165
166 1. m. Mat. Cada uno de los elementos de la sucesión 0, 1, 2, 3...
167
168 that is, "each of the elements of the succession 0, 1, 2, 3 ...". The
169 various Wikipedia articles in languages I can read agree. It's
170 reasonable to call this macro and the associated Lisp function
171 NATNUMP. */
172
173 #ifdef HAVE_BIGNUM
174 #define NATNUMP(x) ((INTP (x) && XINT (x) >= 0) || \
175 (BIGNUMP (x) && bignum_sign (XBIGNUM_DATA (x)) >= 0))
176 #else
177 #define NATNUMP(x) (INTP (x) && XINT (x) >= 0)
178 #endif
179
180 #define CHECK_NATNUM(x) do { \
181 if (!NATNUMP (x)) \
182 dead_wrong_type_argument (Qnatnump, x); \
183 } while (0)
184
185 #define CONCHECK_NATNUM(x) do { \
186 if (!NATNUMP (x)) \
187 x = wrong_type_argument (Qnatnump, x); \
188 } while (0)
155 189
156 190
157 /********************************** Ratios **********************************/ 191 /********************************** Ratios **********************************/
158 #ifdef HAVE_RATIO 192 #ifdef HAVE_RATIO
159 193