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