mirror of https://github.com/python/cpython
Issue #18520: Add a new PyStructSequence_InitType2() function, same than
PyStructSequence_InitType() except that it has a return value (0 on success, -1 on error). * PyStructSequence_InitType2() now raises MemoryError on memory allocation failure * Fix also some calls to PyDict_SetItemString(): handle error
This commit is contained in:
parent
2a545099f7
commit
1c8f059019
|
@ -197,7 +197,7 @@ PyAPI_FUNC(void) _PyImport_Init(void);
|
||||||
PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod);
|
PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod);
|
||||||
PyAPI_FUNC(void) _PyImportHooks_Init(void);
|
PyAPI_FUNC(void) _PyImportHooks_Init(void);
|
||||||
PyAPI_FUNC(int) _PyFrame_Init(void);
|
PyAPI_FUNC(int) _PyFrame_Init(void);
|
||||||
PyAPI_FUNC(void) _PyFloat_Init(void);
|
PyAPI_FUNC(int) _PyFloat_Init(void);
|
||||||
PyAPI_FUNC(int) PyByteArray_Init(void);
|
PyAPI_FUNC(int) PyByteArray_Init(void);
|
||||||
PyAPI_FUNC(void) _PyRandom_Init(void);
|
PyAPI_FUNC(void) _PyRandom_Init(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -24,6 +24,8 @@ extern char* PyStructSequence_UnnamedField;
|
||||||
#ifndef Py_LIMITED_API
|
#ifndef Py_LIMITED_API
|
||||||
PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type,
|
PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type,
|
||||||
PyStructSequence_Desc *desc);
|
PyStructSequence_Desc *desc);
|
||||||
|
PyAPI_FUNC(int) PyStructSequence_InitType2(PyTypeObject *type,
|
||||||
|
PyStructSequence_Desc *desc);
|
||||||
#endif
|
#endif
|
||||||
PyAPI_FUNC(PyTypeObject*) PyStructSequence_NewType(PyStructSequence_Desc *desc);
|
PyAPI_FUNC(PyTypeObject*) PyStructSequence_NewType(PyStructSequence_Desc *desc);
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,10 @@ What's New in Python 3.4.0 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #18520: Add a new PyStructSequence_InitType2() function, same than
|
||||||
|
PyStructSequence_InitType() except that it has a return value (0 on success,
|
||||||
|
-1 on error).
|
||||||
|
|
||||||
- Issue #15905: Fix theoretical buffer overflow in handling of sys.argv[0],
|
- Issue #15905: Fix theoretical buffer overflow in handling of sys.argv[0],
|
||||||
prefix and exec_prefix if the operation system does not obey MAXPATHLEN.
|
prefix and exec_prefix if the operation system does not obey MAXPATHLEN.
|
||||||
|
|
||||||
|
|
|
@ -884,10 +884,12 @@ PyInit__lsprof(void)
|
||||||
PyDict_SetItemString(d, "Profiler", (PyObject *)&PyProfiler_Type);
|
PyDict_SetItemString(d, "Profiler", (PyObject *)&PyProfiler_Type);
|
||||||
|
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
PyStructSequence_InitType(&StatsEntryType,
|
if (PyStructSequence_InitType2(&StatsEntryType,
|
||||||
&profiler_entry_desc);
|
&profiler_entry_desc) < 0)
|
||||||
PyStructSequence_InitType(&StatsSubEntryType,
|
return NULL;
|
||||||
&profiler_subentry_desc);
|
if (PyStructSequence_InitType2(&StatsSubEntryType,
|
||||||
|
&profiler_subentry_desc) < 0)
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
Py_INCREF((PyObject*) &StatsEntryType);
|
Py_INCREF((PyObject*) &StatsEntryType);
|
||||||
Py_INCREF((PyObject*) &StatsSubEntryType);
|
Py_INCREF((PyObject*) &StatsSubEntryType);
|
||||||
|
|
|
@ -210,9 +210,14 @@ PyInit_grp(void)
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
d = PyModule_GetDict(m);
|
d = PyModule_GetDict(m);
|
||||||
if (!initialized)
|
if (!initialized) {
|
||||||
PyStructSequence_InitType(&StructGrpType, &struct_group_type_desc);
|
if (PyStructSequence_InitType2(&StructGrpType,
|
||||||
PyDict_SetItemString(d, "struct_group", (PyObject *) &StructGrpType);
|
&struct_group_type_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (PyDict_SetItemString(d, "struct_group",
|
||||||
|
(PyObject *)&StructGrpType) < 0)
|
||||||
|
return NULL;
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11518,19 +11518,23 @@ INITFUNC(void)
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
#if defined(HAVE_WAITID) && !defined(__APPLE__)
|
#if defined(HAVE_WAITID) && !defined(__APPLE__)
|
||||||
waitid_result_desc.name = MODNAME ".waitid_result";
|
waitid_result_desc.name = MODNAME ".waitid_result";
|
||||||
PyStructSequence_InitType(&WaitidResultType, &waitid_result_desc);
|
if (PyStructSequence_InitType2(&WaitidResultType, &waitid_result_desc) < 0)
|
||||||
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
stat_result_desc.name = MODNAME ".stat_result";
|
stat_result_desc.name = MODNAME ".stat_result";
|
||||||
stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
|
stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
|
||||||
stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
|
stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
|
||||||
stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
|
stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
|
||||||
PyStructSequence_InitType(&StatResultType, &stat_result_desc);
|
if (PyStructSequence_InitType2(&StatResultType, &stat_result_desc) < 0)
|
||||||
|
return NULL;
|
||||||
structseq_new = StatResultType.tp_new;
|
structseq_new = StatResultType.tp_new;
|
||||||
StatResultType.tp_new = statresult_new;
|
StatResultType.tp_new = statresult_new;
|
||||||
|
|
||||||
statvfs_result_desc.name = MODNAME ".statvfs_result";
|
statvfs_result_desc.name = MODNAME ".statvfs_result";
|
||||||
PyStructSequence_InitType(&StatVFSResultType, &statvfs_result_desc);
|
if (PyStructSequence_InitType2(&StatVFSResultType,
|
||||||
|
&statvfs_result_desc) < 0)
|
||||||
|
return NULL;
|
||||||
#ifdef NEED_TICKS_PER_SECOND
|
#ifdef NEED_TICKS_PER_SECOND
|
||||||
# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
|
# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
|
||||||
ticks_per_second = sysconf(_SC_CLK_TCK);
|
ticks_per_second = sysconf(_SC_CLK_TCK);
|
||||||
|
@ -11543,12 +11547,15 @@ INITFUNC(void)
|
||||||
|
|
||||||
#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER)
|
#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER)
|
||||||
sched_param_desc.name = MODNAME ".sched_param";
|
sched_param_desc.name = MODNAME ".sched_param";
|
||||||
PyStructSequence_InitType(&SchedParamType, &sched_param_desc);
|
if (PyStructSequence_InitType2(&SchedParamType, &sched_param_desc) < 0)
|
||||||
|
return NULL;
|
||||||
SchedParamType.tp_new = sched_param_new;
|
SchedParamType.tp_new = sched_param_new;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* initialize TerminalSize_info */
|
/* initialize TerminalSize_info */
|
||||||
PyStructSequence_InitType(&TerminalSizeType, &TerminalSize_desc);
|
if (PyStructSequence_InitType2(&TerminalSizeType,
|
||||||
|
&TerminalSize_desc) < 0)
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
#if defined(HAVE_WAITID) && !defined(__APPLE__)
|
#if defined(HAVE_WAITID) && !defined(__APPLE__)
|
||||||
Py_INCREF((PyObject*) &WaitidResultType);
|
Py_INCREF((PyObject*) &WaitidResultType);
|
||||||
|
@ -11566,11 +11573,13 @@ INITFUNC(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
times_result_desc.name = MODNAME ".times_result";
|
times_result_desc.name = MODNAME ".times_result";
|
||||||
PyStructSequence_InitType(&TimesResultType, ×_result_desc);
|
if (PyStructSequence_InitType2(&TimesResultType, ×_result_desc) < 0)
|
||||||
|
return NULL;
|
||||||
PyModule_AddObject(m, "times_result", (PyObject *)&TimesResultType);
|
PyModule_AddObject(m, "times_result", (PyObject *)&TimesResultType);
|
||||||
|
|
||||||
uname_result_desc.name = MODNAME ".uname_result";
|
uname_result_desc.name = MODNAME ".uname_result";
|
||||||
PyStructSequence_InitType(&UnameResultType, &uname_result_desc);
|
if (PyStructSequence_InitType2(&UnameResultType, &uname_result_desc) < 0)
|
||||||
|
return NULL;
|
||||||
PyModule_AddObject(m, "uname_result", (PyObject *)&UnameResultType);
|
PyModule_AddObject(m, "uname_result", (PyObject *)&UnameResultType);
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
@ -11648,7 +11657,6 @@ INITFUNC(void)
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -216,8 +216,9 @@ PyInit_pwd(void)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
PyStructSequence_InitType(&StructPwdType,
|
if (PyStructSequence_InitType2(&StructPwdType,
|
||||||
&struct_pwd_type_desc);
|
&struct_pwd_type_desc) < 0)
|
||||||
|
return NULL;
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
}
|
}
|
||||||
Py_INCREF((PyObject *) &StructPwdType);
|
Py_INCREF((PyObject *) &StructPwdType);
|
||||||
|
|
|
@ -263,9 +263,12 @@ PyInit_resource(void)
|
||||||
/* Add some symbolic constants to the module */
|
/* Add some symbolic constants to the module */
|
||||||
Py_INCREF(PyExc_OSError);
|
Py_INCREF(PyExc_OSError);
|
||||||
PyModule_AddObject(m, "error", PyExc_OSError);
|
PyModule_AddObject(m, "error", PyExc_OSError);
|
||||||
if (!initialized)
|
if (!initialized) {
|
||||||
PyStructSequence_InitType(&StructRUsageType,
|
if (PyStructSequence_InitType2(&StructRUsageType,
|
||||||
&struct_rusage_desc);
|
&struct_rusage_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
Py_INCREF(&StructRUsageType);
|
Py_INCREF(&StructRUsageType);
|
||||||
PyModule_AddObject(m, "struct_rusage",
|
PyModule_AddObject(m, "struct_rusage",
|
||||||
(PyObject*) &StructRUsageType);
|
(PyObject*) &StructRUsageType);
|
||||||
|
|
|
@ -978,9 +978,10 @@ PyInit_signal(void)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
|
#if defined(HAVE_SIGWAITINFO) || defined(HAVE_SIGTIMEDWAIT)
|
||||||
if (!initialized)
|
if (!initialized) {
|
||||||
PyStructSequence_InitType(&SiginfoType, &struct_siginfo_desc);
|
if (PyStructSequence_InitType2(&SiginfoType, &struct_siginfo_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
Py_INCREF((PyObject*) &SiginfoType);
|
Py_INCREF((PyObject*) &SiginfoType);
|
||||||
PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
|
PyModule_AddObject(m, "struct_siginfo", (PyObject*) &SiginfoType);
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
|
|
@ -196,9 +196,11 @@ PyInit_spwd(void)
|
||||||
m=PyModule_Create(&spwdmodule);
|
m=PyModule_Create(&spwdmodule);
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!initialized)
|
if (!initialized) {
|
||||||
PyStructSequence_InitType(&StructSpwdType,
|
if (PyStructSequence_InitType2(&StructSpwdType,
|
||||||
&struct_spwd_type_desc);
|
&struct_spwd_type_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
Py_INCREF((PyObject *) &StructSpwdType);
|
Py_INCREF((PyObject *) &StructSpwdType);
|
||||||
PyModule_AddObject(m, "struct_spwd", (PyObject *) &StructSpwdType);
|
PyModule_AddObject(m, "struct_spwd", (PyObject *) &StructSpwdType);
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
|
|
@ -1476,8 +1476,9 @@ PyInit_time(void)
|
||||||
PyInit_timezone(m);
|
PyInit_timezone(m);
|
||||||
|
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
PyStructSequence_InitType(&StructTimeType,
|
if (PyStructSequence_InitType2(&StructTimeType,
|
||||||
&struct_time_type_desc);
|
&struct_time_type_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
winver.dwOSVersionInfoSize = sizeof(winver);
|
winver.dwOSVersionInfoSize = sizeof(winver);
|
||||||
|
|
|
@ -1853,7 +1853,7 @@ PyTypeObject PyFloat_Type = {
|
||||||
float_new, /* tp_new */
|
float_new, /* tp_new */
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
int
|
||||||
_PyFloat_Init(void)
|
_PyFloat_Init(void)
|
||||||
{
|
{
|
||||||
/* We attempt to determine if this machine is using IEEE
|
/* We attempt to determine if this machine is using IEEE
|
||||||
|
@ -1903,8 +1903,11 @@ _PyFloat_Init(void)
|
||||||
float_format = detected_float_format;
|
float_format = detected_float_format;
|
||||||
|
|
||||||
/* Init float info */
|
/* Init float info */
|
||||||
if (FloatInfoType.tp_name == 0)
|
if (FloatInfoType.tp_name == NULL) {
|
||||||
PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc);
|
if (PyStructSequence_InitType2(&FloatInfoType, &floatinfo_desc) < 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -5059,8 +5059,10 @@ _PyLong_Init(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* initialize int_info */
|
/* initialize int_info */
|
||||||
if (Int_InfoType.tp_name == 0)
|
if (Int_InfoType.tp_name == NULL) {
|
||||||
PyStructSequence_InitType(&Int_InfoType, &int_info_desc);
|
if (PyStructSequence_InitType2(&Int_InfoType, &int_info_desc) < 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,12 +320,13 @@ static PyTypeObject _struct_sequence_template = {
|
||||||
structseq_new, /* tp_new */
|
structseq_new, /* tp_new */
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
int
|
||||||
PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
|
PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)
|
||||||
{
|
{
|
||||||
PyObject *dict;
|
PyObject *dict;
|
||||||
PyMemberDef* members;
|
PyMemberDef* members;
|
||||||
int n_members, n_unnamed_members, i, k;
|
int n_members, n_unnamed_members, i, k;
|
||||||
|
PyObject *v;
|
||||||
|
|
||||||
#ifdef Py_TRACE_REFS
|
#ifdef Py_TRACE_REFS
|
||||||
/* if the type object was chained, unchain it first
|
/* if the type object was chained, unchain it first
|
||||||
|
@ -347,8 +348,10 @@ PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
|
||||||
type->tp_doc = desc->doc;
|
type->tp_doc = desc->doc;
|
||||||
|
|
||||||
members = PyMem_NEW(PyMemberDef, n_members-n_unnamed_members+1);
|
members = PyMem_NEW(PyMemberDef, n_members-n_unnamed_members+1);
|
||||||
if (members == NULL)
|
if (members == NULL) {
|
||||||
return;
|
PyErr_NoMemory();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = k = 0; i < n_members; ++i) {
|
for (i = k = 0; i < n_members; ++i) {
|
||||||
if (desc->fields[i].name == PyStructSequence_UnnamedField)
|
if (desc->fields[i].name == PyStructSequence_UnnamedField)
|
||||||
|
@ -366,22 +369,33 @@ PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
|
||||||
type->tp_members = members;
|
type->tp_members = members;
|
||||||
|
|
||||||
if (PyType_Ready(type) < 0)
|
if (PyType_Ready(type) < 0)
|
||||||
return;
|
return -1;
|
||||||
Py_INCREF(type);
|
Py_INCREF(type);
|
||||||
|
|
||||||
dict = type->tp_dict;
|
dict = type->tp_dict;
|
||||||
#define SET_DICT_FROM_INT(key, value) \
|
#define SET_DICT_FROM_INT(key, value) \
|
||||||
do { \
|
do { \
|
||||||
PyObject *v = PyLong_FromLong((long) value); \
|
v = PyLong_FromLong((long) value); \
|
||||||
if (v != NULL) { \
|
if (v == NULL) \
|
||||||
PyDict_SetItemString(dict, key, v); \
|
return -1; \
|
||||||
|
if (PyDict_SetItemString(dict, key, v) < 0) { \
|
||||||
Py_DECREF(v); \
|
Py_DECREF(v); \
|
||||||
|
return -1; \
|
||||||
} \
|
} \
|
||||||
|
Py_DECREF(v); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
SET_DICT_FROM_INT(visible_length_key, desc->n_in_sequence);
|
SET_DICT_FROM_INT(visible_length_key, desc->n_in_sequence);
|
||||||
SET_DICT_FROM_INT(real_length_key, n_members);
|
SET_DICT_FROM_INT(real_length_key, n_members);
|
||||||
SET_DICT_FROM_INT(unnamed_fields_key, n_unnamed_members);
|
SET_DICT_FROM_INT(unnamed_fields_key, n_unnamed_members);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
|
||||||
|
{
|
||||||
|
(void)PyStructSequence_InitType2(type, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyTypeObject*
|
PyTypeObject*
|
||||||
|
@ -390,8 +404,11 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc)
|
||||||
PyTypeObject *result;
|
PyTypeObject *result;
|
||||||
|
|
||||||
result = (PyTypeObject*)PyType_GenericAlloc(&PyType_Type, 0);
|
result = (PyTypeObject*)PyType_GenericAlloc(&PyType_Type, 0);
|
||||||
if (result != NULL) {
|
if (result == NULL)
|
||||||
PyStructSequence_InitType(result, desc);
|
return NULL;
|
||||||
|
if (PyStructSequence_InitType2(result, desc) < 0) {
|
||||||
|
Py_DECREF(result);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -328,7 +328,8 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
|
||||||
if (!PyByteArray_Init())
|
if (!PyByteArray_Init())
|
||||||
Py_FatalError("Py_Initialize: can't init bytearray");
|
Py_FatalError("Py_Initialize: can't init bytearray");
|
||||||
|
|
||||||
_PyFloat_Init();
|
if (!_PyFloat_Init())
|
||||||
|
Py_FatalError("Py_Initialize: can't init float");
|
||||||
|
|
||||||
interp->modules = PyDict_New();
|
interp->modules = PyDict_New();
|
||||||
if (interp->modules == NULL)
|
if (interp->modules == NULL)
|
||||||
|
|
|
@ -1634,8 +1634,10 @@ _PySys_Init(void)
|
||||||
SET_SYS_FROM_STRING("int_info",
|
SET_SYS_FROM_STRING("int_info",
|
||||||
PyLong_GetInfo());
|
PyLong_GetInfo());
|
||||||
/* initialize hash_info */
|
/* initialize hash_info */
|
||||||
if (Hash_InfoType.tp_name == 0)
|
if (Hash_InfoType.tp_name == NULL) {
|
||||||
PyStructSequence_InitType(&Hash_InfoType, &hash_info_desc);
|
if (PyStructSequence_InitType2(&Hash_InfoType, &hash_info_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
SET_SYS_FROM_STRING("hash_info",
|
SET_SYS_FROM_STRING("hash_info",
|
||||||
get_hash_info());
|
get_hash_info());
|
||||||
SET_SYS_FROM_STRING("maxunicode",
|
SET_SYS_FROM_STRING("maxunicode",
|
||||||
|
@ -1676,8 +1678,11 @@ _PySys_Init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* version_info */
|
/* version_info */
|
||||||
if (VersionInfoType.tp_name == 0)
|
if (VersionInfoType.tp_name == NULL) {
|
||||||
PyStructSequence_InitType(&VersionInfoType, &version_info_desc);
|
if (PyStructSequence_InitType2(&VersionInfoType,
|
||||||
|
&version_info_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
version_info = make_version_info();
|
version_info = make_version_info();
|
||||||
SET_SYS_FROM_STRING("version_info", version_info);
|
SET_SYS_FROM_STRING("version_info", version_info);
|
||||||
/* prevent user from creating new instances */
|
/* prevent user from creating new instances */
|
||||||
|
@ -1688,8 +1693,10 @@ _PySys_Init(void)
|
||||||
SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
|
SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
|
||||||
|
|
||||||
/* flags */
|
/* flags */
|
||||||
if (FlagsType.tp_name == 0)
|
if (FlagsType.tp_name == 0) {
|
||||||
PyStructSequence_InitType(&FlagsType, &flags_desc);
|
if (PyStructSequence_InitType2(&FlagsType, &flags_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
SET_SYS_FROM_STRING("flags", make_flags());
|
SET_SYS_FROM_STRING("flags", make_flags());
|
||||||
/* prevent user from creating new instances */
|
/* prevent user from creating new instances */
|
||||||
FlagsType.tp_init = NULL;
|
FlagsType.tp_init = NULL;
|
||||||
|
@ -1699,7 +1706,9 @@ _PySys_Init(void)
|
||||||
#if defined(MS_WINDOWS)
|
#if defined(MS_WINDOWS)
|
||||||
/* getwindowsversion */
|
/* getwindowsversion */
|
||||||
if (WindowsVersionType.tp_name == 0)
|
if (WindowsVersionType.tp_name == 0)
|
||||||
PyStructSequence_InitType(&WindowsVersionType, &windows_version_desc);
|
if (PyStructSequence_InitType2(&WindowsVersionType,
|
||||||
|
&windows_version_desc) < 0)
|
||||||
|
return NULL;
|
||||||
/* prevent user from creating new instances */
|
/* prevent user from creating new instances */
|
||||||
WindowsVersionType.tp_init = NULL;
|
WindowsVersionType.tp_init = NULL;
|
||||||
WindowsVersionType.tp_new = NULL;
|
WindowsVersionType.tp_new = NULL;
|
||||||
|
|
|
@ -399,8 +399,10 @@ PyThread_GetInfo(void)
|
||||||
int len;
|
int len;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ThreadInfoType.tp_name == 0)
|
if (ThreadInfoType.tp_name == 0) {
|
||||||
PyStructSequence_InitType(&ThreadInfoType, &threadinfo_desc);
|
if (PyStructSequence_InitType2(&ThreadInfoType, &threadinfo_desc) < 0)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
threadinfo = PyStructSequence_New(&ThreadInfoType);
|
threadinfo = PyStructSequence_New(&ThreadInfoType);
|
||||||
if (threadinfo == NULL)
|
if (threadinfo == NULL)
|
||||||
|
|
Loading…
Reference in New Issue