1. 05 Jul, 2011 1 commit
  2. 24 Jun, 2011 1 commit
  3. 23 Jun, 2011 1 commit
  4. 22 Jun, 2011 1 commit
    • Paul Eggert's avatar
      * dispextern.h (struct face.stipple): · 0766b489
      Paul Eggert authored
      * image.c (x_bitmap_height, x_bitmap_width, x_bitmap_pixmap)
      (x_bitmap_mask, x_allocate_bitmap_record)
      (x_create_bitmap_from_data, x_create_bitmap_from_file)
      (x_destroy_bitmap, x_destroy_all_bitmaps, x_create_bitmap_mask)
      (x_create_bitmap_from_xpm_data):
      * nsterm.h (struct ns_display_info.bitmaps_size, .bitmaps_last):
      * w32term.h (struct w32_display_info.icon_bitmap_id, .bitmaps_size)
      (.bitmaps_last):
      * xfaces.c (load_pixmap):
      * xterm.c (x_bitmap_icon, x_wm_set_icon_pixmap):
      * xterm.h (struct x_display_info.icon_bitmap_id, .bitmaps_size)
      (.bitmaps_last, struct x_output.icon_bitmap):
      Use ptrdiff_t, not int, for bitmap indexes.
      (x_allocate_bitmap_record): Check for size overflow.
      * dispextern.h, lisp.h: Adjust to API changes elsewhere.
      0766b489
  5. 19 Jun, 2011 3 commits
  6. 18 Jun, 2011 4 commits
  7. 16 Jun, 2011 2 commits
  8. 14 Jun, 2011 1 commit
    • Paul Eggert's avatar
      Variadic C functions now count arguments with ptrdiff_t. · f66c7cf8
      Paul Eggert authored
      This partly undoes my 2011-03-30 change, which replaced int with size_t.
      Back then I didn't know that the Emacs coding style prefers signed int.
      Also, in the meantime I found a few more instances where arguments
      were being counted with int, which may truncate counts on 64-bit
      machines, or EMACS_INT, which may be unnecessarily wide.
      * lisp.h (struct Lisp_Subr.function.aMANY)
      (DEFUN_ARGS_MANY, internal_condition_case_n, safe_call):
      Arg counts are now ptrdiff_t, not size_t.
      All variadic functions and their callers changed accordingly.
      (struct gcpro.nvars): Now size_t, not size_t.  All uses changed.
      * bytecode.c (exec_byte_code): Check maxdepth for overflow,
      to avoid potential buffer overrun.  Don't assume arg counts fit in 'int'.
      * callint.c (Fcall_interactively): Check arg count for overflow,
      to avoid potential buffer overrun.  Use signed char, not 'int',
      for 'varies' array, so that we needn't bother to check its size
      calculation for overflow.
      * editfns.c (Fformat): Use ptrdiff_t, not EMACS_INT, to count args.
      * eval.c (apply_lambda):
      * fns.c (Fmapconcat): Use XFASTINT, not XINT, to get args length.
      (struct textprop_rec.argnum): Now ptrdiff_t, not int.  All uses changed.
      (mapconcat): Use ptrdiff_t, not int and EMACS_INT, to count args.
      f66c7cf8
  9. 13 Jun, 2011 2 commits
  10. 12 Jun, 2011 1 commit
    • Paul Eggert's avatar
      * lisp.h (UNSIGNED_CMP): New macro. · ea204efb
      Paul Eggert authored
      This fixes comparison bugs on 64-bit hosts.
      (ASCII_CHAR_P): Use it.
      * casefiddle.c (casify_object):
      * character.h (ASCII_BYTE_P, CHAR_VALID_P):
      (SINGLE_BYTE_CHAR_P, CHAR_STRING):
      * composite.h (COMPOSITION_ENCODE_RULE_VALID):
      * dispextern.h (FACE_FROM_ID):
      * keyboard.c (read_char): Use UNSIGNED_CMP.
      ea204efb
  11. 11 Jun, 2011 2 commits
    • Paul Eggert's avatar
      * buffer.c (Qclone_number): Remove for now, as it's unused. · 4475bec4
      Paul Eggert authored
      (record_buffer, Funrecord_buffer): Rename local to avoid shadowing.
      (record_buffer): Remove unused local.
      * frame.c (other_visible_frames, frame_buffer_list): Now static.
      (set_frame_buffer_list): Remove; unused.
      * frame.h (other_visible_frames): Remove decl.
      * keyboard.h (menu_items_inuse): Declare only if USE_GTK || USE_MOTIF.
      * lisp.h (frame_buffer_list, set_frame_buffer_list): Remove decls.
      (add_gpm_wait_descriptor, delete_gpm_wait_descriptor): Declare only
      if HAVE_GPM.
      * menu.c (menu_items_inuse): Now static unless USE_GTK || USE_MOTIF.
      * process.c (add_gpm_wait_descriptor, delete_gpm_wait_descriptor):
      Define only if HAVE_GPM.
      * widget.c (EmacsFrameResize, emacsFrameClassRec): Now static.
      (update_hints_inhibit): Remove; never set.  All uses removed.
      * widgetprv.h (emacsFrameClassRec): Remove decl.
      * window.c (delete_deletable_window): Now returns void, since it
      wasn't returning anything.
      (compare_window_configurations): Remove unused locals.
      * xfns.c (x_set_scroll_bar_default_width): Remove unused locals.
      * xmenu.c (x_menu_set_in_use): Define only if USE_GTK || USE_MOTIF.
      Omit no-longer-needed #ifdef USE_X_TOOLKIT, since USE_X_TOOLKIT is
      implied by USE_GTK || USE_MOTIF.
      (dialog_selection_callback) [!USE_GTK]: Prefer intptr_t for integers
      the same widths as pointers.  This follows up on the 2011-05-06 patch.
      * xterm.c (x_alloc_lighter_color_for_widget): Define only if USE_LUCID.
      * xterm.h: Likewise.
      (x_menu_set_in_use): Declare only if USE_GTK || USE_MOTIF.
      4475bec4
    • Martin Rudalics's avatar
      Move/add window-buffer-related functions to window.el. · 9397e56f
      Martin Rudalics authored
      * buffer.c: New Lisp objects Qbuffer_list_update_hook and
      Qclone_number.  Remove external declaration of Qdelete_window.
      (Fbuffer_list): Rewrite doc-string.  Minor restructuring of
      code.
      (Fget_buffer_create, Fmake_indirect_buffer, Frename_buffer): Run
      Qbuffer_list_update_hook if allowed.
      (Fother_buffer): Rewrite doc-string.  Major rewrite for new
      buffer list implementation.
      (other_buffer_safely): New function.
      (Fkill_buffer): Replace call to replace_buffer_in_all_windows by
      calls to replace_buffer_in_windows and
      replace_buffer_in_windows_safely.  Run Qbuffer_list_update_hook
      if allowed.
      (record_buffer): Inhibit quitting and rewrite using quittable
      functions.  Run Qbuffer_list_update_hook if allowed.
      (Frecord_buffer, Funrecord_buffer): New functions.
      (switch_to_buffer_1, Fswitch_to_buffer): Remove.  Move
      switch-to-buffer to window.el.
      (bury-buffer): Move to window.el.
      (Vbuffer_list_update_hook): New variable.
      
      * lisp.h (other_buffer_safely): Add prototype in buffer.c
      section.
      
      * window.h (resize_frame_windows): Move up in code.
      (Fwindow_frame): Remove EXFUN.
      (replace_buffer_in_all_windows): Remove prototype.
      (replace_buffer_in_windows_safely): Add prototype.
      
      * window.c: Declare Qdelete_window static again.  Move down
      declaration of select_count.
      (Fnext_window, Fprevious_window): Rewrite doc-strings.
      (Fother_window): Move to window.el.
      (window_loop): Remove DELETE_BUFFER_WINDOWS and UNSHOW_BUFFER
      cases.  Add REPLACE_BUFFER_IN_WINDOWS_SAFELY case.
      (Fdelete_windows_on, Freplace_buffer_in_windows): Move to
      window.el.
      (replace_buffer_in_windows): Implement by calling
      Qreplace_buffer_in_windows.
      (replace_buffer_in_all_windows): Remove with some functionality
      moved into replace_buffer_in_windows_safely.
      (replace_buffer_in_windows_safely): New function.
      (select_window_norecord, select_frame_norecord): Move in front
      of run_window_configuration_change_hook.  Remove now obsolete
      declarations.
      (Fset_window_buffer): Rewrite doc-string.  Call
      Qrecord_window_buffer.
      (keys_of_window): Move binding for other-window to window.el.
      
      * loadup.el (top-level): Load window before files for the sake
      of replace-buffer-in-windows.
      
      * files.el (read-buffer-to-switch)
      (switch-to-buffer-other-window)
      (switch-to-buffer-other-frame, display-buffer-other-frame): Move
      to window.el.
      
      * simple.el (get-next-valid-buffer, last-buffer, next-buffer)
      (previous-buffer): Move to window.el.
      
      * bindings.el (unbury-buffer): Move to window.el.
      
      * window.el (delete-other-windows-vertically): Move after
      definition of delete-other-windows.
      (other-window, delete-windows-on, replace-buffer-in-windows):
      Move here from window.c.
      (record-window-buffer, unrecord-window-buffer)
      (set-window-buffer-start-and-point, switch-to-prev-buffer)
      (switch-to-next-buffer): New functions.
      (get-next-valid-buffer, last-buffer, next-buffer): Move here
      from simple.el.  Call switch-to-next-buffer.
      (previous-buffer): Move here from simple.el.  Call
      switch-to-prev-buffer.
      (bury-buffer): Move here from buffer.c.  Switch to previous
      buffer when window cannot be deleted.
      (unbury-buffer): Move here from bindings.el.
      (ctl-x-map): Move binding for other-window from window.c to
      here.
      (read-buffer-to-switch, switch-to-buffer-other-window)
      (switch-to-buffer-other-frame): Move here from files.el.
      (normalize-buffer-to-switch-to): New functions.
      (switch-to-buffer): Move here from buffer.c.  Use
      read-buffer-to-switch and normalize-buffer-to-switch-to.
      9397e56f
  12. 08 Jun, 2011 2 commits
    • Paul Eggert's avatar
      * lisp.h (SAFE_ALLOCA_LISP): Check for integer overflow. · 9c4c5f81
      Paul Eggert authored
      (struct Lisp_Save_Value): Use ptrdiff_t, not int, for 'integer' member.
      * alloc.c (make_save_value): Integer argument is now of type
      ptrdiff_t, not int.
      (mark_object): Use ptrdiff_t, not int.
      * lisp.h (pD): New macro.
      * print.c (print_object): Use it.
      9c4c5f81
    • Paul Eggert's avatar
      * alloc.c: Catch some string size overflows that we were missing. · c9d624c6
      Paul Eggert authored
      (XMALLOC_OVERRUN_CHECK_SIZE) [!XMALLOC_OVERRUN_CHECK]: Define to 0,
      for convenience in STRING_BYTES_MAX.
      (STRING_BYTES_MAX): New macro, superseding the old one in lisp.h.
      The definition here is exact; the one in lisp.h was approximate.
      (allocate_string_data): Check for string overflow.  This catches
      some instances we weren't catching before.  Also, it catches
      size_t overflow on (unusual) hosts where SIZE_MAX <= min
      (PTRDIFF_MAX, MOST_POSITIVE_FIXNUM), e.g., when size_t is 32 bits
      and ptrdiff_t and EMACS_INT are both 64 bits.
      * character.c, coding.c, doprnt.c, editfns.c, eval.c:
      All uses of STRING_BYTES_MAX replaced by STRING_BYTES_BOUND.
      * lisp.h (STRING_BYTES_BOUND): Renamed from STRING_BYTES_MAX.
      c9d624c6
  13. 06 Jun, 2011 3 commits
    • Martin Rudalics's avatar
      Move some window-related functions from frame.c to window.c. · 727e958e
      Martin Rudalics authored
      * lisp.h: Move EXFUNS for Fframe_root_window,
      Fframe_first_window and Fset_frame_selected_window to window.h.
      
      * window.h: Move EXFUNS for Fframe_root_window,
      Fframe_first_window and Fset_frame_selected_window here from
      lisp.h.
      
      * frame.c (Fwindow_frame, Fframe_first_window)
      (Fframe_root_window, Fframe_selected_window)
      (Fset_frame_selected_window): Move to window.c.
      (Factive_minibuffer_window): Move to minibuf.c.
      (Fother_visible_frames_p): New function.
      
      * minibuf.c (Factive_minibuffer_window): Move here from frame.c.
      
      * window.c (Fwindow_frame): Move here from frame.c.  Accept any
      window as argument.
      (Fframe_root_window, Fframe_first_window)
      (Fframe_selected_window): Move here from frame.c.  Accept frame
      or arbitrary window as argument.  Update doc-strings.
      (Fminibuffer_window): Move up in code.
      (Fwindow_minibuffer_p): Move up in code and simplify.
      (Fset_frame_selected_window): Move here from frame.c.  Marginal
      rewrite.
      (Fselected_window, select_window, Fselect_window): Move up in
      code.  Minor doc-string fixes.
      727e958e
    • Paul Eggert's avatar
      Check for overflow when converting integer to cons and back. · be44ca6c
      Paul Eggert authored
      * charset.c (Fdefine_charset_internal, Fdecode_char):
      Use cons_to_unsigned to catch overflow.
      (Fencode_char): Use INTEGER_TO_CONS.
      * composite.h (LGLYPH_CODE): Use cons_to_unsigned.
      (LGLYPH_SET_CODE): Use INTEGER_TO_CONS.
      * data.c (long_to_cons, cons_to_long): Remove.
      (cons_to_unsigned, cons_to_signed): New functions.
      These signal an error for invalid or out-of-range values.
      * dired.c (Ffile_attributes): Use INTEGER_TO_CONS.
      * fileio.c (Fset_visited_file_modtime): Use CONS_TO_INTEGER.
      * font.c (Ffont_variation_glyphs):
      * fontset.c (Finternal_char_font): Use INTEGER_TO_CONS.
      * lisp.h: Include <intprops.h>.
      (INTEGER_TO_CONS, CONS_TO_INTEGER): New macros.
      (cons_to_signed, cons_to_unsigned): New decls.
      (long_to_cons, cons_to_long): Remove decls.
      * undo.c (record_first_change): Use INTEGER_TO_CONS.
      (Fprimitive_undo): Use CONS_TO_INTEGER.
      * xfns.c (Fx_window_property): Likewise.
      * xselect.c: Include <limits.h>.
      (x_own_selection, selection_data_to_lisp_data):
      Use INTEGER_TO_CONS.
      (x_handle_selection_request, x_handle_selection_clear)
      (x_get_foreign_selection, Fx_disown_selection_internal)
      (Fx_get_atom_name, x_send_client_event): Use CONS_TO_INTEGER.
      (lisp_data_to_selection_data): Use cons_to_unsigned.
      (x_fill_property_data): Use cons_to_signed.
      Report values out of range.
      be44ca6c
    • Paul Eggert's avatar
      Check for buffer and string overflow more precisely. · d1f3d2af
      Paul Eggert authored
      * buffer.h (BUF_BYTES_MAX): New macro.
      * lisp.h (STRING_BYTES_MAX): New macro.
      * alloc.c (Fmake_string):
      * character.c (string_escape_byte8):
      * coding.c (coding_alloc_by_realloc):
      * doprnt.c (doprnt):
      * editfns.c (Fformat):
      * eval.c (verror):
      Use STRING_BYTES_MAX, not MOST_POSITIVE_FIXNUM,
      since they may not be the same number.
      * editfns.c (Finsert_char):
      * fileio.c (Finsert_file_contents):
      Likewise for BUF_BYTES_MAX.
      d1f3d2af
  14. 04 Jun, 2011 1 commit
    • Paul Eggert's avatar
      Check for buffer and string overflow more precisely. · edaa1822
      Paul Eggert authored
      * buffer.h (BUF_BYTES_MAX): New macro.
      * lisp.h (STRING_BYTES_MAX): New macro.
      * alloc.c (Fmake_string):
      * character.c (string_escape_byte8):
      * coding.c (coding_alloc_by_realloc):
      * doprnt.c (doprnt):
      * editfns.c (Fformat):
      * eval.c (verror):
      Use STRING_BYTES_MAX, not MOST_POSITIVE_FIXNUM,
      since they may not be the same number.
      * editfns.c (Finsert_char):
      * fileio.c (Finsert_file_contents):
      Likewise for BUF_BYTES_MAX.
      edaa1822
  15. 03 Jun, 2011 1 commit
    • Paul Eggert's avatar
      Check for overflow when converting integer to cons and back. · 201f31ae
      Paul Eggert authored
      * charset.c (Fdefine_charset_internal, Fdecode_char):
      Use cons_to_unsigned to catch overflow.
      (Fencode_char): Use INTEGER_TO_CONS.
      * composite.h (LGLYPH_CODE): Use cons_to_unsigned.
      (LGLYPH_SET_CODE): Use INTEGER_TO_CONS.
      * data.c (long_to_cons, cons_to_long): Remove.
      (cons_to_unsigned, cons_to_signed): New functions.
      These signal an error for invalid or out-of-range values.
      * dired.c (Ffile_attributes): Use INTEGER_TO_CONS.
      * fileio.c (Fset_visited_file_modtime): Use CONS_TO_INTEGER.
      * font.c (Ffont_variation_glyphs):
      * fontset.c (Finternal_char_font): Use INTEGER_TO_CONS.
      * lisp.h (INTEGER_TO_CONS, CONS_TO_INTEGER): New macros.
      (cons_to_signed, cons_to_unsigned): New decls.
      (long_to_cons, cons_to_long): Remove decls.
      * undo.c (record_first_change): Use INTEGER_TO_CONS.
      (Fprimitive_undo): Use CONS_TO_INTEGER.
      * xfns.c (Fx_window_property): Likewise.
      * xselect.c (x_own_selection, selection_data_to_lisp_data):
      Use INTEGER_TO_CONS.
      (x_handle_selection_request, x_handle_selection_clear)
      (x_get_foreign_selection, Fx_disown_selection_internal)
      (Fx_get_atom_name, x_send_client_event): Use CONS_TO_INTEGER.
      (lisp_data_to_selection_data): Use cons_to_unsigned.
      (x_fill_property_data): Use cons_to_signed.  Report values out of range.
      201f31ae
  16. 02 Jun, 2011 2 commits
  17. 31 May, 2011 1 commit
    • Paul Eggert's avatar
      Remove arbitrary limit of 2**31 entries in hash tables. · 0de4bb68
      Paul Eggert authored
      * category.c (hash_get_category_set): Use 'EMACS_UINT' and 'EMACS_INT'
      for hashes and hash indexes, instead of 'unsigned' and 'int'.
      * ccl.c (ccl_driver): Likewise.
      * charset.c (Fdefine_charset_internal): Likewise.
      * charset.h (struct charset.hash_index): Likewise.
      * composite.c (get_composition_id, gstring_lookup_cache):
      (composition_gstring_put_cache): Likewise.
      * composite.h (struct composition.hash_index): Likewise.
      * dispextern.h (struct image.hash): Likewise.
      * fns.c (next_almost_prime, larger_vector, cmpfn_eql):
      (cmpfn_equal, cmpfn_user_defined, hashfn_eq, hashfn_eql):
      (hashfn_equal, hashfn_user_defined, make_hash_table):
      (maybe_resize_hash_table, hash_lookup, hash_put):
      (hash_remove_from_table, hash_clear, sweep_weak_table, SXHASH_COMBINE):
      (sxhash_string, sxhash_list, sxhash_vector, sxhash_bool_vector):
      (Fsxhash, Fgethash, Fputhash, Fmaphash): Likewise.
      * image.c (make_image, search_image_cache, lookup_image):
      (xpm_put_color_table_h): Likewise.
      * lisp.h (struct Lisp_Hash_Table): Likewise, for 'count', 'cmpfn',
      and 'hashfn' members.
      * minibuf.c (Ftry_completion, Fall_completions, Ftest_completion):
      Likewise.
      * print.c (print): Likewise.
      * alloc.c (allocate_vectorlike): Check for overflow in vector size
      calculations.
      * ccl.c (ccl_driver): Check for overflow when converting EMACS_INT
      to int.
      * fns.c, image.c: Remove unnecessary static decls that would otherwise
      need to be updated by these changes.
      * fns.c (make_hash_table, maybe_resize_hash_table): Check for integer
      overflow with large hash tables.
      (make_hash_table, maybe_resize_hash_table, Fmake_hash_table):
      Prefer the faster XFLOAT_DATA to XFLOATINT where either will do.
      (SXHASH_REDUCE): New macro.
      (sxhash_string, sxhash_list, sxhash_vector, sxhash_bool_vector):
      Use it instead of discarding useful hash info with large hash values.
      (sxhash_float): New function.
      (sxhash): Use it.  No more need for "& INTMASK" due to above changes.
      * lisp.h (FIXNUM_BITS): New macro, useful for SXHASH_REDUCE etc.
      (MOST_NEGATIVE_FIXNUM, MOST_POSITIVE_FIXNUM, INTMASK): Rewrite
      to use FIXNUM_BITS, as this simplifies things.
      (next_almost_prime, larger_vector, sxhash, hash_lookup, hash_put):
      Adjust signatures to match updated version of code.
      (consing_since_gc): Now EMACS_INT, since a single hash table can
      use more than INT_MAX bytes.
      0de4bb68
  18. 30 May, 2011 2 commits
    • Paul Eggert's avatar
      [ChangeLog] · 531b0165
      Paul Eggert authored
      Malloc failure behavior now depends on size of allocation.
      * lib/allocator.h (struct allocator.die): New size arg.
      * lib/careadlinkat.c (careadlinkat): Pass size to 'die' function.
      If the actual problem is an ssize_t limitation, not a size_t or
      malloc failure, fail with errno == ENAMETOOLONG instead of calling 'die'.
      [src/ChangeLog]
      Malloc failure behavior now depends on size of allocation.
      * alloc.c (buffer_memory_full, memory_full): New arg NBYTES.
      * lisp.h: Change signatures accordingly.
      * alloc.c, buffer.c, editfns.c, menu.c, minibuf.c, xterm.c:
      All callers changed.
      531b0165
    • Paul Eggert's avatar
      * eval.c (Qdebug): Now static. · ed008a6d
      Paul Eggert authored
      * lisp.h (Qdebug): Remove decl.  This reverts a part of the
      2011-04-26T11:26:05Z!dan.colascione@gmail.com that inadvertently undid part of
      2011-04-14T06:48:41Z!eggert@cs.ucla.edu.
      ed008a6d
  19. 28 May, 2011 1 commit
    • Paul Eggert's avatar
      [ChangeLog] · 55d4c1b2
      Paul Eggert authored
      Use 'inline', not 'INLINE'.
      * configure.in, autogen/config.in (INLINE): Remove.
      [lib-src/ChangeLog]
      Use 'inline', not 'INLINE'.
      * etags.c (hash): Now inline unconditionally.
      * make-docfile.c (put_char): inline, not INLINE.
      [nt/ChangeLog]
      Use 'inline', not 'INLINE'.
      * config.nt (INLINE): Remove.
      [src/ChangeLog]
      Use 'inline', not 'INLINE'.
      * alloc.c, fontset.c (INLINE): Remove.
      * alloc.c, bidi.c, charset.c, coding.c, dispnew.c, fns.c, image.c:
      * intervals.c, keyboard.c, process.c, syntax.c, textprop.c, w32term.c:
      * xdisp.c, xfaces.c, xterm.c: Replace all uses of INLINE with inline.
      * gmalloc.c (register_heapinfo): Use inline unconditionally.
      * lisp.h (LISP_MAKE_RVALUE): Use inline, not __inline__.
      55d4c1b2
  20. 22 May, 2011 1 commit
  21. 21 May, 2011 1 commit
    • Paul Eggert's avatar
      merge count_size_as_multibyte, parse_str_to_multibyte · de883a70
      Paul Eggert authored
      * character.c, character.h (count_size_as_multibyte):
      Renamed from parse_str_to_multibyte; all uses changed.
      Check for integer overflow.
      * insdel.c, lisp.h (count_size_as_multibyte): Remove,
      since it's now a duplicate of the other.  This is more of
      a character than a buffer op, so better that it's in character.c.
      * fns.c, print.c: Adjust to above changes.
      de883a70
  22. 16 May, 2011 1 commit
    • Paul Eggert's avatar
      * alloc.c (string_overflow): New function. · cb93f9be
      Paul Eggert authored
      (Fmake_string): Use it.  This doesn't change behavior, but saves
      a few bytes and will simplify future changes.
      * character.c (string_escape_byte8): Likewise.
      * lisp.h (string_overflow): New decl.
      cb93f9be
  23. 11 May, 2011 1 commit
  24. 09 May, 2011 1 commit
    • Eli Zaretskii's avatar
      Backport revisions... · 14fe7b53
      Eli Zaretskii authored
      Backport revisions 2011-04-24T05:30:24Z!eggert@cs.ucla.edu..2011-04-25T19:40:22Z!eggert@cs.ucla.edu (inclusive) from trunk (bug#8623)
      
      	The next log entry shows the actual changes by Paul Eggert.
      
       Fix a problem with aliasing and vector headers.
       GCC 4.6.0 optimizes based on type-based alias analysis.  For
       example, if b is of type struct buffer * and v of type struct
       Lisp_Vector *, then gcc -O2 was incorrectly assuming that &b->size
       != &v->size, and therefore "v->size = 1; b->size = 2; return
       v->size;" must therefore return 1.  This assumption is incorrect
       for Emacs, since it type-puns struct Lisp_Vector * with many other
       types.  To fix this problem, this patch adds a new type struct
       vector_header that documents the constraints on layout of vectors
       and pseudovectors, and helps optimizing compilers not get fooled
       by Emacs's type punning.  It also adds the macros XSETTYPED_PVECTYPE
       XSETTYPED_PSEUDOVECTOR, TYPED_PSEUDOVECTORP, for similar reasons.
       src/lisp.h (XVECTOR_SIZE): New convenience macro.  All previous uses of
       XVECTOR (foo)->size replaced to use this macro, to avoid the hassle
       of writing XVECTOR (foo)->header.size.
       src/lisp.h: Say "vectorlike header" rather than "vector header.
       (struct vectorlike_header): Rename from struct vector_header.
       (XVECTORLIKE_HEADER_SIZE): Renamed from XVECTOR_HEADER_SIZE.
       All uses changed.
       (XVECTOR_HEADER_SIZE): New macro, for use in XSETPSEUDOVECTOR.
       (XSETTYPED_PVECTYPE): New macro, specifying the name of the size
       member.
       (XSETPVECTYPE): Rewrite in terms of new macro.
       (XSETPVECTYPESIZE): New macro, specifying both type and size.
       This is a bit clearer, and further avoids the possibility of
       undesirable aliasing.
       (XSETTYPED_PSEUDOVECTOR): New macro, specifying the size.
       (XSETPSEUDOVECTOR): Rewrite in terms of XSETTYPED_PSEUDOVECTOR
       and XVECTOR_HEADER_SIZE.
       (XSETSUBR): Rewrite in terms of XSETTYPED_PSEUDOVECTOR and XSIZE,
       since Lisp_Subr is a special case (no "next" field).
       (ASIZE): Rewrite in terms of XVECTOR_SIZE.
       (struct vector_header): New type.
       (TYPED_PSEUDOVECTORP): New macro, also specifying the C type of the
       object, to help avoid aliasing.
       (PSEUDOVECTORP): Rewrite in terms of TYPED_PSEUDOVECTORP.
       (SUBRP): Likewise, since Lisp_Subr is a special case.
       src/lisp.h (struct Lisp_Vector, struct Lisp_Char_Table):
       (struct Lisp_Sub_Char_Table, struct Lisp_Bool_Vector):
       (struct Lisp_Hash_Table): Combine first two members into a single
       struct vector_header member.  All uses of "size" and "next" members
       changed to be "header.size" and "header.next".
       src/buffer.h (struct buffer): Likewise.
       src/font.h (struct font_spec, struct font_entity, struct font): Likewise.
       src/frame.h (struct frame): Likewise.
       src/process.h (struct Lisp_Process): Likewise.
       src/termhooks.h (struct terminal): Likewise.
       src/window.c (struct save_window_data, struct saved_window): Likewise.
       src/window.h (struct window): Likewise.
       src/alloc.c (allocate_buffer, Fmake_bool_vector, allocate_pseudovector):
       Use XSETPVECTYPESIZE, not XSETPVECTYPE, to avoid aliasing problems.
       src/buffer.c (init_buffer_once): Likewise.
       src/lread.c (defsubr): Use XSETTYPED_PVECTYPE, since Lisp_Subr is a
       special case.
       src/process.c (Fformat_network_address): Use local var for size,
       for brevity.
       src/fns.c (vector): Remove; this old hack is no longer needed.
       src/bytecode.c (exec_byte_code): Don't use XVECTOR before CHECK_VECTOR.
      14fe7b53
  25. 06 May, 2011 1 commit
  26. 01 May, 2011 1 commit
  27. 30 Apr, 2011 1 commit