From: Stefan Monnier Date: Fri, 18 Feb 2011 02:07:36 +0000 (-0500) Subject: Don't GC-scan stack data redundantly. X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~829 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b286858c7a0d5dafa302b9e88970c13385358a6a;p=emacs.git Don't GC-scan stack data redundantly. * src/alloc.c (Fgarbage_collect): When using stack scanning, don't redundantly scan byte-code stacks, catchlist, and handlerlist. * src/bytecode.c (BYTE_MAINTAIN_TOP): New macros. (struct byte_stack): Only define `top' and `bottom' if used. (mark_byte_stack): Only define if used. (BEFORE_POTENTIAL_GC, AFTER_POTENTIAL_GC): Nullify if BYTE_MAINTAIN_TOP is not set. (Fbyte_code): Don't set `bottom' unless BYTE_MAINTAIN_TOP is set. * src/lisp.h (BYTE_MARK_STACK): New macro. (mark_byte_stack): Only declare if BYTE_MARK_STACK is set. * src/term.c (OUTPUT_IF): Use OUTPUT. --- diff --git a/src/ChangeLog b/src/ChangeLog index 048fc7f052d..9fbc83f6c0c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,20 @@ +2011-02-18 Stefan Monnier + + * lisp.h (BYTE_MARK_STACK): New macro. + (mark_byte_stack): Only declare if BYTE_MARK_STACK is set. + + * bytecode.c (BYTE_MAINTAIN_TOP): New macros. + (struct byte_stack): Only define `top' and `bottom' if used. + (mark_byte_stack): Only define if used. + (BEFORE_POTENTIAL_GC, AFTER_POTENTIAL_GC): Nullify if BYTE_MAINTAIN_TOP + is not set. + (Fbyte_code): Don't set `bottom' unless BYTE_MAINTAIN_TOP is set. + + * term.c (OUTPUT_IF): Use OUTPUT. + + * alloc.c (Fgarbage_collect): When using stack scanning, don't + redundantly scan byte-code stacks, catchlist, and handlerlist. + 2011-02-17 Jan Djärv * nsfns.m (Fx_create_frame, ns_set_name_as_filename) @@ -18,8 +35,8 @@ * xdisp.c (decode_mode_spec): Don't use MODE_LINE_BINARY_TEXT. - * fileio.c (Finsert_file_contents, Fwrite_region): Remove - references to buffer_file_type. + * fileio.c (Finsert_file_contents, Fwrite_region): + Remove references to buffer_file_type. (syms_of_fileio): Don't intern and staticpro find-buffer-file-type. @@ -112,8 +129,8 @@ (strout, print_string, temp_output_buffer_setup, print_object): Replace B_ with BVAR. * msdos.c (IT_frame_up_to_date): Replace B_ with BVAR. - * minibuf.c (read_minibuf, get_minibuffer, Fread_buffer): Replace - B_ with BVAR. + * minibuf.c (read_minibuf, get_minibuffer, Fread_buffer): + Replace B_ with BVAR. * marker.c (Fmarker_buffer, Fset_marker, set_marker_restricted) (set_marker_both, set_marker_restricted_both, unchain_marker): Replace B_ with BVAR. @@ -275,8 +292,8 @@ * xmenu.c (apply_systemfont_to_dialog): Apply to *dialog.font. (apply_systemfont_to_menu): Set resources *menubar*font and *popup*font. Remove defflt. - (set_frame_menubar, create_and_show_popup_menu): Call - apply_systemfont_to_menu before lw_create_widget. + (set_frame_menubar, create_and_show_popup_menu): + Call apply_systemfont_to_menu before lw_create_widget. 2011-02-14 Tom Tromey @@ -305,8 +322,8 @@ (PRINTPREPARE, PRINTFINISH, temp_output_buffer_setup) (print_object): Use B_. * font.c (font_at): Use B_. - * fns.c (Fbase64_encode_region, Fbase64_decode_region, Fmd5): Use - B_. + * fns.c (Fbase64_encode_region, Fbase64_decode_region, Fmd5): + Use B_. * callint.c (check_mark, Fcall_interactively): Use B_. * editfns.c (region_limit, Fmark_marker, save_excursion_save) (save_excursion_restore, Fprevious_char, Fchar_before) @@ -329,8 +346,8 @@ (Freplace_match): Use B_. * indent.c (buffer_display_table, recompute_width_table) (width_run_cache_on_off, current_column, scan_for_column) - (Findent_to, position_indentation, compute_motion, vmotion): Use - B_. + (Findent_to, position_indentation, compute_motion, vmotion): + Use B_. * casefiddle.c (casify_object, casify_region): Use B_. * casetab.c (Fcurrent_case_table, set_case_table): Use B_. * cmds.c (Fself_insert_command, internal_self_insert): Use B_. @@ -344,8 +361,8 @@ (Fdo_auto_save, Fset_buffer_auto_saved): Use B_. * minibuf.c (read_minibuf, get_minibuffer, Fread_buffer): Use B_. * marker.c (Fmarker_buffer, Fset_marker, set_marker_restricted) - (set_marker_both, set_marker_restricted_both, unchain_marker): Use - B_. + (set_marker_both, set_marker_restricted_both, unchain_marker): + Use B_. * insdel.c (check_markers, insert_char, insert_1_both) (insert_from_string_1, insert_from_gap, insert_from_buffer_1) (adjust_after_replace, replace_range, del_range_2) @@ -369,8 +386,8 @@ (make_conversion_work_buffer, decode_coding_gap) (decode_coding_object, encode_coding_object) (Fdetect_coding_region, Ffind_coding_systems_region_internal) - (Funencodable_char_position, Fcheck_coding_systems_region): Use - B_. + (Funencodable_char_position, Fcheck_coding_systems_region): + Use B_. * charset.c (Ffind_charset_region): Use B_. * window.c (window_display_table, unshow_buffer, window_loop) (window_min_size_2, set_window_buffer, Fset_window_buffer) @@ -601,8 +618,8 @@ callers changed. * editfns.c (general_insert_function): Change signature to match changes to insert functions' signatures. - * keymap.c (map_keymap_char_table_item, map_keymap_internal): Use - explicit cast when converting between void * and function pointer + * keymap.c (map_keymap_char_table_item, map_keymap_internal): + Use explicit cast when converting between void * and function pointer types, as C89 requires this. 2011-02-05 Paul Eggert @@ -722,7 +739,7 @@ 2011-02-01 Paul Eggert format-time-string now supports subsecond time stamp resolution - * editfns.c (emacs_nmemftime): Renamed from emacs_memftimeu, + * editfns.c (emacs_nmemftime): Rename from emacs_memftimeu, for consistency with its new argument and with gnulib nstrftime. All callers changed. New argument NS. (Fformat_time_string): Check that the time argument's microseconds @@ -1052,11 +1069,11 @@ (history_delete_duplicates, inhibit_x_resources) (last_nonmenu_event, load_in_progress, max_specpdl_size) (minibuffer_auto_raise, print_escape_newlines, scroll_margin) - (use_dialog_box, use_file_dialog): Remove declaration. Include - globals.h. + (use_dialog_box, use_file_dialog): Remove declaration. + Include globals.h. * keymap.h (Voverriding_local_map) - (Voverriding_local_map_menu_flag, meta_prefix_char): Remove - declaration. + (Voverriding_local_map_menu_flag, meta_prefix_char): + Remove declaration. * keyboard.h (Vdouble_click_time, Vfunction_key_map) (Vinput_method_function, Vkey_translation_map) (Vlucid_menu_bar_dirty_flag, Vthis_original_command) @@ -1074,16 +1091,16 @@ (focus_follows_mouse): Remove declaration. * fontset.h (Valternate_fontname_alist, Vfontset_alias_alist) (Vignore_relative_composition, Votf_script_alist) - (Vuse_default_ascent, Vvertical_centering_font_regexp): Remove - declaration. + (Vuse_default_ascent, Vvertical_centering_font_regexp): + Remove declaration. * font.h (Vfont_log): Remove declaration. * dosfns.h (Vdos_display_scancodes, Vdos_version) (Vdos_windows_version, dos_codepage, dos_country_code) (dos_decimal_point, dos_hyper_key, dos_keyboard_layout) - (dos_keypad_mode, dos_super_key, dos_timezone_offset): Remove - declaration. - * disptab.h (Vglyph_table, Vstandard_display_table): Remove - declaration. + (dos_keypad_mode, dos_super_key, dos_timezone_offset): + Remove declaration. + * disptab.h (Vglyph_table, Vstandard_display_table): + Remove declaration. * dispextern.h (Vface_remapping_alist, Vglyphless_char_display) (Vmouse_autoselect_window, Voverflow_newline_into_fringe) (Vshow_trailing_whitespace, Vtool_bar_button_margin) @@ -1111,10 +1128,10 @@ (Vselect_safe_coding_system_function) (Vtranslation_table_for_input, coding_system_require_warning) (eol_mnemonic_dos, eol_mnemonic_mac, eol_mnemonic_undecided) - (eol_mnemonic_unix, inherit_process_coding_system): Remove - declaration. - * charset.h (Vcharset_list, Vcurrent_iso639_language): Remove - declaration. + (eol_mnemonic_unix, inherit_process_coding_system): + Remove declaration. + * charset.h (Vcharset_list, Vcurrent_iso639_language): + Remove declaration. * character.h (Vauto_fill_chars, Vchar_direction_table) (Vchar_script_table, Vchar_width_table, Vprintable_chars) (Vscript_representative_chars, Vtranslation_table_vector) @@ -1229,8 +1246,8 @@ (w32_strict_fontnames, w32_strict_painting): Remove. (Vhourglass_delay, Vmenu_bar_mode, Vtool_bar_mode) (Vw32_recognize_altgr, Vwindow_system_version) - (w32_num_mouse_buttons, w32_use_visible_system_caret): Remove - declaration. + (w32_num_mouse_buttons, w32_use_visible_system_caret): + Remove declaration. * w32console.c (syms_of_ntterm): Update. (w32_use_full_screen_buffer): Remove. (Vtty_defined_color_alist): Remove declaration. diff --git a/src/alloc.c b/src/alloc.c index 566c6fe00b9..e8b8f45e9b1 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -4842,8 +4842,6 @@ returns nil, because real GC can't be done. */) (void) { register struct specbinding *bind; - struct catchtag *catch; - struct handler *handler; char stack_top_variable; register int i; int message_p; @@ -4972,9 +4970,11 @@ returns nil, because real GC can't be done. */) for (i = 0; i < tail->nvars; i++) mark_object (tail->var[i]); } -#endif - mark_byte_stack (); + { + struct catchtag *catch; + struct handler *handler; + for (catch = catchlist; catch; catch = catch->next) { mark_object (catch->tag); @@ -4985,7 +4985,9 @@ returns nil, because real GC can't be done. */) mark_object (handler->handler); mark_object (handler->var); } + } mark_backtrace (); +#endif #ifdef HAVE_WINDOW_SYSTEM mark_fringe_data (); diff --git a/src/bytecode.c b/src/bytecode.c index a88df080c5a..cf4a1fc225f 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -229,6 +229,8 @@ Lisp_Object Qbytecode; #define Bconstant 0300 #define CONSTANTLIM 0100 +/* Whether to maintain a `top' and `bottom' field in the stack frame. */ +#define BYTE_MAINTAIN_TOP (BYTE_CODE_SAFE || BYTE_MARK_STACK) /* Structure describing a value stack used during byte-code execution in Fbyte_code. */ @@ -241,7 +243,9 @@ struct byte_stack /* Top and bottom of stack. The bottom points to an area of memory allocated with alloca in Fbyte_code. */ +#if BYTE_MAINTAIN_TOP Lisp_Object *top, *bottom; +#endif /* The string containing the byte-code, and its current address. Storing this here protects it from GC because mark_byte_stack @@ -268,6 +272,7 @@ struct byte_stack *byte_stack_list; /* Mark objects on byte_stack_list. Called during GC. */ +#if BYTE_MARK_STACK void mark_byte_stack (void) { @@ -292,7 +297,7 @@ mark_byte_stack (void) mark_object (stack->constants); } } - +#endif /* Unmark objects in the stacks on byte_stack_list. Relocate program counters. Called when GC has completed. */ @@ -346,8 +351,13 @@ unmark_byte_stack (void) /* Actions that must be performed before and after calling a function that might GC. */ +#if !BYTE_MAINTAIN_TOP +#define BEFORE_POTENTIAL_GC() ((void)0) +#define AFTER_POTENTIAL_GC() ((void)0) +#else #define BEFORE_POTENTIAL_GC() stack.top = top #define AFTER_POTENTIAL_GC() stack.top = NULL +#endif /* Garbage collect if we have consed enough since the last time. We do this at every branch, to avoid loops that never GC. */ @@ -447,10 +457,13 @@ If the third argument is incorrect, Emacs may crash. */) stack.byte_string = bytestr; stack.pc = stack.byte_string_start = SDATA (bytestr); stack.constants = vector; - stack.bottom = (Lisp_Object *) alloca (XFASTINT (maxdepth) + top = (Lisp_Object *) alloca (XFASTINT (maxdepth) * sizeof (Lisp_Object)); - top = stack.bottom - 1; +#if BYTE_MAINTAIN_TOP + stack.bottom = top; stack.top = NULL; +#endif + top -= 1; stack.next = byte_stack_list; byte_stack_list = &stack; diff --git a/src/lisp.h b/src/lisp.h index 7cc2a8e7d45..82c4f65613d 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -2145,6 +2145,11 @@ struct gcpro #define GC_MARK_STACK GC_USE_GCPROS_AS_BEFORE #endif +/* Whether we do the stack marking manually. */ +#define BYTE_MARK_STACK !(GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \ + || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS) + + #if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS /* Do something silly with gcproN vars just so gcc shuts up. */ @@ -3253,7 +3258,9 @@ extern Lisp_Object Qbytecode; EXFUN (Fbyte_code, 3); extern void syms_of_bytecode (void); extern struct byte_stack *byte_stack_list; +#ifdef BYTE_MARK_STACK extern void mark_byte_stack (void); +#endif extern void unmark_byte_stack (void); /* Defined in macros.c */ diff --git a/src/term.c b/src/term.c index 21ed163c934..f082bb40e89 100644 --- a/src/term.c +++ b/src/term.c @@ -112,10 +112,7 @@ static void vfatal (const char *str, va_list ap) NO_RETURN; #define OUTPUT_IF(tty, a) \ do { \ if (a) \ - emacs_tputs ((tty), a, \ - (int) (FRAME_LINES (XFRAME (selected_frame)) \ - - curY (tty) ), \ - cmputc); \ + OUTPUT (tty, a); \ } while (0) #define OUTPUT1_IF(tty, a) do { if (a) emacs_tputs ((tty), a, 1, cmputc); } while (0)