mirror of https://github.com/python/cpython
Issue #13380: add an internal function for resetting the ctypes caches
This commit is contained in:
commit
4bc45b7a9f
|
@ -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)
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue