summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErlend Egeberg Aasland <erlend.aasland@protonmail.com>2022-06-10 11:28:48 (GMT)
committerGitHub <noreply@github.com>2022-06-10 11:28:48 (GMT)
commit175ed6e52c7bf6d9805ac8b56ad3f38e46ff7de5 (patch)
tree5c15d5d342bd7cda0ebdfcf346141cb130fb10d1
parent927b5afee73218500a8fa80df86216cfdc24ef5a (diff)
downloadcpython-175ed6e52c7bf6d9805ac8b56ad3f38e46ff7de5.zip
cpython-175ed6e52c7bf6d9805ac8b56ad3f38e46ff7de5.tar.gz
cpython-175ed6e52c7bf6d9805ac8b56ad3f38e46ff7de5.tar.bz2
[3.11] gh-90763: Modernise xx template module initialisation (GH-93078) (#93681)
Use C APIs such as PyModule_AddType instead of PyModule_AddObject. Also remove incorrect module decrefs if module fails to initialise. (cherry picked from commit a87c9b538fbfc42883417c4d5e69f1a5922690e3) Co-authored-by: Erlend Egeberg Aasland <erlend.aasland@protonmail.com>
-rw-r--r--Modules/xxlimited_35.c58
-rw-r--r--Modules/xxmodule.c39
2 files changed, 54 insertions, 43 deletions
diff --git a/Modules/xxlimited_35.c b/Modules/xxlimited_35.c
index 647abf6..8d29c71 100644
--- a/Modules/xxlimited_35.c
+++ b/Modules/xxlimited_35.c
@@ -124,7 +124,7 @@ static PyType_Slot Xxo_Type_slots[] = {
};
static PyType_Spec Xxo_Type_spec = {
- "xxlimited.Xxo",
+ "xxlimited_35.Xxo",
sizeof(XxoObject),
0,
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
@@ -189,7 +189,7 @@ static PyType_Slot Str_Type_slots[] = {
};
static PyType_Spec Str_Type_spec = {
- "xxlimited.Str",
+ "xxlimited_35.Str",
0,
0,
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
@@ -212,7 +212,7 @@ static PyType_Slot Null_Type_slots[] = {
};
static PyType_Spec Null_Type_spec = {
- "xxlimited.Null",
+ "xxlimited_35.Null",
0, /* basicsize */
0, /* itemsize */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
@@ -248,40 +248,50 @@ xx_modexec(PyObject *m)
Null_Type_slots[1].pfunc = PyType_GenericNew;
Str_Type_slots[0].pfunc = &PyUnicode_Type;
- Xxo_Type = PyType_FromSpec(&Xxo_Type_spec);
- if (Xxo_Type == NULL)
- goto fail;
-
/* Add some symbolic constants to the module */
if (ErrorObject == NULL) {
- ErrorObject = PyErr_NewException("xxlimited.error", NULL, NULL);
- if (ErrorObject == NULL)
- goto fail;
+ ErrorObject = PyErr_NewException("xxlimited_35.error", NULL, NULL);
+ if (ErrorObject == NULL) {
+ return -1;
+ }
}
Py_INCREF(ErrorObject);
- PyModule_AddObject(m, "error", ErrorObject);
+ if (PyModule_AddObject(m, "error", ErrorObject) < 0) {
+ Py_DECREF(ErrorObject);
+ return -1;
+ }
/* Add Xxo */
- o = PyType_FromSpec(&Xxo_Type_spec);
- if (o == NULL)
- goto fail;
- PyModule_AddObject(m, "Xxo", o);
+ Xxo_Type = PyType_FromSpec(&Xxo_Type_spec);
+ if (Xxo_Type == NULL) {
+ return -1;
+ }
+ if (PyModule_AddObject(m, "Xxo", Xxo_Type) < 0) {
+ Py_DECREF(Xxo_Type);
+ return -1;
+ }
/* Add Str */
o = PyType_FromSpec(&Str_Type_spec);
- if (o == NULL)
- goto fail;
- PyModule_AddObject(m, "Str", o);
+ if (o == NULL) {
+ return -1;
+ }
+ if (PyModule_AddObject(m, "Str", o) < 0) {
+ Py_DECREF(o);
+ return -1;
+ }
/* Add Null */
o = PyType_FromSpec(&Null_Type_spec);
- if (o == NULL)
- goto fail;
- PyModule_AddObject(m, "Null", o);
+ if (o == NULL) {
+ return -1;
+ }
+ if (PyModule_AddObject(m, "Null", o) < 0) {
+ Py_DECREF(o);
+ return -1;
+ }
+
return 0;
- fail:
- Py_XDECREF(m);
- return -1;
}
diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c
index edcd621..a6e5071 100644
--- a/Modules/xxmodule.c
+++ b/Modules/xxmodule.c
@@ -358,31 +358,32 @@ xx_exec(PyObject *m)
/* Finalize the type object including setting type of the new type
* object; doing it here is required for portability, too. */
- if (PyType_Ready(&Xxo_Type) < 0)
- goto fail;
+ if (PyType_Ready(&Xxo_Type) < 0) {
+ return -1;
+ }
/* Add some symbolic constants to the module */
if (ErrorObject == NULL) {
ErrorObject = PyErr_NewException("xx.error", NULL, NULL);
- if (ErrorObject == NULL)
- goto fail;
+ if (ErrorObject == NULL) {
+ return -1;
+ }
+ }
+ int rc = PyModule_AddType(m, (PyTypeObject *)ErrorObject);
+ Py_DECREF(ErrorObject);
+ if (rc < 0) {
+ return -1;
}
- Py_INCREF(ErrorObject);
- PyModule_AddObject(m, "error", ErrorObject);
-
- /* Add Str */
- if (PyType_Ready(&Str_Type) < 0)
- goto fail;
- PyModule_AddObject(m, "Str", (PyObject *)&Str_Type);
-
- /* Add Null */
- if (PyType_Ready(&Null_Type) < 0)
- goto fail;
- PyModule_AddObject(m, "Null", (PyObject *)&Null_Type);
+
+ /* Add Str and Null types */
+ if (PyModule_AddType(m, &Str_Type) < 0) {
+ return -1;
+ }
+ if (PyModule_AddType(m, &Null_Type) < 0) {
+ return -1;
+ }
+
return 0;
- fail:
- Py_XDECREF(m);
- return -1;
}
static struct PyModuleDef_Slot xx_slots[] = {