Mercurial > hg > xemacs-beta
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; |