diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index 199c42b68f3..cc412bfc232 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -176,21 +176,31 @@ normalizeUserObj(PyObject *obj) if (fn->m_self == NULL) { /* built-in function: look up the module name */ PyObject *mod = fn->m_module; - PyObject *modname; - if (mod != NULL) { - if (PyUnicode_Check(mod)) { - modname = mod; - Py_INCREF(modname); - } - else if (PyModule_Check(mod)) { - modname = PyModule_GetNameObject(mod); - if (modname == NULL) - PyErr_Clear(); + const char *modname; + if (mod && PyUnicode_Check(mod)) { + /* XXX: The following will truncate module names with embedded + * null-characters. It is unlikely that this can happen in + * practice and the concequences are not serious enough to + * introduce extra checks here. + */ + modname = _PyUnicode_AsString(mod); + if (modname == NULL) { + modname = ""; + PyErr_Clear(); } } - if (modname != NULL && - PyUnicode_CompareWithASCIIString(modname, "builtins") != 0) - return PyUnicode_FromFormat("<%U.%s>", + else if (mod && PyModule_Check(mod)) { + modname = PyModule_GetName(mod); + if (modname == NULL) { + PyErr_Clear(); + modname = "builtins"; + } + } + else { + modname = "builtins"; + } + if (strcmp(modname, "builtins") != 0) + return PyUnicode_FromFormat("<%s.%s>", modname, fn->m_ml->ml_name); else diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 8b22b7dc95a..2c095a09687 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -168,8 +168,8 @@ PyModule_GetDict(PyObject *m) return d; } -PyObject * -PyModule_GetNameObject(PyObject *m) +const char * +PyModule_GetName(PyObject *m) { PyObject *d; PyObject *nameobj; @@ -185,21 +185,7 @@ PyModule_GetNameObject(PyObject *m) PyErr_SetString(PyExc_SystemError, "nameless module"); return NULL; } - Py_INCREF(nameobj); - return nameobj; -} - -const char * -PyModule_GetName(PyObject *m) -{ - PyObject *nameobj; - char *utf8; - nameobj = PyModule_GetNameObject(m); - if (nameobj == NULL) - return NULL; - utf8 = _PyUnicode_AsString(nameobj); - Py_DECREF(nameobj); - return utf8; + return _PyUnicode_AsString(nameobj); } PyObject*