]> granicus.if.org Git - python/commitdiff
Issue #13380: add an internal function for resetting the ctypes caches
authorMeador Inge <meadori@gmail.com>
Sat, 26 Nov 2011 04:25:06 +0000 (22:25 -0600)
committerMeador Inge <meadori@gmail.com>
Sat, 26 Nov 2011 04:25:06 +0000 (22:25 -0600)
Lib/ctypes/__init__.py
Lib/ctypes/test/test_as_parameter.py
Lib/ctypes/test/test_functions.py
Lib/test/regrtest.py

index 16489b953498b6253954effecd2a14c736baa361..4e97c15208fd0d3c91b34cd779ce0312c1e6d07a 100644 (file)
@@ -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()
index 7e8017345a97634f26a7c1359377f467e813fc5f..a603a64714b8059045878df95bda199734832a29 100644 (file)
@@ -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)
 
index 70cf188ed886546b5306b6e13e81da8b1b1b7631..8e898a8d2e35aa3fe861ca7cc1c6608447769888 100644 (file)
@@ -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)
 
index c5f19ad9b2de1a47a0d41007b89d636e90edc470..5044ce41f5bc3539fae6a92065c26345803f5f76 100755 (executable)
@@ -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()