]> granicus.if.org Git - python/commitdiff
Fixed error handling branches. Thanks
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>
Sat, 8 Jan 2011 01:23:02 +0000 (01:23 +0000)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>
Sat, 8 Jan 2011 01:23:02 +0000 (01:23 +0000)
Victor Stinner for pointing this out.

Lib/test/test_time.py
Modules/timemodule.c

index e4b6a0fb46544e8788f1f742bb32c288f62903b3..d3de933cc8a34c90b54872a92040a664fb7bc3a3 100644 (file)
@@ -308,13 +308,24 @@ class TestDontAccept2Year(TestAccept2Year):
     def test_invalid(self):
         pass
 
+class TestAccept2YearBad(TestAccept2Year):
+    class X:
+        def __bool__(self):
+            raise RuntimeError('boo')
+    accept2dyear = X()
+    def test_2dyear(self):
+        pass
+    def test_invalid(self):
+        self.assertRaises(RuntimeError, self.yearstr, 200)
+
+
 class TestDontAccept2YearBool(TestDontAccept2Year):
     accept2dyear = False
 
 
 def test_main():
     support.run_unittest(TimeTestCase, TestLocale,
-                         TestAccept2Year, TestAccept2YearBool,
+                         TestAccept2Year, TestAccept2YearBool, TestAccept2YearBad,
                          TestDontAccept2Year, TestDontAccept2YearBool)
 
 if __name__ == "__main__":
index 5732f15265be2f0c0c1a88ed7a3657c52a064d94..46c90ecdc971194c4148dc29605d657e480e94ff 100644 (file)
@@ -332,23 +332,27 @@ gettmarg(PyObject *args, struct tm *p)
     if (y < 1000) {
         PyObject *accept = PyDict_GetItemString(moddict,
                                                 "accept2dyear");
-        int acceptval = accept != NULL && PyObject_IsTrue(accept);
-        if (acceptval == -1)
-            return 0;
-        if (acceptval) {
-            if (0 <= y && y < 69)
-                y += 2000;
-            else if (69 <= y && y < 100)
-                y += 1900;
-            else {
-                PyErr_SetString(PyExc_ValueError,
-                                "year out of range");
+       if (accept != NULL) {
+            int acceptval =  PyObject_IsTrue(accept);
+            if (acceptval == -1)
                 return 0;
+            if (acceptval) {
+                if (0 <= y && y < 69)
+                    y += 2000;
+                else if (69 <= y && y < 100)
+                    y += 1900;
+                else {
+                    PyErr_SetString(PyExc_ValueError,
+                                    "year out of range");
+                    return 0;
+                }
+                if (PyErr_WarnEx(PyExc_DeprecationWarning,
+                           "Century info guessed for a 2-digit year.", 1) != 0)
+                    return 0;
             }
-            if (PyErr_WarnEx(PyExc_DeprecationWarning,
-                    "Century info guessed for a 2-digit year.", 1) != 0)
-                return 0;
         }
+        else
+            return 0;
     }
     p->tm_year = y - 1900;
     p->tm_mon--;
@@ -477,6 +481,7 @@ time_strftime(PyObject *self, PyObject *args)
         PyErr_Format(PyExc_ValueError, "year=%d is before 1900; "
                      "the strftime() method requires year >= 1900",
                      buf.tm_year + 1900);
+        return NULL;
     }
 
     /* Normalize tm_isdst just in case someone foolishly implements %Z