diff --git a/Python/ast.c b/Python/ast.c
index be25ac3..759dd73 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -35,7 +35,7 @@
 static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
 
 static PyObject *parsenumber(const char *);
-static PyObject *parsestr(const node *n, const char *encoding, int *bytesmode);
+static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
 static PyObject *parsestrplus(struct compiling *, const node *n,
                               int *bytesmode);
 
@@ -3191,14 +3191,13 @@
  * parsestr parses it, and returns the decoded Python string object.
  */
 static PyObject *
-parsestr(const node *n, const char *encoding, int *bytesmode)
+parsestr(struct compiling *c, const node *n, int *bytesmode)
 {
     size_t len;
     const char *s = STR(n);
     int quote = Py_CHARMASK(*s);
     int rawmode = 0;
     int need_encoding;
-
     if (isalpha(quote)) {
         if (quote == 'b' || quote == 'B') {
             quote = *++s;
@@ -3233,7 +3232,7 @@
         }
     }
     if (!*bytesmode && !rawmode) {
-        return decode_unicode(s, len, rawmode, encoding);
+        return decode_unicode(s, len, rawmode, c->c_encoding);
     }
     if (*bytesmode) {
         /* Disallow non-ascii characters (but not escapes) */
@@ -3246,28 +3245,27 @@
             }
         }
     }
-    need_encoding = (!*bytesmode && encoding != NULL &&
-                     strcmp(encoding, "utf-8") != 0 &&
-                     strcmp(encoding, "iso-8859-1") != 0);
+    need_encoding = (!*bytesmode && c->c_encoding != NULL &&
+                     strcmp(c->c_encoding, "utf-8") != 0 &&
+                     strcmp(c->c_encoding, "iso-8859-1") != 0);
     if (rawmode || strchr(s, '\\') == NULL) {
         if (need_encoding) {
             PyObject *v, *u = PyUnicode_DecodeUTF8(s, len, NULL);
             if (u == NULL || !*bytesmode)
                 return u;
-            v = PyUnicode_AsEncodedString(u, encoding, NULL);
+            v = PyUnicode_AsEncodedString(u, c->c_encoding, NULL);
             Py_DECREF(u);
             return v;
         } else if (*bytesmode) {
             return PyString_FromStringAndSize(s, len);
-        } else if (strcmp(encoding, "utf-8") == 0) {
+        } else if (strcmp(c->c_encoding, "utf-8") == 0) {
             return PyUnicode_FromStringAndSize(s, len);
 	} else {
             return PyUnicode_DecodeLatin1(s, len, NULL);
         }
     }
-
     return PyString_DecodeEscape(s, len, NULL, 1,
-                                 need_encoding ? encoding : NULL);
+                                 need_encoding ? c->c_encoding : NULL);
 }
 
 /* Build a Python string object out of a STRING+ atom.  This takes care of
@@ -3280,13 +3278,13 @@
     PyObject *v;
     int i;
     REQ(CHILD(n, 0), STRING);
-    v = parsestr(CHILD(n, 0), c->c_encoding, bytesmode);
+    v = parsestr(c, CHILD(n, 0), bytesmode);
     if (v != NULL) {
         /* String literal concatenation */
         for (i = 1; i < NCH(n); i++) {
             PyObject *s;
             int subbm = 0;
-            s = parsestr(CHILD(n, i), c->c_encoding, &subbm);
+            s = parsestr(c, CHILD(n, i), &subbm);
             if (s == NULL)
                 goto onError;
             if (*bytesmode != subbm) {
