Issue #13380: add an internal function for resetting the ctypes caches

This commit is contained in:
Meador Inge 2011-11-25 22:37:44 -06:00
commit 4bc45b7a9f
4 changed files with 25 additions and 9 deletions

View File

@ -265,7 +265,21 @@ class c_wchar_p(_SimpleCData):
class c_wchar(_SimpleCData): class c_wchar(_SimpleCData):
_type_ = "u" _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): def create_unicode_buffer(init, size=None):
"""create_unicode_buffer(aString) -> character array """create_unicode_buffer(aString) -> character array
@ -285,7 +299,6 @@ def create_unicode_buffer(init, size=None):
return buf return buf
raise TypeError(init) raise TypeError(init)
POINTER(c_char).from_param = c_char_p.from_param #_SimpleCData.c_char_p_from_param
# XXX Deprecated # XXX Deprecated
def SetPointerType(pointer, cls): def SetPointerType(pointer, cls):
@ -445,8 +458,6 @@ if _os.name in ("nt", "ce"):
descr = FormatError(code).strip() descr = FormatError(code).strip()
return WindowsError(code, descr) return WindowsError(code, descr)
_pointer_type_cache[None] = c_void_p
if sizeof(c_uint) == sizeof(c_void_p): if sizeof(c_uint) == sizeof(c_void_p):
c_size_t = c_uint c_size_t = c_uint
c_ssize_t = c_int 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 elif sizeof(kind) == 8: c_uint64 = kind
del(kind) del(kind)
# XXX for whatever reasons, creating the first instance of a callback _reset_cache()
# 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)

View File

@ -74,6 +74,7 @@ class BasicWrapTestCase(unittest.TestCase):
def test_callbacks(self): def test_callbacks(self):
f = dll._testfunc_callback_i_if f = dll._testfunc_callback_i_if
f.restype = c_int f.restype = c_int
f.argtypes = None
MyCallback = CFUNCTYPE(c_int, c_int) MyCallback = CFUNCTYPE(c_int, c_int)

View File

@ -250,6 +250,7 @@ class FunctionTestCase(unittest.TestCase):
def test_callbacks(self): def test_callbacks(self):
f = dll._testfunc_callback_i_if f = dll._testfunc_callback_i_if
f.restype = c_int f.restype = c_int
f.argtypes = None
MyCallback = CFUNCTYPE(c_int, c_int) MyCallback = CFUNCTYPE(c_int, c_int)

View File

@ -1401,6 +1401,13 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs):
filecmp._cache.clear() filecmp._cache.clear()
struct._clearcache() struct._clearcache()
doctest.master = None 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. # Collect cyclic trash.
gc.collect() gc.collect()