Skip to content

Commit 0ad5ae0

Browse files
author
Thomas Heller
committed
Fix a regression introduced by rev. 63792: ctypes function pointers
that are COM methods must have a boolean True value.
1 parent 4348a25 commit 0ad5ae0

3 files changed

Lines changed: 35 additions & 6 deletions

File tree

Lib/ctypes/test/test_pointers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import unittest
1+
import unittest, sys
22

33
from ctypes import *
44
import _ctypes_test
@@ -183,5 +183,10 @@ def test_pointers_bool(self):
183183
self.failUnlessEqual(bool(CFUNCTYPE(None)(0)), False)
184184
self.failUnlessEqual(bool(CFUNCTYPE(None)(42)), True)
185185

186+
# COM methods are boolean True:
187+
if sys.platform == "win32":
188+
mth = WINFUNCTYPE(None)(42, "name", (), None)
189+
self.failUnlessEqual(bool(mth), True)
190+
186191
if __name__ == '__main__':
187192
unittest.main()

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ What's New in Python 2.6 beta 3?
1212
Core and Builtins
1313
-----------------
1414

15+
- ctypes function pointers that are COM methods have a boolean True
16+
value again.
17+
1518
- Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
1619
by denying s# to parse objects that have a releasebuffer procedure,
1720
and introducing s*.

Modules/_ctypes/_ctypes.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3938,12 +3938,13 @@ CFuncPtr_repr(CFuncPtrObject *self)
39383938
}
39393939

39403940
static int
3941-
Pointer_nonzero(CDataObject *self)
3941+
CFuncPtr_nonzero(CFuncPtrObject *self)
39423942
{
3943-
return *(void **)self->b_ptr != NULL;
3943+
return ((*(void **)self->b_ptr != NULL)
3944+
|| (self->index != 0));
39443945
}
39453946

3946-
static PyNumberMethods Pointer_as_number = {
3947+
static PyNumberMethods CFuncPtr_as_number = {
39473948
0, /* nb_add */
39483949
0, /* nb_subtract */
39493950
0, /* nb_multiply */
@@ -3954,7 +3955,7 @@ static PyNumberMethods Pointer_as_number = {
39543955
0, /* nb_negative */
39553956
0, /* nb_positive */
39563957
0, /* nb_absolute */
3957-
(inquiry)Pointer_nonzero, /* nb_nonzero */
3958+
(inquiry)CFuncPtr_nonzero, /* nb_nonzero */
39583959
};
39593960

39603961
PyTypeObject CFuncPtr_Type = {
@@ -3968,7 +3969,7 @@ PyTypeObject CFuncPtr_Type = {
39683969
0, /* tp_setattr */
39693970
0, /* tp_compare */
39703971
(reprfunc)CFuncPtr_repr, /* tp_repr */
3971-
&Pointer_as_number, /* tp_as_number */
3972+
&CFuncPtr_as_number, /* tp_as_number */
39723973
0, /* tp_as_sequence */
39733974
0, /* tp_as_mapping */
39743975
0, /* tp_hash */
@@ -5176,6 +5177,26 @@ static PyMappingMethods Pointer_as_mapping = {
51765177
Pointer_subscript,
51775178
};
51785179

5180+
static int
5181+
Pointer_nonzero(CDataObject *self)
5182+
{
5183+
return (*(void **)self->b_ptr != NULL);
5184+
}
5185+
5186+
static PyNumberMethods Pointer_as_number = {
5187+
0, /* nb_add */
5188+
0, /* nb_subtract */
5189+
0, /* nb_multiply */
5190+
0, /* nb_divide */
5191+
0, /* nb_remainder */
5192+
0, /* nb_divmod */
5193+
0, /* nb_power */
5194+
0, /* nb_negative */
5195+
0, /* nb_positive */
5196+
0, /* nb_absolute */
5197+
(inquiry)Pointer_nonzero, /* nb_nonzero */
5198+
};
5199+
51795200
PyTypeObject Pointer_Type = {
51805201
PyVarObject_HEAD_INIT(NULL, 0)
51815202
"_ctypes._Pointer",

0 commit comments

Comments
 (0)