aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornulano <nulano@nulano.eu>2020-12-25 19:57:35 +0100
committernulano <nulano@nulano.eu>2020-12-25 19:57:35 +0100
commite3dea970029307a198a4340333bf69013aadf710 (patch)
tree77e1af53db087c247497aff48e59559f006b6be5
parentbackport 0df11e6e: redo winreg reflection using runtime loading (diff)
downloadpypy-e3dea970029307a198a4340333bf69013aadf710.tar.gz
pypy-e3dea970029307a198a4340333bf69013aadf710.tar.bz2
pypy-e3dea970029307a198a4340333bf69013aadf710.zip
fix py3.7-winreg backports
-rw-r--r--pypy/module/_winreg/interp_winreg.py28
-rw-r--r--pypy/module/_winreg/test/test_winreg.py24
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)
-