summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-07-22 09:06:46 (GMT)
committerGitHub <noreply@github.com>2023-07-22 09:06:46 (GMT)
commit67748f18c9b53def23f7614759fb632165f50d6a (patch)
tree0d2e7c62e551c8bd6dc9199360518096975506a2
parent9cbde7c6ce6f7b93301a37f03dfa0c0d45e00a39 (diff)
downloadcpython-67748f18c9b53def23f7614759fb632165f50d6a.zip
cpython-67748f18c9b53def23f7614759fb632165f50d6a.tar.gz
cpython-67748f18c9b53def23f7614759fb632165f50d6a.tar.bz2
[3.12] gh-106970: Fix Argument Clinic 'destination <name> clear' command (GH-106972) (#106983)
Add test for the 'destination <name> clear' command, and the 'destination' directive in general. Fix two bugs in 'destination <name> clear' command: 1. The text attribute of the allocator is called 'text', not '_text' 2. Return after processing the 'clear' command, instead of proceeding directly to the fail(). (cherry picked from commit 3372bcba9893030e4063a9264ec0b4d1b6166883) Co-authored-by: Erlend E. Aasland <erlend@python.org>
-rw-r--r--Lib/test/clinic.test.c56
-rw-r--r--Lib/test/test_clinic.py9
-rw-r--r--Misc/NEWS.d/next/Tools-Demos/2023-07-21-23-16-05.gh-issue-106970.NLRnml.rst4
-rwxr-xr-xTools/clinic/clinic.py16
4 files changed, 77 insertions, 8 deletions
diff --git a/Lib/test/clinic.test.c b/Lib/test/clinic.test.c
index 5748bbc..04227e4 100644
--- a/Lib/test/clinic.test.c
+++ b/Lib/test/clinic.test.c
@@ -4954,3 +4954,59 @@ Test_meth_coexist(TestObj *self, PyObject *Py_UNUSED(ignored))
static PyObject *
Test_meth_coexist_impl(TestObj *self)
/*[clinic end generated code: output=808a293d0cd27439 input=2a1d75b5e6fec6dd]*/
+
+
+/*[clinic input]
+output push
+output preset buffer
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5bff3376ee0df0b5]*/
+
+/*[clinic input]
+buffer_clear
+ a: int
+We'll call 'destination buffer clear' after this.
+
+Argument Clinic's buffer preset puts most generated code into the
+'buffer' destination, except from 'impl_definition', which is put into
+the 'block' destination, so we should expect everything but
+'impl_definition' to be cleared.
+[clinic start generated code]*/
+
+static PyObject *
+buffer_clear_impl(PyObject *module, int a)
+/*[clinic end generated code: output=f14bba74677e1846 input=a4c308a6fdab043c]*/
+
+/*[clinic input]
+destination buffer clear
+output pop
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f20d06adb8252084]*/
+
+
+/*[clinic input]
+output push
+destination test1 new buffer
+output everything suppress
+output docstring_definition test1
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5a77c454970992fc]*/
+
+/*[clinic input]
+new_dest
+ a: int
+Only this docstring should be outputted to test1.
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=da5af421ed8996ed]*/
+
+/*[clinic input]
+dump test1
+output pop
+[clinic start generated code]*/
+
+PyDoc_STRVAR(new_dest__doc__,
+"new_dest($module, /, a)\n"
+"--\n"
+"\n"
+"Only this docstring should be outputted to test1.");
+/*[clinic end generated code: output=9cac703f51d90e84 input=090db8df4945576d]*/
diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py
index 7c725e3..e40579b 100644
--- a/Lib/test/test_clinic.py
+++ b/Lib/test/test_clinic.py
@@ -249,6 +249,15 @@ class ClinicWholeFileTest(_ParserBase):
out = self.expect_failure(raw)
self.assertEqual(out, msg)
+ def test_unknown_destination_command(self):
+ out = self.expect_failure("""
+ /*[clinic input]
+ destination buffer nosuchcommand
+ [clinic start generated code]*/
+ """)
+ msg = "unknown destination command 'nosuchcommand'"
+ self.assertIn(msg, out)
+
class ClinicGroupPermuterTest(TestCase):
def _test(self, l, m, r, output):
diff --git a/Misc/NEWS.d/next/Tools-Demos/2023-07-21-23-16-05.gh-issue-106970.NLRnml.rst b/Misc/NEWS.d/next/Tools-Demos/2023-07-21-23-16-05.gh-issue-106970.NLRnml.rst
new file mode 100644
index 0000000..194e335
--- /dev/null
+++ b/Misc/NEWS.d/next/Tools-Demos/2023-07-21-23-16-05.gh-issue-106970.NLRnml.rst
@@ -0,0 +1,4 @@
+Fix bugs in the Argument Clinic ``destination <name> clear`` command; the
+destination buffers would never be cleared, and the ``destination``
+directive parser would simply continue to the fault handler after processing
+the command. Patch by Erlend E. Aasland.
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 04951e9..3e60328 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -1906,7 +1906,7 @@ class BufferSeries:
def clear(self):
for ta in self._array:
- ta._text.clear()
+ ta.text.clear()
def dump(self):
texts = [ta.output() for ta in self._array]
@@ -4366,13 +4366,13 @@ class DSLParser:
command: str,
*args
) -> None:
- if command == 'new':
- self.clinic.add_destination(name, *args)
- return
-
- if command == 'clear':
- self.clinic.get_destination(name).clear()
- fail("unknown destination command", repr(command))
+ match command:
+ case "new":
+ self.clinic.add_destination(name, *args)
+ case "clear":
+ self.clinic.get_destination(name).clear()
+ case _:
+ fail("unknown destination command", repr(command))
def directive_output(