diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2013-02-07 14:59:25 +0200 |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2013-02-07 14:59:25 +0200 |
commit | eb3d46d6da40737ee1d5651e60b8fb8638f65cd0 (patch) | |
tree | de830540d5dcbc2c5b2154dffe06151abca1b4f7 /Lib/ctypes | |
parent | 75d73b2b58f051abf8761e3d1e2ce564eaf478d4 (diff) | |
parent | fc7664dd67fac35ff16cd31a1aea7ab5dc3a6dc2 (diff) | |
download | cpython-eb3d46d6da40737ee1d5651e60b8fb8638f65cd0.tar.gz |
Fix test_from_dll* in test_returnfuncptrs.py.
Diffstat (limited to 'Lib/ctypes')
-rw-r--r-- | Lib/ctypes/__init__.py | 4 | ||||
-rw-r--r-- | Lib/ctypes/test/test_callbacks.py | 2 | ||||
-rw-r--r-- | Lib/ctypes/test/test_memfunctions.py | 2 | ||||
-rw-r--r-- | Lib/ctypes/test/test_parameters.py | 9 | ||||
-rw-r--r-- | Lib/ctypes/test/test_pep3118.py | 76 | ||||
-rw-r--r-- | Lib/ctypes/test/test_python_api.py | 3 | ||||
-rw-r--r-- | Lib/ctypes/test/test_refcounts.py | 3 | ||||
-rw-r--r-- | Lib/ctypes/test/test_stringptr.py | 2 | ||||
-rw-r--r-- | Lib/ctypes/test/test_win32.py | 22 | ||||
-rw-r--r-- | Lib/ctypes/util.py | 66 |
10 files changed, 127 insertions, 62 deletions
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py index 111209a953..c92e130976 100644 --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -26,7 +26,7 @@ if _os.name == "posix" and _sys.platform == "darwin": # libraries. OS X 10.3 is Darwin 7, so we check for # that. - if int(_os.uname()[2].split('.')[0]) < 8: + if int(_os.uname().release.split('.')[0]) < 8: DEFAULT_MODE = RTLD_GLOBAL from _ctypes import FUNCFLAG_CDECL as _FUNCFLAG_CDECL, \ @@ -456,7 +456,7 @@ if _os.name in ("nt", "ce"): code = GetLastError() if descr is None: descr = FormatError(code).strip() - return WindowsError(code, descr) + return WindowsError(None, descr, None, code) if sizeof(c_uint) == sizeof(c_void_p): c_size_t = c_uint diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py index c7207eab9d..5600b437c1 100644 --- a/Lib/ctypes/test/test_callbacks.py +++ b/Lib/ctypes/test/test_callbacks.py @@ -140,7 +140,7 @@ class Callbacks(unittest.TestCase): def __del__(self): gc.collect() CFUNCTYPE(None)(lambda x=Nasty(): None) - + try: WINFUNCTYPE diff --git a/Lib/ctypes/test/test_memfunctions.py b/Lib/ctypes/test/test_memfunctions.py index aa2113b885..aec4aaadac 100644 --- a/Lib/ctypes/test/test_memfunctions.py +++ b/Lib/ctypes/test/test_memfunctions.py @@ -1,4 +1,5 @@ import sys +from test import support import unittest from ctypes import * @@ -49,6 +50,7 @@ class MemFunctionsTest(unittest.TestCase): self.assertEqual(cast(a, POINTER(c_byte))[:7:7], [97]) + @support.refcount_test def test_string_at(self): s = string_at(b"foo bar") # XXX The following may be wrong, depending on how Python diff --git a/Lib/ctypes/test/test_parameters.py b/Lib/ctypes/test/test_parameters.py index e83fd9a6fc..9762fb915d 100644 --- a/Lib/ctypes/test/test_parameters.py +++ b/Lib/ctypes/test/test_parameters.py @@ -73,13 +73,10 @@ class SimpleTypesTestCase(unittest.TestCase): except ImportError: ## print "(No c_wchar_p)" return - s = "123" - if sys.platform == "win32": - self.assertTrue(c_wchar_p.from_param(s)._obj is s) - self.assertRaises(TypeError, c_wchar_p.from_param, 42) - # new in 0.9.1: convert (decode) ascii to unicode - self.assertEqual(c_wchar_p.from_param("123")._obj, "123") + c_wchar_p.from_param("123") + + self.assertRaises(TypeError, c_wchar_p.from_param, 42) self.assertRaises(TypeError, c_wchar_p.from_param, b"123\377") pa = c_wchar_p.from_param(c_wchar_p("123")) diff --git a/Lib/ctypes/test/test_pep3118.py b/Lib/ctypes/test/test_pep3118.py index fa6461f546..ad13b016e7 100644 --- a/Lib/ctypes/test/test_pep3118.py +++ b/Lib/ctypes/test/test_pep3118.py @@ -25,14 +25,17 @@ class Test(unittest.TestCase): v = memoryview(ob) try: self.assertEqual(normalize(v.format), normalize(fmt)) - if shape is not None: + if shape: self.assertEqual(len(v), shape[0]) else: self.assertEqual(len(v) * sizeof(itemtp), sizeof(ob)) self.assertEqual(v.itemsize, sizeof(itemtp)) self.assertEqual(v.shape, shape) - # ctypes object always have a non-strided memory block - self.assertEqual(v.strides, None) + # XXX Issue #12851: PyCData_NewGetBuffer() must provide strides + # if requested. memoryview currently reconstructs missing + # stride information, so this assert will fail. + # self.assertEqual(v.strides, ()) + # they are always read/write self.assertFalse(v.readonly) @@ -52,14 +55,15 @@ class Test(unittest.TestCase): v = memoryview(ob) try: self.assertEqual(v.format, fmt) - if shape is not None: + if shape: self.assertEqual(len(v), shape[0]) else: self.assertEqual(len(v) * sizeof(itemtp), sizeof(ob)) self.assertEqual(v.itemsize, sizeof(itemtp)) self.assertEqual(v.shape, shape) - # ctypes object always have a non-strided memory block - self.assertEqual(v.strides, None) + # XXX Issue #12851 + # self.assertEqual(v.strides, ()) + # they are always read/write self.assertFalse(v.readonly) @@ -110,34 +114,34 @@ native_types = [ ## simple types - (c_char, "<c", None, c_char), - (c_byte, "<b", None, c_byte), - (c_ubyte, "<B", None, c_ubyte), - (c_short, "<h", None, c_short), - (c_ushort, "<H", None, c_ushort), + (c_char, "<c", (), c_char), + (c_byte, "<b", (), c_byte), + (c_ubyte, "<B", (), c_ubyte), + (c_short, "<h", (), c_short), + (c_ushort, "<H", (), c_ushort), # c_int and c_uint may be aliases to c_long - #(c_int, "<i", None, c_int), - #(c_uint, "<I", None, c_uint), + #(c_int, "<i", (), c_int), + #(c_uint, "<I", (), c_uint), - (c_long, "<l", None, c_long), - (c_ulong, "<L", None, c_ulong), + (c_long, "<l", (), c_long), + (c_ulong, "<L", (), c_ulong), # c_longlong and c_ulonglong are aliases on 64-bit platforms #(c_longlong, "<q", None, c_longlong), #(c_ulonglong, "<Q", None, c_ulonglong), - (c_float, "<f", None, c_float), - (c_double, "<d", None, c_double), + (c_float, "<f", (), c_float), + (c_double, "<d", (), c_double), # c_longdouble may be an alias to c_double - (c_bool, "<?", None, c_bool), - (py_object, "<O", None, py_object), + (c_bool, "<?", (), c_bool), + (py_object, "<O", (), py_object), ## pointers - (POINTER(c_byte), "&<b", None, POINTER(c_byte)), - (POINTER(POINTER(c_long)), "&&<l", None, POINTER(POINTER(c_long))), + (POINTER(c_byte), "&<b", (), POINTER(c_byte)), + (POINTER(POINTER(c_long)), "&&<l", (), POINTER(POINTER(c_long))), ## arrays and pointers @@ -145,32 +149,32 @@ native_types = [ (c_float * 4 * 3 * 2, "(2,3,4)<f", (2,3,4), c_float), (POINTER(c_short) * 2, "(2)&<h", (2,), POINTER(c_short)), (POINTER(c_short) * 2 * 3, "(3,2)&<h", (3,2,), POINTER(c_short)), - (POINTER(c_short * 2), "&(2)<h", None, POINTER(c_short)), + (POINTER(c_short * 2), "&(2)<h", (), POINTER(c_short)), ## structures and unions - (Point, "T{<l:x:<l:y:}", None, Point), + (Point, "T{<l:x:<l:y:}", (), Point), # packed structures do not implement the pep - (PackedPoint, "B", None, PackedPoint), - (Point2, "T{<l:x:<l:y:}", None, Point2), - (EmptyStruct, "T{}", None, EmptyStruct), + (PackedPoint, "B", (), PackedPoint), + (Point2, "T{<l:x:<l:y:}", (), Point2), + (EmptyStruct, "T{}", (), EmptyStruct), # the pep does't support unions - (aUnion, "B", None, aUnion), + (aUnion, "B", (), aUnion), ## pointer to incomplete structure - (Incomplete, "B", None, Incomplete), - (POINTER(Incomplete), "&B", None, POINTER(Incomplete)), + (Incomplete, "B", (), Incomplete), + (POINTER(Incomplete), "&B", (), POINTER(Incomplete)), # 'Complete' is a structure that starts incomplete, but is completed after the # pointer type to it has been created. - (Complete, "T{<l:a:}", None, Complete), + (Complete, "T{<l:a:}", (), Complete), # Unfortunately the pointer format string is not fixed... - (POINTER(Complete), "&B", None, POINTER(Complete)), + (POINTER(Complete), "&B", (), POINTER(Complete)), ## other # function signatures are not implemented - (CFUNCTYPE(None), "X{}", None, CFUNCTYPE(None)), + (CFUNCTYPE(None), "X{}", (), CFUNCTYPE(None)), ] @@ -186,10 +190,10 @@ class LEPoint(LittleEndianStructure): # and little endian machines. # endian_types = [ - (BEPoint, "T{>l:x:>l:y:}", None, BEPoint), - (LEPoint, "T{<l:x:<l:y:}", None, LEPoint), - (POINTER(BEPoint), "&T{>l:x:>l:y:}", None, POINTER(BEPoint)), - (POINTER(LEPoint), "&T{<l:x:<l:y:}", None, POINTER(LEPoint)), + (BEPoint, "T{>l:x:>l:y:}", (), BEPoint), + (LEPoint, "T{<l:x:<l:y:}", (), LEPoint), + (POINTER(BEPoint), "&T{>l:x:>l:y:}", (), POINTER(BEPoint)), + (POINTER(LEPoint), "&T{<l:x:<l:y:}", (), POINTER(LEPoint)), ] if __name__ == "__main__": diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py index 1f4c6039dc..9de3980ed4 100644 --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -1,5 +1,6 @@ from ctypes import * import unittest, sys +from test import support from ctypes.test import is_resource_enabled ################################################################ @@ -25,6 +26,7 @@ class PythonAPITestCase(unittest.TestCase): self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc") + @support.refcount_test def test_PyString_FromString(self): pythonapi.PyBytes_FromString.restype = py_object pythonapi.PyBytes_FromString.argtypes = (c_char_p,) @@ -56,6 +58,7 @@ class PythonAPITestCase(unittest.TestCase): del res self.assertEqual(grc(42), ref42) + @support.refcount_test def test_PyObj_FromPtr(self): s = "abc def ghi jkl" ref = grc(s) diff --git a/Lib/ctypes/test/test_refcounts.py b/Lib/ctypes/test/test_refcounts.py index 35a81aa40b..5613e7a387 100644 --- a/Lib/ctypes/test/test_refcounts.py +++ b/Lib/ctypes/test/test_refcounts.py @@ -1,4 +1,5 @@ import unittest +from test import support import ctypes import gc @@ -10,6 +11,7 @@ dll = ctypes.CDLL(_ctypes_test.__file__) class RefcountTestCase(unittest.TestCase): + @support.refcount_test def test_1(self): from sys import getrefcount as grc @@ -34,6 +36,7 @@ class RefcountTestCase(unittest.TestCase): self.assertEqual(grc(callback), 2) + @support.refcount_test def test_refcount(self): from sys import getrefcount as grc def func(*args): diff --git a/Lib/ctypes/test/test_stringptr.py b/Lib/ctypes/test/test_stringptr.py index 3d25fa5360..95cd1614c6 100644 --- a/Lib/ctypes/test/test_stringptr.py +++ b/Lib/ctypes/test/test_stringptr.py @@ -1,4 +1,5 @@ import unittest +from test import support from ctypes import * import _ctypes_test @@ -7,6 +8,7 @@ lib = CDLL(_ctypes_test.__file__) class StringPtrTestCase(unittest.TestCase): + @support.refcount_test def test__POINTER_c_char(self): class X(Structure): _fields_ = [("str", POINTER(c_char))] diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py index 7e6fe3fba0..da21336682 100644 --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -70,6 +70,28 @@ if sys.platform == "win32": self.assertEqual(ex.text, "text") self.assertEqual(ex.details, ("details",)) + class TestWinError(unittest.TestCase): + def test_winerror(self): + # see Issue 16169 + import errno + ERROR_INVALID_PARAMETER = 87 + msg = FormatError(ERROR_INVALID_PARAMETER).strip() + args = (errno.EINVAL, msg, None, ERROR_INVALID_PARAMETER) + + e = WinError(ERROR_INVALID_PARAMETER) + self.assertEqual(e.args, args) + self.assertEqual(e.errno, errno.EINVAL) + self.assertEqual(e.winerror, ERROR_INVALID_PARAMETER) + + windll.kernel32.SetLastError(ERROR_INVALID_PARAMETER) + try: + raise WinError() + except OSError as exc: + e = exc + self.assertEqual(e.args, args) + self.assertEqual(e.errno, errno.EINVAL) + self.assertEqual(e.winerror, ERROR_INVALID_PARAMETER) + class Structures(unittest.TestCase): def test_struct_by_value(self): diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 1bb7d1de7e..1515604272 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -1,5 +1,6 @@ import sys, os import contextlib +import subprocess # find_library(name) returns the pathname of a library, or None. if os.name == "nt": @@ -39,8 +40,8 @@ if os.name == "nt": clibname = 'msvcr%d' % (version * 10) # If python was built with in debug mode - import imp - if imp.get_suffixes()[0][0] == '_d.pyd': + import importlib.machinery + if '_d.pyd' in importlib.machinery.EXTENSION_SUFFIXES: clibname += 'd' return clibname+'.dll' @@ -136,16 +137,12 @@ elif os.name == "posix": rv = f.close() if rv == 10: raise OSError('objdump command not found') - with contextlib.closing(os.popen(cmd)) as f: - data = f.read() - res = re.search(r'\sSONAME\s+([^\s]+)', data) + res = re.search(r'\sSONAME\s+([^\s]+)', dump) if not res: return None return res.group(1) - if (sys.platform.startswith("freebsd") - or sys.platform.startswith("openbsd") - or sys.platform.startswith("dragonfly")): + if sys.platform.startswith(("freebsd", "openbsd", "dragonfly")): def _num_version(libname): # "libxyz.so.MAJOR.MINOR" => [ MAJOR, MINOR ] @@ -169,14 +166,43 @@ elif os.name == "posix": res.sort(key=_num_version) return res[-1] + elif sys.platform == "sunos5": + + def _findLib_crle(name, is64): + if not os.path.exists('/usr/bin/crle'): + return None + + if is64: + cmd = 'env LC_ALL=C /usr/bin/crle -64 2>/dev/null' + else: + cmd = 'env LC_ALL=C /usr/bin/crle 2>/dev/null' + + for line in os.popen(cmd).readlines(): + line = line.strip() + if line.startswith('Default Library Path (ELF):'): + paths = line.split()[4] + + if not paths: + return None + + for dir in paths.split(":"): + libfile = os.path.join(dir, "lib%s.so" % name) + if os.path.exists(libfile): + return libfile + + return None + + def find_library(name, is64 = False): + return _get_soname(_findLib_crle(name, is64) or _findLib_gcc(name)) + else: def _findSoname_ldconfig(name): import struct if struct.calcsize('l') == 4: - machine = os.uname()[4] + '-32' + machine = os.uname().machine + '-32' else: - machine = os.uname()[4] + '-64' + machine = os.uname().machine + '-64' mach_map = { 'x86_64-64': 'libc6,x86-64', 'ppc64-64': 'libc6,64bit', @@ -187,13 +213,19 @@ elif os.name == "posix": abi_type = mach_map.get(machine, 'libc6') # XXX assuming GLIBC's ldconfig (with option -p) - expr = r'\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type) - with contextlib.closing(os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null')) as f: - data = f.read() - res = re.search(expr, data) - if not res: - return None - return res.group(1) + regex = os.fsencode( + '\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type)) + try: + with subprocess.Popen(['/sbin/ldconfig', '-p'], + stdin=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + stdout=subprocess.PIPE, + env={'LC_ALL': 'C', 'LANG': 'C'}) as p: + res = re.search(regex, p.stdout.read()) + if res: + return os.fsdecode(res.group(1)) + except OSError: + pass def find_library(name): return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) |