Author: Matti Picus <[email protected]>
Branch: py3-winreg
Changeset: r93610:a9b00a31a070
Date: 2018-01-02 12:25 +0200
http://bitbucket.org/pypy/pypy/changeset/a9b00a31a070/
Log: fixes, multibytes is two bytes, memoryview can be stored now
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
@@ -297,7 +297,7 @@
else:
buf = rffi.unicode2wcharp(space.unicode_w(w_value))
buf = rffi.cast(rffi.CCHARP, buf)
- buflen = space.len_w(w_value) + 1
+ buflen = (space.len_w(w_value) * 2) + 1
elif typ == rwinreg.REG_MULTI_SZ:
if space.is_w(w_value, space.w_None):
@@ -315,12 +315,12 @@
w_item = space.next(w_iter)
item = space.unicode_w(w_item)
strings.append(item)
- buflen += len(item) + 1
+ buflen += 2 * (len(item) + 1)
except OperationError as e:
if not e.match(space, space.w_StopIteration):
raise # re-raise other app-level exceptions
break
- buflen += 1
+ buflen += 2
buf = lltype.malloc(rffi.CCHARP.TO, buflen, flavor='raw')
# Now copy data
@@ -328,12 +328,14 @@
for string in strings:
with rffi.scoped_unicode2wcharp(string) as wchr:
c_str = rffi.cast(rffi.CCHARP, wchr)
- for i in range(len(string)):
+ for i in range(len(string) * 2):
buf[buflen + i] = c_str[i]
- buflen += len(string) + 1
+ buflen += (len(string) + 1) * 2
buf[buflen - 1] = '\0'
- buflen += 1
+ buf[buflen - 2] = '\0'
+ buflen += 2
buf[buflen - 1] = '\0'
+ buf[buflen - 2] = '\0'
else: # REG_BINARY and ALL unknown data types.
if space.is_w(w_value, space.w_None):
@@ -371,6 +373,7 @@
else:
# may or may not have a trailing NULL in the buffer.
buf = rffi.cast(rffi.CWCHARP, buf)
+ buflen /= 2
if buf[buflen - 1] == '\x00':
buflen -= 1
s = rffi.wcharp2unicoden(buf, buflen)
@@ -380,11 +383,13 @@
elif typ == rwinreg.REG_MULTI_SZ:
if not buflen:
return space.newlist([])
+ buf = rffi.cast(rffi.CWCHARP, buf)
+ buflen /= 2
i = 0
l = []
while i < buflen and buf[i]:
s = []
- while i < buflen and buf[i] != '\0':
+ while i < buflen and buf[i] != u'\0':
s.append(buf[i])
i += 1
if len(s) == 0:
@@ -504,8 +509,8 @@
raiseWindowsError(space, ret, 'CreateKey')
return W_HKEY(space, rethkey[0])
-@unwrap_spec(subkey="unicode", reserved=int, access=rffi.r_uint)
-def CreateKeyEx(space, w_key, subkey, reserved=0, access=rwinreg.KEY_WRITE):
+@unwrap_spec(sub_key="unicode", reserved=int, access=rffi.r_uint)
+def CreateKeyEx(space, w_key, sub_key, reserved=0, access=rwinreg.KEY_WRITE):
"""key = CreateKey(key, sub_key) - Creates or opens the specified key.
key is an already open key, or one of the predefined HKEY_* constants
@@ -518,8 +523,8 @@
The return value is the handle of the opened key.
If the function fails, an exception is raised."""
hkey = hkey_w(w_key, space)
- with rffi.scoped_unicode2wcharp(subkey) as wide_subkey:
- c_subkey = rffi.cast(rffi.CCHARP, wide_subkey)
+ with rffi.scoped_unicode2wcharp(sub_key) as wide_sub_key:
+ c_subkey = rffi.cast(rffi.CCHARP, wide_sub_key)
with lltype.scoped_alloc(rwinreg.PHKEY.TO, 1) as rethkey:
ret = rwinreg.RegCreateKeyEx(hkey, c_subkey, reserved, None, 0,
access, None, rethkey,
diff --git a/pypy/module/_winreg/test/test_winreg.py
b/pypy/module/_winreg/test/test_winreg.py
--- a/pypy/module/_winreg/test/test_winreg.py
+++ b/pypy/module/_winreg/test/test_winreg.py
@@ -42,8 +42,8 @@
test_data = [
("Int Value", 0xFEDCBA98, winreg.REG_DWORD),
("Str Value", b"A string Value", winreg.REG_SZ),
- ("Unicode Value", u"A unicode Value", winreg.REG_SZ),
- ("Str Expand", u"The path is %path%", winreg.REG_EXPAND_SZ),
+ ("Unicode Value", "A unicode Value", winreg.REG_SZ),
+ ("Str Expand", "The path is %path%", winreg.REG_EXPAND_SZ),
("Multi Str", [b"Several", u"string", u"values"],
winreg.REG_MULTI_SZ),
]
cls.w_test_data = w_test_data = space.wrap(test_data)
@@ -140,6 +140,7 @@
assert 0, "Did not raise"
def test_SetValueEx(self):
+ # this test leaves open keys. If it fails, others will too
from winreg import CreateKey, SetValueEx, REG_BINARY, REG_DWORD
key = CreateKey(self.root_key, self.test_key_name)
sub_key = CreateKey(key, u"sub_key")
@@ -147,10 +148,9 @@
SetValueEx(sub_key, 'Int Value', 0, REG_DWORD, 45)
for name, value, type in self.test_data:
SetValueEx(sub_key, name, 0, type, value)
- exc = raises(TypeError, SetValueEx, sub_key, 'test_name', None,
- REG_BINARY, memoryview('abc'))
- assert str(exc.value) == ("Objects of type 'memoryview' can not "
- "be used as binary registry values")
+ # cannot wrap a memoryview in setup_class for test_data
+ SetValueEx(sub_key, u'test_name', None,
+ REG_BINARY, memoryview(b'abc'))
def test_readValues(self):
from winreg import OpenKey, EnumValue, QueryValueEx, EnumKey
@@ -163,27 +163,31 @@
data = EnumValue(sub_key, index)
except EnvironmentError as e:
break
- assert data in self.test_data
+ if data[0] != 'test_name':
+ # cannot wrap a memoryview in setup_class for test_data
+ assert data in self.test_data
index = index + 1
- assert index == len(self.test_data)
+ assert index == len(self.test_data) + 1
for name, value, type in self.test_data:
result = QueryValueEx(sub_key, name)
assert result == (value, type)
if type == REG_SZ or type == REG_EXPAND_SZ:
- assert isinstance(result[0], unicode) # not string
+ assert not isinstance(result[0], bytes)
assert EnumKey(key, 0) == "sub_key"
raises(EnvironmentError, EnumKey, key, 1)
def test_delete(self):
# must be run after test_SetValueEx
- from _winreg import OpenKey, KEY_ALL_ACCESS, DeleteValue, DeleteKey
+ from winreg import OpenKey, KEY_ALL_ACCESS, DeleteValue, DeleteKey
key = OpenKey(self.root_key, self.test_key_name, 0, KEY_ALL_ACCESS)
sub_key = OpenKey(key, "sub_key", 0, KEY_ALL_ACCESS)
for name, value, type in self.test_data:
DeleteValue(sub_key, name)
+ # cannot wrap a memoryview in setup_class for test_data
+ DeleteValue(sub_key, 'test_name')
DeleteKey(key, "sub_key")
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit