Author: Matti Picus <[email protected]>
Branch: py3.6
Changeset: r98051:3eabce9188ed
Date: 2019-11-14 09:27 -0500
http://bitbucket.org/pypy/pypy/changeset/3eabce9188ed/

Log:    pass 'final' down to where it is handled, add error check

diff --git a/pypy/interpreter/unicodehelper_win32.py 
b/pypy/interpreter/unicodehelper_win32.py
--- a/pypy/interpreter/unicodehelper_win32.py
+++ b/pypy/interpreter/unicodehelper_win32.py
@@ -41,13 +41,13 @@
         return 0
     return rwin32.WC_NO_BEST_FIT_CHARS
 
-def _decode_cp_error(s, errorhandler, encoding, errors, start, end):
+def _decode_cp_error(s, errorhandler, encoding, errors, final, start, end):
     # late import to avoid circular import
     from pypy.interpreter.unicodehelper import _str_decode_utf8_slowpath
     if rwin32.GetLastError_saved() == rwin32.ERROR_NO_UNICODE_TRANSLATION:
         msg = ("No mapping for the Unicode character exists in the target "
                "multi-byte code page.")
-        r, ignore1, ignore2 = _str_decode_utf8_slowpath(s[start:end], errors, 
False, errorhandler, False)
+        r, ignore1, ignore2 = _str_decode_utf8_slowpath(s[start:end], errors, 
final, errorhandler, False)
         return r, end
     else:
         raise rwin32.lastSavedWindowsError()
@@ -77,7 +77,7 @@
             return result
 
 def _decode_helper(cp, s, flags, encoding, errors, errorhandler, 
-                   start, end, res):
+                   final, start, end, res):
     if end > len(s):
         end = len(s)
     piece = s[start:end]
@@ -87,7 +87,7 @@
                                     lltype.nullptr(rffi.CWCHARP.TO), 0)
         if outsize == 0:
             r, pos = _decode_cp_error(s, errorhandler,
-                                               encoding, errors, start, end)
+                                           encoding, errors, final, start, end)
             res.append(r)
             return pos
 
@@ -96,7 +96,7 @@
             if MultiByteToWideChar(cp, flags, dataptr, len(piece),
                                    buf.raw, outsize) == 0:
                 r, pos = _decode_cp_error(s, errorhandler,
-                                             encoding, errors, start, end)
+                                           encoding, errors, final, start, end)
                 res.append(r)
                 return pos
             else:
@@ -116,14 +116,14 @@
     res = StringBuilder(insize)
     if errors == 'strict':
         _decode_helper(cp, s, flags, encoding, errors, errorhandler,
-                       0, len(s), res)
+                       final, 0, len(s), res)
     else:
         prev_pos = 0
         pos = 0
         while pos < len(s):
             pos = next_codepoint_pos(s, prev_pos)
-            pos = _decode_helper(cp, s, flags, encoding,
-                            errors, errorhandler, prev_pos, pos, res)
+            pos = _decode_helper(cp, s, flags, encoding, errors,
+                                 errorhandler, final, prev_pos, pos, res)
             prev_pos = pos
     return res.build(), insize
 
diff --git a/pypy/module/_codecs/interp_codecs.py 
b/pypy/module/_codecs/interp_codecs.py
--- a/pypy/module/_codecs/interp_codecs.py
+++ b/pypy/module/_codecs/interp_codecs.py
@@ -716,6 +716,9 @@
     @unwrap_spec(code_page=int, errors='text_or_none')
     def code_page_encode(space, code_page, w_arg, errors="strict"):
         # w_arg is a W_Unicode or W_Bytes?
+        if code_page < 0:
+            raise oefmt(space.w_ValueError, "invalid code page number %d",
+                        code_page)
         w_arg = space.convert_arg_to_w_unicode(w_arg, errors)
         if errors is None:
             errors = 'strict'
@@ -732,6 +735,9 @@
     @unwrap_spec(code_page=int, string='bufferstr', errors='text_or_none',
                  w_final=WrappedDefault(False))
     def code_page_decode(space, code_page, string, errors="strict", 
w_final=None):
+        if code_page < 0:
+            raise oefmt(space.w_ValueError, "invalid code page number %d",
+                        code_page)
         if errors is None:
             errors = 'strict'
         final = space.is_true(w_final)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to