diff options
author | Thomas Heller <theller@ctypes.org> | 2008-08-19 19:49:49 (GMT) |
---|---|---|
committer | Thomas Heller <theller@ctypes.org> | 2008-08-19 19:49:49 (GMT) |
commit | f5049fc8c65ca45a3d42de400be57353b42f1d61 (patch) | |
tree | 194458c17b52e4894ef88af2f42e5371d558f89a | |
parent | 58ea9fedc825a91a3b153898afade19512bbde85 (diff) | |
download | cpython-f5049fc8c65ca45a3d42de400be57353b42f1d61.zip cpython-f5049fc8c65ca45a3d42de400be57353b42f1d61.tar.gz cpython-f5049fc8c65ca45a3d42de400be57353b42f1d61.tar.bz2 |
Merged revisions 65868,65870 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r65868 | thomas.heller | 2008-08-19 21:25:04 +0200 (Di, 19 Aug 2008) | 3 lines
Fix a regression introduced by rev. 63792: ctypes function pointers
that are COM methods must have a boolean True value.
........
r65870 | thomas.heller | 2008-08-19 21:40:23 +0200 (Di, 19 Aug 2008) | 1 line
COM method code is windows specific
........
-rw-r--r-- | Lib/ctypes/test/test_pointers.py | 7 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 33 |
3 files changed, 37 insertions, 6 deletions
diff --git a/Lib/ctypes/test/test_pointers.py b/Lib/ctypes/test/test_pointers.py index 05b180e..86429c0 100644 --- a/Lib/ctypes/test/test_pointers.py +++ b/Lib/ctypes/test/test_pointers.py @@ -1,4 +1,4 @@ -import unittest +import unittest, sys from ctypes import * import _ctypes_test @@ -183,5 +183,10 @@ class PointersTestCase(unittest.TestCase): self.failUnlessEqual(bool(CFUNCTYPE(None)(0)), False) self.failUnlessEqual(bool(CFUNCTYPE(None)(42)), True) + # COM methods are boolean True: + if sys.platform == "win32": + mth = WINFUNCTYPE(None)(42, "name", (), None) + self.failUnlessEqual(bool(mth), True) + if __name__ == '__main__': unittest.main() @@ -18,6 +18,9 @@ Core and Builtins without relying on a particular implementation; remove the ill-named PyMemoryView() function (PyMemoryView_GET_BUFFER() can be used instead). +- ctypes function pointers that are COM methods have a boolean True + value again. + - Issue #1819: function calls with several named parameters are now on average 35% faster (as measured by pybench). diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 7ef3ea1..11a725d 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3858,12 +3858,16 @@ CFuncPtr_repr(CFuncPtrObject *self) } static int -Pointer_bool(CDataObject *self) +CFuncPtr_bool(CFuncPtrObject *self) { - return *(void **)self->b_ptr != NULL; + return ((*(void **)self->b_ptr != NULL) +#ifdef MS_WIN32 + || (self->index != 0) +#endif + ); } -static PyNumberMethods Pointer_as_number = { +static PyNumberMethods CFuncPtr_as_number = { 0, /* nb_add */ 0, /* nb_subtract */ 0, /* nb_multiply */ @@ -3873,7 +3877,7 @@ static PyNumberMethods Pointer_as_number = { 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ - (inquiry)Pointer_bool, /* nb_bool */ + (inquiry)CFuncPtr_bool, /* nb_bool */ }; PyTypeObject CFuncPtr_Type = { @@ -3887,7 +3891,7 @@ PyTypeObject CFuncPtr_Type = { 0, /* tp_setattr */ 0, /* tp_compare */ (reprfunc)CFuncPtr_repr, /* tp_repr */ - &Pointer_as_number, /* tp_as_number */ + &CFuncPtr_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ @@ -4960,6 +4964,25 @@ static PyMappingMethods Pointer_as_mapping = { Pointer_subscript, }; +static int +Pointer_bool(CDataObject *self) +{ + return (*(void **)self->b_ptr != NULL); +} + +static PyNumberMethods Pointer_as_number = { + 0, /* nb_add */ + 0, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* nb_positive */ + 0, /* nb_absolute */ + (inquiry)Pointer_bool, /* nb_bool */ +}; + PyTypeObject Pointer_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_ctypes._Pointer", |