PyUnicode_DecodeCharmap() uses the new Unicode API
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index cf1f2ea..8a35307 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -7558,8 +7558,6 @@
     Py_ssize_t extrachars = 0;
     PyObject *errorHandler = NULL;
     PyObject *exc = NULL;
-    Py_UNICODE *mapstring = NULL;
-    Py_ssize_t maplen = 0;
 
     /* Default to Latin-1 */
     if (mapping == NULL)
@@ -7573,16 +7571,27 @@
     outpos = 0;
     e = s + size;
     if (PyUnicode_CheckExact(mapping)) {
-        mapstring = PyUnicode_AS_UNICODE(mapping);
-        maplen = PyUnicode_GET_SIZE(mapping);
+        Py_ssize_t maplen;
+        enum PyUnicode_Kind kind;
+        void *data;
+        Py_UCS4 x;
+
+        if (PyUnicode_READY(mapping) < 0)
+            return NULL;
+
+        maplen = PyUnicode_GET_LENGTH(mapping);
+        data = PyUnicode_DATA(mapping);
+        kind = PyUnicode_KIND(mapping);
         while (s < e) {
             unsigned char ch = *s;
-            Py_UNICODE x = 0xfffe; /* illegal value */
 
             if (ch < maplen)
-                x = mapstring[ch];
+                x = PyUnicode_READ(kind, data, ch);
+            else
+                x = 0xfffe; /* invalid value */
 
-            if (x == 0xfffe) {
+            if (x == 0xfffe)
+            {
                 /* undefined mapping */
                 startinpos = s-starts;
                 endinpos = startinpos+1;
@@ -7595,6 +7604,7 @@
                 }
                 continue;
             }
+
             if (unicode_putchar(&v, &outpos, x) < 0)
                 goto onError;
             ++s;