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.
This commit is contained in:
parent
3804652098
commit
b286858c7a
5 changed files with 80 additions and 44 deletions
|
@ -1,3 +1,20 @@
|
|||
2011-02-18 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* 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 <jan.h.d@swipnet.se>
|
||||
|
||||
* 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 <tromey@redhat.com>
|
||||
|
||||
|
@ -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 <eggert@cs.ucla.edu>
|
||||
|
@ -722,7 +739,7 @@
|
|||
2011-02-01 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
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.
|
||||
|
|
10
src/alloc.c
10
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 ();
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue