_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_showwarnmsg));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_shutdown));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_slotnames));
+ _PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_strptime));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_strptime_datetime));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_swappedbytes_));
_PyStaticObject_CheckRefcnt((PyObject *)&_Py_ID(_type_));
STRUCT_FOR_ID(_showwarnmsg)
STRUCT_FOR_ID(_shutdown)
STRUCT_FOR_ID(_slotnames)
+ STRUCT_FOR_ID(_strptime)
STRUCT_FOR_ID(_strptime_datetime)
STRUCT_FOR_ID(_swappedbytes_)
STRUCT_FOR_ID(_type_)
INIT_ID(_showwarnmsg), \
INIT_ID(_shutdown), \
INIT_ID(_slotnames), \
+ INIT_ID(_strptime), \
INIT_ID(_strptime_datetime), \
INIT_ID(_swappedbytes_), \
INIT_ID(_type_), \
string = &_Py_ID(_slotnames);
assert(_PyUnicode_CheckConsistency(string, 1));
_PyUnicode_InternInPlace(interp, &string);
+ string = &_Py_ID(_strptime);
+ assert(_PyUnicode_CheckConsistency(string, 1));
+ _PyUnicode_InternInPlace(interp, &string);
string = &_Py_ID(_strptime_datetime);
assert(_PyUnicode_CheckConsistency(string, 1));
_PyUnicode_InternInPlace(interp, &string);
out, err = self.run_embedded_interpreter("test_repeated_init_exec", code)
self.assertEqual(out, '9\n' * INIT_LOOPS)
+ def test_datetime_reset_strptime(self):
+ code = (
+ "import datetime;"
+ "d = datetime.datetime.strptime('2000-01-01', '%Y-%m-%d');"
+ "print(d.strftime('%Y%m%d'))"
+ )
+ out, err = self.run_embedded_interpreter("test_repeated_init_exec", code)
+ self.assertEqual(out, '20000101\n' * INIT_LOOPS)
+
@unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi")
class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
--- /dev/null
+Fix crash in C version of :meth:`datetime.datetime.strptime` when called again
+on the restarted interpreter.
static PyObject *
datetime_strptime(PyObject *cls, PyObject *args)
{
- static PyObject *module = NULL;
- PyObject *string, *format;
+ PyObject *string, *format, *result;
if (!PyArg_ParseTuple(args, "UU:strptime", &string, &format))
return NULL;
+ PyObject *module = PyImport_Import(&_Py_ID(_strptime));
if (module == NULL) {
- module = PyImport_ImportModule("_strptime");
- if (module == NULL)
- return NULL;
+ return NULL;
}
- return PyObject_CallMethodObjArgs(module, &_Py_ID(_strptime_datetime),
- cls, string, format, NULL);
+ result = PyObject_CallMethodObjArgs(module, &_Py_ID(_strptime_datetime),
+ cls, string, format, NULL);
+ Py_DECREF(module);
+ return result;
}
/* Return new datetime from date/datetime and time arguments. */
Modules/_ctypes/_ctypes.c - _unpickle -
Modules/_ctypes/_ctypes.c PyCArrayType_from_ctype array_cache -
Modules/_cursesmodule.c - ModDict -
-Modules/_datetimemodule.c datetime_strptime module -
## state
Modules/_ctypes/_ctypes.c - _ctypes_ptrtype_cache -