summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-07-22 21:04:55 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-07-22 21:04:55 (GMT)
commit34f96b8dd35dd4339db86f18beeccfbec124df1a (patch)
treee0bb15288db16b790b25408f344160f495104ce8 /Objects
parent4d1f5d6eee2864476c3042d7941e126b2c8a9c21 (diff)
downloadcpython-34f96b8dd35dd4339db86f18beeccfbec124df1a.zip
cpython-34f96b8dd35dd4339db86f18beeccfbec124df1a.tar.gz
cpython-34f96b8dd35dd4339db86f18beeccfbec124df1a.tar.bz2
Issue #18520: Fix PyFunction_NewWithQualName() error handling
Diffstat (limited to 'Objects')
-rw-r--r--Objects/funcobject.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index b5525e3..b043934 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -12,6 +12,12 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
PyObject *doc, *consts, *module;
static PyObject *__name__ = NULL;
+ if (__name__ == NULL) {
+ __name__ = PyUnicode_InternFromString("__name__");
+ if (__name__ == NULL)
+ return NULL;
+ }
+
op = PyObject_GC_New(PyFunctionObject, &PyFunction_Type);
if (op == NULL)
return NULL;
@@ -26,6 +32,7 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
op->func_defaults = NULL; /* No default arguments */
op->func_kwdefaults = NULL; /* No keyword only defaults */
op->func_closure = NULL;
+
consts = ((PyCodeObject *)code)->co_consts;
if (PyTuple_Size(consts) >= 1) {
doc = PyTuple_GetItem(consts, 0);
@@ -36,21 +43,13 @@ PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname
doc = Py_None;
Py_INCREF(doc);
op->func_doc = doc;
+
op->func_dict = NULL;
op->func_module = NULL;
op->func_annotations = NULL;
/* __module__: If module name is in globals, use it.
- Otherwise, use None.
- */
- if (!__name__) {
- __name__ = PyUnicode_InternFromString("__name__");
- if (!__name__) {
- Py_DECREF(op);
- return NULL;
- }
- }
-
+ Otherwise, use None. */
module = PyDict_GetItem(globals, __name__);
if (module) {
Py_INCREF(module);