Index: Objects/moduleobject.c =================================================================== --- Objects/moduleobject.c (revision 87134) +++ Objects/moduleobject.c (working copy) @@ -168,8 +168,8 @@ return d; } -const char * -PyModule_GetName(PyObject *m) +PyObject * +PyModule_GetNameObject(PyObject *m) { PyObject *d; PyObject *nameobj; @@ -185,9 +185,23 @@ PyErr_SetString(PyExc_SystemError, "nameless module"); return NULL; } - return _PyUnicode_AsString(nameobj); + 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; +} + PyObject* PyModule_GetFilenameObject(PyObject *m) { Index: Modules/_lsprof.c =================================================================== --- Modules/_lsprof.c (revision 87137) +++ Modules/_lsprof.c (working copy) @@ -175,32 +175,22 @@ if (fn->m_self == NULL) { /* built-in function: look up the module name */ - PyObject *mod = fn->m_module; - 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(); + PyObject * mod = fn->m_module; + PyObject *modname; + if (mod != NULL) { + if (PyUnicode_Check(mod)) { + modname = mod; + Py_INCREF(modname); } - } - else if (mod && PyModule_Check(mod)) { - modname = PyModule_GetName(mod); - if (modname == NULL) { - PyErr_Clear(); - modname = "builtins"; + else if (PyModule_Check(mod)) { + modname = PyModule_GetNameObject(mod); + if (modname == NULL) + PyErr_Clear(); } } - else { - modname = "builtins"; - } - if (strcmp(modname, "builtins") != 0) - return PyUnicode_FromFormat("<%s.%s>", + if (modname != NULL && + PyUnicode_CompareWithASCIIString(modname, "builtins") != 0) + return PyUnicode_FromFormat("<%U.%s>", modname, fn->m_ml->ml_name); else