X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-winsource.c;h=94ab8c09f6721c906974537ecc3e63b486cfa130;hb=20149b6b207ac8c2bcde6f272607109f566168a9;hp=27edc4ed29cad469acb864f69ae4288c2a69e9a4;hpb=a38da35d7bc89e4c2191d4f042912038c585f36d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c index 27edc4ed29..94ab8c09f6 100644 --- a/gdb/tui/tui-winsource.c +++ b/gdb/tui/tui-winsource.c @@ -44,7 +44,8 @@ void tui_display_main () { - if (!tui_source_windows ().empty ()) + auto adapter = tui_source_windows (); + if (adapter.begin () != adapter.end ()) { struct gdbarch *gdbarch; CORE_ADDR addr; @@ -72,13 +73,10 @@ void tui_update_source_window (struct tui_source_window_base *win_info, struct gdbarch *gdbarch, struct symtab *s, - struct tui_line_or_address line_or_addr, - int noerror) + struct tui_line_or_address line_or_addr) { win_info->horizontal_offset = 0; - tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr, noerror); - - return; + tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr); } @@ -88,27 +86,22 @@ void tui_update_source_window_as_is (struct tui_source_window_base *win_info, struct gdbarch *gdbarch, struct symtab *s, - struct tui_line_or_address line_or_addr, - int noerror) + struct tui_line_or_address line_or_addr) { enum tui_status ret; if (win_info->type == SRC_WIN) - ret = tui_set_source_content (win_info, s, line_or_addr.u.line_no, - noerror); + ret = tui_set_source_content (win_info, s, line_or_addr.u.line_no); else - ret = tui_set_disassem_content (gdbarch, line_or_addr.u.addr); + ret = tui_set_disassem_content (win_info, gdbarch, line_or_addr.u.addr); if (ret == TUI_FAILURE) - { - tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT); - tui_clear_exec_info_content (win_info); - } + win_info->erase_source_content (); else { tui_update_breakpoint_info (win_info, nullptr, false); - tui_show_source_content (win_info); - tui_update_exec_info (win_info); + win_info->show_source_content (); + win_info->update_exec_info (); if (win_info->type == SRC_WIN) { symtab_and_line sal; @@ -125,9 +118,6 @@ tui_update_source_window_as_is (struct tui_source_window_base *win_info, tui_set_win_focus_to (win_info); } } - - - return; } @@ -154,17 +144,14 @@ tui_update_source_windows_with_addr (struct gdbarch *gdbarch, CORE_ADDR addr) sal = find_pc_line (addr, 0); l.loa = LOA_LINE; l.u.line_no = sal.line; - tui_show_symtab_source (TUI_SRC_WIN, gdbarch, sal.symtab, l, FALSE); + tui_show_symtab_source (TUI_SRC_WIN, gdbarch, sal.symtab, l); break; } } else { for (struct tui_source_window_base *win_info : tui_source_windows ()) - { - tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT); - tui_clear_exec_info_content (win_info); - } + win_info->erase_source_content (); } } @@ -192,7 +179,7 @@ tui_update_source_windows_with_line (struct symtab *s, int line) default: l.loa = LOA_LINE; l.u.line_no = line; - tui_show_symtab_source (TUI_SRC_WIN, gdbarch, s, l, FALSE); + tui_show_symtab_source (TUI_SRC_WIN, gdbarch, s, l); if (tui_current_layout () == SRC_DISASSEM_COMMAND) { find_line_pc (s, line, &pc); @@ -200,67 +187,33 @@ tui_update_source_windows_with_line (struct symtab *s, int line) } break; } - - return; } void -tui_clear_source_content (struct tui_source_window_base *win_info, - int display_prompt) +tui_source_window_base::do_erase_source_content (const char *str) { - if (win_info != NULL) - { - int i; + int x_pos; + int half_width = (width - 2) / 2; - win_info->content_in_use = false; - tui_erase_source_content (win_info, display_prompt); - for (i = 0; i < win_info->content.size (); i++) - { - struct tui_source_element *element = &win_info->content[i]; + content.clear (); + if (handle != NULL) + { + werase (handle); + check_and_display_highlight_if_needed (); - element->break_mode = 0; - element->is_exec_point = false; - } - } -} + if (strlen (str) >= half_width) + x_pos = 1; + else + x_pos = half_width - strlen (str); + mvwaddstr (handle, + (height / 2), + x_pos, + (char *) str); + refresh_window (); -void -tui_erase_source_content (struct tui_source_window_base *win_info, - int display_prompt) -{ - int x_pos; - int half_width = (win_info->width - 2) / 2; - - if (win_info->handle != NULL) - { - werase (win_info->handle); - tui_check_and_display_highlight_if_needed (win_info); - if (display_prompt == EMPTY_SOURCE_PROMPT) - { - const char *no_src_str; - - if (win_info->type == SRC_WIN) - no_src_str = NO_SRC_STRING; - else - no_src_str = NO_DISASSEM_STRING; - if (strlen (no_src_str) >= half_width) - x_pos = 1; - else - x_pos = half_width - strlen (no_src_str); - mvwaddstr (win_info->handle, - (win_info->height / 2), - x_pos, - (char *) no_src_str); - - /* elz: Added this function call to set the real contents of - the window to what is on the screen, so that later calls - to refresh, do display the correct stuff, and not the old - image. */ - - tui_set_source_content_nil (win_info, no_src_str); - } - win_info->refresh_window (); + werase (execution_info->handle); + execution_info->refresh_window (); } } @@ -292,21 +245,131 @@ tui_show_source_line (struct tui_source_window_base *win_info, int lineno) } void -tui_show_source_content (struct tui_source_window_base *win_info) +tui_source_window_base::show_source_content () { - if (!win_info->content.empty ()) + if (!content.empty ()) { int lineno; - for (lineno = 1; lineno <= win_info->content.size (); lineno++) - tui_show_source_line (win_info, lineno); + for (lineno = 1; lineno <= content.size (); lineno++) + tui_show_source_line (this, lineno); + } + else + erase_source_content (); + + check_and_display_highlight_if_needed (); + refresh_window (); +} + +/* See tui-data.h. */ + +void +tui_source_window_base::clear_detail () +{ + gdbarch = NULL; + start_line_or_addr.loa = LOA_ADDRESS; + start_line_or_addr.u.addr = 0; + horizontal_offset = 0; +} + +tui_source_window_base::tui_source_window_base (enum tui_win_type type) + : tui_win_info (type), + execution_info (new tui_exec_info_window ()) +{ + gdb_assert (type == SRC_WIN || type == DISASSEM_WIN); + start_line_or_addr.loa = LOA_ADDRESS; + start_line_or_addr.u.addr = 0; +} + + +tui_source_window_base::~tui_source_window_base () +{ + xfree (fullname); + delete execution_info; +} + +void +tui_source_window_base::resize (int height, int width, + int origin_x, int origin_y) +{ + tui_gen_win_info::resize (height, width - 3, + origin_x + 3, origin_y); + execution_info->resize (height, 3, origin_x, origin_y); +} + +/* See tui-data.h. */ + +void +tui_source_window_base::refresh_all () +{ + show_source_content (); + check_and_display_highlight_if_needed (); + update_exec_info (); +} + +/* See tui-data.h. */ + +void +tui_source_window_base::update_tab_width () +{ + werase (handle); + rerender (); +} + +void +tui_source_window_base::rerender () +{ + if (!content.empty ()) + { + struct tui_line_or_address line_or_addr; + struct symtab_and_line cursal + = get_current_source_symtab_and_line (); + + line_or_addr = start_line_or_addr; + tui_update_source_window (this, gdbarch, + cursal.symtab, line_or_addr); + } + else if (deprecated_safe_get_selected_frame () != NULL) + { + struct tui_line_or_address line; + struct symtab_and_line cursal + = get_current_source_symtab_and_line (); + struct frame_info *frame = deprecated_safe_get_selected_frame (); + struct gdbarch *gdbarch = get_frame_arch (frame); + + struct symtab *s = find_pc_line_symtab (get_frame_pc (frame)); + if (type == SRC_WIN) + { + line.loa = LOA_LINE; + line.u.line_no = cursal.line; + } + else + { + line.loa = LOA_ADDRESS; + find_line_pc (s, cursal.line, &line.u.addr); + } + tui_update_source_window (this, gdbarch, s, line); } else - tui_erase_source_content (win_info, TRUE); + erase_source_content (); +} - tui_check_and_display_highlight_if_needed (win_info); - win_info->refresh_window (); - win_info->content_in_use = true; +/* See tui-data.h. */ + +void +tui_source_window_base::make_visible (bool visible) +{ + execution_info->make_visible (visible); + tui_win_info::make_visible (visible); +} + +/* See tui-data.h. */ + +void +tui_source_window_base::refresh_window () +{ + execution_info->refresh_window (); + tui_win_info::refresh_window (); } /* See tui-data.h. */ @@ -325,8 +388,7 @@ tui_source_window_base::refill () } tui_update_source_window_as_is (this, gdbarch, s, - content[0].line_or_addr, - FALSE); + content[0].line_or_addr); } /* Scroll the source forward or backward horizontally. */ @@ -391,7 +453,7 @@ tui_update_all_breakpoint_info (struct breakpoint *being_deleted) { if (tui_update_breakpoint_info (win, being_deleted, false)) { - tui_update_exec_info (win); + win->update_exec_info (); } } } @@ -463,176 +525,36 @@ tui_update_breakpoint_info (struct tui_source_window_base *win, return need_refresh; } -/* See tui-data.h. */ - -tui_exec_info_content * -tui_exec_info_window::maybe_allocate_content (int n_elements) -{ - if (m_content == nullptr) - m_content = XNEWVEC (tui_exec_info_content, n_elements); - return m_content; -} - - /* Function to initialize the content of the execution info window, based upon the input window which is either the source or disassembly window. */ void -tui_set_exec_info_content (struct tui_source_window_base *win_info) -{ - if (win_info->execution_info != NULL) - { - tui_exec_info_content *content - = win_info->execution_info->maybe_allocate_content (win_info->height); - - tui_update_breakpoint_info (win_info, nullptr, true); - for (int i = 0; i < win_info->content.size (); i++) - { - tui_exec_info_content &element = content[i]; - struct tui_source_element *src_element; - tui_bp_flags mode; - - src_element = &win_info->content[i]; - - memset (element, ' ', sizeof (tui_exec_info_content)); - element[TUI_EXECINFO_SIZE - 1] = 0; - - /* Now update the exec info content based upon the state - of each line as indicated by the source content. */ - mode = src_element->break_mode; - if (mode & TUI_BP_HIT) - element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B'; - else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED)) - element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b'; - - if (mode & TUI_BP_ENABLED) - element[TUI_BP_BREAK_POS] = '+'; - else if (mode & TUI_BP_DISABLED) - element[TUI_BP_BREAK_POS] = '-'; - - if (src_element->is_exec_point) - element[TUI_EXEC_POS] = '>'; - } - } -} - - -void -tui_show_exec_info_content (struct tui_source_window_base *win_info) -{ - struct tui_exec_info_window *exec_info = win_info->execution_info; - const tui_exec_info_content *content = exec_info->get_content (); - - werase (exec_info->handle); - exec_info->refresh_window (); - for (int cur_line = 1; cur_line <= win_info->content.size (); cur_line++) - mvwaddstr (exec_info->handle, - cur_line, - 0, - content[cur_line - 1]); - exec_info->refresh_window (); -} - - -void -tui_erase_exec_info_content (struct tui_source_window_base *win_info) -{ - struct tui_gen_win_info *exec_info = win_info->execution_info; - - werase (exec_info->handle); - exec_info->refresh_window (); -} - -void -tui_clear_exec_info_content (struct tui_source_window_base *win_info) -{ - tui_erase_exec_info_content (win_info); -} - -/* Function to update the execution info window. */ -void -tui_update_exec_info (struct tui_source_window_base *win_info) -{ - tui_set_exec_info_content (win_info); - tui_show_exec_info_content (win_info); -} - -void -tui_alloc_source_buffer (struct tui_source_window_base *win_info) +tui_source_window_base::update_exec_info () { - int i, line_width, max_lines; - - /* The window width/height includes the highlight box. Determine actual - content dimensions, including string null-terminators. */ - max_lines = win_info->height - 2; - line_width = win_info->width - 2 + 1; - - /* Allocate the buffer for the source lines. */ - win_info->content.resize (max_lines); - for (i = 0; i < max_lines; i++) + werase (execution_info->handle); + tui_update_breakpoint_info (this, nullptr, true); + for (int i = 0; i < content.size (); i++) { - if (win_info->content[i].line == nullptr) - win_info->content[i].line = (char *) xmalloc (line_width); + struct tui_source_element *src_element = &content[i]; + char element[TUI_EXECINFO_SIZE] = " "; + + /* Now update the exec info content based upon the state + of each line as indicated by the source content. */ + tui_bp_flags mode = src_element->break_mode; + if (mode & TUI_BP_HIT) + element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B'; + else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED)) + element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b'; + + if (mode & TUI_BP_ENABLED) + element[TUI_BP_BREAK_POS] = '+'; + else if (mode & TUI_BP_DISABLED) + element[TUI_BP_BREAK_POS] = '-'; + + if (src_element->is_exec_point) + element[TUI_EXEC_POS] = '>'; + + mvwaddstr (execution_info->handle, i + 1, 0, element); } + execution_info->refresh_window (); } - - -/* Answer whether a particular line number or address is displayed - in the current source window. */ -int -tui_line_is_displayed (int line, - struct tui_source_window_base *win_info, - int check_threshold) -{ - int is_displayed = FALSE; - int i, threshold; - - if (check_threshold) - threshold = SCROLL_THRESHOLD; - else - threshold = 0; - i = 0; - while (i < win_info->content.size () - threshold - && !is_displayed) - { - is_displayed - = win_info->content[i].line_or_addr.loa == LOA_LINE - && win_info->content[i].line_or_addr.u.line_no == line; - i++; - } - - return is_displayed; -} - - -/* Answer whether a particular line number or address is displayed - in the current source window. */ -int -tui_addr_is_displayed (CORE_ADDR addr, - struct tui_source_window_base *win_info, - int check_threshold) -{ - int is_displayed = FALSE; - int i, threshold; - - if (check_threshold) - threshold = SCROLL_THRESHOLD; - else - threshold = 0; - i = 0; - while (i < win_info->content.size () - threshold - && !is_displayed) - { - is_displayed - = win_info->content[i].line_or_addr.loa == LOA_ADDRESS - && win_info->content[i].line_or_addr.u.addr == addr; - i++; - } - - return is_displayed; -} - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/