summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-08-08 22:12:45 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-08-08 22:12:45 (GMT)
commit2e5f1178ac55c032982c69f4f4dd70c19f9fa46e (patch)
tree6c5e91d640adbe729e2139914103db04362e160d
parenteb6f3ead00f1cccffafba03245861a4d6bd84346 (diff)
downloadcpython-2e5f1178ac55c032982c69f4f4dd70c19f9fa46e.zip
cpython-2e5f1178ac55c032982c69f4f4dd70c19f9fa46e.tar.gz
cpython-2e5f1178ac55c032982c69f4f4dd70c19f9fa46e.tar.bz2
Issue #9425: fix setup_context() for non-ascii filenames
setup_context() replaces .pyc or .pyo filename suffix by .py, but it didn't work if the filename contains a non-ascii character because the function used the wrong unit for the length (number of characters instead of the number of bytes). With this patch, it uses unicode filenames instead of bytes filenames, to fix the bug and to be fully unicode compliant.
-rw-r--r--Python/_warnings.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/Python/_warnings.c b/Python/_warnings.c
index dd7bb57..6067ce3 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -498,23 +498,21 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,
*filename = PyDict_GetItemString(globals, "__file__");
if (*filename != NULL) {
Py_ssize_t len = PyUnicode_GetSize(*filename);
- const char *file_str = _PyUnicode_AsString(*filename);
- if (file_str == NULL || (len < 0 && PyErr_Occurred()))
- goto handle_error;
+ Py_UNICODE *unicode = PyUnicode_AS_UNICODE(*filename);
/* if filename.lower().endswith((".pyc", ".pyo")): */
if (len >= 4 &&
- file_str[len-4] == '.' &&
- tolower(file_str[len-3]) == 'p' &&
- tolower(file_str[len-2]) == 'y' &&
- (tolower(file_str[len-1]) == 'c' ||
- tolower(file_str[len-1]) == 'o'))
+ unicode[len-4] == '.' &&
+ Py_UNICODE_TOLOWER(unicode[len-3]) == 'p' &&
+ Py_UNICODE_TOLOWER(unicode[len-2]) == 'y' &&
+ (Py_UNICODE_TOLOWER(unicode[len-1]) == 'c' ||
+ Py_UNICODE_TOLOWER(unicode[len-1]) == 'o'))
{
- *filename = PyUnicode_FromStringAndSize(file_str, len-1);
- if (*filename == NULL)
- goto handle_error;
- }
- else
+ *filename = PyUnicode_FromUnicode(unicode, len-1);
+ if (*filename == NULL)
+ goto handle_error;
+ }
+ else
Py_INCREF(*filename);
}
else {