Issue #8670: ctypes.c_wchar supports non-BMP characters with 32 bits wchar_t
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index ba60deb..072b8c6 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -1203,6 +1203,7 @@
 u_set(void *ptr, PyObject *value, Py_ssize_t size)
 {
     Py_ssize_t len;
+    wchar_t chars[2];
     if (!PyUnicode_Check(value)) {
         PyErr_Format(PyExc_TypeError,
                         "unicode string expected instead of %s instance",
@@ -1211,7 +1212,7 @@
     } else
         Py_INCREF(value);
 
-    len = PyUnicode_GET_SIZE(value);
+    len = PyUnicode_AsWideChar((PyUnicodeObject *)value, chars, 2);
     if (len != 1) {
         Py_DECREF(value);
         PyErr_SetString(PyExc_TypeError,
@@ -1219,7 +1220,7 @@
         return NULL;
     }
 
-    *(wchar_t *)ptr = PyUnicode_AS_UNICODE(value)[0];
+    *(wchar_t *)ptr = chars[0];
     Py_DECREF(value);
 
     _RET(value);
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index d2d3b19..912ba17 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -1386,7 +1386,7 @@
 }
 
 static PyObject *
-test_aswidechar(PyObject *self, PyObject *args)
+unicode_aswidechar(PyObject *self, PyObject *args)
 {
     PyObject *unicode, *result;
     Py_ssize_t buflen, size;
@@ -1417,7 +1417,7 @@
 }
 
 static PyObject *
-test_aswidecharstring(PyObject *self, PyObject *args)
+unicode_aswidecharstring(PyObject *self, PyObject *args)
 {
     PyObject *unicode, *result;
     Py_ssize_t size;
@@ -2321,8 +2321,8 @@
     {"test_u_code",             (PyCFunction)test_u_code,        METH_NOARGS},
     {"test_Z_code",             (PyCFunction)test_Z_code,        METH_NOARGS},
     {"test_widechar",           (PyCFunction)test_widechar,      METH_NOARGS},
-    {"test_aswidechar",         test_aswidechar,                 METH_VARARGS},
-    {"test_aswidecharstring",   test_aswidecharstring,           METH_VARARGS},
+    {"unicode_aswidechar",      unicode_aswidechar,                 METH_VARARGS},
+    {"unicode_aswidecharstring",unicode_aswidecharstring,           METH_VARARGS},
 #ifdef WITH_THREAD
     {"_test_thread_state",      test_thread_state,               METH_VARARGS},
     {"_pending_threadfunc",     pending_threadfunc,              METH_VARARGS},