129
129
The use of intern() may defer breakage is but is not enough, the string
130
130
object should be secure against module reloading and during teardown.
132
is_py3 = sys.version_info > (3,)
135
134
old_ptr = ctypes.c_void_p.in_dll(ctypes.pythonapi,
136
135
"Py_FileSystemDefaultEncoding")
138
has_enc = ctypes.c_int.in_dll(ctypes.pythonapi,
139
"Py_HasFileSystemDefaultEncoding")
140
as_utf8 = ctypes.PYFUNCTYPE(
141
ctypes.POINTER(ctypes.c_char), ctypes.py_object)(
142
("PyUnicode_AsUTF8", ctypes.pythonapi))
136
has_enc = ctypes.c_int.in_dll(ctypes.pythonapi,
137
"Py_HasFileSystemDefaultEncoding")
138
as_utf8 = ctypes.PYFUNCTYPE(
139
ctypes.POINTER(ctypes.c_char), ctypes.py_object)(
140
("PyUnicode_AsUTF8", ctypes.pythonapi))
143
141
except (ImportError, ValueError):
144
142
return # No ctypes or not CPython implementation, do nothing
146
new_enc = sys.intern(new_enc)
147
enc_ptr = as_utf8(new_enc)
150
new_enc = intern(new_enc)
151
enc_ptr = ctypes.c_char_p(new_enc)
143
new_enc = sys.intern(new_enc)
144
enc_ptr = as_utf8(new_enc)
152
146
old_ptr.value = ctypes.cast(enc_ptr, ctypes.c_void_p).value
153
147
if sys.getfilesystemencoding() != new_enc:
154
148
raise RuntimeError("Failed to change the filesystem default encoding")