1. 21 Jul, 2013 1 commit
  2. 19 Jul, 2013 2 commits
    • Paul Eggert's avatar
      * alloc.c (staticpro): Avoid buffer overrun on repeated calls. · 4195afc3
      Paul Eggert authored
      (NSTATICS): Now a constant; doesn't need to be a macro.
      4195afc3
    • Paul Eggert's avatar
      Fix obscure porting bug with varargs functions. · 1396ac86
      Paul Eggert authored
      The code assumed that int is treated like ptrdiff_t in a vararg
      function, which is not a portable assumption.  There was a similar
      -- though these days less likely -- porting problem with various
      assumptions that pointers of different types all smell the same as
      far as vararg functions is conserved.  To make this problem less
      likely in the future, redo the API to use varargs functions.
      * alloc.c (make_save_value): Remove this vararg function.
      All uses changed to ...
      (make_save_int_int_int, make_save_obj_obj_obj_obj)
      (make_save_ptr_int, make_save_funcptr_ptr_obj, make_save_memory):
      New functions.
      (make_save_ptr): Rename from make_save_pointer, for consistency with
      the above.  Define only on platforms that need it.  All uses changed.
      1396ac86
  3. 16 Jul, 2013 2 commits
    • Paul Eggert's avatar
      New unwind-protect flavors to better type-check C callbacks. · 27e498e6
      Paul Eggert authored
      This also lessens the need to write wrappers for callbacks,
      and the need for make_save_pointer.
      * alloca.c (free_save_value):
      * atimer.c (run_all_atimers):
      Now extern.
      * alloc.c (safe_alloca_unwind):
      * atimer.c (unwind_stop_other_atimers):
      * keyboard.c (cancel_hourglass_unwind) [HAVE_WINDOW_SYSTEM]:
      * menu.c (cleanup_popup_menu) [HAVE_NS]:
      * minibuf.c (choose_minibuf_frame_1):
      * process.c (make_serial_process_unwind):
      * xdisp.h (pop_message_unwind):
      * xselect.c (queue_selection_requests_unwind):
      Remove no-longer-needed wrapper.  All uses replaced by the wrappee.
      * alloca.c (record_xmalloc):
      Prefer record_unwind_protect_ptr to record_unwind_protect with
      make_save_pointer.
      * alloca.c (Fgarbage_collect):
      Prefer record_unwind_protect_void to passing a dummy.
      * buffer.c (restore_buffer):
      * window.c (restore_window_configuration):
      * xfns.c, w32fns.c (do_unwind_create_frame)
      New wrapper.  All record-unwind uses of wrappee changed.
      * buffer.c (set_buffer_if_live):
      * callproc.c (call_process_cleanup, delete_temp_file):
      * coding.c (code_conversion_restore):
      * dired.c (directory_files_internal_w32_unwind) [WINDOWSNT]:
      * editfns.c (save_excursion_restore)
      (subst_char_in_region_unwind, subst_char_in_region_unwind_1)
      (save_restriction_restore):
      * eval.c (restore_stack_limits, un_autoload):
      * fns.c (require_unwind):
      * keyboard.c (recursive_edit_unwind, tracking_off):
      * lread.c (record_load_unwind, load_warn_old_style_backquotes):
      * macros.c (pop_kbd_macro, restore_menu_items):
      * nsfns.m (unwind_create_frame):
      * print.c (print_unwind):
      * process.c (start_process_unwind):
      * search.c (unwind_set_match_data):
      * window.c (select_window_norecord, select_frame_norecord):
      * xdisp.c (unwind_with_echo_area_buffer, unwind_format_mode_line)
      (fast_set_selected_frame):
      * xfns.c, w32fns.c (unwind_create_tip_frame):
      Return void, not a dummy Lisp_Object.  All uses changed.
      * buffer.h (set_buffer_if_live): Move decl here from lisp.h.
      * callproc.c (call_process_kill):
      * fileio.c (restore_point_unwind, decide_coding_unwind)
      (build_annotations_unwind):
      * insdel.c (Fcombine_after_change_execute_1):
      * keyboard.c (read_char_help_form_unwind):
      * menu.c (unuse_menu_items):
      * minibuf.c (run_exit_minibuf_hook, read_minibuf_unwind):
      * sound.c (sound_cleanup):
      * xdisp.c (unwind_redisplay):
      * xfns.c (clean_up_dialog):
      * xselect.c (x_selection_request_lisp_error, x_catch_errors_unwind):
      Accept no args and return void, instead of accepting and returning
      a dummy Lisp_Object.  All uses changed.
      * cygw32.c (fchdir_unwind):
      * fileio.c (close_file_unwind):
      * keyboard.c (restore_kboard_configuration):
      * lread.c (readevalllop_1):
      * process.c (wait_reading_process_output_unwind):
      Accept int and return void, rather than accepting an Emacs integer
      and returning a dummy object.  In some cases this fixes an
      unlikely bug when the corresponding int is outside Emacs integer
      range.  All uses changed.
      * dired.c (directory_files_internal_unwind):
      * fileio.c (do_auto_save_unwind):
      * gtkutil.c (pop_down_dialog):
      * insdel.c (reset_var_on_error):
      * lread.c (load_unwind):
      * xfns.c (clean_up_file_dialog):
      * xmenu.c, nsmenu.m (pop_down_menu):
      * xmenu.c (cleanup_widget_value_tree):
      * xselect.c (wait_for_property_change_unwind):
      Accept pointer and return void, rather than accepting an Emacs
      save value encapsulating the pointer and returning a dummy object.
      All uses changed.
      * editfns.c (Fformat): Update the saved pointer directly via
      set_unwind_protect_ptr rather than indirectly via make_save_pointer.
      * eval.c (specpdl_func): Remove.  All uses replaced by definiens.
      (unwind_body): New function.
      (record_unwind_protect): First arg is now a function returning void,
      not a dummy Lisp_Object.
      (record_unwind_protect_ptr, record_unwind_protect_int)
      (record_unwind_protect_void): New functions.
      (unbind_to): Support SPECPDL_UNWIND_PTR etc.
      * fileio.c (struct auto_save_unwind): New type.
      (do_auto_save_unwind): Use it.
      (do_auto_save_unwind_1): Remove; subsumed by new do_auto_save_unwind.
      * insdel.c (struct rvoe_arg): New type.
      (reset_var_on_error): Use it.
      * lisp.h (SPECPDL_UNWIND_PTR, SPECPDL_UNWIND_INT, SPECPDL_UNWIND_VOID):
      New constants.
      (specbinding_func): Remove; there are now several such functions.
      (union specbinding): New members unwind_ptr, unwind_int, unwind_void.
      (set_unwind_protect_ptr): New function.
      * xselect.c: Remove unnecessary forward decls, to simplify maintenance.
      27e498e6
    • Paul Eggert's avatar
      Fix porting bug to older POSIXish platforms. · c7ddc792
      Paul Eggert authored
      * sysdep.c (emacs_pipe): New function, that implements
      pipe2 (fd, O_CLOEXEC) even on hosts that lack O_CLOEXEC.
      This should port better to CentOS 5 and to Mac OS X 10.6.
      All calls to pipe2 changed.
      
      Fixes: debbugs:14862
      c7ddc792
  4. 07 Jul, 2013 1 commit
    • Paul Eggert's avatar
      Make file descriptors close-on-exec when possible. · 067428c1
      Paul Eggert authored
      This simplifies Emacs a bit, since it no longer needs to worry
      about closing file descriptors by hand in some cases.
      It also fixes some unlikely races.  Not all such races, as
      libraries often open files internally without setting
      close-on-exec, but it's an improvement.
      * admin/merge-gnulib (GNULIB_MODULES): Add fcntl, pipe2.
      (GNULIB_TOOL_FLAGS): Avoid binary-io, close.  Do not avoid fcntl.
      * configure.ac (mkostemp): New function to check for.
      (PTY_OPEN): Pass O_CLOEXEC to posix_openpt.
      * lib/fcntl.c, lib/getdtablesize.c, lib/pipe2.c, m4/fcntl.m4:
      * m4/getdtablesize.m4, m4/pipe2.m4: New files, taken from gnulib.
      * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
      * nt/gnulib.mk: Remove empty gl_GNULIB_ENABLED_verify section;
      otherwise, gnulib-tool complains given close-on-exec changes.
      * nt/inc/ms-w32.h (pipe): Remove.
      * nt/mingw-cfg.site (ac_cv_func_fcntl, gl_cv_func_fcntl_f_dupfd_cloexec)
      (gl_cv_func_fcntl_f_dupfd_works, ac_cv_func_pipe2): New vars.
      * src/alloc.c (valid_pointer_p) [!WINDOWSNT]:
      * src/callproc.c (Fcall_process) [!MSDOS]:
      * src/emacs.c (main) [!DOS_NT]:
      * src/nsterm.m (ns_term_init):
      * src/process.c (create_process):
      Use 'pipe2' with O_CLOEXEC instead of 'pipe'.
      * src/emacs.c (Fcall_process_region) [HAVE_MKOSTEMP]:
      * src/filelock.c (create_lock_file) [HAVE_MKOSTEMP]:
      Prefer mkostemp with O_CLOEXEC to mkstemp.
      * src/callproc.c (relocate_fd) [!WINDOWSNT]:
      * src/emacs.c (main): Use F_DUPFD_CLOEXEC, not plain F_DUPFD.
      No need to use fcntl (..., F_SETFD, FD_CLOEXEC), since we're
      now using pipe2.
      * src/filelock.c (create_lock_file) [! HAVE_MKOSTEMP]:
      Make the resulting file descriptor close-on-exec.
      * src/lisp.h, src/lread.c, src/process.c (close_load_descs, close_process_descs):
      * src/lread.c (load_descriptor_list, load_descriptor_unwind):
      Remove; no longer needed.  All uses removed.
      * src/process.c (SOCK_CLOEXEC): Define to 0 if not supplied by system.
      (close_on_exec, accept4, process_socket) [!SOCK_CLOEXEC]:
      New functions.
      (socket) [!SOCK_CLOEXEC]: Supply a substitute.
      (Fmake_network_process, Fnetwork_interface_list):
      (Fnetwork_interface_info, server_accept_connection):
      Make newly-created socket close-on-exec.
      * src/sysdep.c (emacs_open, emacs_fopen):
      Make new-created descriptor close-on-exec.
      * src/w32.c (fcntl): Support F_DUPFD_CLOEXEC well enough for Emacs.
      * src/w32.c, src/w32.h (pipe2): Rename from 'pipe', with new flags arg.
      
      Fixes: debbugs:14803
      067428c1
  5. 05 Jul, 2013 1 commit
    • Paul Eggert's avatar
      Remove duplicate #include directives. · 47ba6d43
      Paul Eggert authored
      * alloc.c [GC_MARK_STACK == GC_USE_GCPROS_CHECK_ZOMBIES]:
      * xfaces.c:
      Don't include stdio.h twice.
      * buffer.c [USE_MMAP_FOR_BUFFERS]:
      Don't include sys/types.h or stdio.h twice.
      * fileio.c [WINDOWSNT | MSDOS]: Don't include fcntl.h twice.
      * lread.c: Don't include coding.h twice.
      * nsfont.m: Don't include frame.h twice.
      * process.c [HAVE_RES_INIT]: Don't include <netinet/in.h> twice.
      * ralloc.c: Don't include <unistd.h> twice.
      * xdisp.c: Don't include font.h twice.
      * xterm.c: Don't include fontset.h twice.
      * xterm.h [USE_X_TOOLKIT]: Don't include X11/StringDefs.h twice.
      47ba6d43
  6. 02 Jul, 2013 1 commit
    • Paul Eggert's avatar
      Don't convert function pointers to void * and back. · 52a9bcae
      Paul Eggert authored
      It isn't portable C, and it's easy enough to avoid.
      * alloc.c: Verify SAVE_FUNCPOINTER bits, too.
      (make_save_value): Add support for SAVE_FUNCPOINTER.
      * keymap.c (map_keymap_char_table_item, map_keymap_internal):
      * print.c (print_object):
      Distinguish function from object pointers.
      * lisp.h (SAVE_FUNCPOINTER): New constant.
      (SAVE_SLOT_BITS): Adjust to it.
      (SAVE_TYPE_FUNCPTR_PTR_OBJ): New constant, replacing
      SAVE_TYPE_PTR_PTR_OBJ.  Change the only use.
      (voidfuncptr): New typedef.
      (struct Lisp_Save_Value): New member data[0].funcpointer.
      (XSAVE_FUNCPOINTER): New function.
      52a9bcae
  7. 21 Jun, 2013 1 commit
    • Paul Eggert's avatar
      Use C99-style flexible array members if available. · fbe9e0b9
      Paul Eggert authored
      This avoids some subtle aliasing issues, which typically
      aren't a problem with GCC but may be a problem elsewhere.
      * lib-src/ebrowse.c (struct member, struct alias, struct sym):
      Use FLEXIBLE_ARRAY_MEMBER.
      (add_sym, add_member, make_namespace, register_namespace_alias):
      Use offsetof (struct, flex_array_member), not sizeof (struct), as
      that ports better to pre-C99 non-GCC.
      * src/alloc.c (sdata): New typedef, replacing the old struct sdata.
      It is a struct if GC_CHECK_STRING_BYTES, a union otherwise.
      In either case, it uses a flexible array member rather than
      the old struct hack.  All uses changed.
      (SDATA_NBYTES, sweep_strings) [!GC_CHECK_STRING_BYTES]:
      Adjust to sdata reorganization.
      * src/alloc.c (VBLOCK_BYTES_MIN, allocate_vectorlike, Fgarbage_collect):
      Use offsetof (struct, flex_array_member), not sizeof (struct), as
      that ports better to pre-C99 non-GCC.
      * src/chartab.c (Fmake_char_table, make_sub_char_table, copy_char_table):
      Use CHAR_TABLE_STANDARD_SLOTS rather than its definition,
      as the latter has changed.
      * src/conf_post.h (FLEXIBLE_ARRAY_MEMBER): Move here from w32.c,
      and port better to pre-C99 GCC.
      * src/image.c (struct xpm_cached_color):
      * src/lisp.h (struct Lisp_Vector, struct Lisp_Bool_Vector)
      (struct Lisp_Char_Table, struct Lisp_Sub_Char_Table):
      Use FLEXIBLE_ARRAY_MEMBER.
      * src/lisp.h (string_bytes) [GC_CHECK_STRING_BYTES]:
      Move decl to top level so it gets checked against implementation.
      (CHAR_TABLE_STANDARD_SLOTS): Adjust to struct Lisp_Char_Table change.
      * src/w32.c (FLEXIBLE_ARRAY_MEMBER): Move to conf_post.h.
      fbe9e0b9
  8. 20 Jun, 2013 1 commit
    • Paul Eggert's avatar
      * alloc.c (die): Move "assertion failed" string here ... · 5013fc08
      Paul Eggert authored
      * lisp.h (eassert): ... from here.  Also, suppress evaluation of
      COND when SUPPRESS_CHECKING.  This shrinks the executable text
      size by 0.8% to 2.2% when configured with --enable-checking,
      depending on optimization flags (GCC 4.8.1 x86-64).
      5013fc08
  9. 17 Jun, 2013 1 commit
    • Paul Eggert's avatar
      Use functions, not macros, for XINT etc. · 84575e67
      Paul Eggert authored
      In lisp.h, prefer functions to function-like macros, and
      constants to object-like macros, when either will do.  This:
       . simplifies use, as there's no more need to worry about
         arguments' side effects being evaluated multiple times.
       . makes the code easier to debug on some platforms.
      However, when using gcc -O0, keep using function-like macros
      for a few critical operations, for performance reasons.
      This sort of thing isn't needed with gcc -Og, but -Og
      is a GCC 4.8 feature and isn't widely-enough available yet.
      Also, move functions from lisp.h to individual modules when possible.
      From a suggestion by Andreas Schwab in <http://bugs.gnu.org/11935#68>.
      * alloc.c (XFLOAT_INIT, set_symbol_name):
      * buffer.c (CHECK_OVERLAY):
      * chartab.c (CHECK_CHAR_TABLE, set_char_table_ascii)
      (set_char_table_parent):
      * coding.c (CHECK_NATNUM_CAR, CHECK_NATNUM_CDR):
      * data.c (BOOLFWDP, INTFWDP, KBOARD_OBJFWDP, OBJFWDP, XBOOLFWD)
      (XKBOARD_OBJFWD, XINTFWD, XOBJFWD, CHECK_SUBR, set_blv_found)
      (blv_value, set_blv_value, set_blv_where, set_blv_defcell)
      (set_blv_valcell):
      * emacs.c (setlocale) [!HAVE_SETLOCALE]:
      * eval.c (specpdl_symbol, specpdl_old_value, specpdl_where)
      (specpdl_arg, specpdl_func, backtrace_function, backtrace_nargs)
      (backtrace_args, backtrace_debug_on_exit):
      * floatfns.c (CHECK_FLOAT):
      * fns.c (CHECK_HASH_TABLE, CHECK_LIST_END)
      (set_hash_key_and_value, set_hash_next, set_hash_next_slot)
      (set_hash_hash, set_hash_hash_slot, set_hash_index)
      (set_hash_index_slot):
      * keymap.c (CHECK_VECTOR_OR_CHAR_TABLE):
      * marker.c (CHECK_MARKER):
      * textprop.c (CHECK_STRING_OR_BUFFER):
      * window.c (CHECK_WINDOW_CONFIGURATION):
      Move here from lisp.h, and make these functions static rather than
      extern inline.
      * buffer.c (Qoverlayp):
      * data.c (Qsubrp):
      * fns.c (Qhash_table_p):
      * window.c (Qwindow_configuration_p):
      Now static.
      * lisp.h: Remove the abovementioned defns and decls.
      
      * configure.ac (WARN_CFLAGS): Remove -Wbad-function-cast,
      as it generates bogus warnings about reasonable casts of calls.
      * alloc.c (gdb_make_enums_visible) [USE_LSB_TAG]:
      Remove enum lsb_bits; no longer needed.
      (allocate_misc, free_misc): Don't use XMISCTYPE as an lvalue.
      * buffer.c (Qoverlap):
      * data.c (Qsubrp):
      * fns.c (Qhash_table_p):
      Now extern, so lisp.h can use these symbols.
      * dispextern.h: Include character.h, for MAX_CHAR etc.
      (GLYPH, GLYPH_CHAR, GLYPH_FACE, SET_GLYPH_CHAR, SET_GLYPH_FACE)
      (SET_GLYPH, GLYPH_CODE_CHAR, GLYPH_CODE_FACE)
      (SET_GLYPH_FROM_GLYPH_CODE, GLYPH_MODE_LINE_FACE, GLYPH_CHAR_VALID_P)
      (GLYPH_CODE_P): Move here from lisp.h.
      (GLYPH_CHAR, GLYPH_FACE, GLYPH_CODE_CHAR, GLYPH_CODE_FACE)
      (GLYPH_CHAR_VALID_P, GLYPH_CODE_P): Now functions, not macros.
      (GLYPH_MODE_LINE_FACE): Now enums, not macros.
      * eval.c (Fautoload): Cast XUNTAG output to intptr_t, since
      XUNTAG now returns void *.
      * lisp.h (lisp_h_XLI, lisp_h_XIL, lisp_h_CHECK_LIST_CONS)
      (lisp_h_CHECK_NUMBER CHECK_SYMBOL, lisp_h_CHECK_TYPE)
      (lisp_h_CONSP, lisp_h_EQ, lisp_h_FLOATP, lisp_h_INTEGERP)
      (lisp_h_MARKERP, lisp_h_MISCP, lisp_h_NILP)
      (lisp_h_SET_SYMBOL_VAL, lisp_h_SYMBOL_CONSTANT_P)
      (lisp_h_SYMBOL_VAL, lisp_h_SYMBOLP, lisp_h_VECTORLIKEP)
      (lisp_h_XCAR, lisp_h_XCDR, lisp_h_XCONS, lisp_h_XHASH)
      (lisp_h_XPNTR, lisp_h_XSYMBOL):
      New macros, renamed from their sans-lisp_h_ counterparts.
      (XLI, XIL, CHECK_LIST_CONS, CHECK_NUMBER CHECK_SYMBOL)
      (CHECK_TYPE, CONSP, EQ, FLOATP, INTEGERP, MARKERP)
      (MISCP, NILP, SET_SYMBOL_VAL, SYMBOL_CONSTANT_P, SYMBOL_VAL, SYMBOLP)
      (VECTORLIKEP, XCAR, XCDR, XCONS, XHASH, XPNTR, XSYMBOL):
      If compiling via GCC without optimization, define these as macros
      in addition to inline functions.
      To disable this, compile with -DINLINING=0.
      (LISP_MACRO_DEFUN, LISP_MACRO_DEFUN_VOID): New macros.
      (check_cons_list) [!GC_CHECK_CONS_LIST]: Likewise.
      (make_number, XFASTINT, XINT, XTYPE, XUNTAG): Likewise, but
      hand-optimize only in the USE_LSB_TAG case, as GNUish hosts do that.
      (INTMASK, VALMASK): Now macros, since static values cannot be
      accessed from extern inline functions.
      (VALMASK): Also a constant, for benefit of old GDB.
      (LISP_INT_TAG_P): Remove; no longer needed as the only caller
      is INTEGERP, which can fold it in.
      (XLI, XIL, XHASH, XTYPE,XINT, XFASTINT, XUINT)
      (make_number, XPNTR, XUNTAG, EQ, XCONS, XVECTOR, XSTRING, XSYMBOL)
      (XFLOAT, XPROCESS, XWINDOW, XTERMINAL, XSUBR, XBUFFER, XCHAR_TABLE)
      (XSUB_CHAR_TABLE, XBOOL_VECTOR, make_lisp_ptr, CHECK_TYPE)
      (CHECK_STRING_OR_BUFFER, XCAR, XCDR, XSETCAR, XSETCDR, CAR, CDR)
      (CAR_SAFE, CDR_SAFE, STRING_MULTIBYTE, SDATA, SSDATA, SREF, SSET)
      (SCHARS, STRING_BYTES, SBYTES, STRING_SET_CHARS, STRING_COPYIN, AREF)
      (ASIZE, ASET, CHAR_TABLE_REF_ASCII, CHAR_TABLE_REF)
      (CHAR_TABLE_SET, CHAR_TABLE_EXTRA_SLOTS, SYMBOL_VAL, SYMBOL_ALIAS)
      (SYMBOL_BLV, SYMBOL_FWD, SET_SYMBOL_VAL, SET_SYMBOL_ALIAS)
      (SET_SYMBOL_BLV, SET_SYMBOL_FWD, SYMBOL_NAME, SYMBOL_INTERNED_P)
      (SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P, SYMBOL_CONSTANT_P)
      (XHASH_TABLE, HASH_TABLE_P, CHECK_HASH_TABLE, HASH_KEY, HASH_VALUE)
      (HASH_NEXT, HASH_HASH, HASH_INDEX, HASH_TABLE_SIZE)
      (XMISC, XMISCANY, XMARKER, XOVERLAY, XSAVE_VALUE, XFWDTYPE)
      (XINTFWD, XBOOLFWD, XOBJFWD, XBUFFER_OBJFWD, XKBOARD_OBJFWD)
      (XFLOAT_DATA, XFLOAT_INIT, NILP, NUMBERP, NATNUMP)
      (RANGED_INTEGERP, CONSP, FLOATP, MISCP, STRINGP, SYMBOLP)
      (INTEGERP, VECTORLIKEP, VECTORP, OVERLAYP)
      (MARKERP, SAVE_VALUEP, AUTOLOADP, INTFWDP, BOOLFWDP, OBJFWDP)
      (BUFFER_OBJFWDP, KBOARD_OBJFWDP, PSEUDOVECTOR_TYPEP)
      (PSEUDOVECTORP, WINDOW_CONFIGURATIONP, PROCESSP, WINDOWP)
      (TERMINALP, SUBRP, COMPILEDP, BUFFERP, CHAR_TABLE_P)
      (SUB_CHAR_TABLE_P, BOOL_VECTOR_P, FRAMEP, IMAGEP, ARRAYP)
      (CHECK_LIST, CHECK_LIST_CONS, CHECK_LIST_END, CHECK_STRING)
      (CHECK_STRING_CAR, CHECK_CONS, CHECK_SYMBOL, CHECK_CHAR_TABLE)
      (CHECK_VECTOR, CHECK_VECTOR_OR_STRING, CHECK_ARRAY)
      (CHECK_VECTOR_OR_CHAR_TABLE, CHECK_BUFFER, CHECK_WINDOW)
      (CHECK_WINDOW_CONFIGURATION, CHECK_PROCESS, CHECK_SUBR)
      (CHECK_NUMBER, CHECK_NATNUM, CHECK_MARKER, XFLOATINT)
      (CHECK_FLOAT, CHECK_NUMBER_OR_FLOAT, CHECK_OVERLAY)
      (CHECK_NUMBER_CAR, CHECK_NUMBER_CDR, CHECK_NATNUM_CAR)
      (CHECK_NATNUM_CDR, FUNCTIONP, SPECPDL_INDEX, LOADHIST_ATTACH)
      Now functions.
      (check_cons_list) [!GC_CHECK_CONS_LIST]: New empty function.
      (LISP_MAKE_RVALUE, TYPEMASK): Remove; no longer needed.
      (VALMASK): Define in one place rather than in two, merging the
      USE_LSB_TAG parts; this is simpler.
      (aref_addr, gc_aset, MOST_POSITIVE_FIXNUM, MOST_NEGATIVE_FIXNUM)
      (max, min, struct Lisp_String, UNSIGNED_CMP, ASCII_CHAR_P):
      Move up, to avoid use before definition.
      Also include "globals.h" earlier, for the same reason.
      (make_natnum): New function.
      (XUNTAG): Now returns void *, not intptr_t, as this means fewer casts.
      (union Lisp_Fwd, BOOLFWDP, BOOL_VECTOR_P, BUFFER_OBJFWDP, BUFFERP)
      (CHAR_TABLE_P, CHAR_TABLE_REF_ASCII, CONSP, FLOATP, INTEGERP, INTFWDP)
      (KBOARD_OBJFWDP, MARKERP, MISCP, NILP, OBJFWDP, OVERLAYP, PROCESSP)
      (PSEUDOVECTORP, SAVE_VALUEP, STRINGP, SUB_CHAR_TABLE_P, SUBRP, SYMBOLP)
      (VECTORLIKEP, WINDOWP, Qoverlayp, char_table_ref, char_table_set)
      (char_table_translate, Qarrayp, Qbufferp, Qbuffer_or_string_p)
      (Qchar_table_p, Qconsp, Qfloatp, Qintegerp, Qlambda, Qlistp, Qmarkerp)
      (Qnil, Qnumberp, Qsubrp, Qstringp, Qsymbolp, Qvectorp)
      (Qvector_or_char_table_p, Qwholenump, Ffboundp, wrong_type_argument)
      (initialized, Qhash_table_p, extract_float, Qprocessp, Qwindowp)
      (Qwindow_configuration_p, Qimage): New forward declarations.
      (XSETFASTINT): Simplify by rewriting in terms of make_natnum.
      (STRING_COPYIN): Remove; unused.
      (XCAR_AS_LVALUE, XCDR_AS_LVALUE): Remove these macros, replacing with ...
      (xcar_addr, xcdr_addr): New functions.  All uses changed.
      (IEEE_FLOATING_POINT): Now a constant, not a macro.
      (GLYPH, GLYPH_CHAR, GLYPH_FACE, SET_GLYPH_CHAR, SET_GLYPH_FACE)
      (SET_GLYPH, GLYPH_CODE_CHAR, GLYPH_CODE_FACE)
      (SET_GLYPH_FROM_GLYPH_CODE, GLYPH_MODE_LINE_FACE, GLYPH_CHAR_VALID_P)
      (GLYPH_CODE_P): Move to dispextern.h, to avoid define-before-use.
      (TYPE_RANGED_INTEGERP): Simplify.
      (Qsubrp, Qhash_table_p, Qoverlayp): New extern decls.
      (setlocale, fixup_locale, synchronize_system_messages_locale)
      (synchronize_system_time_locale) [!HAVE_SETLOCALE]:
      Now empty functions, not macros.
      (functionp): Return bool, not int.
      * window.c (Qwindow_configuration_p): Now extern,
      so window.h can use it.
      * window.h (Qwindowp): Move decl back to lisp.h.
      84575e67
  10. 03 Jun, 2013 1 commit
    • Stefan Monnier's avatar
      Merge the specpdl and backtrace stacks. Make the structure of the · 2f592f95
      Stefan Monnier authored
      specpdl entries more obvious via a tagged union of structs.
      * src/lisp.h (BITS_PER_PTRDIFF_T): New constant.
      (enum specbind_tag): New enum.
      (struct specbinding): Make it a tagged union of structs.
      Add a case for backtrace records.
      (specpdl_symbol, specpdl_old_value, specpdl_where, specpdl_arg)
      (specpdl_func, backtrace_function, backtrace_nargs, backtrace_args)
      (backtrace_debug_on_exit): New accessors.
      (struct backtrace): Remove.
      (struct catchtag): Remove backlist field.
      * src/data.c (let_shadows_buffer_binding_p, let_shadows_global_binding_p):
      Move to eval.c.
      (Flocal_variable_p): Speed up the common case where the binding is
      already loaded.
      * src/eval.c (backtrace_list): Remove.
      (set_specpdl_symbol, set_specpdl_old_value): Remove.
      (set_backtrace_args, set_backtrace_nargs)
      (set_backtrace_debug_on_exit, backtrace_p, backtrace_top)
      (backtrace_next): New functions.
      (Fdefvaralias, Fdefvar): Adjust to new specpdl format.
      (unwind_to_catch, internal_lisp_condition_case)
      (internal_condition_case, internal_condition_case_1)
      (internal_condition_case_2, internal_condition_case_n): Don't bother
      with backtrace_list any more.
      (Fsignal): Adjust to new backtrace format.
      (grow_specpdl): Move up.
      (record_in_backtrace): New function.
      (eval_sub, Ffuncall): Use it.
      (apply_lambda): Adjust to new backtrace format.
      (let_shadows_buffer_binding_p, let_shadows_global_binding_p): Move from
      data.c.
      (specbind): Adjust to new specpdl format.  Simplify.
      (record_unwind_protect, unbind_to): Adjust to new specpdl format.
      (Fbacktrace_debug, Fbacktrace, Fbacktrace_frame): Adjust to new
      backtrace format.
      (mark_backtrace): Remove.
      (mark_specpdl, get_backtrace, backtrace_top_function): New functions.
      * src/xdisp.c (redisplay_internal): Use record_in_backtrace.
      * src/alloc.c (Fgarbage_collect): Use record_in_backtrace.
      Use mark_specpdl.
      * src/profiler.c (record_backtrace): Use get_backtrace.
      (handle_profiler_signal): Use backtrace_top_function.
      * src/.gdbinit (xbacktrace, hookpost-backtrace): Use new backtrace
      accessor functions.
      2f592f95
  11. 02 Apr, 2013 1 commit
    • Paul Eggert's avatar
      Prefer < to > in range checks such as 0 <= i && i < N. · 7216e43b
      Paul Eggert authored
      This makes it easier to visualize quantities on a number line.
      This patch doesn't apply to all such range checks,
      only to the range checks affected by the 2013-03-24 change.
      This patch reverts most of the 2013-03-24 change.
      * alloc.c (xpalloc, Fgarbage_collect):
      * ccl.c (ccl_driver, resolve_symbol_ccl_program):
      * character.c (string_escape_byte8):
      * charset.c (read_hex):
      * data.c (cons_to_unsigned):
      * dispnew.c (update_frame_1):
      * doc.c (Fsubstitute_command_keys):
      * doprnt.c (doprnt):
      * editfns.c (hi_time, decode_time_components):
      * fileio.c (file_offset):
      * fns.c (larger_vector, make_hash_table, Fmake_hash_table):
      * font.c (font_intern_prop):
      * frame.c (x_set_alpha):
      * gtkutil.c (get_utf8_string):
      * indent.c (check_display_width):
      * keymap.c (Fkey_description):
      * lisp.h (FIXNUM_OVERFLOW_P, vcopy):
      * lread.c (read1):
      * minibuf.c (read_minibuf_noninteractive):
      * process.c (wait_reading_process_output):
      * search.c (Freplace_match):
      * window.c (get_phys_cursor_glyph):
      * xdisp.c (redisplay_internal):
      * xsmfns.c (smc_save_yourself_CB):
      Prefer < to > for range checks.
      * dispnew.c (sit_for): Don't mishandle NaNs.
      This fixes a bug introduced in the 2013-03-24 change.
      * editfns.c (decode_time_components): Don't hoist comparison.
      This fixes another bug introduced in the 2013-03-24 change.
      7216e43b
  12. 28 Mar, 2013 1 commit
    • Dmitry Antipov's avatar
      * window.h (struct window): Replace hchild, vchild and buffer slots · e74aeda8
      Dmitry Antipov authored
      with the only contents slot.  This is possible because each valid
      window may have either the child window (in vertical or horizontal
      combination) or buffer to display (for the leaf window).  Using that,
      a lof of operations to traverse and/or change window hierarchies may
      be simplified.  New member horizontal is used to distinguish between
      horizontal and vertical combinations of internal windows.
      (WINDOW_LEAF_P, WINDOW_HORIZONTAL_COMBINATION_P)
      (WINDOW_VERTICAL_COMBINATION_P): New macros.
      (WINDOW_VALID_P, WINDOW_LIVE_P): Adjust to match struct window changes.
      * window.c (wset_hchild, wset_vchild): Remove.  Adjust all users.
      Use contents slot, not buffer, where appropriate.
      (wset_combination): New function.
      (wset_buffer): Add eassert.
      (Fframe_first_window): Simplify the loop reaching first window.
      (Fwindow_buffer): Use WINDOW_LEAF_P.
      (Fwindow_top_child): Use WINDOW_VERTICAL_COMBINATION_P.
      (Fwindow_left_child): Use WINDOW_HORIZONTAL_COMBINATION_P.
      (unshow_buffer): Convert initial debugging check to eassert.
      (replace_window, recombine_windows, Fdelete_other_windows_internal)
      (make_parent_window, window_resize_check, window_resize_apply)
      (resize_frame_windows, Fsplit_window_internal, Fdelete_window_internal)
      (Fset_window_configuration, delete_all_child_windows, save_window_save):
      Adjust to match struct window changes.
      (window_loop): Check for broken markers in CHECK_ALL_WINDOWS.
      (mark_window_cursors_off, count_windows, get_leaf_windows)
      (foreach_window_1): Simplify the loop.
      * alloc.c (mark_object): Do not check for the leaf window because
      internal windows has no glyph matrices anyway.
      * dispnew.c (clear_window_matrices, showing_window_margins_p)
      (allocate_matrices_for_window_redisplay, fake_current_matrices)
      (allocate_matrices_for_frame_redisplay, free_window_matrices)
      (build_frame_matrix_from_window_tree, mirror_make_current)
      (frame_row_to_window, mirror_line_dance, check_window_matrix_pointers)
      (update_window_tree, set_window_update_flags): Simplify the loop.
      (sync_window_with_frame_matrix_rows): Enforce live window.
      Use contents slot, not buffer, where appropriate.
      * frame.c (set_menu_bar_lines_1): Use WINDOW_VERTICAL_COMBINATION_P
      and WINDOW_HORIZONTAL_COMBINATION_P.
      (make_frame_visible_1): Simplify the loop.
      Use contents slot, not buffer, where appropriate.
      * xdisp.c (hscroll_window_tree, mark_window_display_accurate)
      (redisplay_windows, redisplay_mode_lines, update_cursor_in_window_tree)
      (expose_window_tree): Likewise.
      Use contents slot, not buffer, where appropriate.
      * textprop.c (get_char_property_and_overlay): Add CHECK_LIVE_WINDOW
      to avoid deleted windows.  Use contents slot instead of buffer.
      * buffer.c, dispextern.h, editfns.c, fileio.c, font.c, fringe.c:
      * indent.c, insdel.c, keyboard.c, keymap.c, minibuf.c, msdos.c:
      * nsfns.m, nsmenu.m, nsterm.m, print.c, w32fns.c, w32menu.c, xfaces.c:
      * xfns.c, xmenu.c: Use contents slot, not buffer, where appropriate.
      e74aeda8
  13. 24 Mar, 2013 1 commit
    • Andreas Schwab's avatar
      Reorder conditions that are written backwards · 908589fd
      Andreas Schwab authored
      * alloc.c (xpalloc, Fgarbage_collect): Reorder conditions that are
      written backwards.
      * blockinput.h (input_blocked_p): Likewise.
      * bytecode.c (exec_byte_code): Likewise.
      * callproc.c (call_process_kill, call_process_cleanup)
      (Fcall_process): Likewise.
      * ccl.c (ccl_driver, resolve_symbol_ccl_program)
      (Fccl_execute_on_string): Likewise.
      * character.c (string_escape_byte8): Likewise.
      * charset.c (read_hex): Likewise.
      * cm.c (calccost): Likewise.
      * data.c (cons_to_unsigned): Likewise.
      * dired.c (directory_files_internal, file_name_completion):
      Likewise.
      * dispnew.c (scrolling_window, update_frame_1, Fsleep_for)
      (sit_for): Likewise.
      * doc.c (Fsubstitute_command_keys): Likewise.
      * doprnt.c (doprnt): Likewise.
      * editfns.c (hi_time, decode_time_components, Fformat): Likewise.
      * emacsgtkfixed.c: Likewise.
      * fileio.c (file_offset, Fwrite_region): Likewise.
      * floatfns.c (Fexpt, fmod_float): Likewise.
      * fns.c (larger_vector, make_hash_table, Fmake_hash_table):
      Likewise.
      * font.c (font_intern_prop): Likewise.
      * frame.c (x_set_alpha): Likewise.
      * gtkutil.c (get_utf8_string): Likewise.
      * indent.c (check_display_width): Likewise.
      * intervals.c (create_root_interval, rotate_right, rotate_left)
      (split_interval_right, split_interval_left)
      (adjust_intervals_for_insertion, delete_node)
      (interval_deletion_adjustment, adjust_intervals_for_deletion)
      (merge_interval_right, merge_interval_left, copy_intervals)
      (set_intervals_multibyte_1): Likewise.
      * keyboard.c (gobble_input, append_tool_bar_item): Likewise.
      * keymap.c (Fkey_description): Likewise.
      * lisp.h (FIXNUM_OVERFLOW_P, vcopy): Likewise.
      * lread.c (openp, read_integer, read1, string_to_number):
      Likewise.
      * menu.c (ensure_menu_items): Likewise.
      * minibuf.c (read_minibuf_noninteractive): Likewise.
      * print.c (printchar, strout): Likewise.
      * process.c (create_process, Faccept_process_output)
      (wait_reading_process_output, read_process_output, send_process)
      (wait_reading_process_output): Likewise.
      * profiler.c (make_log, handle_profiler_signal): Likewise.
      * regex.c (re_exec): Likewise.
      * regex.h: Likewise.
      * search.c (looking_at_1, Freplace_match): Likewise.
      * sysdep.c (get_child_status, procfs_ttyname)
      (procfs_get_total_memory): Likewise.
      * systime.h (EMACS_TIME_VALID_P): Likewise.
      * term.c (dissociate_if_controlling_tty): Likewise.
      * window.c (get_phys_cursor_glyph): Likewise.
      * xdisp.c (init_iterator, redisplay_internal, redisplay_window)
      (try_window_reusing_current_matrix, try_window_id, pint2hrstr):
      Likewise.
      * xfns.c (Fx_window_property): Likewise.
      * xmenu.c (set_frame_menubar): Likewise.
      * xselect.c (x_get_window_property, x_handle_dnd_message):
      Likewise.
      * xsmfns.c (smc_save_yourself_CB): Likewise.
      * xterm.c (x_scroll_bar_set_handle): Likewise.
      908589fd
  14. 21 Mar, 2013 2 commits
    • Paul Eggert's avatar
      Use functions and constants to manipulate Lisp_Save_Value objects. · 7b1123d8
      Paul Eggert authored
      This replaces code that used macros and strings and token-pasting.
      The change makes the C source a bit easier to follow,
      and shrinks the Emacs executable a bit.
      * alloc.c: Verify some properties of Lisp_Save_Value's representation.
      (make_save_value): Change 1st arg from string to enum.  All callers
      changed.
      (INTX): Remove.
      (mark_object): Use if, not #if, for GC_MARK_STACK.
      * lisp.h (SAVE_VALUEP, XSAVE_VALUE, XSAVE_POINTER, XSAVE_INTEGER)
      (XSAVE_OBJECT): Now functions, not macros.
      (STRING_BYTES_BOUND): Now just a macro, not a constant too;
      the constant was never used.
      (SAVE_SLOT_BITS, SAVE_VALUE_SLOTS, SAVE_TYPE_BITS, SAVE_TYPE_INT_INT)
      (SAVE_TYPE_INT_INT_INT, SAVE_TYPE_OBJ_OBJ, SAVE_TYPE_OBJ_OBJ_OBJ)
      (SAVE_TYPE_OBJ_OBJ_OBJ_OBJ, SAVE_TYPE_PTR_INT, SAVE_TYPE_PTR_OBJ)
      (SAVE_TYPE_PTR_PTR, SAVE_TYPE_PTR_PTR_OBJ, SAVE_TYPE_MEMORY):
      New constants.
      (struct Lisp_Save_Value): Replace members area, type0, type1, type2,
      type3 with a single member save_type.  All uses changed.
      (save_type, set_save_pointer, set_save_integer): New functions.
      * print.c (PRINTX): Remove.
      7b1123d8
    • Paul Eggert's avatar
      d6723bf7
  15. 19 Mar, 2013 1 commit
  16. 13 Mar, 2013 1 commit
    • Paul Eggert's avatar
      Static checking by Sun C 5.12. · d9df6f40
      Paul Eggert authored
      * lib-src/etags.c (analyse_regex): Omit unreachable code.
      * src/alloc.c (buffer_memory_full) [REL_ALLOC]:
      * src/bytecode.c (exec_byte_code):
      * src/dispnew.c (init_display):
      * src/eval.c (error):
      * src/fileio.c (Fsubstitute_in_file_name):
      * src/keyboard.c (Fevent_convert_list):
      * src/keymap.c (Fsingle_key_description):
      * src/term.c (maybe_fatal, fatal):
      * src/xfns.c (Fx_display_backing_store, Fx_display_visual_class):
      * src/xsmfns.c (Fhandle_save_session):
      Omit unreachable code.
      * src/keymap.c (map_keymap_char_table_item): Cast void * to
      a function pointer type; the C Standard requires this.
      d9df6f40
  17. 08 Feb, 2013 1 commit
    • Dmitry Antipov's avatar
      * lisp.h (make_uninit_vector): New function. · 25721f5b
      Dmitry Antipov authored
      * alloc.c (Fvector, Fmake_byte_code):
      * ccl.c (Fregister_ccl_program):
      * charset.c (Fdefine_charset_internal, define_charset_internal):
      * coding.c (make_subsidiaries, Fdefine_coding_system_internal):
      * composite.c (syms_of_composite):
      * font.c (Fquery_font, Ffont_info, syms_of_font):
      * fontset.c (FONT_DEF_NEW, Fset_fontset_font):
      * ftfont.c (ftfont_shape_by_flt):
      * indent.c (recompute_width_table):
      * nsselect.m (clean_local_selection_data):
      * syntax.c (init_syntax_once):
      * w32unsubscribe.c (uniscribe_shape):
      * window.c (Fcurrent_window_configuration):
      * xfaces.c (Fx_family_fonts):
      * xselect.c (selection_data_to_lisp_data): Use it.
      25721f5b
  18. 23 Jan, 2013 1 commit
    • Stefan Monnier's avatar
      * src/xdisp.c (message2, message2_nolog): Remove functions. · b09cca6a
      Stefan Monnier authored
      (message3, message3_nolog): Extract nbytes and multibyteness directly
      from the string.  Change all callers.
      (message3_nolog): Don't set message_enable_multibyte since set_message
      will reset it anyway.
      (message1, message1_nolog): Use message3.
      (vmessage): Use a stack allocated buffer rather than f->message_buf.
      (with_echo_area_buffer): Remove last two arguments.  Update all callers.
      (set_message): Drop all but the second arg, which has to be a string.
      (set_message_1): Simplify now that we know that a1 is NULL and the
      second arg is a string.
      * src/frame.h (struct frame): Remove `message_buf' field.
      Use glyphs_initialized_p instead.
      (FRAME_MESSAGE_BUF): Remove macro.
      * src/w16select.c (Fw16_set_clipboard_data): Prefer message3 to message2.
      * src/lisp.h (message2, message2_nolog): Remove declarations.
      (message3, message3_nolog): Update declarations.
      * src/keyboard.c (read_char_minibuf_menu_text)
      (read_char_minibuf_menu_width): Remove vars.
      (read_char_minibuf_menu_prompt): Rewrite the menu's construction so as
      to correctly handle multibyte strings.
      * src/frame.c (delete_frame): Don't free message_buf any more.
      * src/editfns.c (message_text, message_length): Remove vars.
      (Fmessage_box): Don't copy the Lisp string's bytes any longer.
      * src/fileio.c (auto_save_error): Use message3 instead of message2.
      * src/dispnew.c (adjust_frame_message_buffer): Remove function.
      b09cca6a
  19. 17 Jan, 2013 1 commit
    • Dmitry Antipov's avatar
      * lisp.h (toplevel): Add comment about using Lisp_Save_Value · 468afbac
      Dmitry Antipov authored
      objects, related functions and macros.
      (make_save_value): Adjust prototype.
      (make_save_pointer): New prototype.
      (SAFE_NALLOCA): Fix indentation.  Use make_save_pointer.
      (SAFE_ALLOCA_LISP): Adjust make_save_value usage.
      * alloc.c (format_save_value): Rename to make_save_value.
      (make_save_pointer): New function.
      (record_xmalloc): Use make_save_pointer.
      * dired.c, editfns.c, fileio.c, font.c, gtkutil.c, lread.c:
      * nsmenu.m, nsterm.m, xfns.c, xmenu.c, xselect.c, keymap.c:
      Change users of make_save_value to make_save_pointer.
      Likewise for format_save_value and make_save_value.
      468afbac
  20. 15 Jan, 2013 3 commits
    • Paul Eggert's avatar
      * src/alloc.c (free_save_value): Now static. · 963ea40f
      Paul Eggert authored
      963ea40f
    • Dmitry Antipov's avatar
      * src/lisp.h (XSAVE_POINTER, XSAVE_INTEGER): Change to allow extraction · 2b30549c
      Dmitry Antipov authored
      from any Lisp_Save_Value slot.  Add type checking.
      * src/alloc.c, src/dired.c, src/editfns.c, src/fileio.c, src/ftfont.c:
      * src/gtkutil.c, src/keymap.c, src/lread.c, src/nsterm.h, src/nsmenu.c:
      * src/xfns.c, src/xmenu.c, src/xselect.c: All users changed.
      * admin/coccinelle/xsave.cocci: Semantic patch to adjust users of
      XSAVE_POINTER and XSAVE_INTEGER macros.
      2b30549c
    • Dmitry Antipov's avatar
      Some convenient bits to deal with Lisp_Save_Values. · 1b971ac1
      Dmitry Antipov authored
      * lisp.h (XSAVE_OBJECT): New macro to extract saved objects.
      (allocate_misc): Remove prototype.
      (format_save_value): New prototype.
      * alloc.c (allocate_misc): Revert back to static.
      (format_save_value): New function to build Lisp_Save_Value
      object with the specified internal structure.
      (make_save_value): Reimplement using format_save_value.
      * editfns.c (save_excursion_save): Use format_save_value.
      (save_excursion_restore): Use XSAVE_OBJECT.
      1b971ac1
  21. 14 Jan, 2013 2 commits
    • Paul Eggert's avatar
      Avoid needless casts with XSAVE_POINTER. · c50cf2ea
      Paul Eggert authored
      * alloc.c (mark_object) [GC_MARK_STACK]:
      * dired.c (directory_files_internal_unwind):
      * fileio.c (do_auto_save_unwind):
      * gtkutil.c (pop_down_dialog):
      * keymap.c (map_keymap_char_table_item):
      * lread.c (load_unwind):
      * nsmenu.m (pop_down_menu):
      * print.c (print_object) [GC_MARK_STACK]:
      * xfns.c (clean_up_file_dialog):
      * xmenu.c (cleanup_widget_value_tree):
      Omit casts between XSAVE_POINTER and a pointer type.
      c50cf2ea
    • Dmitry Antipov's avatar
      Make Lisp_Save_Value more versatile storage for up to four objects. · 73ebd38f
      Dmitry Antipov authored
      * lisp.h (toplevel): Enumeration to describe types of saved objects.
      (struct Lisp_Save_Value): New layout.  Adjust comments.
      (XSAVE_POINTER): New macro.
      (XSAVE_INTEGER): Likewise.
      (allocate_misc): Add prototype.
      (free_misc): Likewise.
      * alloc.c (allocate_misc): Now global.
      (free_misc): Likewise.  Adjust comment.
      (make_save_value): Use new Lisp_Save_Value layout.  Adjust comment.
      (free_save_value): Likewise.
      (mark_object): Likewise.
      * editfns.c (save_excursion_save): Pack everything within
      Lisp_Save_Value and so avoid xmalloc.
      (save_excursion_restore): Adjust to match new layout.  Use free_misc
      because we do not allocate extra memory any more.  Add eassert.
      * print.c (print_object): New code to print Lisp_Save_Value.  Do not
      rely on valid_lisp_object_p if !GC_MARK_STACK.  Adjust comments.
      * dired.c, fileio.c, font.c, ftfont.c, gtkutil.c, keymap.c,
      * lread.c, nsmenu.m, nsterm.h, xfns.c, xmenu.c, xselect.c:
      Use XSAVE_POINTER and XSAVE_INTEGER where appropriate.
      73ebd38f
  22. 12 Jan, 2013 1 commit
  23. 01 Jan, 2013 1 commit
  24. 26 Dec, 2012 1 commit
  25. 08 Dec, 2012 1 commit
    • Paul Eggert's avatar
      Use putenv+unsetenv instead of modifying environ directly. · 5745a7df
      Paul Eggert authored
      * admin/merge-gnulib (GNULIB_MODULES): Add putenv, unsetenv.
      * lib/putenv.c, lib/unsetenv.c, m4/putenv.m4, m4/setenv.m4:
      New files, copied automatically from gnulib.
      * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
      * src/alloc.c (xputenv): New function.
      * src/dbusbind.c (Fdbus_init_bus):
      * src/emacs.c (main):
      * src/xterm.c (x_term_init):
      Use xputenv instead of setenv or putenv, to detect memory exhaustion.
      * src/editfns.c (initial_tz): Move static var decl up.
      (tzvalbuf_in_environ): New static var.
      (init_editfns):	Initialize these two static vars.
      (Fencode_time): Don't assume arbitrary limit on EMACS_INT width.
      Save old TZ value on stack, if it's small.
      (Fencode_time, set_time_zone_rule): Don't modify 'environ' directly;
      instead, use xputenv+unsetenv to set and restore TZ.
      (environbuf): Remove static var.  All uses removed.
      (Fset_time_zone_rule): Do not save TZ and environ;
      no longer needed here.
      (set_time_zone_rule_tz1, set_time_zone_rule_tz2) [LOCALTIME_CACHE]:
      Move to inside set_time_zone_rule; they don't need file scope any more.
      (set_time_zone_rule): Maintain the TZ=value string separately.
      (syms_of_editfns): Don't initialize initial_tz;
      init_editfns now does it.
      * src/emacs.c (dump_tz) [HAVE_TZSET]: Now const.
      * src/lisp.h (xputenv): New decl.
      
      Fixes: debbugs:13070
      5745a7df
  26. 03 Dec, 2012 1 commit
    • Dmitry Antipov's avatar
      * alloc.c (free_save_value): New function. · 62c2e5ed
      Dmitry Antipov authored
      (safe_alloca_unwind): Use it.
      * lisp.h (free_save_value): New prototype.
      * editfns.c (save_excursion_save): Use Lisp_Misc_Save_Value.
      Add comment.
      (save_excursion_restore): Adjust to match saved data structure.
      Use free_save_value to offload some work from GC.  Drop obsolete
      #if 0 code.
      62c2e5ed
  27. 02 Dec, 2012 1 commit
    • Paul Eggert's avatar
      Fix xpalloc confusion after memory is exhausted. · 2dd2e622
      Paul Eggert authored
      * alloc.c (xpalloc): Comment fix.
      * charset.c (Fdefine_charset_internal): If xpalloc exhausts memory
      and signals an error, do not clear charset_table_size, as
      charset_table is still valid.
      * doprnt.c (evxprintf): Clear *BUF after freeing it.
      2dd2e622
  28. 22 Nov, 2012 1 commit
    • Dmitry Antipov's avatar
      * alloc.c (Fgarbage_collect): Unblock input after clearing · 5c747675
      Dmitry Antipov authored
      gc_in_progress to avoid note_mouse_highlight glitch with GC.
      * frame.h (FRAME_MOUSE_UPDATE): New macro.
      * msdos.c (IT_frame_up_to_date): Use it here...
      * w32term.c (w32_frame_up_to_date): ...here...
      * xterm.c (XTframe_up_to_date): ...and here...
      * nsterm.m (ns_frame_up_to_date): ...but not here.
      * lisp.h (Mouse_HLInfo): Remove mouse_face_deferred_gc member.
      Adjust users.
      * xdisp.c (message2_nolog, message3_nolog, note_mouse_highlight):
      Do not check whether GC is in progress.
      5c747675
  29. 21 Nov, 2012 1 commit
    • Paul Eggert's avatar
      Assume POSIX 1003.1-1988 or later for unistd.h. · 9239d970
      Paul Eggert authored
      * admin/CPP-DEFINES (BROKEN_GETWD, HAVE_GETCWD, HAVE_GETWD, HAVE_SIZE_T)
      (HAVE_UNISTD_H): Remove.
      * configure.ac: Do not check for getcwd or getwd.
      * lib-src/emacsclient.c (getcwd): Remove decl.
      (get_current_dir_name): Assume getcwd exists.
      * lib-src/etags.c (HAVE_GETCWD): Remove.
      (getcwd): Remove decl.
      (NO_LONG_OPTIONS): Remove this.  All uses removed.
      Emacs always has GNU getopt.
      (etags_getcwd): Assume getcwd exists.
      * lib-src/movemail.c (F_OK, X_OK, W_OK, R_OK): Remove.
      * nt/config.nt (HAVE_GETCWD): Remove.
      * src/alloc.c: Assume unistd.h exists.
      * src/fileio.c (Fexpand_file_name) [DOS_NT]: Use getcwd, not getwd.
      * src/sysdep.c (get_current_dir_name): Assume getcwd exists.
      (getwd) [USG]: Remove; no longer needed.
      (sys_subshell) [DOS_NT]: Use getcwd, not getwd.
      * src/w32.c (getcwd): Rename from getwd, and switch to getcwd's API.
      * src/w32.h (getcwd): Remove decl.
      
      Fixes: debbugs:12945
      9239d970
  30. 20 Nov, 2012 1 commit
    • Stefan Monnier's avatar
      Conflate Qnil and Qunbound for `symbol-function'. · eadf1faa
      Stefan Monnier authored
      * src/alloc.c (Fmake_symbol): Initialize `function' to Qnil.
      * src/lread.c (init_obarray): Set `function' fields to Qnil.
      * src/eval.c (Fcommandp): Ignore Qunbound.
      (Fautoload, eval_sub, Fapply, Ffuncall, Fmacroexpand):
      * src/data.c (Ffset, Ffboundp, indirect_function, Findirect_function):
      Test NILP rather than Qunbound.
      (Ffmakunbound): Set to Qnil.
      (Fsymbol_function): Never signal an error.
      (Finteractive_form): Ignore Qunbound.
      eadf1faa
  31. 12 Nov, 2012 1 commit
    • Paul Eggert's avatar
      Another tweak to vectorlike_header change. · 76ae24d7
      Paul Eggert authored
      * alloc.c (struct Lisp_Vectorlike_Free, NEXT_IN_FREE_LIST):
      Remove, and replace all uses with ...
      (next_in_free_list, set_next_in_free_list):
      New functions, which respect C's aliasing rules better.
      76ae24d7
  32. 09 Nov, 2012 1 commit
  33. 08 Nov, 2012 2 commits
    • Stefan Monnier's avatar
      Use ad-hoc comparison function for the profiler's hash-tables. · b7432bb2
      Stefan Monnier authored
      * src/profiler.c (Qprofiler_backtrace_equal, hashtest_profiler): New vars.
      (make_log): Use them.
      (handle_profiler_signal): Don't inhibit quit any longer since we don't
      call Fequal any more.
      (Ffunction_equal): New function.
      (cmpfn_profiler, hashfn_profiler): New functions.
      (syms_of_profiler): Initialize them.
      * src/lisp.h (struct hash_table_test): New struct.
      (struct Lisp_Hash_Table): Use it.
      * src/alloc.c (mark_object): Mark hash_table_test fields of hash tables.
      * src/fns.c (make_hash_table): Take a struct to describe the test.
      (cmpfn_eql, cmpfn_equal, cmpfn_user_defined, hashfn_eq, hashfn_eql)
      (hashfn_equal, hashfn_user_defined): Adjust to new calling convention.
      (hash_lookup, hash_remove_from_table): Move assertion checking of
      hashfn result here.  Check hash-equality before calling cmpfn.
      (Fmake_hash_table): Adjust call to make_hash_table.
      (hashtest_eq, hashtest_eql, hashtest_equal): New structs.
      (syms_of_fns): Initialize them.
      * src/emacs.c (main): Move syms_of_fns earlier.
      * src/xterm.c (syms_of_xterm):
      * src/category.c (hash_get_category_set): Adjust call to make_hash_table.
      * src/print.c (print_object): Adjust to new hash-table struct.
      * src/composite.c (composition_gstring_put_cache): Adjust to new hashfn.
      b7432bb2
    • Dmitry Antipov's avatar
      Shrink struct vectorlike_header to the only size field. · 914adc42
      Dmitry Antipov authored
      * lisp.h (enum pvec_type): Avoid explicit enum member values.
      Adjust comment.
      (enum More_Lisp_Bits): Change PSEUDOVECTOR_SIZE_BITS and
      PVEC_TYPE_MASK to arrange new bitfield in the vector header.
      (PSEUDOVECTOR_REST_BITS, PSEUDOVECTOR_REST_MASK): New members.
      (PSEUDOVECTOR_AREA_BITS): New member used to extract subtype
      information from the vector header.  Adjust comment.
      (XSETPVECTYPE, XSETPVECTYPESIZE, XSETTYPED_PSEUDOVECTOR)
      (PSEUDOVECTOR_TYPEP, DEFUN): Adjust to match new vector header
      layout.
      (XSETSUBR, SUBRP): Adjust to match new Lisp_Subr layout.
      (struct vectorlike_header): Remove next member.  Adjust comment.
      (struct Lisp_Subr): Add convenient header.  Adjust comment.
      (allocate_pseudovector): Adjust prototype.
      * alloc.c (mark_glyph_matrix, mark_face_cache, allocate_string)
      (sweep_string, lisp_malloc): Remove useless prototypes.
      (enum mem_type): Adjust comment.
      (NEXT_IN_FREE_LIST): New macro.
      (SETUP_ON_FREE_LIST): Adjust XSETPVECTYPESIZE usage.
      (Fmake_bool_vector): Likewise.
      (struct large_vector): New type to represent allocation unit for
      the vectors with the memory footprint more than VBLOOCK_BYTES_MAX.
      (large_vectors): Change type to struct large_vector.
      (allocate_vector_from_block): Simplify.
      (PSEUDOVECTOR_NBYTES): Replace with...
      (vector_nbytes): ...new function.  Adjust users.
      (sweep_vectors): Adjust processing of large vectors.
      (allocate_vectorlike): Likewise.
      (allocate_pseudovector): Change type of 3rd arg to enum pvec_type.
      Add easserts.  Adjust XSETPVECTYPESIZE usage.
      (allocate_buffer): Use BUFFER_PVEC_INIT.
      (live_vector_p): Adjust to match large vector.
      * buffer.c (init_buffer_once): Use BUFFER_PVEC_INIT.
      * buffer.h (struct buffer): Add next member.
      (BUFFER_LISP_SIZE, BUFFER_REST_SIZE, BUFFER_PVEC_INIT):
      New macros.
      (FOR_EACH_BUFFER): Adjust to match struct buffer change.
      * fns.c (internal_equal): Adjust to match enum pvec_type change.
      (copy_hash_table): Adjust to match vector header change.
      * lread.c (defsubr): Use XSETPVECTYPE.
      * .gdbinit (xpr, xbacktrace): Adjust to match vector header change.
      (xvectype): Likewise.  Print PVEC_NORMAL_VECTOR for regular vectors.
      (xvecsize): New command.
      914adc42