From 9147a9697ac60a9fff739394056992a61d207a16 Mon Sep 17 00:00:00 2001 From: Larry Hastings Date: Sun, 4 May 2014 04:41:18 -0700 Subject: [PATCH] Issue #21088: Bugfix for curses.window.addch() regression in 3.4.0. In porting to Argument Clinic, the first two arguments were reversed. --- Lib/test/test_curses.py | 30 ++++++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Modules/_cursesmodule.c | 24 ++++++++++++------------ 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py index ce8f254bbbd..ad10f620b36 100644 --- a/Lib/test/test_curses.py +++ b/Lib/test/test_curses.py @@ -17,6 +17,7 @@ import sys, tempfile, os import unittest from test.support import requires, import_module +import inspect requires('curses') # If either of these don't exist, skip the tests. @@ -331,6 +332,34 @@ def test_encoding(stdscr): else: raise AssertionError("TypeError not raised") +def test_issue21088(stdscr): + # + # http://bugs.python.org/issue21088 + # + # the bug: + # when converting curses.window.addch to Argument Clinic + # the first two parameters were switched. + + # if someday we can represent the signature of addch + # we will need to rewrite this test. + try: + signature = inspect.signature(stdscr.addch) + self.assertFalse(signature) + except ValueError: + # not generating a signature is fine. + pass + + # So. No signature for addch. + # But Argument Clinic gave us a human-readable equivalent + # as the first line of the docstring. So we parse that, + # and ensure that the parameters appear in the correct order. + # Since this is parsing output from Argument Clinic, we can + # be reasonably certain the generated parsing code will be + # correct too. + human_readable_signature = stdscr.addch.__doc__.split("\n")[0] + offset = human_readable_signature.find("[y, x,]") + assert offset >= 0, "" + def main(stdscr): curses.savetty() try: @@ -344,6 +373,7 @@ def main(stdscr): test_unget_wch(stdscr) test_issue10570() test_encoding(stdscr) + test_issue21088(stdscr) finally: curses.resetty() diff --git a/Misc/NEWS b/Misc/NEWS index 9034371462b..2b79789beef 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -39,6 +39,9 @@ Core and Builtins Library ------- +- Issue #21088: Bugfix for curses.window.addch() regression in 3.4.0. + In porting to Argument Clinic, the first two arguments were reversed. + - Issue #21321: itertools.islice() now releases the reference to the source iterator when the slice is exhausted. Patch by Anton Afanasyev. diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 494f02e194a..5ffce2f9541 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -560,10 +560,10 @@ PyCursesWindow_Dealloc(PyCursesWindowObject *wo) curses.window.addch [ - x: int - X-coordinate. y: int Y-coordinate. + x: int + X-coordinate. ] ch: object @@ -584,13 +584,13 @@ current settings for the window object. [clinic start generated code]*/ PyDoc_STRVAR(curses_window_addch__doc__, -"addch([x, y,] ch, [attr])\n" +"addch([y, x,] ch, [attr])\n" "Paint character ch at (y, x) with attributes attr.\n" "\n" -" x\n" -" X-coordinate.\n" " y\n" " Y-coordinate.\n" +" x\n" +" X-coordinate.\n" " ch\n" " Character to add.\n" " attr\n" @@ -605,15 +605,15 @@ PyDoc_STRVAR(curses_window_addch__doc__, {"addch", (PyCFunction)curses_window_addch, METH_VARARGS, curses_window_addch__doc__}, static PyObject * -curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr); +curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr); static PyObject * curses_window_addch(PyCursesWindowObject *self, PyObject *args) { PyObject *return_value = NULL; int group_left_1 = 0; - int x = 0; int y = 0; + int x = 0; PyObject *ch; int group_right_1 = 0; long attr = 0; @@ -629,12 +629,12 @@ curses_window_addch(PyCursesWindowObject *self, PyObject *args) group_right_1 = 1; break; case 3: - if (!PyArg_ParseTuple(args, "iiO:addch", &x, &y, &ch)) + if (!PyArg_ParseTuple(args, "iiO:addch", &y, &x, &ch)) goto exit; group_left_1 = 1; break; case 4: - if (!PyArg_ParseTuple(args, "iiOl:addch", &x, &y, &ch, &attr)) + if (!PyArg_ParseTuple(args, "iiOl:addch", &y, &x, &ch, &attr)) goto exit; group_right_1 = 1; group_left_1 = 1; @@ -643,15 +643,15 @@ curses_window_addch(PyCursesWindowObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "curses.window.addch requires 1 to 4 arguments"); goto exit; } - return_value = curses_window_addch_impl(self, group_left_1, x, y, ch, group_right_1, attr); + return_value = curses_window_addch_impl(self, group_left_1, y, x, ch, group_right_1, attr); exit: return return_value; } static PyObject * -curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr) -/*[clinic end generated code: output=43acb91a5c98f615 input=fe7e3711d5bbf1f6]*/ +curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr) +/*[clinic end generated code: output=d4b97cc287010c54 input=5a41efb34a2de338]*/ { PyCursesWindowObject *cwself = (PyCursesWindowObject *)self; int coordinates_group = group_left_1;