diff options
| author | Paul Eggert | 2018-08-27 21:27:50 -0700 |
|---|---|---|
| committer | Paul Eggert | 2018-08-27 21:45:23 -0700 |
| commit | d77d01d22902acdc45c2c7059de4f1b158ab5806 (patch) | |
| tree | 35f2b77594dc43e824852bb29598430945c5e6a4 /src/xselect.c | |
| parent | 9abaf5f3581ecb76f30e8a6e7ee0e9633c133d1c (diff) | |
| download | emacs-d77d01d22902acdc45c2c7059de4f1b158ab5806.tar.gz emacs-d77d01d22902acdc45c2c7059de4f1b158ab5806.zip | |
Improve bignum support for system types
Use bignums when Emacs converts to and from system types like
off_t for file sizes whose values can exceed fixnum range.
Formerly, Emacs sometimes generted floats and sometimes ad-hoc
conses of integers. Emacs still accepts floats and conses for
these system types, in case some stray Lisp code is generating
them, though this usage is obsolescent.
* doc/lispref/files.texi (File Attributes):
* doc/lispref/hash.texi (Defining Hash):
* doc/lispref/nonascii.texi (Character Sets):
* doc/lispref/os.texi (User Identification):
* doc/lispref/processes.texi (System Processes):
* etc/NEWS:
Document changes.
* src/bignum.c (mpz_set_uintmax, make_biguint)
(mpz_set_uintmax_slow, bignum_to_intmax, bignum_to_uintmax):
New functions.
(mpz_set_intmax_slow): Implement via mpz_limbs_write,
to avoid the need for an extra pass through a negative number.
* src/charset.c (Fencode_char):
* src/composite.h (LGLYPH_SET_CODE):
* src/dired.c (file_attributes):
* src/dosfns.c, src/w32.c (list_system_processes)
(system_process_attributes):
* src/editfns.c (init_editfns, Fuser_uid, Fuser_real_uid)
(Fgroup_gid, Fgroup_real_gid, Femacs_pid):
* src/emacs-module.c (check_vec_index):
* src/fns.c (Fsafe_length):
* src/process.c (record_deleted_pid, Fprocess_id):
* src/sysdep.c (list_system_processes, system_process_attributes):
* src/xselect.c (x_own_selection, selection_data_to_lisp_data):
* src/xterm.c (set_wm_state):
* src/inotify.c (inotifyevent_to_event, add_watch)
(inotify_callback):
If an integer is out of fixnum range, use a bignum
instead of converting it to a float or a cons of integers.
* src/coding.c (Fdefine_coding_system_internal):
* src/frame.c (frame_windows_min_size)
(x_set_frame_parameters):
* src/fringe.c (Fdefine_fringe_bitmap):
* src/nsterm.m (mouseDown:):
* src/syntax.c (find_defun_start):
* src/w32fns.c (x_set_undecorated, w32_createwindow)
(w32_wnd_proc, Fx_create_frame, Fx_show_tip)
(w32_console_toggle_lock_key):
* src/w32inevt.c (key_event):
* src/w32proc.c (Fw32_get_locale_info):
Do not mishandle floats by treating their addresses as their
values.
* src/data.c (store_symval_forwarding):
* src/gnutls.c (Fgnutls_error_fatalp, Fgnutls_error_string):
* src/keyboard.c (command_loop_1, make_lispy_event):
* src/lread.c (read_filtered_event, read1)
(substitute_object_recurse):
* src/window.c (Fcoordinates_in_window_p, Fwindow_at)
(window_resize_apply, Fset_window_vscroll):
* src/xdisp.c (handle_single_display_spec, try_scrolling)
(redisplay_window, calc_pixel_width_or_height)
(calc_line_height_property, on_hot_spot_p):
* src/xfaces.c (check_lface_attrs):
* src/xselect.c (x_get_local_selection, cons_to_x_long)
(lisp_data_to_selection_data, clean_local_selection_data)
(x_check_property_data, x_fill_property_data):
(x_send_client_event):
Do not reject bignums.
* src/data.c (INTBIG_TO_LISP, intbig_to_lisp)
(uintbig_to_lisp):
Remove. All uses removed.
* src/data.c (cons_to_unsigned, cons_to_signed):
* src/dbusbind.c (xd_signature, xd_extract_signed)
(xd_extract_unsigned):
* src/dispnew.c (sit_for):
* src/dosfns.c, src/w32.c (system_process_attributes):
* src/editfns.c (Fuser_full_name):
* src/fileio.c (file_offset):
* src/fileio.c (write_region):
* src/font.c (font_unparse_xlfd, font_open_for_lface, Fopen_font):
* src/frame.c (x_set_screen_gamma):
* src/frame.h (NUMVAL, FRAME_PIXEL_X_FROM_CANON_X)
(FRAME_PIXEL_Y_FROM_CANON_Y):
* src/image.c (parse_image_spec, x_edge_detection)
(compute_image_size):
* src/json.c (json_to_lisp):
* src/lcms.c (PARSE_LAB_LIST_FIELD, Flcms_cie_de2000)
(PARSE_XYZ_LIST_FIELD, PARSE_JCH_LIST_FIELD)
(PARSE_JAB_LIST_FIELD, PARSE_VIEW_CONDITION_FLOAT)
(Flcms_temp_to_white_point):
* src/nsimage.m (ns_load_image, setSizeFromSpec):
* src/process.c (Fsignal_process, handle_child_signal):
* src/sysdep.c (system_process_attributes):
* src/xdisp.c (calc_line_height_property):
Handle bignums.
* src/data.c (Fnumber_to_string): Use proper predicate name in
signal if the argument is not a number.
* src/lisp.h (make_uint): New function.
(INT_TO_INTEGER): New macro.
(FIXED_OR_FLOATP, CHECK_FIXNUM_OR_FLOAT)
(CHECK_FIXNUM_OR_FLOAT_COERCE_MARKER, INTEGER_TO_CONS)
(make_fixnum_or_float): Remove; no longer used.
* src/nsfns.m, src/w32fns.c, src/xfns.c (Fx_create_frame):
Reject floating-point min-width or min-height.
* src/process.c (handle_child_signal): Do not worry
about floating-point pids, as they are no longer generated.
Diffstat (limited to 'src/xselect.c')
| -rw-r--r-- | src/xselect.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/src/xselect.c b/src/xselect.c index dd3da8e1243..4b28d474a03 100644 --- a/src/xselect.c +++ b/src/xselect.c | |||
| @@ -321,7 +321,7 @@ x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value, | |||
| 321 | Lisp_Object prev_value; | 321 | Lisp_Object prev_value; |
| 322 | 322 | ||
| 323 | selection_data = list4 (selection_name, selection_value, | 323 | selection_data = list4 (selection_name, selection_value, |
| 324 | INTEGER_TO_CONS (timestamp), frame); | 324 | INT_TO_INTEGER (timestamp), frame); |
| 325 | prev_value = LOCAL_SELECTION (selection_name, dpyinfo); | 325 | prev_value = LOCAL_SELECTION (selection_name, dpyinfo); |
| 326 | 326 | ||
| 327 | tset_selection_alist | 327 | tset_selection_alist |
| @@ -401,16 +401,16 @@ x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type, | |||
| 401 | if (STRINGP (check) | 401 | if (STRINGP (check) |
| 402 | || VECTORP (check) | 402 | || VECTORP (check) |
| 403 | || SYMBOLP (check) | 403 | || SYMBOLP (check) |
| 404 | || FIXNUMP (check) | 404 | || INTEGERP (check) |
| 405 | || NILP (value)) | 405 | || NILP (value)) |
| 406 | return value; | 406 | return value; |
| 407 | /* Check for a value that CONS_TO_INTEGER could handle. */ | 407 | /* Check for a value that CONS_TO_INTEGER could handle. */ |
| 408 | else if (CONSP (check) | 408 | else if (CONSP (check) |
| 409 | && FIXNUMP (XCAR (check)) | 409 | && INTEGERP (XCAR (check)) |
| 410 | && (FIXNUMP (XCDR (check)) | 410 | && (INTEGERP (XCDR (check)) |
| 411 | || | 411 | || |
| 412 | (CONSP (XCDR (check)) | 412 | (CONSP (XCDR (check)) |
| 413 | && FIXNUMP (XCAR (XCDR (check))) | 413 | && INTEGERP (XCAR (XCDR (check))) |
| 414 | && NILP (XCDR (XCDR (check)))))) | 414 | && NILP (XCDR (XCDR (check)))))) |
| 415 | return value; | 415 | return value; |
| 416 | 416 | ||
| @@ -1620,9 +1620,9 @@ selection_data_to_lisp_data (struct x_display_info *dpyinfo, | |||
| 1620 | else if (format == 32 && size == sizeof (int)) | 1620 | else if (format == 32 && size == sizeof (int)) |
| 1621 | { | 1621 | { |
| 1622 | if (type == XA_INTEGER) | 1622 | if (type == XA_INTEGER) |
| 1623 | return INTEGER_TO_CONS (((int *) data) [0]); | 1623 | return INT_TO_INTEGER (((int *) data) [0]); |
| 1624 | else | 1624 | else |
| 1625 | return INTEGER_TO_CONS (((unsigned int *) data) [0]); | 1625 | return INT_TO_INTEGER (((unsigned int *) data) [0]); |
| 1626 | } | 1626 | } |
| 1627 | else if (format == 16 && size == sizeof (short)) | 1627 | else if (format == 16 && size == sizeof (short)) |
| 1628 | { | 1628 | { |
| @@ -1668,7 +1668,7 @@ selection_data_to_lisp_data (struct x_display_info *dpyinfo, | |||
| 1668 | for (i = 0; i < size / X_LONG_SIZE; i++) | 1668 | for (i = 0; i < size / X_LONG_SIZE; i++) |
| 1669 | { | 1669 | { |
| 1670 | int j = ((int *) data) [i]; | 1670 | int j = ((int *) data) [i]; |
| 1671 | ASET (v, i, INTEGER_TO_CONS (j)); | 1671 | ASET (v, i, INT_TO_INTEGER (j)); |
| 1672 | } | 1672 | } |
| 1673 | } | 1673 | } |
| 1674 | else | 1674 | else |
| @@ -1676,7 +1676,7 @@ selection_data_to_lisp_data (struct x_display_info *dpyinfo, | |||
| 1676 | for (i = 0; i < size / X_LONG_SIZE; i++) | 1676 | for (i = 0; i < size / X_LONG_SIZE; i++) |
| 1677 | { | 1677 | { |
| 1678 | unsigned int j = ((unsigned int *) data) [i]; | 1678 | unsigned int j = ((unsigned int *) data) [i]; |
| 1679 | ASET (v, i, INTEGER_TO_CONS (j)); | 1679 | ASET (v, i, INT_TO_INTEGER (j)); |
| 1680 | } | 1680 | } |
| 1681 | } | 1681 | } |
| 1682 | return v; | 1682 | return v; |
| @@ -1693,7 +1693,7 @@ static unsigned long | |||
| 1693 | cons_to_x_long (Lisp_Object obj) | 1693 | cons_to_x_long (Lisp_Object obj) |
| 1694 | { | 1694 | { |
| 1695 | if (X_ULONG_MAX <= INTMAX_MAX | 1695 | if (X_ULONG_MAX <= INTMAX_MAX |
| 1696 | || XFIXNUM (FIXNUMP (obj) ? obj : XCAR (obj)) < 0) | 1696 | || !Fnatnump (CONSP (obj) ? XCAR (obj) : obj)) |
| 1697 | return cons_to_signed (obj, X_LONG_MIN, min (X_ULONG_MAX, INTMAX_MAX)); | 1697 | return cons_to_signed (obj, X_LONG_MIN, min (X_ULONG_MAX, INTMAX_MAX)); |
| 1698 | else | 1698 | else |
| 1699 | return cons_to_unsigned (obj, X_ULONG_MAX); | 1699 | return cons_to_unsigned (obj, X_ULONG_MAX); |
| @@ -1759,8 +1759,8 @@ lisp_data_to_selection_data (struct x_display_info *dpyinfo, | |||
| 1759 | *short_ptr = XFIXNUM (obj); | 1759 | *short_ptr = XFIXNUM (obj); |
| 1760 | if (NILP (type)) type = QINTEGER; | 1760 | if (NILP (type)) type = QINTEGER; |
| 1761 | } | 1761 | } |
| 1762 | else if (FIXNUMP (obj) | 1762 | else if (INTEGERP (obj) |
| 1763 | || (CONSP (obj) && FIXNUMP (XCAR (obj)) | 1763 | || (CONSP (obj) && INTEGERP (XCAR (obj)) |
| 1764 | && (FIXNUMP (XCDR (obj)) | 1764 | && (FIXNUMP (XCDR (obj)) |
| 1765 | || (CONSP (XCDR (obj)) | 1765 | || (CONSP (XCDR (obj)) |
| 1766 | && FIXNUMP (XCAR (XCDR (obj))))))) | 1766 | && FIXNUMP (XCAR (XCDR (obj))))))) |
| @@ -1846,19 +1846,19 @@ static Lisp_Object | |||
| 1846 | clean_local_selection_data (Lisp_Object obj) | 1846 | clean_local_selection_data (Lisp_Object obj) |
| 1847 | { | 1847 | { |
| 1848 | if (CONSP (obj) | 1848 | if (CONSP (obj) |
| 1849 | && FIXNUMP (XCAR (obj)) | 1849 | && INTEGERP (XCAR (obj)) |
| 1850 | && CONSP (XCDR (obj)) | 1850 | && CONSP (XCDR (obj)) |
| 1851 | && FIXNUMP (XCAR (XCDR (obj))) | 1851 | && FIXNUMP (XCAR (XCDR (obj))) |
| 1852 | && NILP (XCDR (XCDR (obj)))) | 1852 | && NILP (XCDR (XCDR (obj)))) |
| 1853 | obj = Fcons (XCAR (obj), XCDR (obj)); | 1853 | obj = Fcons (XCAR (obj), XCDR (obj)); |
| 1854 | 1854 | ||
| 1855 | if (CONSP (obj) | 1855 | if (CONSP (obj) |
| 1856 | && FIXNUMP (XCAR (obj)) | 1856 | && INTEGERP (XCAR (obj)) |
| 1857 | && FIXNUMP (XCDR (obj))) | 1857 | && FIXNUMP (XCDR (obj))) |
| 1858 | { | 1858 | { |
| 1859 | if (XFIXNUM (XCAR (obj)) == 0) | 1859 | if (EQ (XCAR (obj), make_fixnum (0))) |
| 1860 | return XCDR (obj); | 1860 | return XCDR (obj); |
| 1861 | if (XFIXNUM (XCAR (obj)) == -1) | 1861 | if (EQ (XCAR (obj), make_fixnum (-1))) |
| 1862 | return make_fixnum (- XFIXNUM (XCDR (obj))); | 1862 | return make_fixnum (- XFIXNUM (XCDR (obj))); |
| 1863 | } | 1863 | } |
| 1864 | if (VECTORP (obj)) | 1864 | if (VECTORP (obj)) |
| @@ -2264,10 +2264,10 @@ x_check_property_data (Lisp_Object data) | |||
| 2264 | { | 2264 | { |
| 2265 | Lisp_Object o = XCAR (iter); | 2265 | Lisp_Object o = XCAR (iter); |
| 2266 | 2266 | ||
| 2267 | if (! FIXED_OR_FLOATP (o) && ! STRINGP (o) && ! CONSP (o)) | 2267 | if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o)) |
| 2268 | return -1; | 2268 | return -1; |
| 2269 | else if (CONSP (o) && | 2269 | else if (CONSP (o) && |
| 2270 | (! FIXED_OR_FLOATP (XCAR (o)) || ! FIXED_OR_FLOATP (XCDR (o)))) | 2270 | (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o)))) |
| 2271 | return -1; | 2271 | return -1; |
| 2272 | if (size == INT_MAX) | 2272 | if (size == INT_MAX) |
| 2273 | return -1; | 2273 | return -1; |
| @@ -2303,7 +2303,7 @@ x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format) | |||
| 2303 | { | 2303 | { |
| 2304 | Lisp_Object o = XCAR (iter); | 2304 | Lisp_Object o = XCAR (iter); |
| 2305 | 2305 | ||
| 2306 | if (FIXED_OR_FLOATP (o) || CONSP (o)) | 2306 | if (NUMBERP (o) || CONSP (o)) |
| 2307 | { | 2307 | { |
| 2308 | if (CONSP (o) | 2308 | if (CONSP (o) |
| 2309 | && RANGED_FIXNUMP (X_LONG_MIN >> 16, XCAR (o), X_LONG_MAX >> 16) | 2309 | && RANGED_FIXNUMP (X_LONG_MIN >> 16, XCAR (o), X_LONG_MAX >> 16) |
| @@ -2580,7 +2580,7 @@ x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from, | |||
| 2580 | else | 2580 | else |
| 2581 | error ("DEST as a string must be one of PointerWindow or InputFocus"); | 2581 | error ("DEST as a string must be one of PointerWindow or InputFocus"); |
| 2582 | } | 2582 | } |
| 2583 | else if (FIXED_OR_FLOATP (dest) || CONSP (dest)) | 2583 | else if (NUMBERP (dest) || CONSP (dest)) |
| 2584 | CONS_TO_INTEGER (dest, Window, wdest); | 2584 | CONS_TO_INTEGER (dest, Window, wdest); |
| 2585 | else | 2585 | else |
| 2586 | error ("DEST must be a frame, nil, string, number or cons"); | 2586 | error ("DEST must be a frame, nil, string, number or cons"); |