Author: Matti Picus <matti.pi...@gmail.com>
Branch: unicode-utf8
Changeset: r93991:341ddb374260
Date: 2018-03-18 18:28 +0100
http://bitbucket.org/pypy/pypy/changeset/341ddb374260/

Log:    fix winreg for utf8 on win32

diff --git a/pypy/interpreter/unicodehelper.py 
b/pypy/interpreter/unicodehelper.py
--- a/pypy/interpreter/unicodehelper.py
+++ b/pypy/interpreter/unicodehelper.py
@@ -226,12 +226,12 @@
         from rpython.rlib import runicode
         slen = len(s)
         res = runicode.unicode_encode_mbcs(s, slen, errors, errorhandler)
-        return res.decode('utf8')
+        return res
         
-    def str_decode_mbcs(s, errors, errorhandler):
+    def str_decode_mbcs(s, errors, final, errorhandler):
         from rpython.rlib import runicode
         slen = len(s)
-        res, size = runicode.str_decode_mbcs(s, slen, errors=errors,
+        res, size = runicode.str_decode_mbcs(s, slen, final=final, 
errors=errors,
                                            errorhandler=errorhandler)
         return res.encode('utf8'), size, len(res)
 
diff --git a/pypy/module/_winreg/interp_winreg.py 
b/pypy/module/_winreg/interp_winreg.py
--- a/pypy/module/_winreg/interp_winreg.py
+++ b/pypy/module/_winreg/interp_winreg.py
@@ -697,11 +697,12 @@
             raiseWindowsError(space, ret, 'RegConnectRegistry')
         return W_HKEY(space, rethkey[0])
 
-@unwrap_spec(source=unicode)
-def ExpandEnvironmentStrings(space, source):
+def ExpandEnvironmentStrings(space, w_source):
     "string = ExpandEnvironmentStrings(string) - Expand environment vars."
     try:
-        return space.newunicode(rwinreg.ExpandEnvironmentStrings(source))
+        source, source_ulen = space.utf8_len_w(w_source)
+        res, res_ulen = rwinreg.ExpandEnvironmentStrings(source, source_ulen)
+        return space.newutf8(res, res_ulen)
     except WindowsError as e:
         raise wrap_windowserror(space, e)
 
diff --git a/rpython/rlib/rwinreg.py b/rpython/rlib/rwinreg.py
--- a/rpython/rlib/rwinreg.py
+++ b/rpython/rlib/rwinreg.py
@@ -165,8 +165,8 @@
     rwin32.DWORD,
     save_err=rffi.RFFI_SAVE_LASTERROR)
 
-def ExpandEnvironmentStrings(source):
-    with rffi.scoped_unicode2wcharp(source) as src_buf:
+def ExpandEnvironmentStrings(source, unicode_len):
+    with rffi.scoped_utf82wcharp(source, unicode_len) as src_buf:
         size = _ExpandEnvironmentStringsW(src_buf,
                                           lltype.nullptr(rffi.CWCHARP.TO), 0)
         if size == 0:
@@ -176,4 +176,5 @@
             if _ExpandEnvironmentStringsW(src_buf,
                                           dest_buf.raw, size) == 0:
                 raise rwin32.lastSavedWindowsError("ExpandEnvironmentStrings")
-            return dest_buf.str(size - 1) # remove trailing \0
+            res = dest_buf.str(size-1) # remove trailing \0
+            return res.encode('utf8'), len(res)
diff --git a/rpython/rtyper/lltypesystem/rffi.py 
b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -1278,6 +1278,18 @@
         if self.buf:
             free_wcharp(self.buf)
 
+class scoped_utf82wcharp:
+    def __init__(self, value, unicode_len):
+        if value is not None:
+            self.buf = utf82wcharp(value, unicode_len)
+        else:
+            self.buf = lltype.nullptr(CWCHARP.TO)
+    def __enter__(self):
+        return self.buf
+    def __exit__(self, *args):
+        if self.buf:
+            free_wcharp(self.buf)
+
 
 class scoped_nonmovingbuffer:
 
@@ -1316,7 +1328,7 @@
     def __init__(self, data):
         self.data = data
     def __enter__(self):
-        self.buf, self.flag = get_nonmoving_unicodebuffer(self.data)
+        self.buf, self.flag = 
get_nonmoving_unicodebuffer(self.data.decode('utf-8'))
         return self.buf
     def __exit__(self, *args):
         free_nonmoving_unicodebuffer(self.data, self.buf, self.flag)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to