From: Meador Inge Date: Sat, 26 Nov 2011 04:25:06 +0000 (-0600) Subject: Issue #13380: add an internal function for resetting the ctypes caches X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e30317891c41ada25d5459644484aef0bc8e88c;p=python Issue #13380: add an internal function for resetting the ctypes caches --- diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 16489b9534..4e97c15208 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -262,6 +262,22 @@ class c_bool(_SimpleCData): from _ctypes import POINTER, pointer, _pointer_type_cache +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) + try: from _ctypes import set_conversion_mode except ImportError: @@ -278,8 +294,6 @@ else: class c_wchar(_SimpleCData): _type_ = "u" - POINTER(c_wchar).from_param = c_wchar_p.from_param #_SimpleCData.c_wchar_p_from_param - def create_unicode_buffer(init, size=None): """create_unicode_buffer(aString) -> character array create_unicode_buffer(anInteger) -> character array @@ -298,8 +312,6 @@ else: 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): if _pointer_type_cache.get(cls, None) is not None: @@ -458,8 +470,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 @@ -542,8 +552,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 7e8017345a..a603a64714 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 70cf188ed8..8e898a8d2e 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 c5f19ad9b2..5044ce41f5 100755 --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -1076,6 +1076,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()