1 /* Class object implementation (dead now except for methods) */
4 #include "structmember.h"
6 #define TP_DESCR_GET(t) ((t)->tp_descr_get)
8 /* Free list for method objects to safe malloc/free overhead
9 * The im_self element is used to chain the elements.
11 static PyMethodObject
*free_list
;
12 static int numfree
= 0;
13 #ifndef PyMethod_MAXFREELIST
14 #define PyMethod_MAXFREELIST 256
18 PyMethod_Function(PyObject
*im
)
20 if (!PyMethod_Check(im
)) {
21 PyErr_BadInternalCall();
24 return ((PyMethodObject
*)im
)->im_func
;
28 PyMethod_Self(PyObject
*im
)
30 if (!PyMethod_Check(im
)) {
31 PyErr_BadInternalCall();
34 return ((PyMethodObject
*)im
)->im_self
;
37 /* Method objects are used for bound instance methods returned by
38 instancename.methodname. ClassName.methodname returns an ordinary
43 PyMethod_New(PyObject
*func
, PyObject
*self
)
45 register PyMethodObject
*im
;
46 if (!PyCallable_Check(func
)) {
47 PyErr_BadInternalCall();
51 PyErr_BadInternalCall();
56 free_list
= (PyMethodObject
*)(im
->im_self
);
57 PyObject_INIT(im
, &PyMethod_Type
);
61 im
= PyObject_GC_New(PyMethodObject
, &PyMethod_Type
);
65 im
->im_weakreflist
= NULL
;
70 _PyObject_GC_TRACK(im
);
71 return (PyObject
*)im
;
74 /* Descriptors for PyMethod attributes */
76 /* im_func and im_self are stored in the PyMethod object */
78 #define MO_OFF(x) offsetof(PyMethodObject, x)
80 static PyMemberDef method_memberlist
[] = {
81 {"__func__", T_OBJECT
, MO_OFF(im_func
), READONLY
|RESTRICTED
,
82 "the function (or other callable) implementing a method"},
83 {"__self__", T_OBJECT
, MO_OFF(im_self
), READONLY
|RESTRICTED
,
84 "the instance to which a method is bound"},
88 /* Christian Tismer argued convincingly that method attributes should
89 (nearly) always override function attributes.
90 The one exception is __doc__; there's a default __doc__ which
91 should only be used for the class, not for instances */
94 method_get_doc(PyMethodObject
*im
, void *context
)
96 static PyObject
*docstr
;
98 docstr
= PyUnicode_InternFromString("__doc__");
102 return PyObject_GetAttr(im
->im_func
, docstr
);
105 static PyGetSetDef method_getset
[] = {
106 {"__doc__", (getter
)method_get_doc
, NULL
, NULL
},
111 method_getattro(PyObject
*obj
, PyObject
*name
)
113 PyMethodObject
*im
= (PyMethodObject
*)obj
;
114 PyTypeObject
*tp
= obj
->ob_type
;
115 PyObject
*descr
= NULL
;
118 if (tp
->tp_dict
== NULL
) {
119 if (PyType_Ready(tp
) < 0)
122 descr
= _PyType_Lookup(tp
, name
);
126 descrgetfunc f
= TP_DESCR_GET(descr
->ob_type
);
128 return f(descr
, obj
, (PyObject
*)obj
->ob_type
);
135 return PyObject_GetAttr(im
->im_func
, name
);
138 PyDoc_STRVAR(method_doc
,
139 "method(function, instance)\n\
141 Create a bound instance method object.");
144 method_new(PyTypeObject
* type
, PyObject
* args
, PyObject
*kw
)
149 if (!_PyArg_NoKeywords("method", kw
))
151 if (!PyArg_UnpackTuple(args
, "method", 2, 2,
154 if (!PyCallable_Check(func
)) {
155 PyErr_SetString(PyExc_TypeError
,
156 "first argument must be callable");
159 if (self
== NULL
|| self
== Py_None
) {
160 PyErr_SetString(PyExc_TypeError
,
161 "self must not be None");
165 return PyMethod_New(func
, self
);
169 method_dealloc(register PyMethodObject
*im
)
171 _PyObject_GC_UNTRACK(im
);
172 if (im
->im_weakreflist
!= NULL
)
173 PyObject_ClearWeakRefs((PyObject
*)im
);
174 Py_DECREF(im
->im_func
);
175 Py_XDECREF(im
->im_self
);
176 if (numfree
< PyMethod_MAXFREELIST
) {
177 im
->im_self
= (PyObject
*)free_list
;
187 method_richcompare(PyObject
*self
, PyObject
*other
, int op
)
189 PyMethodObject
*a
, *b
;
193 if ((op
!= Py_EQ
&& op
!= Py_NE
) ||
194 !PyMethod_Check(self
) ||
195 !PyMethod_Check(other
))
197 Py_INCREF(Py_NotImplemented
);
198 return Py_NotImplemented
;
200 a
= (PyMethodObject
*)self
;
201 b
= (PyMethodObject
*)other
;
202 eq
= PyObject_RichCompareBool(a
->im_func
, b
->im_func
, Py_EQ
);
204 if (a
->im_self
== NULL
|| b
->im_self
== NULL
)
205 eq
= a
->im_self
== b
->im_self
;
207 eq
= PyObject_RichCompareBool(a
->im_self
, b
->im_self
,
213 res
= eq
? Py_True
: Py_False
;
215 res
= eq
? Py_False
: Py_True
;
221 method_repr(PyMethodObject
*a
)
223 PyObject
*self
= a
->im_self
;
224 PyObject
*func
= a
->im_func
;
225 PyObject
*klass
= (PyObject
*)Py_TYPE(self
);
226 PyObject
*funcname
= NULL
,*klassname
= NULL
, *result
= NULL
;
230 PyErr_BadInternalCall();
234 funcname
= PyObject_GetAttrString(func
, "__name__");
235 if (funcname
== NULL
) {
236 if (!PyErr_ExceptionMatches(PyExc_AttributeError
))
240 else if (!PyUnicode_Check(funcname
)) {
248 klassname
= PyObject_GetAttrString(klass
, "__name__");
249 if (klassname
== NULL
) {
250 if (!PyErr_ExceptionMatches(PyExc_AttributeError
))
254 else if (!PyUnicode_Check(klassname
)) {
255 Py_DECREF(klassname
);
260 /* XXX Shouldn't use repr()/%R here! */
261 result
= PyUnicode_FromFormat("<bound method %V.%V of %R>",
263 funcname
, defname
, self
);
265 Py_XDECREF(funcname
);
266 Py_XDECREF(klassname
);
271 method_hash(PyMethodObject
*a
)
274 if (a
->im_self
== NULL
)
275 x
= PyObject_Hash(Py_None
);
277 x
= PyObject_Hash(a
->im_self
);
280 y
= PyObject_Hash(a
->im_func
);
290 method_traverse(PyMethodObject
*im
, visitproc visit
, void *arg
)
292 Py_VISIT(im
->im_func
);
293 Py_VISIT(im
->im_self
);
298 method_call(PyObject
*func
, PyObject
*arg
, PyObject
*kw
)
300 PyObject
*self
= PyMethod_GET_SELF(func
);
303 func
= PyMethod_GET_FUNCTION(func
);
305 PyErr_BadInternalCall();
309 Py_ssize_t argcount
= PyTuple_Size(arg
);
310 PyObject
*newarg
= PyTuple_New(argcount
+ 1);
315 PyTuple_SET_ITEM(newarg
, 0, self
);
316 for (i
= 0; i
< argcount
; i
++) {
317 PyObject
*v
= PyTuple_GET_ITEM(arg
, i
);
319 PyTuple_SET_ITEM(newarg
, i
+1, v
);
323 result
= PyObject_Call((PyObject
*)func
, arg
, kw
);
329 method_descr_get(PyObject
*meth
, PyObject
*obj
, PyObject
*cls
)
331 /* Don't rebind an already bound method of a class that's not a base
333 if (PyMethod_GET_SELF(meth
) != NULL
) {
339 return PyMethod_New(PyMethod_GET_FUNCTION(meth
), obj
);
342 PyTypeObject PyMethod_Type
= {
343 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
345 sizeof(PyMethodObject
),
347 (destructor
)method_dealloc
, /* tp_dealloc */
352 (reprfunc
)method_repr
, /* tp_repr */
353 0, /* tp_as_number */
354 0, /* tp_as_sequence */
355 0, /* tp_as_mapping */
356 (hashfunc
)method_hash
, /* tp_hash */
357 method_call
, /* tp_call */
359 method_getattro
, /* tp_getattro */
360 PyObject_GenericSetAttr
, /* tp_setattro */
361 0, /* tp_as_buffer */
362 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
, /* tp_flags */
363 method_doc
, /* tp_doc */
364 (traverseproc
)method_traverse
, /* tp_traverse */
366 method_richcompare
, /* tp_richcompare */
367 offsetof(PyMethodObject
, im_weakreflist
), /* tp_weaklistoffset */
371 method_memberlist
, /* tp_members */
372 method_getset
, /* tp_getset */
375 method_descr_get
, /* tp_descr_get */
376 0, /* tp_descr_set */
377 0, /* tp_dictoffset */
380 method_new
, /* tp_new */
383 /* Clear out the free list */
386 PyMethod_ClearFreeList(void)
388 int freelist_size
= numfree
;
391 PyMethodObject
*im
= free_list
;
392 free_list
= (PyMethodObject
*)(im
->im_self
);
396 assert(numfree
== 0);
397 return freelist_size
;
403 (void)PyMethod_ClearFreeList();
406 /* ------------------------------------------------------------------------
411 PyInstanceMethod_New(PyObject
*func
) {
412 PyInstanceMethodObject
*method
;
413 method
= PyObject_GC_New(PyInstanceMethodObject
,
414 &PyInstanceMethod_Type
);
415 if (method
== NULL
) return NULL
;
418 _PyObject_GC_TRACK(method
);
419 return (PyObject
*)method
;
423 PyInstanceMethod_Function(PyObject
*im
)
425 if (!PyInstanceMethod_Check(im
)) {
426 PyErr_BadInternalCall();
429 return PyInstanceMethod_GET_FUNCTION(im
);
432 #define IMO_OFF(x) offsetof(PyInstanceMethodObject, x)
434 static PyMemberDef instancemethod_memberlist
[] = {
435 {"__func__", T_OBJECT
, IMO_OFF(func
), READONLY
|RESTRICTED
,
436 "the function (or other callable) implementing a method"},
437 {NULL
} /* Sentinel */
441 instancemethod_get_doc(PyObject
*self
, void *context
)
443 static PyObject
*docstr
;
444 if (docstr
== NULL
) {
445 docstr
= PyUnicode_InternFromString("__doc__");
449 return PyObject_GetAttr(PyInstanceMethod_GET_FUNCTION(self
), docstr
);
452 static PyGetSetDef instancemethod_getset
[] = {
453 {"__doc__", (getter
)instancemethod_get_doc
, NULL
, NULL
},
458 instancemethod_getattro(PyObject
*self
, PyObject
*name
)
460 PyTypeObject
*tp
= self
->ob_type
;
461 PyObject
*descr
= NULL
;
463 if (tp
->tp_dict
== NULL
) {
464 if (PyType_Ready(tp
) < 0)
467 descr
= _PyType_Lookup(tp
, name
);
470 descrgetfunc f
= TP_DESCR_GET(descr
->ob_type
);
472 return f(descr
, self
, (PyObject
*)self
->ob_type
);
479 return PyObject_GetAttr(PyInstanceMethod_GET_FUNCTION(self
), name
);
483 instancemethod_dealloc(PyObject
*self
) {
484 _PyObject_GC_UNTRACK(self
);
485 Py_DECREF(PyInstanceMethod_GET_FUNCTION(self
));
486 PyObject_GC_Del(self
);
490 instancemethod_traverse(PyObject
*self
, visitproc visit
, void *arg
) {
491 Py_VISIT(PyInstanceMethod_GET_FUNCTION(self
));
496 instancemethod_call(PyObject
*self
, PyObject
*arg
, PyObject
*kw
)
498 return PyObject_Call(PyMethod_GET_FUNCTION(self
), arg
, kw
);
502 instancemethod_descr_get(PyObject
*descr
, PyObject
*obj
, PyObject
*type
) {
503 register PyObject
*func
= PyInstanceMethod_GET_FUNCTION(descr
);
509 return PyMethod_New(func
, obj
);
513 instancemethod_richcompare(PyObject
*self
, PyObject
*other
, int op
)
515 PyInstanceMethodObject
*a
, *b
;
519 if ((op
!= Py_EQ
&& op
!= Py_NE
) ||
520 !PyInstanceMethod_Check(self
) ||
521 !PyInstanceMethod_Check(other
))
523 Py_INCREF(Py_NotImplemented
);
524 return Py_NotImplemented
;
526 a
= (PyInstanceMethodObject
*)self
;
527 b
= (PyInstanceMethodObject
*)other
;
528 eq
= PyObject_RichCompareBool(a
->func
, b
->func
, Py_EQ
);
532 res
= eq
? Py_True
: Py_False
;
534 res
= eq
? Py_False
: Py_True
;
540 instancemethod_repr(PyObject
*self
)
542 PyObject
*func
= PyInstanceMethod_Function(self
);
543 PyObject
*funcname
= NULL
, *result
= NULL
;
547 PyErr_BadInternalCall();
551 funcname
= PyObject_GetAttrString(func
, "__name__");
552 if (funcname
== NULL
) {
553 if (!PyErr_ExceptionMatches(PyExc_AttributeError
))
557 else if (!PyUnicode_Check(funcname
)) {
562 result
= PyUnicode_FromFormat("<instancemethod %V at %p>",
563 funcname
, defname
, self
);
565 Py_XDECREF(funcname
);
571 instancemethod_hash(PyObject *self)
575 y = PyObject_Hash(PyInstanceMethod_GET_FUNCTION(self));
585 PyDoc_STRVAR(instancemethod_doc
,
586 "instancemethod(function)\n\
588 Bind a function to a class.");
591 instancemethod_new(PyTypeObject
* type
, PyObject
* args
, PyObject
*kw
)
595 if (!_PyArg_NoKeywords("instancemethod", kw
))
597 if (!PyArg_UnpackTuple(args
, "instancemethod", 1, 1, &func
))
599 if (!PyCallable_Check(func
)) {
600 PyErr_SetString(PyExc_TypeError
,
601 "first argument must be callable");
605 return PyInstanceMethod_New(func
);
608 PyTypeObject PyInstanceMethod_Type
= {
609 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
610 "instancemethod", /* tp_name */
611 sizeof(PyInstanceMethodObject
), /* tp_basicsize */
613 instancemethod_dealloc
, /* tp_dealloc */
618 (reprfunc
)instancemethod_repr
, /* tp_repr */
619 0, /* tp_as_number */
620 0, /* tp_as_sequence */
621 0, /* tp_as_mapping */
622 0, /*(hashfunc)instancemethod_hash, tp_hash */
623 instancemethod_call
, /* tp_call */
625 instancemethod_getattro
, /* tp_getattro */
626 PyObject_GenericSetAttr
, /* tp_setattro */
627 0, /* tp_as_buffer */
629 | Py_TPFLAGS_HAVE_GC
, /* tp_flags */
630 instancemethod_doc
, /* tp_doc */
631 instancemethod_traverse
, /* tp_traverse */
633 instancemethod_richcompare
, /* tp_richcompare */
634 0, /* tp_weaklistoffset */
638 instancemethod_memberlist
, /* tp_members */
639 instancemethod_getset
, /* tp_getset */
642 instancemethod_descr_get
, /* tp_descr_get */
643 0, /* tp_descr_set */
644 0, /* tp_dictoffset */
647 instancemethod_new
, /* tp_new */