From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 119940 invoked by alias); 13 Apr 2015 19:23:20 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 119905 invoked by uid 89); 13 Apr 2015 19:23:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,SPF_HELO_PASS,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 13 Apr 2015 19:23:18 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t3DJNGBp003146 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 13 Apr 2015 15:23:16 -0400 Received: from valrhona.uglyboxes.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t3DJNGp0017465 for ; Mon, 13 Apr 2015 15:23:16 -0400 Subject: [PATCH 06/18] Implement completion limiting for condition_completer. From: Keith Seitz To: gdb-patches@sourceware.org Date: Mon, 13 Apr 2015 19:23:00 -0000 Message-ID: <20150413192316.29172.89247.stgit@valrhona.uglyboxes.com> In-Reply-To: <20150413192235.29172.13097.stgit@valrhona.uglyboxes.com> References: <20150413192235.29172.13097.stgit@valrhona.uglyboxes.com> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-IsSubscribed: yes X-SW-Source: 2015-04/txt/msg00484.txt.bz2 This patch converts the condition completer to use maybe_add_completion. A side-effect of this is the similar conversion of complete_internalvar. Tests have been added to exercise this new behavior. gdb/ChangeLog * breakpoint.c (condition_completer): Pass completer_data to complete_internalvar. Use maybe_add_completion. * value.c: Include completer.h. (complete_internalvar): Add completer_data argument. Use maybe_add_completion. * value.h (complete_internalvar): Add completer_data argument. gdb/testsuite/ChangeLog * gdb.base/condbreak.exp (test_completion): New procedure. Add more completion tests, with and without limiting. --- gdb/breakpoint.c | 24 +++++++++++- gdb/testsuite/gdb.base/condbreak.exp | 70 ++++++++++++++++++++++++++++++++++ gdb/value.c | 21 +++++++++- gdb/value.h | 3 + 4 files changed, 113 insertions(+), 5 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 095fdf2..04dc734 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1052,7 +1052,7 @@ condition_completer (struct completer_data *cdata, /* We don't support completion of history indices. */ if (isdigit (text[1])) return NULL; - return complete_internalvar (&text[1]); + return complete_internalvar (cdata, &text[1]); } /* We're completing the breakpoint number. */ @@ -1065,7 +1065,27 @@ condition_completer (struct completer_data *cdata, xsnprintf (number, sizeof (number), "%d", b->number); if (strncmp (number, text, len) == 0) - VEC_safe_push (char_ptr, result, xstrdup (number)); + { + enum maybe_add_completion_enum add_status; + char *completion = xstrdup (number); + + add_status = maybe_add_completion (cdata, completion); + switch (add_status) + { + case MAYBE_ADD_COMPLETION_OK: + VEC_safe_push (char_ptr, result, completion); + break; + case MAYBE_ADD_COMPLETION_OK_MAX_REACHED: + VEC_safe_push (char_ptr, result, completion); + return result; + case MAYBE_ADD_COMPLETION_MAX_REACHED: + xfree (completion); + return result; + case MAYBE_ADD_COMPLETION_DUPLICATE: + xfree (completion); + break; + } + } } return result; diff --git a/gdb/testsuite/gdb.base/condbreak.exp b/gdb/testsuite/gdb.base/condbreak.exp index fa40a5f..5630ede 100644 --- a/gdb/testsuite/gdb.base/condbreak.exp +++ b/gdb/testsuite/gdb.base/condbreak.exp @@ -246,3 +246,73 @@ gdb_test "complete cond 1" "cond 1" gdb_test "set variable \$var = 1" gdb_test "complete cond \$v" "cond \\\$var" gdb_test "complete cond 1 values\[0\].a" "cond 1 values.0..a_field" + +# Test non-trivial completion and completion-limiting + +# Delete all breakpoints and create a bunch of new ones. +delete_breakpoints +for {set i 0} {$i < 20} {incr i} { + with_test_prefix "set breakpoint $i" { + gdb_breakpoint "factorial" + } +} + +# While the completer function does traverse breakpoints in the order +# they were created, don't assume that is required for the test. +# We only count the number of completions found. In this case, +# this test will create breakpoints 9-19, giving "complete cond 1" +# ten total completion possibilities. + +# A convenience procedure to automate test completion lists. +proc test_completion {cmd exp total {limit 0}} { + global gdb_prompt + + if {$limit} { + set end "\\\*\\\*\\\* List may be truncated, " + append end "max-completions reached\\\. \\\*\\\*\\\*\r\n" + set testname "limit '$cmd'" + } else { + set end "" + set testname $cmd + } + + set seen 0 + gdb_test_multiple $cmd $testname { + "$cmd\r\n" { exp_continue } + + -re "cond $exp\[0-9\]+\r\n" { + incr seen + exp_continue + } + + -re ".*$end$gdb_prompt $" { + if {$seen == $total} { + pass $testname + } else { + fail "$testname ($seen/$total)" + } + } + } +} + +# Test completion of breakpoint number. +with_test_prefix "completion test:" { + test_completion "complete cond 1" "1" 10 +} + +# Test completion of breakpoint number using internal variable. +for {set i 0} {$i < 10} {incr i} { + gdb_test_no_output "set variable \$var_bp_$i = $i" +} + +test_completion "complete cond \$var_bp" "\\\$var_bp_" 10 + +# Run the above tests with completion limiting. +set max_completions 4 +gdb_test_no_output "set max-completions $max_completions" + +with_test_prefix "completion test:" { + test_completion "complete cond 1" "1" $max_completions 1 +} + +test_completion "complete cond \$var_bp" "\\\$var_bp_" $max_completions 1 diff --git a/gdb/value.c b/gdb/value.c index cb56849..8519b91 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -40,6 +40,7 @@ #include "tracepoint.h" #include "cp-abi.h" #include "user-regs.h" +#include "completer.h" /* Prototypes for exported functions. */ @@ -2029,7 +2030,7 @@ lookup_only_internalvar (const char *name) were found. */ VEC (char_ptr) * -complete_internalvar (const char *name) +complete_internalvar (struct completer_data *cdata, const char *name) { VEC (char_ptr) *result = NULL; struct internalvar *var; @@ -2041,8 +2042,24 @@ complete_internalvar (const char *name) if (strncmp (var->name, name, len) == 0) { char *r = xstrdup (var->name); + enum maybe_add_completion_enum add_status; - VEC_safe_push (char_ptr, result, r); + add_status = maybe_add_completion (cdata, r); + switch (add_status) + { + case MAYBE_ADD_COMPLETION_OK: + VEC_safe_push (char_ptr, result, r); + break; + case MAYBE_ADD_COMPLETION_OK_MAX_REACHED: + VEC_safe_push (char_ptr, result, r); + return result; + case MAYBE_ADD_COMPLETION_MAX_REACHED: + xfree (r); + return result; + case MAYBE_ADD_COMPLETION_DUPLICATE: + xfree (r); + break; + } } return result; diff --git a/gdb/value.h b/gdb/value.h index 21baa32..41aec1b 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -872,7 +872,8 @@ extern struct internalvar *lookup_only_internalvar (const char *name); extern struct internalvar *create_internalvar (const char *name); -extern VEC (char_ptr) *complete_internalvar (const char *name); +extern VEC (char_ptr) *complete_internalvar (struct completer_data *cdata, + const char *name); /* An internalvar can be dynamically computed by supplying a vector of function pointers to perform various operations. */