Commit 0dd06f40 authored by Alexander Belopolsky's avatar Alexander Belopolsky

Fixed error handling branches. Thanks

Victor Stinner for pointing this out.
parent b8bb4664
...@@ -308,13 +308,24 @@ class TestDontAccept2Year(TestAccept2Year): ...@@ -308,13 +308,24 @@ class TestDontAccept2Year(TestAccept2Year):
def test_invalid(self): def test_invalid(self):
pass 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): class TestDontAccept2YearBool(TestDontAccept2Year):
accept2dyear = False accept2dyear = False
def test_main(): def test_main():
support.run_unittest(TimeTestCase, TestLocale, support.run_unittest(TimeTestCase, TestLocale,
TestAccept2Year, TestAccept2YearBool, TestAccept2Year, TestAccept2YearBool, TestAccept2YearBad,
TestDontAccept2Year, TestDontAccept2YearBool) TestDontAccept2Year, TestDontAccept2YearBool)
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -332,23 +332,27 @@ gettmarg(PyObject *args, struct tm *p) ...@@ -332,23 +332,27 @@ gettmarg(PyObject *args, struct tm *p)
if (y < 1000) { if (y < 1000) {
PyObject *accept = PyDict_GetItemString(moddict, PyObject *accept = PyDict_GetItemString(moddict,
"accept2dyear"); "accept2dyear");
int acceptval = accept != NULL && PyObject_IsTrue(accept); if (accept != NULL) {
if (acceptval == -1) int acceptval = PyObject_IsTrue(accept);
return 0; if (acceptval == -1)
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; 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_year = y - 1900;
p->tm_mon--; p->tm_mon--;
...@@ -477,6 +481,7 @@ time_strftime(PyObject *self, PyObject *args) ...@@ -477,6 +481,7 @@ time_strftime(PyObject *self, PyObject *args)
PyErr_Format(PyExc_ValueError, "year=%d is before 1900; " PyErr_Format(PyExc_ValueError, "year=%d is before 1900; "
"the strftime() method requires year >= 1900", "the strftime() method requires year >= 1900",
buf.tm_year + 1900); buf.tm_year + 1900);
return NULL;
} }
/* Normalize tm_isdst just in case someone foolishly implements %Z /* Normalize tm_isdst just in case someone foolishly implements %Z
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment