This is the mail archive of the gdb-prs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug python/16699] GDB Python command completion with overriden complete vs. completer class


https://sourceware.org/bugzilla/show_bug.cgi?id=16699

--- Comment #5 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Sergio Durigan Junior
<sergiodj@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6d62641c832525382336c1b04731d85cb6c398e7

commit 6d62641c832525382336c1b04731d85cb6c398e7
Author: Sergio Durigan Junior <sergiodj@redhat.com>
Date:   Wed Apr 8 18:27:10 2015 -0400

    Fix Python completion when using the "complete" command

    This patch is related to PR python/16699, and is an improvement over the
    patch posted here:

      <https://sourceware.org/ml/gdb-patches/2014-03/msg00301.html>

    Keith noticed that, when using the "complete" command on GDB to complete
    a Python command, some strange things could happen.  In order to
    understand what can go wrong, I need to explain how the Python
    completion mechanism works.

    When the user requests a completion of a Python command by using TAB,
    GDB will first try to determine the right set of "brkchars" that will be
    used when doing the completion.  This is done by actually calling the
    "complete" method of the Python class.  Then, when we already know the
    "brkchars" that will be used, we call the "complete" method again, for
    the same values.

    If you read the thread mentioned above, you will see that one of the
    design decisions was to make the "cmdpy_completer_helper" (which is the
    function the does the actual calling of the "complete" method) cache the
    first result of the completion, since this result will be used in the
    second call, to do the actual completion.

    The problem is that the "complete" command does not process the
    brkchars, and the current Python completion mechanism (improved by the
    patch mentioned above) relies on GDB trying to determine the brkchars,
    and then doing the completion itself.  Therefore, when we use the
    "complete" command instead of doing a TAB-completion on GDB, there is a
    scenario where we can use the invalid cache of a previous Python command
    that was completed before.  For example:

      (gdb) A <TAB>
      (gdb) complete B
      B value1
      B value10
      B value2
      B value3
      B value4
      B value5
      B value6
      B value7
      B value8
      B value9
      (gdb) B <TAB>
      comp1   comp2   comp4   comp6   comp8
      comp10  comp3   comp5   comp7   comp9

    Here, we see that "complete B " gave a different result than "B <TAB>".
    The reason for that is because "A <TAB>" was called before, and its
    completion results were "value*", so when GDB tried to "complete B " it
    wrongly answered with the results for A.  The problem here is using a
    wrong cache (A's cache) for completing B.

    We tried to come up with a solution that would preserve the caching
    mechanism, but it wasn't really possible.  So I decided to completely
    remove the cache, and doing the method calling twice for every
    completion.  This is not optimal, but I do not think it will impact
    users noticeably.

    It is worth mentioning another small issue that I found.  The code was
    doing:

      wordobj = PyUnicode_Decode (word, sizeof (word), host_charset (), NULL);

    which is totally wrong, because using "sizeof" here will lead to always
    the same result.  So I changed this to use "strlen".  The testcase also
    catches this problem.

    Keith kindly expanded the existing testcase to cover the problem
    described above, and everything is passing.

    gdb/ChangeLog:
    2015-04-08  Sergio Durigan Junior  <sergiodj@redhat.com>

        PR python/16699
        * python/py-cmd.c (cmdpy_completer_helper): Adjust function to not
        use a caching mechanism.  Adjust comments and code to reflect
        that.  Replace 'sizeof' by 'strlen' when fetching 'wordobj'.
        (cmdpy_completer_handle_brkchars): Adjust call to
        cmdpy_completer_helper.  Call Py_XDECREF for 'resultobj'.
        (cmdpy_completer): Likewise.

    gdb/testsuite/ChangeLog:
    2015-04-08  Keith Seitz  <keiths@redhat.com>

        PR python/16699
        * gdb.python/py-completion.exp: New tests for completion.
        * gdb.python/py-completion.py (CompleteLimit1): New class.
        (CompleteLimit2): Likewise.
        (CompleteLimit3): Likewise.
        (CompleteLimit4): Likewise.
        (CompleteLimit5): Likewise.
        (CompleteLimit6): Likewise.
        (CompleteLimit7): Likewise.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]