diff options
author | nulano <nulano@nulano.eu> | 2020-12-25 19:57:35 +0100 |
---|---|---|
committer | nulano <nulano@nulano.eu> | 2020-12-25 19:57:35 +0100 |
commit | e3dea970029307a198a4340333bf69013aadf710 (patch) | |
tree | 77e1af53db087c247497aff48e59559f006b6be5 | |
parent | backport 0df11e6e: redo winreg reflection using runtime loading (diff) | |
download | pypy-e3dea970029307a198a4340333bf69013aadf710.tar.gz pypy-e3dea970029307a198a4340333bf69013aadf710.tar.bz2 pypy-e3dea970029307a198a4340333bf69013aadf710.zip |
fix py3.7-winreg backports
-rw-r--r-- | pypy/module/_winreg/interp_winreg.py | 28 | ||||
-rw-r--r-- | pypy/module/_winreg/test/test_winreg.py | 24 |
2 files changed, 21 insertions, 31 deletions
diff --git a/pypy/module/_winreg/interp_winreg.py b/pypy/module/_winreg/interp_winreg.py index e97af9e06f..dc29cd844c 100644 --- a/pypy/module/_winreg/interp_winreg.py +++ b/pypy/module/_winreg/interp_winreg.py @@ -19,7 +19,7 @@ eci = ExternalCompilationInfo( "RPY_EXTERN LONG\n" "pypy_RegQueryReflectionKey(FARPROC address, HKEY key, LPBOOL isDisabled);\n" "RPY_EXTERN LONG\n" - "pypy_RegDeleteKeyExW(FARPROC address, HKEY key, LPCWSTR subkey,\n" + "pypy_RegDeleteKeyExA(FARPROC address, HKEY key, LPCSTR subkey,\n" " REGSAM sam, DWORD reserved);\n" ], separate_module_sources=[''' @@ -38,9 +38,9 @@ eci = ExternalCompilationInfo( } LONG - pypy_RegDeleteKeyExW(FARPROC address, HKEY key, LPCWSTR subkey, + pypy_RegDeleteKeyExA(FARPROC address, HKEY key, LPCSTR subkey, REGSAM sam, DWORD reserved) { - LONG (WINAPI *func)(HKEY, LPCWSTR, REGSAM, DWORD); + LONG (WINAPI *func)(HKEY, LPCSTR, REGSAM, DWORD); *(FARPROC*)&func = address; return func(key, subkey, sam, reserved); } @@ -56,9 +56,9 @@ pypy_RegQueryReflectionKey = rffi.llexternal( [rffi.VOIDP, rwinreg.HKEY, rwin32.LPBOOL], rffi.LONG, compilation_info=eci) -pypy_RegDeleteKeyExW = rffi.llexternal( - 'pypy_RegDeleteKeyExW', - [rffi.VOIDP, rwinreg.HKEY, rffi.CWCHARP, rwinreg.REGSAM, rwin32.DWORD], +pypy_RegDeleteKeyExA = rffi.llexternal( + 'pypy_RegDeleteKeyExA', + [rffi.VOIDP, rwinreg.HKEY, rffi.CCHARP, rwinreg.REGSAM, rwin32.DWORD], rffi.LONG, compilation_info=eci) @@ -313,6 +313,8 @@ But the underlying API call doesn't return the type, Lame Lame Lame, DONT USE TH if ret != 0: raiseWindowsError(space, ret, 'RegQueryValue') length = intmask(bufsize_p[0]) + if length == 0: + return space.w_None return space.newtext(rffi.charp2strn(buf, length - 1)) def convert_to_regdata(space, w_value, typ): @@ -795,7 +797,7 @@ _RegEnableReflectionKey = ReflectionFunction( "RegEnableReflectionKey", pypy_RegChangeReflectionKey) _RegQueryReflectionKey = ReflectionFunction( "RegQueryReflectionKey", pypy_RegQueryReflectionKey) -_RegDeleteKeyExW = ReflectionFunction("RegDeleteKeyExW", pypy_RegDeleteKeyExW) +_RegDeleteKeyExA = ReflectionFunction("RegDeleteKeyExA", pypy_RegDeleteKeyExA) def DisableReflectionKey(space, w_key): @@ -841,7 +843,7 @@ def QueryReflectionKey(space, w_key): return space.newbool(intmask(isDisabled[0]) != 0) -@unwrap_spec(sub_key="unicode", access=r_uint, reserved=int) +@unwrap_spec(sub_key="text", access=r_uint, reserved=int) def DeleteKeyEx(space, w_key, sub_key, access=rwinreg.KEY_WOW64_64KEY, reserved=0): """DeleteKeyEx(key, sub_key, sam, res) - Deletes the specified key. @@ -856,13 +858,11 @@ def DeleteKeyEx(space, w_key, sub_key, access=rwinreg.KEY_WOW64_64KEY, reserved= If the method succeeds, the entire key, including all of its values, is removed. If the method fails, a WindowsError exception is raised. On unsupported Windows versions, NotImplementedError is raised.""" - if not _RegDeleteKeyExW.check(): + if not _RegDeleteKeyExA.check(): raise oefmt(space.w_NotImplementedError, "not implemented on this platform") else: hkey = hkey_w(w_key, space) - with rffi.scoped_unicode2wcharp(sub_key) as wide_subkey: - c_subkey = rffi.cast(rffi.CWCHARP, wide_subkey) - ret = _RegDeleteKeyExW.call(hkey, c_subkey, access, reserved) - if ret != 0: - raiseWindowsError(space, ret, 'RegDeleteKeyEx') + ret = _RegDeleteKeyExA.call(hkey, sub_key, access, reserved) + if ret != 0: + raiseWindowsError(space, ret, 'RegDeleteKeyEx') diff --git a/pypy/module/_winreg/test/test_winreg.py b/pypy/module/_winreg/test/test_winreg.py index 841079b3ea..1d25cbb900 100644 --- a/pypy/module/_winreg/test/test_winreg.py +++ b/pypy/module/_winreg/test/test_winreg.py @@ -178,14 +178,19 @@ class AppTestFfi: 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, DeleteKeyEx 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) - DeleteKey(key, "sub_key") + if self.win64_machine: + DeleteKeyEx(key, "sub_key", KEY_ALL_ACCESS, 0) + else: + DeleteKey(key, "sub_key") + + raises(OSError, OpenKey, key, "sub_key") def test_connect(self): from _winreg import ConnectRegistry, HKEY_LOCAL_MACHINE @@ -273,18 +278,3 @@ class AppTestFfi: assert EnableReflectionKey(key) is None assert DisableReflectionKey(key) is None assert QueryReflectionKey(key) - - def test_named_arguments(self): - from _winreg import KEY_ALL_ACCESS, CreateKeyEx, DeleteKey, DeleteKeyEx, OpenKeyEx - with CreateKeyEx(key=self.root_key, sub_key=self.test_key_name, - reserved=0, access=KEY_ALL_ACCESS) as ckey: - assert ckey.handle != 0 - with OpenKeyEx(key=self.root_key, sub_key=self.test_key_name, - reserved=0, access=KEY_ALL_ACCESS) as okey: - assert okey.handle != 0 - if self.win64_machine: - DeleteKeyEx(key=self.root_key, sub_key=self.test_key_name, - access=KEY_ALL_ACCESS, reserved=0) - else: - DeleteKey(self.root_key, self.test_key_name) - |