diff options
author | Meador Inge <meadori@gmail.com> | 2011-11-26 04:33:32 (GMT) |
---|---|---|
committer | Meador Inge <meadori@gmail.com> | 2011-11-26 04:33:32 (GMT) |
commit | 11e381310bb5f498186098855f843c2e07e7ea82 (patch) | |
tree | 70533ac58fb9900b4098819f3b3ae85726175c38 | |
parent | 4558bad7d64a7599b46fb56ea2df52319437f3a0 (diff) | |
download | cpython-11e381310bb5f498186098855f843c2e07e7ea82.zip cpython-11e381310bb5f498186098855f843c2e07e7ea82.tar.gz cpython-11e381310bb5f498186098855f843c2e07e7ea82.tar.bz2 |
Issue #13380: add an internal function for resetting the ctypes caches
-rw-r--r-- | Lib/ctypes/__init__.py | 25 | ||||
-rw-r--r-- | Lib/ctypes/test/test_as_parameter.py | 1 | ||||
-rw-r--r-- | Lib/ctypes/test/test_functions.py | 1 | ||||
-rwxr-xr-x | Lib/test/regrtest.py | 7 |
4 files changed, 25 insertions, 9 deletions
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 71686e7..111209a 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -265,7 +265,21 @@ class c_wchar_p(_SimpleCData): class c_wchar(_SimpleCData): _type_ = "u" -POINTER(c_wchar).from_param = c_wchar_p.from_param #_SimpleCData.c_wchar_p_from_param +def _reset_cache(): + _pointer_type_cache.clear() + _c_functype_cache.clear() + if _os.name in ("nt", "ce"): + _win_functype_cache.clear() + # _SimpleCData.c_wchar_p_from_param + POINTER(c_wchar).from_param = c_wchar_p.from_param + # _SimpleCData.c_char_p_from_param + POINTER(c_char).from_param = c_char_p.from_param + _pointer_type_cache[None] = c_void_p + # XXX for whatever reasons, creating the first instance of a callback + # function is needed for the unittests on Win64 to succeed. This MAY + # be a compiler bug, since the problem occurs only when _ctypes is + # compiled with the MS SDK compiler. Or an uninitialized variable? + CFUNCTYPE(c_int)(lambda: None) def create_unicode_buffer(init, size=None): """create_unicode_buffer(aString) -> character array @@ -285,7 +299,6 @@ def create_unicode_buffer(init, size=None): return buf raise TypeError(init) -POINTER(c_char).from_param = c_char_p.from_param #_SimpleCData.c_char_p_from_param # XXX Deprecated def SetPointerType(pointer, cls): @@ -445,8 +458,6 @@ if _os.name in ("nt", "ce"): descr = FormatError(code).strip() return WindowsError(code, descr) -_pointer_type_cache[None] = c_void_p - if sizeof(c_uint) == sizeof(c_void_p): c_size_t = c_uint c_ssize_t = c_int @@ -529,8 +540,4 @@ for kind in [c_ushort, c_uint, c_ulong, c_ulonglong]: elif sizeof(kind) == 8: c_uint64 = kind del(kind) -# XXX for whatever reasons, creating the first instance of a callback -# function is needed for the unittests on Win64 to succeed. This MAY -# be a compiler bug, since the problem occurs only when _ctypes is -# compiled with the MS SDK compiler. Or an uninitialized variable? -CFUNCTYPE(c_int)(lambda: None) +_reset_cache() diff --git a/Lib/ctypes/test/test_as_parameter.py b/Lib/ctypes/test/test_as_parameter.py index 475d595..2657a66 100644 --- a/Lib/ctypes/test/test_as_parameter.py +++ b/Lib/ctypes/test/test_as_parameter.py @@ -74,6 +74,7 @@ class BasicWrapTestCase(unittest.TestCase): def test_callbacks(self): f = dll._testfunc_callback_i_if f.restype = c_int + f.argtypes = None MyCallback = CFUNCTYPE(c_int, c_int) diff --git a/Lib/ctypes/test/test_functions.py b/Lib/ctypes/test/test_functions.py index f70cacd..45d74ec 100644 --- a/Lib/ctypes/test/test_functions.py +++ b/Lib/ctypes/test/test_functions.py @@ -250,6 +250,7 @@ class FunctionTestCase(unittest.TestCase): def test_callbacks(self): f = dll._testfunc_callback_i_if f.restype = c_int + f.argtypes = None MyCallback = CFUNCTYPE(c_int, c_int) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index 10b515b..cbbf1ca 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1255,6 +1255,13 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs): filecmp._cache.clear() struct._clearcache() doctest.master = None + try: + import ctypes + except ImportError: + # Don't worry about resetting the cache if ctypes is not supported + pass + else: + ctypes._reset_cache() # Collect cyclic trash. gc.collect() |