Skip to content

Commit 2c31a01

Browse files
committed
PyType_GetSlot() doesn't work with non-heap types
1 parent bcb17a9 commit 2c31a01

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

src/wrapt/_wrappers.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2146,15 +2146,17 @@ static PyObject *WraptFunctionWrapperBase_descr_get(
21462146
}
21472147

21482148
if (self->parent == Py_None) {
2149-
descrgetfunc descr_get;
2149+
PyObject *descr_get;
21502150
if (PyObject_IsInstance(self->object_proxy.wrapped,
21512151
(PyObject *)&PyType_Type)) {
21522152
Py_INCREF(self);
21532153
return (PyObject *)self;
21542154
}
21552155

2156-
descr_get = (descrgetfunc)PyType_GetSlot(
2157-
Py_TYPE(self->object_proxy.wrapped), Py_tp_descr_get);
2156+
/* Cannot use Py_tp_descr_get with non-heap types */
2157+
descr_get = PyObject_GetAttrString(
2158+
Py_TYPE(self->object_proxy.wrapped), "__get__"
2159+
);
21582160
if (descr_get == NULL) {
21592161
PyObject *name = type_getname(Py_TYPE(self->object_proxy.wrapped));
21602162
if (name == NULL) {
@@ -2167,9 +2169,9 @@ static PyObject *WraptFunctionWrapperBase_descr_get(
21672169
return NULL;
21682170
}
21692171

2170-
descriptor = descr_get(
2171-
self->object_proxy.wrapped, obj, type);
2172-
2172+
descriptor = PyObject_CallFunctionObjArgs(
2173+
descr_get, self->object_proxy.wrapped, obj, type, NULL);
2174+
Py_DECREF(descr_get);
21732175
if (!descriptor)
21742176
return NULL;
21752177

@@ -2202,7 +2204,7 @@ static PyObject *WraptFunctionWrapperBase_descr_get(
22022204
PyObject *wrapped = NULL;
22032205

22042206
static PyObject *wrapped_str = NULL;
2205-
descrgetfunc descr_get;
2207+
PyObject *descr_get;
22062208

22072209
if (!wrapped_str) {
22082210
wrapped_str = PyUnicode_InternFromString("__wrapped__");
@@ -2213,9 +2215,10 @@ static PyObject *WraptFunctionWrapperBase_descr_get(
22132215
if (!wrapped)
22142216
return NULL;
22152217

2216-
descr_get = (descrgetfunc)PyType_GetSlot(
2217-
Py_TYPE(wrapped), Py_tp_descr_get);
2218-
2218+
/* Cannot use Py_tp_descr_get with non-heap types */
2219+
descr_get = PyObject_GetAttrString(
2220+
Py_TYPE(self->object_proxy.wrapped), "__get__"
2221+
);
22192222
if (descr_get == NULL) {
22202223
PyObject *name = type_getname(Py_TYPE(wrapped));
22212224
if (name == NULL) {
@@ -2230,8 +2233,9 @@ static PyObject *WraptFunctionWrapperBase_descr_get(
22302233
return NULL;
22312234
}
22322235

2233-
descriptor = descr_get(wrapped, obj, type);
2234-
2236+
descriptor = PyObject_CallFunctionObjArgs(
2237+
descr_get, wrapped, obj, type, NULL);
2238+
Py_DECREF(descr_get);
22352239
Py_DECREF(wrapped);
22362240

22372241
if (!descriptor)

0 commit comments

Comments
 (0)