summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_time.py13
-rw-r--r--Modules/timemodule.c33
2 files changed, 31 insertions, 15 deletions
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
index e4b6a0fb46..d3de933cc8 100644
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -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__":
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 5732f15265..46c90ecdc9 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -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