aboutsummaryrefslogtreecommitdiffstats
path: root/src/xselect.c
diff options
context:
space:
mode:
authorPaul Eggert2018-08-27 21:27:50 -0700
committerPaul Eggert2018-08-27 21:45:23 -0700
commitd77d01d22902acdc45c2c7059de4f1b158ab5806 (patch)
tree35f2b77594dc43e824852bb29598430945c5e6a4 /src/xselect.c
parent9abaf5f3581ecb76f30e8a6e7ee0e9633c133d1c (diff)
downloademacs-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.c40
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
1693cons_to_x_long (Lisp_Object obj) 1693cons_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
1846clean_local_selection_data (Lisp_Object obj) 1846clean_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");