binutils-gdb/gdb/testsuite/gdb.python
Sergio Durigan Junior 6d62641c83 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.
2015-04-08 18:27:10 -04:00
..
Makefile.in
amd64-py-framefilter-invalidarg.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
lib-types.cc Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
lib-types.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-arch.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-arch.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-block.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-block.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-breakpoint.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-breakpoint.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-caller-is.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-caller-is.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-cmd.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-cmd.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-completion.exp Fix Python completion when using the "complete" command 2015-04-08 18:27:10 -04:00
py-completion.py Fix Python completion when using the "complete" command 2015-04-08 18:27:10 -04:00
py-error.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-error.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-events-shlib.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-events.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-events.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-events.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-evsignal.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-evthreads.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-evthreads.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-explore-cc.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-explore.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-explore.cc Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-explore.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-finish-breakpoint.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-finish-breakpoint.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-finish-breakpoint.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-finish-breakpoint2.cc Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-finish-breakpoint2.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-finish-breakpoint2.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-frame-args.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-frame-args.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-frame-args.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-frame-inline.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-frame-inline.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-frame.c
py-frame.exp [testsuite patch] Fix new FAIL: py-frame.exp: test Frame.read_register(rip) 2015-01-12 11:02:46 +01:00
py-framefilter-gdb.py.in Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-framefilter-invalidarg-gdb.py.in Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-framefilter-invalidarg.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-framefilter-invalidarg.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-framefilter-mi.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-framefilter-mi.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-framefilter.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-framefilter.exp framefilter quit: New test 2015-02-11 14:53:14 +01:00
py-framefilter.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-function.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-inferior.c
py-inferior.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-infthread.c
py-infthread.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-linetable.S Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-linetable.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-linetable.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-lookup-type.exp check gdb.lookup_type return value in gdb.python/py-lookup-type.exp 2015-01-26 08:41:37 +04:00
py-mi.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-objfile-script-gdb.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-objfile-script.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-objfile-script.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-objfile.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-objfile.exp Add gdb.Objfile.username. 2015-01-27 10:13:52 -08:00
py-parameter.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-integral.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-integral.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-integral.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-maint.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-maint.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-maint.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-re-notag.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-re-notag.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-pp-re-notag.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-prettyprint.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-prettyprint.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-prettyprint.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-progspace.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-progspace.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-prompt.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-prompt.exp gdb.python/py-prompt.exp: restore GDBFLAGS 2015-01-12 17:10:06 +00:00
py-section-script.c Add support for inlining scripts into .debug_gdb_scripts. 2015-01-31 12:01:13 -08:00
py-section-script.exp Add support for inlining scripts into .debug_gdb_scripts. 2015-01-31 12:01:13 -08:00
py-section-script.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-shared-sl.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-shared.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-shared.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-strfns.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-strfns.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-symbol.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-symbol.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-symtab.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-sync-interp.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-sync-interp.exp skip "attach" tests when testing against stub-like targets 2015-01-09 11:04:19 +00:00
py-template.cc Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-template.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-type.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-type.exp gdb/python: exception trying to create empty array 2015-01-06 19:07:12 +04:00
py-typeprint.cc Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-typeprint.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-typeprint.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-unwind-maint.c Add support for writing unwinders in Python. 2015-04-01 11:49:12 -07:00
py-unwind-maint.exp Add support for writing unwinders in Python. 2015-04-01 11:49:12 -07:00
py-unwind-maint.py Add support for writing unwinders in Python. 2015-04-01 11:49:12 -07:00
py-unwind.c Add support for writing unwinders in Python. 2015-04-01 11:49:12 -07:00
py-unwind.exp Add support for writing unwinders in Python. 2015-04-01 11:49:12 -07:00
py-unwind.py Add support for writing unwinders in Python. 2015-04-01 11:49:12 -07:00
py-value-cc.cc Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-value-cc.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-value.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-value.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-xmethods.cc Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-xmethods.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
py-xmethods.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
python-1.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
python.c Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
python.exp Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
source1 Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00
source2.py Update year range in copyright notice of all files owned by the GDB project. 2015-01-01 13:32:14 +04:00