comparison src/lisp.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 59a6419f7504
children 31be2a3d121d 8d29f1c4bb98
comparison
equal deleted inserted replaced
5306:cde1608596d0 5307:c096d8051f89
1677 #define GCBITS 2 1677 #define GCBITS 2
1678 #define INT_GCBITS 1 1678 #define INT_GCBITS 1
1679 1679
1680 #define INT_VALBITS (BITS_PER_EMACS_INT - INT_GCBITS) 1680 #define INT_VALBITS (BITS_PER_EMACS_INT - INT_GCBITS)
1681 #define VALBITS (BITS_PER_EMACS_INT - GCBITS) 1681 #define VALBITS (BITS_PER_EMACS_INT - GCBITS)
1682 /* This is badly named; it's not the maximum value that an EMACS_INT can
1683 have, it's the maximum value that a Lisp-visible fixnum can have (half
1684 the maximum value an EMACS_INT can have) and as such would be better
1685 called MOST_POSITIVE_FIXNUM. Similarly for MOST_NEGATIVE_FIXNUM. */
1682 #define EMACS_INT_MAX ((EMACS_INT) ((1UL << (INT_VALBITS - 1)) -1UL)) 1686 #define EMACS_INT_MAX ((EMACS_INT) ((1UL << (INT_VALBITS - 1)) -1UL))
1683 #define EMACS_INT_MIN (-(EMACS_INT_MAX) - 1) 1687 #define EMACS_INT_MIN (-(EMACS_INT_MAX) - 1)
1684 /* WARNING: evaluates its arg twice. */ 1688 /* WARNING: evaluates its arg twice. */
1685 #define NUMBER_FITS_IN_AN_EMACS_INT(num) \ 1689 #define NUMBER_FITS_IN_AN_EMACS_INT(num) \
1686 ((num) <= EMACS_INT_MAX && (num) >= EMACS_INT_MIN) 1690 ((num) <= EMACS_INT_MAX && (num) >= EMACS_INT_MIN)
2919 } while (0) 2923 } while (0)
2920 2924
2921 #define CONCHECK_INT(x) do { \ 2925 #define CONCHECK_INT(x) do { \
2922 if (!INTP (x)) \ 2926 if (!INTP (x)) \
2923 x = wrong_type_argument (Qfixnump, x); \ 2927 x = wrong_type_argument (Qfixnump, x); \
2924 } while (0)
2925
2926 /* NOTE NOTE NOTE! This definition of "natural number" is mathematically
2927 wrong. Mathematically, a natural number is a positive integer; 0
2928 isn't included. This would be better called NONNEGINT(). */
2929
2930 #define NATNUMP(x) (INTP (x) && XINT (x) >= 0)
2931
2932 #define CHECK_NATNUM(x) do { \
2933 if (!NATNUMP (x)) \
2934 dead_wrong_type_argument (Qnatnump, x); \
2935 } while (0)
2936
2937 #define CONCHECK_NATNUM(x) do { \
2938 if (!NATNUMP (x)) \
2939 x = wrong_type_argument (Qnatnump, x); \
2940 } while (0) 2928 } while (0)
2941 2929
2942 END_C_DECLS 2930 END_C_DECLS
2943 2931
2944 /* -------------- properties of internally-formatted text ------------- */ 2932 /* -------------- properties of internally-formatted text ------------- */
4316 MODULE_API Lisp_Object listu (Lisp_Object, ...); 4304 MODULE_API Lisp_Object listu (Lisp_Object, ...);
4317 DECLARE_DOESNT_RETURN (memory_full (void)); 4305 DECLARE_DOESNT_RETURN (memory_full (void));
4318 void disksave_object_finalization (void); 4306 void disksave_object_finalization (void);
4319 void finish_object_memory_usage_stats (void); 4307 void finish_object_memory_usage_stats (void);
4320 extern int purify_flag; 4308 extern int purify_flag;
4309 #define ARRAY_DIMENSION_LIMIT EMACS_INT_MAX
4310 extern Fixnum Varray_dimension_limit;
4321 #ifndef NEW_GC 4311 #ifndef NEW_GC
4322 extern EMACS_INT gc_generation_number[1]; 4312 extern EMACS_INT gc_generation_number[1];
4323 #endif /* not NEW_GC */ 4313 #endif /* not NEW_GC */
4324 int c_readonly (Lisp_Object); 4314 int c_readonly (Lisp_Object);
4325 int lisp_readonly (Lisp_Object); 4315 int lisp_readonly (Lisp_Object);
4503 DECLARE_DOESNT_RETURN (args_out_of_range_3 (Lisp_Object, Lisp_Object, 4493 DECLARE_DOESNT_RETURN (args_out_of_range_3 (Lisp_Object, Lisp_Object,
4504 Lisp_Object)); 4494 Lisp_Object));
4505 MODULE_API Lisp_Object wrong_type_argument (Lisp_Object, Lisp_Object); 4495 MODULE_API Lisp_Object wrong_type_argument (Lisp_Object, Lisp_Object);
4506 MODULE_API 4496 MODULE_API
4507 DECLARE_DOESNT_RETURN (dead_wrong_type_argument (Lisp_Object, Lisp_Object)); 4497 DECLARE_DOESNT_RETURN (dead_wrong_type_argument (Lisp_Object, Lisp_Object));
4508 void check_int_range (EMACS_INT, EMACS_INT, EMACS_INT); 4498 void check_integer_range (Lisp_Object, Lisp_Object, Lisp_Object);
4509 4499
4510 EXFUN (Fint_to_char, 1); 4500 EXFUN (Fint_to_char, 1);
4511 EXFUN (Fchar_to_int, 1); 4501 EXFUN (Fchar_to_int, 1);
4512 4502
4513 enum arith_comparison { 4503 enum arith_comparison {
4529 Qerror_conditions, Qerror_message, Qinteger_char_or_marker_p, 4519 Qerror_conditions, Qerror_message, Qinteger_char_or_marker_p,
4530 Qinteger_or_char_p, Qinteger_or_marker_p, Qlambda, Qlistp, Qnatnump, 4520 Qinteger_or_char_p, Qinteger_or_marker_p, Qlambda, Qlistp, Qnatnump,
4531 Qnonnegativep, Qnumber_char_or_marker_p, Qnumberp, Qquote, Qtrue_list_p; 4521 Qnonnegativep, Qnumber_char_or_marker_p, Qnumberp, Qquote, Qtrue_list_p;
4532 extern MODULE_API Lisp_Object Qintegerp; 4522 extern MODULE_API Lisp_Object Qintegerp;
4533 4523
4534 extern Lisp_Object Qarith_error, Qbeginning_of_buffer, Qbuffer_read_only, 4524 extern Lisp_Object Qargs_out_of_range, Qarith_error, Qbeginning_of_buffer,
4535 Qcircular_list, Qcircular_property_list, Qconversion_error, 4525 Qbuffer_read_only, Qcircular_list, Qcircular_property_list,
4536 Qcyclic_variable_indirection, Qdomain_error, Qediting_error, 4526 Qconversion_error, Qcyclic_variable_indirection, Qdomain_error,
4537 Qend_of_buffer, Qend_of_file, Qerror, Qfile_error, Qinternal_error, 4527 Qediting_error, Qend_of_buffer, Qend_of_file, Qerror, Qfile_error,
4538 Qinvalid_change, Qinvalid_constant, Qinvalid_function, 4528 Qinternal_error, Qinvalid_change, Qinvalid_constant, Qinvalid_function,
4539 Qinvalid_keyword_argument, Qinvalid_operation, 4529 Qinvalid_keyword_argument, Qinvalid_operation,
4540 Qinvalid_read_syntax, Qinvalid_state, Qio_error, Qlist_formation_error, 4530 Qinvalid_read_syntax, Qinvalid_state, Qio_error, Qlist_formation_error,
4541 Qmalformed_list, Qmalformed_property_list, Qno_catch, Qout_of_memory, 4531 Qmalformed_list, Qmalformed_property_list, Qno_catch, Qout_of_memory,
4542 Qoverflow_error, Qprinting_unreadable_object, Qquit, Qrange_error, 4532 Qoverflow_error, Qprinting_unreadable_object, Qquit, Qrange_error,
4543 Qsetting_constant, Qsingularity_error, Qstack_overflow, 4533 Qsetting_constant, Qsingularity_error, Qstack_overflow,
4544 Qstructure_formation_error, Qtext_conversion_error, Qunderflow_error, 4534 Qstructure_formation_error, Qtext_conversion_error, Qunderflow_error,
4545 Qvoid_function, Qvoid_variable, Qwrong_number_of_arguments, 4535 Qvoid_function, Qvoid_variable, Qwrong_number_of_arguments,
4546 Qwrong_type_argument; 4536 Qwrong_type_argument;
4537
4547 extern Lisp_Object Qcdr; 4538 extern Lisp_Object Qcdr;
4548 extern Lisp_Object Qerror_lacks_explanatory_string; 4539 extern Lisp_Object Qerror_lacks_explanatory_string;
4549 extern Lisp_Object Qfile_error; 4540 extern Lisp_Object Qfile_error;
4550 extern Lisp_Object Qsequencep; 4541 extern Lisp_Object Qsequencep;
4551 extern MODULE_API Lisp_Object Qinvalid_argument, Qsyntax_error; 4542 extern MODULE_API Lisp_Object Qinvalid_argument, Qsyntax_error;
5008 Lisp_Object un_autoload (Lisp_Object); 4999 Lisp_Object un_autoload (Lisp_Object);
5009 void warn_when_safe_lispobj (Lisp_Object, Lisp_Object, Lisp_Object); 5000 void warn_when_safe_lispobj (Lisp_Object, Lisp_Object, Lisp_Object);
5010 MODULE_API void warn_when_safe (Lisp_Object, Lisp_Object, const Ascbyte *, 5001 MODULE_API void warn_when_safe (Lisp_Object, Lisp_Object, const Ascbyte *,
5011 ...) PRINTF_ARGS (3, 4); 5002 ...) PRINTF_ARGS (3, 4);
5012 extern int backtrace_with_internal_sections; 5003 extern int backtrace_with_internal_sections;
5004 extern Fixnum Vmultiple_values_limit;
5013 5005
5014 extern Lisp_Object Qand_optional; 5006 extern Lisp_Object Qand_optional;
5015 extern Lisp_Object Qand_rest; 5007 extern Lisp_Object Qand_rest;
5016 extern Lisp_Object Qautoload; 5008 extern Lisp_Object Qautoload;
5017 extern Lisp_Object Qcommandp; 5009 extern Lisp_Object Qcommandp;