diff --git a/Lib/ctypes/test/test_pointers.py b/Lib/ctypes/test/test_pointers.py index fd42c8029b4..076cd8bd033 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() diff --git a/Misc/NEWS b/Misc/NEWS index e82772f36d1..627ce44ca9b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.6 beta 3? Core and Builtins ----------------- +- ctypes function pointers that are COM methods have a boolean True + value again. + - Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple, by denying s# to parse objects that have a releasebuffer procedure, and introducing s*. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index e53dc715d36..2a5da4eeb47 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3938,12 +3938,13 @@ CFuncPtr_repr(CFuncPtrObject *self) } static int -Pointer_nonzero(CDataObject *self) +CFuncPtr_nonzero(CFuncPtrObject *self) { - return *(void **)self->b_ptr != NULL; + return ((*(void **)self->b_ptr != NULL) + || (self->index != 0)); } -static PyNumberMethods Pointer_as_number = { +static PyNumberMethods CFuncPtr_as_number = { 0, /* nb_add */ 0, /* nb_subtract */ 0, /* nb_multiply */ @@ -3954,7 +3955,7 @@ static PyNumberMethods Pointer_as_number = { 0, /* nb_negative */ 0, /* nb_positive */ 0, /* nb_absolute */ - (inquiry)Pointer_nonzero, /* nb_nonzero */ + (inquiry)CFuncPtr_nonzero, /* nb_nonzero */ }; PyTypeObject CFuncPtr_Type = { @@ -3968,7 +3969,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 */ @@ -5176,6 +5177,26 @@ static PyMappingMethods Pointer_as_mapping = { Pointer_subscript, }; +static int +Pointer_nonzero(CDataObject *self) +{ + return (*(void **)self->b_ptr != NULL); +} + +static PyNumberMethods Pointer_as_number = { + 0, /* nb_add */ + 0, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_divide */ + 0, /* nb_remainder */ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* nb_positive */ + 0, /* nb_absolute */ + (inquiry)Pointer_nonzero, /* nb_nonzero */ +}; + PyTypeObject Pointer_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_ctypes._Pointer",