diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-07-22 21:04:55 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-07-22 21:04:55 (GMT) |
commit | 34f96b8dd35dd4339db86f18beeccfbec124df1a (patch) | |
tree | e0bb15288db16b790b25408f344160f495104ce8 /Objects | |
parent | 4d1f5d6eee2864476c3042d7941e126b2c8a9c21 (diff) | |
download | cpython-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.c | 19 |
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); |