Skip to content

Commit 5d27da0

Browse files
committed
Use "replace" error handler
1 parent 6962116 commit 5d27da0

File tree

3 files changed

+28
-17
lines changed

3 files changed

+28
-17
lines changed

Lib/test/test_threading.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2125,15 +2125,12 @@ def work():
21252125
limit = truncate or 100
21262126

21272127
def create_test(name):
2128-
try:
2129-
encoded = os.fsencode(name)
2130-
except UnicodeEncodeError:
2131-
expected = None
2128+
if truncate is not None:
2129+
encoding = sys.getfilesystemencoding()
2130+
encoded = name.encode(encoding, "replace")
2131+
expected = os.fsdecode(encoded[:truncate])
21322132
else:
2133-
if truncate is not None:
2134-
expected = os.fsdecode(encoded[:truncate])
2135-
else:
2136-
expected = name
2133+
expected = name
21372134
return (name, expected)
21382135

21392136
tests = [
@@ -2163,8 +2160,7 @@ def create_test(name):
21632160
thread = threading.Thread(target=work, name=name)
21642161
thread.start()
21652162
thread.join()
2166-
if expected is not None:
2167-
self.assertEqual(work_name, expected)
2163+
self.assertEqual(work_name, expected)
21682164

21692165

21702166
class InterruptMainTests(unittest.TestCase):

Modules/_threadmodule.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2395,16 +2395,33 @@ _thread__get_name_impl(PyObject *module)
23952395
/*[clinic input]
23962396
_thread.set_name
23972397
2398-
name as name_obj: object(converter="PyUnicode_FSConverter")
2398+
name as name_obj: object
23992399
24002400
Set the name of the current thread.
24012401
[clinic start generated code]*/
24022402

24032403
static PyObject *
24042404
_thread_set_name_impl(PyObject *module, PyObject *name_obj)
2405-
/*[clinic end generated code: output=402b0c68e0c0daed input=a0459bd64f771808]*/
2405+
/*[clinic end generated code: output=402b0c68e0c0daed input=b55d3d4279e2e831]*/
24062406
{
2407-
const char *name = PyBytes_AS_STRING(name_obj);
2407+
if (!PyUnicode_Check(name_obj)) {
2408+
PyErr_Format(PyExc_TypeError, "expected str, got %T", name_obj);
2409+
return NULL;
2410+
}
2411+
2412+
const PyConfig *config = _Py_GetConfig();
2413+
char *encoding = Py_EncodeLocale(config->filesystem_encoding, NULL);
2414+
if (encoding == NULL) {
2415+
return NULL;
2416+
}
2417+
2418+
PyObject *name_encoded = PyUnicode_AsEncodedString(name_obj, encoding, "replace");
2419+
PyMem_Free(encoding);
2420+
if (name_encoded == NULL) {
2421+
return NULL;
2422+
}
2423+
2424+
const char *name = PyBytes_AS_STRING(name_encoded);
24082425
#ifdef __APPLE__
24092426
# define NAME_LIMIT 63
24102427
#elif defined(__linux__)

Modules/clinic/_threadmodule.c.h

Lines changed: 2 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)