summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMeador Inge <meadori@gmail.com>2011-11-26 04:37:44 (GMT)
committerMeador Inge <meadori@gmail.com>2011-11-26 04:37:44 (GMT)
commit4bc45b7a9f5fc849ee13699e3da8d483188fe90b (patch)
tree9ab06fe735d92ac06e0f845a02e6f1cc45b22a51 /Lib
parent4d098735c6b96afd495aaa6256a4855706043812 (diff)
parent11e381310bb5f498186098855f843c2e07e7ea82 (diff)
downloadcpython-4bc45b7a9f5fc849ee13699e3da8d483188fe90b.zip
cpython-4bc45b7a9f5fc849ee13699e3da8d483188fe90b.tar.gz
cpython-4bc45b7a9f5fc849ee13699e3da8d483188fe90b.tar.bz2
Issue #13380: add an internal function for resetting the ctypes caches
Diffstat (limited to 'Lib')
-rw-r--r--Lib/ctypes/__init__.py25
-rw-r--r--Lib/ctypes/test/test_as_parameter.py1
-rw-r--r--Lib/ctypes/test/test_functions.py1
-rwxr-xr-xLib/test/regrtest.py7
4 files changed, 25 insertions, 9 deletions
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
index 71686e7..111209a 100644
--- a/Lib/ctypes/__init__.py
+++ b/Lib/ctypes/__init__.py
@@ -265,7 +265,21 @@ class c_wchar_p(_SimpleCData):
class c_wchar(_SimpleCData):
_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):
"""create_unicode_buffer(aString) -> character array
@@ -285,7 +299,6 @@ def create_unicode_buffer(init, size=None):
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):
@@ -445,8 +458,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
@@ -529,8 +540,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 475d595..2657a66 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 f70cacd..45d74ec 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 f859c51..cfae1f0 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -1401,6 +1401,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()