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

Reply via email to