X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-source.c;h=906006a4225ab4240a803ad82ee1212c791f459c;hb=8634b4628ea00a95ce3dfe8f9915724e8d710dad;hp=f0bac24bfea4d6b5837cee4603ab605bc97567e1;hpb=f6cc34a91c173634b6afcc1a48601a601fbace37;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c index f0bac24bfe..906006a422 100644 --- a/gdb/tui/tui-source.c +++ b/gdb/tui/tui-source.c @@ -123,11 +123,13 @@ copy_source_line (const char **ptr, int line_no, int first_col, /* Function to display source in the source window. */ enum tui_status -tui_set_source_content (tui_source_window_base *win_info, - struct symtab *s, - int line_no, - int noerror) +tui_source_window::set_contents (struct gdbarch *arch, + struct symtab *s, + struct tui_line_or_address line_or_addr) { + gdb_assert (line_or_addr.loa == LOA_LINE); + int line_no = line_or_addr.u.line_no; + enum tui_status ret = TUI_FAILURE; if (s != NULL) @@ -135,26 +137,15 @@ tui_set_source_content (tui_source_window_base *win_info, int line_width, nlines; ret = TUI_SUCCESS; - tui_alloc_source_buffer (win_info); - line_width = win_info->width - 1; + line_width = width - TUI_EXECINFO_SIZE - 1; /* Take hilite (window border) into account, when calculating the number of lines. */ - nlines = (line_no + (win_info->height - 2)) - line_no; + nlines = (line_no + (height - 2)) - line_no; std::string srclines; if (!g_source_cache.get_source_lines (s, line_no, line_no + nlines, &srclines)) - { - if (!noerror) - { - const char *filename = symtab_to_filename_for_display (s); - char *name = (char *) alloca (strlen (filename) + 100); - - sprintf (name, "%s:%d", filename, line_no); - print_sys_errmsg (name, errno); - } - ret = TUI_FAILURE; - } + ret = TUI_FAILURE; else { int cur_line_no, cur_line; @@ -162,28 +153,26 @@ tui_set_source_content (tui_source_window_base *win_info, = tui_locator_win_info_ptr (); const char *s_filename = symtab_to_filename_for_display (s); - xfree (win_info->title); - win_info->title = xstrdup (s_filename); + title = s_filename; - xfree (win_info->fullname); - win_info->fullname = xstrdup (symtab_to_fullname (s)); + xfree (fullname); + fullname = xstrdup (symtab_to_fullname (s)); cur_line = 0; - win_info->gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s)); - win_info->start_line_or_addr.loa = LOA_LINE; - cur_line_no = win_info->start_line_or_addr.u.line_no = line_no; + gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s)); + start_line_or_addr.loa = LOA_LINE; + cur_line_no = start_line_or_addr.u.line_no = line_no; const char *iter = srclines.c_str (); - win_info->content.resize (nlines); + content.resize (nlines); while (cur_line < nlines) { struct tui_source_element *element - = &win_info->content[cur_line]; + = &content[cur_line]; std::string text; if (*iter != '\0') - text = copy_source_line (&iter, cur_line_no, - win_info->horizontal_offset, + text = copy_source_line (&iter, cur_line_no, horizontal_offset, line_width); /* Set whether element is the execution point @@ -195,8 +184,8 @@ tui_set_source_content (tui_source_window_base *win_info, symtab_to_fullname (s)) == 0 && cur_line_no == locator->line_no); - xfree (win_info->content[cur_line].line); - win_info->content[cur_line].line + xfree (content[cur_line].line); + content[cur_line].line = xstrdup (text.c_str ()); cur_line++; @@ -212,13 +201,12 @@ tui_set_source_content (tui_source_window_base *win_info, /* Function to display source in the source window. This function initializes the horizontal scroll to 0. */ void -tui_show_symtab_source (tui_source_window_base *win_info, - struct gdbarch *gdbarch, struct symtab *s, - struct tui_line_or_address line, - int noerror) +tui_source_window::show_symtab_source (struct gdbarch *gdbarch, + struct symtab *s, + struct tui_line_or_address line) { - win_info->horizontal_offset = 0; - tui_update_source_window_as_is (win_info, gdbarch, s, line, noerror); + horizontal_offset = 0; + update_source_window_as_is (gdbarch, s, line); } @@ -251,7 +239,9 @@ tui_source_window::do_scroll_vertical (int num_to_scroll) l.loa = LOA_LINE; l.u.line_no = content[0].line_or_addr.u.line_no + num_to_scroll; - if (l.u.line_no > s->nlines) + const std::vector *offsets; + if (g_source_cache.get_line_charpos (s, &offsets) + && l.u.line_no > offsets->size ()) /* line = s->nlines - win_info->content_size + 1; */ /* elz: fix for dts 23398. */ l.u.line_no = content[0].line_or_addr.u.line_no; @@ -278,7 +268,7 @@ tui_source_window::~tui_source_window () void tui_source_window::style_changed () { - if (tui_active && is_visible) + if (tui_active && is_visible ()) refill (); } @@ -291,3 +281,47 @@ tui_source_window::location_matches_p (struct bp_location *loc, int line_no) && filename_cmp (fullname, symtab_to_fullname (loc->symtab)) == 0); } + +/* See tui-source.h. */ + +bool +tui_source_window::line_is_displayed (int line) const +{ + bool is_displayed = false; + int threshold = SCROLL_THRESHOLD; + int i = 0; + while (i < content.size () - threshold && !is_displayed) + { + is_displayed + = (content[i].line_or_addr.loa == LOA_LINE + && content[i].line_or_addr.u.line_no == line); + i++; + } + + return is_displayed; +} + +void +tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal, + int line_no, CORE_ADDR addr) +{ + int start_line = (line_no - (viewport_height / 2)) + 1; + if (start_line <= 0) + start_line = 1; + + bool source_already_displayed = (sal.symtab != 0 + && showing_source_p (fullname)); + + struct tui_line_or_address l; + + l.loa = LOA_LINE; + l.u.line_no = start_line; + if (!(source_already_displayed + && line_is_displayed (line_no))) + update_source_window (get_frame_arch (fi), sal.symtab, l); + else + { + l.u.line_no = line_no; + set_is_exec_point_at (l); + } +}