Author: Matti Picus <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit