[Python-checkins] cpython (merge 3.4 -> default): Issue #21088: Merge from 3.4.

larry.hastings python-checkins at python.org
Sun May 4 13:48:29 CEST 2014


http://hg.python.org/cpython/rev/3aa5fae8c313
changeset:   90560:3aa5fae8c313
parent:      90558:a3c345ba3563
parent:      90559:4f26430b03fd
user:        Larry Hastings <larry at hastings.org>
date:        Sun May 04 04:45:57 2014 -0700
summary:
  Issue #21088: Merge from 3.4.

files:
  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
--- a/Lib/test/test_curses.py
+++ b/Lib/test/test_curses.py
@@ -17,6 +17,7 @@
 
 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 @@
     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 @@
         test_unget_wch(stdscr)
         test_issue10570()
         test_encoding(stdscr)
+        test_issue21088(stdscr)
     finally:
         curses.resetty()
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -69,6 +69,9 @@
 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 #10650: Remove the non-standard 'watchexp' parameter from the
   Decimal.quantize() method in the Python version.  It had never been
   present in the C version.
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -560,10 +560,10 @@
 curses.window.addch
 
     [
+    y: int
+      Y-coordinate.
     x: int
       X-coordinate.
-    y: int
-      Y-coordinate.
     ]
 
     ch: object
@@ -584,13 +584,13 @@
 [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"
+"  y\n"
+"    Y-coordinate.\n"
 "  x\n"
 "    X-coordinate.\n"
-"  y\n"
-"    Y-coordinate.\n"
 "  ch\n"
 "    Character to add.\n"
 "  attr\n"
@@ -605,15 +605,15 @@
     {"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 y = 0;
     int x = 0;
-    int y = 0;
     PyObject *ch;
     int group_right_1 = 0;
     long attr = 0;
@@ -629,12 +629,12 @@
             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 @@
             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;

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list