Browse Source

Fixed a segmentation fault/assertion error when trying to read from deleted cursors/toktens.

merge-requests/365/head
eidheim 11 years ago
parent
commit
81a8a80a7f
  1. 14
      juci/source.cc
  2. 1
      juci/source.h

14
juci/source.cc

@ -183,9 +183,11 @@ parse_thread_go(true), parse_thread_mapped(false), parse_thread_stop(false) {
if(parse_thread_mapped) { if(parse_thread_mapped) {
INFO("Updating syntax"); INFO("Updating syntax");
update_syntax(extract_tokens(0, get_source_buffer()->get_text().size())); update_syntax(extract_tokens(0, get_source_buffer()->get_text().size()));
update_diagnostics();
update_types();
parsing_in_progress->done("done"); parsing_in_progress->done("done");
INFO("Syntax updated"); INFO("Syntax updated");
update_diagnostics(); clang_tokens_ready=true;
} }
else { else {
parse_thread_go=true; parse_thread_go=true;
@ -214,6 +216,7 @@ parse_thread_go(true), parse_thread_mapped(false), parse_thread_stop(false) {
get_source_buffer()->signal_changed().connect([this]() { get_source_buffer()->signal_changed().connect([this]() {
parse_thread_mapped=false; parse_thread_mapped=false;
clang_tokens_ready=false;
parse_thread_go=true; parse_thread_go=true;
}); });
@ -310,7 +313,6 @@ extract_tokens(int start_offset, int end_offset) {
clang::SourceLocation end(clang_tu.get(), file_path, end_offset); clang::SourceLocation end(clang_tu.get(), file_path, end_offset);
clang::SourceRange range(&start, &end); clang::SourceRange range(&start, &end);
clang_tokens=std::unique_ptr<clang::Tokens>(new clang::Tokens(clang_tu.get(), &range)); clang_tokens=std::unique_ptr<clang::Tokens>(new clang::Tokens(clang_tu.get(), &range));
update_types();
for (auto &token : *clang_tokens) { for (auto &token : *clang_tokens) {
switch (token.kind()) { switch (token.kind()) {
case 0: highlight_cursor(&token, &ranges); break; // PunctuationToken case 0: highlight_cursor(&token, &ranges); break; // PunctuationToken
@ -406,9 +408,11 @@ void Source::ClangView::update_types() {
auto get_tooltip_buffer=[this, c]() { auto get_tooltip_buffer=[this, c]() {
auto tooltip_buffer=Gtk::TextBuffer::create(get_buffer()->get_tag_table()); auto tooltip_buffer=Gtk::TextBuffer::create(get_buffer()->get_tag_table());
tooltip_buffer->insert_at_cursor("Type: "+(*clang_tokens)[c].type); tooltip_buffer->insert_at_cursor("Type: "+(*clang_tokens)[c].type);
auto brief_comment=clang_tokens->get_brief_comment(c); if(clang_tokens_ready) {
if(brief_comment!="") auto brief_comment=clang_tokens->get_brief_comment(c);
tooltip_buffer->insert_at_cursor("\n\n"+brief_comment); if(brief_comment!="")
tooltip_buffer->insert_at_cursor("\n\n"+brief_comment);
}
return tooltip_buffer; return tooltip_buffer;
}; };

1
juci/source.h

@ -109,6 +109,7 @@ namespace Source {
private: private:
std::unique_ptr<clang::TranslationUnit> clang_tu; std::unique_ptr<clang::TranslationUnit> clang_tu;
std::unique_ptr<clang::Tokens> clang_tokens; std::unique_ptr<clang::Tokens> clang_tokens;
bool clang_tokens_ready=false;
void highlight_token(clang::Token *token, void highlight_token(clang::Token *token,
std::vector<Range> *source_ranges, std::vector<Range> *source_ranges,
int token_kind); int token_kind);

Loading…
Cancel
Save