mirror of https://github.com/python/cpython
gh-94673: Ensure Builtin Static Types are Readied Properly (gh-103940)
There were cases where we do unnecessary work for builtin static types. This also simplifies some work necessary for a per-interpreter GIL.
This commit is contained in:
parent
56c7176d1d
commit
d2e2e53f73
|
@ -9,11 +9,6 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* runtime lifecycle */
|
|
||||||
|
|
||||||
extern PyStatus _PyBytes_InitTypes(PyInterpreterState *);
|
|
||||||
|
|
||||||
|
|
||||||
/* Substring Search.
|
/* Substring Search.
|
||||||
|
|
||||||
Returns the index of the first occurrence of
|
Returns the index of the first occurrence of
|
||||||
|
|
|
@ -14,7 +14,6 @@ extern "C" {
|
||||||
/* runtime lifecycle */
|
/* runtime lifecycle */
|
||||||
|
|
||||||
extern PyStatus _PyTuple_InitGlobalObjects(PyInterpreterState *);
|
extern PyStatus _PyTuple_InitGlobalObjects(PyInterpreterState *);
|
||||||
extern PyStatus _PyTuple_InitTypes(PyInterpreterState *);
|
|
||||||
extern void _PyTuple_Fini(PyInterpreterState *);
|
extern void _PyTuple_Fini(PyInterpreterState *);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -671,13 +671,11 @@ static PyTypeObject* static_types[] = {
|
||||||
PyStatus
|
PyStatus
|
||||||
_PyIO_InitTypes(PyInterpreterState *interp)
|
_PyIO_InitTypes(PyInterpreterState *interp)
|
||||||
{
|
{
|
||||||
if (!_Py_IsMainInterpreter(interp)) {
|
|
||||||
return _PyStatus_OK();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set type base classes
|
|
||||||
#ifdef HAVE_WINDOWS_CONSOLE_IO
|
#ifdef HAVE_WINDOWS_CONSOLE_IO
|
||||||
PyWindowsConsoleIO_Type.tp_base = &PyRawIOBase_Type;
|
if (_Py_IsMainInterpreter(interp)) {
|
||||||
|
// Set type base classes
|
||||||
|
PyWindowsConsoleIO_Type.tp_base = &PyRawIOBase_Type;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
|
for (size_t i=0; i < Py_ARRAY_LENGTH(static_types); i++) {
|
||||||
|
|
|
@ -2096,7 +2096,7 @@ math_trunc(PyObject *module, PyObject *x)
|
||||||
return PyFloat_Type.tp_as_number->nb_int(x);
|
return PyFloat_Type.tp_as_number->nb_int(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Py_TYPE(x)->tp_dict == NULL) {
|
if (_PyType_IsReady(Py_TYPE(x))) {
|
||||||
if (PyType_Ready(Py_TYPE(x)) < 0)
|
if (PyType_Ready(Py_TYPE(x)) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,12 +66,6 @@ static PyMethodDef symtable_methods[] = {
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
|
||||||
symtable_init_stentry_type(PyObject *m)
|
|
||||||
{
|
|
||||||
return PyType_Ready(&PySTEntry_Type);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
symtable_init_constants(PyObject *m)
|
symtable_init_constants(PyObject *m)
|
||||||
{
|
{
|
||||||
|
@ -105,7 +99,6 @@ symtable_init_constants(PyObject *m)
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyModuleDef_Slot symtable_slots[] = {
|
static PyModuleDef_Slot symtable_slots[] = {
|
||||||
{Py_mod_exec, symtable_init_stentry_type},
|
|
||||||
{Py_mod_exec, symtable_init_constants},
|
{Py_mod_exec, symtable_init_constants},
|
||||||
{0, NULL}
|
{0, NULL}
|
||||||
};
|
};
|
||||||
|
|
|
@ -3090,25 +3090,6 @@ error:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PyStatus
|
|
||||||
_PyBytes_InitTypes(PyInterpreterState *interp)
|
|
||||||
{
|
|
||||||
if (!_Py_IsMainInterpreter(interp)) {
|
|
||||||
return _PyStatus_OK();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PyType_Ready(&PyBytes_Type) < 0) {
|
|
||||||
return _PyStatus_ERR("Can't initialize bytes type");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PyType_Ready(&PyBytesIter_Type) < 0) {
|
|
||||||
return _PyStatus_ERR("Can't initialize bytes iterator type");
|
|
||||||
}
|
|
||||||
|
|
||||||
return _PyStatus_OK();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*********************** Bytes Iterator ****************************/
|
/*********************** Bytes Iterator ****************************/
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -181,7 +181,7 @@ method_getattro(PyObject *obj, PyObject *name)
|
||||||
PyObject *descr = NULL;
|
PyObject *descr = NULL;
|
||||||
|
|
||||||
{
|
{
|
||||||
if (tp->tp_dict == NULL) {
|
if (!_PyType_IsReady(tp)) {
|
||||||
if (PyType_Ready(tp) < 0)
|
if (PyType_Ready(tp) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -395,7 +395,7 @@ instancemethod_getattro(PyObject *self, PyObject *name)
|
||||||
PyTypeObject *tp = Py_TYPE(self);
|
PyTypeObject *tp = Py_TYPE(self);
|
||||||
PyObject *descr = NULL;
|
PyObject *descr = NULL;
|
||||||
|
|
||||||
if (tp->tp_dict == NULL) {
|
if (!_PyType_IsReady(tp)) {
|
||||||
if (PyType_Ready(tp) < 0)
|
if (PyType_Ready(tp) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3596,10 +3596,6 @@ static struct static_exception static_exceptions[] = {
|
||||||
int
|
int
|
||||||
_PyExc_InitTypes(PyInterpreterState *interp)
|
_PyExc_InitTypes(PyInterpreterState *interp)
|
||||||
{
|
{
|
||||||
if (!_Py_IsMainInterpreter(interp)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i=0; i < Py_ARRAY_LENGTH(static_exceptions); i++) {
|
for (size_t i=0; i < Py_ARRAY_LENGTH(static_exceptions); i++) {
|
||||||
PyTypeObject *exc = static_exceptions[i].exc;
|
PyTypeObject *exc = static_exceptions[i].exc;
|
||||||
if (_PyStaticType_InitBuiltin(exc) < 0) {
|
if (_PyStaticType_InitBuiltin(exc) < 0) {
|
||||||
|
|
|
@ -1990,20 +1990,10 @@ _PyFloat_InitState(PyInterpreterState *interp)
|
||||||
PyStatus
|
PyStatus
|
||||||
_PyFloat_InitTypes(PyInterpreterState *interp)
|
_PyFloat_InitTypes(PyInterpreterState *interp)
|
||||||
{
|
{
|
||||||
if (!_Py_IsMainInterpreter(interp)) {
|
|
||||||
return _PyStatus_OK();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PyType_Ready(&PyFloat_Type) < 0) {
|
|
||||||
return _PyStatus_ERR("Can't initialize float type");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Init float info */
|
/* Init float info */
|
||||||
if (FloatInfoType.tp_name == NULL) {
|
if (_PyStructSequence_InitBuiltin(&FloatInfoType,
|
||||||
if (_PyStructSequence_InitBuiltin(&FloatInfoType,
|
&floatinfo_desc) < 0) {
|
||||||
&floatinfo_desc) < 0) {
|
return _PyStatus_ERR("can't init float info type");
|
||||||
return _PyStatus_ERR("can't init float info type");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return _PyStatus_OK();
|
return _PyStatus_OK();
|
||||||
|
|
|
@ -6351,19 +6351,9 @@ PyLong_GetInfo(void)
|
||||||
PyStatus
|
PyStatus
|
||||||
_PyLong_InitTypes(PyInterpreterState *interp)
|
_PyLong_InitTypes(PyInterpreterState *interp)
|
||||||
{
|
{
|
||||||
if (!_Py_IsMainInterpreter(interp)) {
|
|
||||||
return _PyStatus_OK();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PyType_Ready(&PyLong_Type) < 0) {
|
|
||||||
return _PyStatus_ERR("Can't initialize int type");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize int_info */
|
/* initialize int_info */
|
||||||
if (Int_InfoType.tp_name == NULL) {
|
if (_PyStructSequence_InitBuiltin(&Int_InfoType, &int_info_desc) < 0) {
|
||||||
if (_PyStructSequence_InitBuiltin(&Int_InfoType, &int_info_desc) < 0) {
|
return _PyStatus_ERR("can't init int info type");
|
||||||
return _PyStatus_ERR("can't init int info type");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return _PyStatus_OK();
|
return _PyStatus_OK();
|
||||||
|
|
|
@ -890,7 +890,7 @@ PyObject_Hash(PyObject *v)
|
||||||
* an explicit call to PyType_Ready, we implicitly call
|
* an explicit call to PyType_Ready, we implicitly call
|
||||||
* PyType_Ready here and then check the tp_hash slot again
|
* PyType_Ready here and then check the tp_hash slot again
|
||||||
*/
|
*/
|
||||||
if (tp->tp_dict == NULL) {
|
if (!_PyType_IsReady(tp)) {
|
||||||
if (PyType_Ready(tp) < 0)
|
if (PyType_Ready(tp) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (tp->tp_hash != NULL)
|
if (tp->tp_hash != NULL)
|
||||||
|
@ -1385,7 +1385,7 @@ _PyObject_GenericGetAttrWithDict(PyObject *obj, PyObject *name,
|
||||||
}
|
}
|
||||||
Py_INCREF(name);
|
Py_INCREF(name);
|
||||||
|
|
||||||
if (tp->tp_dict == NULL) {
|
if (!_PyType_IsReady(tp)) {
|
||||||
if (PyType_Ready(tp) < 0)
|
if (PyType_Ready(tp) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
@ -1507,8 +1507,9 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tp->tp_dict == NULL && PyType_Ready(tp) < 0)
|
if (!_PyType_IsReady(tp) && PyType_Ready(tp) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
Py_INCREF(name);
|
Py_INCREF(name);
|
||||||
Py_INCREF(tp);
|
Py_INCREF(tp);
|
||||||
|
|
|
@ -509,6 +509,13 @@ _PyStructSequence_InitBuiltinWithFlags(PyTypeObject *type,
|
||||||
PyStructSequence_Desc *desc,
|
PyStructSequence_Desc *desc,
|
||||||
unsigned long tp_flags)
|
unsigned long tp_flags)
|
||||||
{
|
{
|
||||||
|
if (type->tp_flags & Py_TPFLAGS_READY) {
|
||||||
|
if (_PyStaticType_InitBuiltin(type) < 0) {
|
||||||
|
goto failed_init_builtin;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
PyMemberDef *members;
|
PyMemberDef *members;
|
||||||
Py_ssize_t n_members, n_unnamed_members;
|
Py_ssize_t n_members, n_unnamed_members;
|
||||||
|
|
||||||
|
@ -517,18 +524,25 @@ _PyStructSequence_InitBuiltinWithFlags(PyTypeObject *type,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
initialize_static_fields(type, desc, members, tp_flags);
|
initialize_static_fields(type, desc, members, tp_flags);
|
||||||
|
|
||||||
|
Py_INCREF(type); // XXX It should be immortal.
|
||||||
if (_PyStaticType_InitBuiltin(type) < 0) {
|
if (_PyStaticType_InitBuiltin(type) < 0) {
|
||||||
PyMem_Free(members);
|
PyMem_Free(members);
|
||||||
PyErr_Format(PyExc_RuntimeError,
|
goto failed_init_builtin;
|
||||||
"Can't initialize builtin type %s",
|
|
||||||
desc->name);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
if (initialize_static_type(type, desc, n_members, n_unnamed_members) < 0) {
|
|
||||||
|
if (initialize_structseq_dict(
|
||||||
|
desc, type->tp_dict, n_members, n_unnamed_members) < 0) {
|
||||||
PyMem_Free(members);
|
PyMem_Free(members);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
failed_init_builtin:
|
||||||
|
PyErr_Format(PyExc_RuntimeError,
|
||||||
|
"Can't initialize builtin type %s",
|
||||||
|
desc->name);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -960,24 +960,6 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PyStatus
|
|
||||||
_PyTuple_InitTypes(PyInterpreterState *interp)
|
|
||||||
{
|
|
||||||
if (!_Py_IsMainInterpreter(interp)) {
|
|
||||||
return _PyStatus_OK();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PyType_Ready(&PyTuple_Type) < 0) {
|
|
||||||
return _PyStatus_ERR("Can't initialize tuple type");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PyType_Ready(&PyTupleIter_Type) < 0) {
|
|
||||||
return _PyStatus_ERR("Can't initialize tuple iterator type");
|
|
||||||
}
|
|
||||||
|
|
||||||
return _PyStatus_OK();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void maybe_freelist_clear(PyInterpreterState *, int);
|
static void maybe_freelist_clear(PyInterpreterState *, int);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -6948,8 +6948,12 @@ type_ready_post_checks(PyTypeObject *type)
|
||||||
static int
|
static int
|
||||||
type_ready(PyTypeObject *type)
|
type_ready(PyTypeObject *type)
|
||||||
{
|
{
|
||||||
|
_PyObject_ASSERT((PyObject *)type,
|
||||||
|
(type->tp_flags & Py_TPFLAGS_READYING) == 0);
|
||||||
|
type->tp_flags |= Py_TPFLAGS_READYING;
|
||||||
|
|
||||||
if (type_ready_pre_checks(type) < 0) {
|
if (type_ready_pre_checks(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Py_TRACE_REFS
|
#ifdef Py_TRACE_REFS
|
||||||
|
@ -6963,41 +6967,49 @@ type_ready(PyTypeObject *type)
|
||||||
|
|
||||||
/* Initialize tp_dict: _PyType_IsReady() tests if tp_dict != NULL */
|
/* Initialize tp_dict: _PyType_IsReady() tests if tp_dict != NULL */
|
||||||
if (type_ready_set_dict(type) < 0) {
|
if (type_ready_set_dict(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_set_bases(type) < 0) {
|
if (type_ready_set_bases(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_mro(type) < 0) {
|
if (type_ready_mro(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_set_new(type) < 0) {
|
if (type_ready_set_new(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_fill_dict(type) < 0) {
|
if (type_ready_fill_dict(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_inherit(type) < 0) {
|
if (type_ready_inherit(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_preheader(type) < 0) {
|
if (type_ready_preheader(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_set_hash(type) < 0) {
|
if (type_ready_set_hash(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_add_subclasses(type) < 0) {
|
if (type_ready_add_subclasses(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_managed_dict(type) < 0) {
|
if (type_ready_managed_dict(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
if (type_ready_post_checks(type) < 0) {
|
if (type_ready_post_checks(type) < 0) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* All done -- set the ready flag */
|
||||||
|
type->tp_flags = (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
|
||||||
|
|
||||||
|
assert(_PyType_CheckConsistency(type));
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
type->tp_flags &= ~Py_TPFLAGS_READYING;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
PyType_Ready(PyTypeObject *type)
|
PyType_Ready(PyTypeObject *type)
|
||||||
|
@ -7006,31 +7018,29 @@ PyType_Ready(PyTypeObject *type)
|
||||||
assert(_PyType_CheckConsistency(type));
|
assert(_PyType_CheckConsistency(type));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
_PyObject_ASSERT((PyObject *)type,
|
assert(!(type->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN));
|
||||||
(type->tp_flags & Py_TPFLAGS_READYING) == 0);
|
|
||||||
|
|
||||||
type->tp_flags |= Py_TPFLAGS_READYING;
|
|
||||||
|
|
||||||
/* Historically, all static types were immutable. See bpo-43908 */
|
/* Historically, all static types were immutable. See bpo-43908 */
|
||||||
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
|
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
|
||||||
type->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
|
type->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type_ready(type) < 0) {
|
return type_ready(type);
|
||||||
type->tp_flags &= ~Py_TPFLAGS_READYING;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* All done -- set the ready flag */
|
|
||||||
type->tp_flags = (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
|
|
||||||
assert(_PyType_CheckConsistency(type));
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_PyStaticType_InitBuiltin(PyTypeObject *self)
|
_PyStaticType_InitBuiltin(PyTypeObject *self)
|
||||||
{
|
{
|
||||||
|
assert(!(self->tp_flags & Py_TPFLAGS_HEAPTYPE));
|
||||||
|
|
||||||
|
if (self->tp_flags & Py_TPFLAGS_READY) {
|
||||||
|
assert(self->tp_flags & _Py_TPFLAGS_STATIC_BUILTIN);
|
||||||
|
assert(_PyType_CheckConsistency(self));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
self->tp_flags |= _Py_TPFLAGS_STATIC_BUILTIN;
|
self->tp_flags |= _Py_TPFLAGS_STATIC_BUILTIN;
|
||||||
|
self->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
|
||||||
|
|
||||||
assert(NEXT_GLOBAL_VERSION_TAG <= _Py_MAX_GLOBAL_TYPE_VERSION_TAG);
|
assert(NEXT_GLOBAL_VERSION_TAG <= _Py_MAX_GLOBAL_TYPE_VERSION_TAG);
|
||||||
self->tp_version_tag = NEXT_GLOBAL_VERSION_TAG++;
|
self->tp_version_tag = NEXT_GLOBAL_VERSION_TAG++;
|
||||||
|
@ -7038,7 +7048,7 @@ _PyStaticType_InitBuiltin(PyTypeObject *self)
|
||||||
|
|
||||||
static_builtin_state_init(self);
|
static_builtin_state_init(self);
|
||||||
|
|
||||||
int res = PyType_Ready(self);
|
int res = type_ready(self);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
static_builtin_state_clear(self);
|
static_builtin_state_clear(self);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14573,10 +14573,6 @@ _PyUnicode_InitGlobalObjects(PyInterpreterState *interp)
|
||||||
PyStatus
|
PyStatus
|
||||||
_PyUnicode_InitTypes(PyInterpreterState *interp)
|
_PyUnicode_InitTypes(PyInterpreterState *interp)
|
||||||
{
|
{
|
||||||
if (!_Py_IsMainInterpreter(interp)) {
|
|
||||||
return _PyStatus_OK();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_PyStaticType_InitBuiltin(&EncodingMapType) < 0) {
|
if (_PyStaticType_InitBuiltin(&EncodingMapType) < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2316,7 +2316,7 @@ builtin_round_impl(PyObject *module, PyObject *number, PyObject *ndigits)
|
||||||
{
|
{
|
||||||
PyObject *round, *result;
|
PyObject *round, *result;
|
||||||
|
|
||||||
if (Py_TYPE(number)->tp_dict == NULL) {
|
if (!_PyType_IsReady(Py_TYPE(number))) {
|
||||||
if (PyType_Ready(Py_TYPE(number)) < 0)
|
if (PyType_Ready(Py_TYPE(number)) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1342,15 +1342,9 @@ static PyStructSequence_Desc UnraisableHookArgs_desc = {
|
||||||
PyStatus
|
PyStatus
|
||||||
_PyErr_InitTypes(PyInterpreterState *interp)
|
_PyErr_InitTypes(PyInterpreterState *interp)
|
||||||
{
|
{
|
||||||
if (!_Py_IsMainInterpreter(interp)) {
|
if (_PyStructSequence_InitBuiltin(&UnraisableHookArgsType,
|
||||||
return _PyStatus_OK();
|
&UnraisableHookArgs_desc) < 0) {
|
||||||
}
|
return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
|
||||||
|
|
||||||
if (UnraisableHookArgsType.tp_name == NULL) {
|
|
||||||
if (_PyStructSequence_InitBuiltin(&UnraisableHookArgsType,
|
|
||||||
&UnraisableHookArgs_desc) < 0) {
|
|
||||||
return _PyStatus_ERR("failed to initialize UnraisableHookArgs type");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return _PyStatus_OK();
|
return _PyStatus_OK();
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_abstract.h" // _PyIndex_Check()
|
#include "pycore_abstract.h" // _PyIndex_Check()
|
||||||
|
#include "pycore_object.h" // _PyType_IsReady()
|
||||||
|
|
||||||
#define FLAG_SIZE_T 1
|
#define FLAG_SIZE_T 1
|
||||||
typedef double va_double;
|
typedef double va_double;
|
||||||
|
@ -693,7 +694,7 @@ PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
|
||||||
int
|
int
|
||||||
PyModule_AddType(PyObject *module, PyTypeObject *type)
|
PyModule_AddType(PyObject *module, PyTypeObject *type)
|
||||||
{
|
{
|
||||||
if (PyType_Ready(type) < 0) {
|
if (!_PyType_IsReady(type) && PyType_Ready(type) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
|
|
||||||
#include "pycore_bytesobject.h" // _PyBytes_InitTypes()
|
|
||||||
#include "pycore_ceval.h" // _PyEval_FiniGIL()
|
#include "pycore_ceval.h" // _PyEval_FiniGIL()
|
||||||
#include "pycore_context.h" // _PyContext_Init()
|
#include "pycore_context.h" // _PyContext_Init()
|
||||||
#include "pycore_exceptions.h" // _PyExc_InitTypes()
|
#include "pycore_exceptions.h" // _PyExc_InitTypes()
|
||||||
|
@ -26,7 +25,6 @@
|
||||||
#include "pycore_sliceobject.h" // _PySlice_Fini()
|
#include "pycore_sliceobject.h" // _PySlice_Fini()
|
||||||
#include "pycore_sysmodule.h" // _PySys_ClearAuditHooks()
|
#include "pycore_sysmodule.h" // _PySys_ClearAuditHooks()
|
||||||
#include "pycore_traceback.h" // _Py_DumpTracebackThreads()
|
#include "pycore_traceback.h" // _Py_DumpTracebackThreads()
|
||||||
#include "pycore_tuple.h" // _PyTuple_InitTypes()
|
|
||||||
#include "pycore_typeobject.h" // _PyTypes_InitTypes()
|
#include "pycore_typeobject.h" // _PyTypes_InitTypes()
|
||||||
#include "pycore_unicodeobject.h" // _PyUnicode_InitTypes()
|
#include "pycore_unicodeobject.h" // _PyUnicode_InitTypes()
|
||||||
#include "opcode.h"
|
#include "opcode.h"
|
||||||
|
@ -684,11 +682,6 @@ pycore_init_types(PyInterpreterState *interp)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = _PyBytes_InitTypes(interp);
|
|
||||||
if (_PyStatus_EXCEPTION(status)) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = _PyLong_InitTypes(interp);
|
status = _PyLong_InitTypes(interp);
|
||||||
if (_PyStatus_EXCEPTION(status)) {
|
if (_PyStatus_EXCEPTION(status)) {
|
||||||
return status;
|
return status;
|
||||||
|
@ -704,11 +697,6 @@ pycore_init_types(PyInterpreterState *interp)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = _PyTuple_InitTypes(interp);
|
|
||||||
if (_PyStatus_EXCEPTION(status)) {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_PyExc_InitTypes(interp) < 0) {
|
if (_PyExc_InitTypes(interp) < 0) {
|
||||||
return _PyStatus_ERR("failed to initialize an exception type");
|
return _PyStatus_ERR("failed to initialize an exception type");
|
||||||
}
|
}
|
||||||
|
|
|
@ -3166,10 +3166,8 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
|
||||||
SET_SYS("float_info", PyFloat_GetInfo());
|
SET_SYS("float_info", PyFloat_GetInfo());
|
||||||
SET_SYS("int_info", PyLong_GetInfo());
|
SET_SYS("int_info", PyLong_GetInfo());
|
||||||
/* initialize hash_info */
|
/* initialize hash_info */
|
||||||
if (Hash_InfoType.tp_name == NULL) {
|
if (_PyStructSequence_InitBuiltin(&Hash_InfoType, &hash_info_desc) < 0) {
|
||||||
if (_PyStructSequence_InitBuiltin(&Hash_InfoType, &hash_info_desc) < 0) {
|
goto type_init_failed;
|
||||||
goto type_init_failed;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SET_SYS("hash_info", get_hash_info(tstate));
|
SET_SYS("hash_info", get_hash_info(tstate));
|
||||||
SET_SYS("maxunicode", PyLong_FromLong(0x10FFFF));
|
SET_SYS("maxunicode", PyLong_FromLong(0x10FFFF));
|
||||||
|
@ -3191,11 +3189,9 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
|
||||||
|
|
||||||
#define ENSURE_INFO_TYPE(TYPE, DESC) \
|
#define ENSURE_INFO_TYPE(TYPE, DESC) \
|
||||||
do { \
|
do { \
|
||||||
if (TYPE.tp_name == NULL) { \
|
if (_PyStructSequence_InitBuiltinWithFlags( \
|
||||||
if (_PyStructSequence_InitBuiltinWithFlags( \
|
&TYPE, &DESC, Py_TPFLAGS_DISALLOW_INSTANTIATION) < 0) { \
|
||||||
&TYPE, &DESC, Py_TPFLAGS_DISALLOW_INSTANTIATION) < 0) { \
|
goto type_init_failed; \
|
||||||
goto type_init_failed; \
|
|
||||||
} \
|
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -3230,11 +3226,9 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
|
||||||
SET_SYS("thread_info", PyThread_GetInfo());
|
SET_SYS("thread_info", PyThread_GetInfo());
|
||||||
|
|
||||||
/* initialize asyncgen_hooks */
|
/* initialize asyncgen_hooks */
|
||||||
if (AsyncGenHooksType.tp_name == NULL) {
|
if (_PyStructSequence_InitBuiltin(
|
||||||
if (_PyStructSequence_InitBuiltin(
|
&AsyncGenHooksType, &asyncgen_hooks_desc) < 0) {
|
||||||
&AsyncGenHooksType, &asyncgen_hooks_desc) < 0) {
|
goto type_init_failed;
|
||||||
goto type_init_failed;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
|
|
|
@ -137,10 +137,8 @@ PyThread_GetInfo(void)
|
||||||
int len;
|
int len;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ThreadInfoType.tp_name == 0) {
|
if (_PyStructSequence_InitBuiltin(&ThreadInfoType, &threadinfo_desc) < 0) {
|
||||||
if (_PyStructSequence_InitBuiltin(&ThreadInfoType,
|
return NULL;
|
||||||
&threadinfo_desc) < 0)
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
threadinfo = PyStructSequence_New(&ThreadInfoType);
|
threadinfo = PyStructSequence_New(&ThreadInfoType);
|
||||||
|
|
Loading…
Reference in New Issue