annotate Objects/classobject.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 992ef855b3ed
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
39536
8f5b9982beba Completely get rid of PyClass and PyInstance.
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
1 /* Class object implementation (dead now except for methods) */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5008
diff changeset
3 #include "Python.h"
944
222f04f55083 Changes so that user-defined classes can implement operations invoked
Guido van Rossum <guido@python.org>
parents: 791
diff changeset
4 #include "structmember.h"
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
39222
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38673
diff changeset
6 #define TP_DESCR_GET(t) ((t)->tp_descr_get)
20501
733cb268ad2f Protect references to tp_descr_get and tp_dict with the appropriate test:
Guido van Rossum <guido@python.org>
parents: 20183
diff changeset
7
45192
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
8 /* Free list for method objects to safe malloc/free overhead
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
9 * The im_self element is used to chain the elements.
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
10 */
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
11 static PyMethodObject *free_list;
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
12 static int numfree = 0;
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
13 #ifndef PyMethod_MAXFREELIST
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
14 #define PyMethod_MAXFREELIST 256
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
15 #endif
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
16
72925
7109f31300fb Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents: 72848
diff changeset
17 _Py_IDENTIFIER(__name__);
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
18
19751
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
19 PyObject *
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
20 PyMethod_Function(PyObject *im)
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
21 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
22 if (!PyMethod_Check(im)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
23 PyErr_BadInternalCall();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
24 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
25 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
26 return ((PyMethodObject *)im)->im_func;
19751
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
27 }
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
28
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
29 PyObject *
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
30 PyMethod_Self(PyObject *im)
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
31 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
32 if (!PyMethod_Check(im)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
33 PyErr_BadInternalCall();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
34 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
35 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
36 return ((PyMethodObject *)im)->im_self;
19751
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
37 }
3d76dfc34c57 Add PyMethod_Function(), PyMethod_Self(), PyMethod_Class() back.
Guido van Rossum <guido@python.org>
parents: 19581
diff changeset
38
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
39 /* Method objects are used for bound instance methods returned by
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
40 instancename.methodname. ClassName.methodname returns an ordinary
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
41 function.
1289
4d292c7857d4 Access checks now work, at least for instance data (not for methods
Guido van Rossum <guido@python.org>
parents: 1288
diff changeset
42 */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5008
diff changeset
44 PyObject *
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
45 PyMethod_New(PyObject *func, PyObject *self)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 {
85157
e7f6cef7a4cc Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents: 78935
diff changeset
47 PyMethodObject *im;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
48 if (self == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
49 PyErr_BadInternalCall();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
50 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
51 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
52 im = free_list;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
53 if (im != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
54 free_list = (PyMethodObject *)(im->im_self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
55 PyObject_INIT(im, &PyMethod_Type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
56 numfree--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
57 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
58 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
59 im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
60 if (im == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
61 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
62 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
63 im->im_weakreflist = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
64 Py_INCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
65 im->im_func = func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
66 Py_XINCREF(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
67 im->im_self = self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
68 _PyObject_GC_TRACK(im);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
69 return (PyObject *)im;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
72 static PyObject *
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
73 method_reduce(PyMethodObject *im)
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
74 {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
75 PyObject *self = PyMethod_GET_SELF(im);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
76 PyObject *func = PyMethod_GET_FUNCTION(im);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
77 PyObject *builtins;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
78 PyObject *getattr;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
79 PyObject *funcname;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
80 _Py_IDENTIFIER(getattr);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
81
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
82 funcname = _PyObject_GetAttrId(func, &PyId___name__);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
83 if (funcname == NULL) {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
84 return NULL;
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
85 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
86 builtins = PyEval_GetBuiltins();
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
87 getattr = _PyDict_GetItemId(builtins, &PyId_getattr);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
88 return Py_BuildValue("O(ON)", getattr, self, funcname);
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
89 }
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
90
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
91 static PyMethodDef method_methods[] = {
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
92 {"__reduce__", (PyCFunction)method_reduce, METH_NOARGS, NULL},
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
93 {NULL, NULL}
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
94 };
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
95
19956
33669c8914b4 Redo the PyMethod attributes using a dir()-friendly approach, creating
Guido van Rossum <guido@python.org>
parents: 19808
diff changeset
96 /* Descriptors for PyMethod attributes */
33669c8914b4 Redo the PyMethod attributes using a dir()-friendly approach, creating
Guido van Rossum <guido@python.org>
parents: 19808
diff changeset
97
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
98 /* im_func and im_self are stored in the PyMethod object */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
100 #define MO_OFF(x) offsetof(PyMethodObject, x)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
101
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
102 static PyMemberDef method_memberlist[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
103 {"__func__", T_OBJECT, MO_OFF(im_func), READONLY|RESTRICTED,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
104 "the function (or other callable) implementing a method"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
105 {"__self__", T_OBJECT, MO_OFF(im_self), READONLY|RESTRICTED,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
106 "the instance to which a method is bound"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
107 {NULL} /* Sentinel */
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
108 };
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
109
31003
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
110 /* Christian Tismer argued convincingly that method attributes should
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
111 (nearly) always override function attributes.
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
112 The one exception is __doc__; there's a default __doc__ which
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
113 should only be used for the class, not for instances */
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
114
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
115 static PyObject *
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
116 method_get_doc(PyMethodObject *im, void *context)
31003
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
117 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
118 static PyObject *docstr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
119 if (docstr == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
120 docstr= PyUnicode_InternFromString("__doc__");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
121 if (docstr == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
122 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
123 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
124 return PyObject_GetAttr(im->im_func, docstr);
31003
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
125 }
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
126
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
127 static PyGetSetDef method_getset[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
128 {"__doc__", (getter)method_get_doc, NULL, NULL},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
129 {0}
31003
278976b19dcc - When method objects have an attribute that can be satisfied either
Guido van Rossum <guido@python.org>
parents: 30801
diff changeset
130 };
15894
1c6b0d3a58ea Committing PEP 232, function attribute feature, approved by Guido.
Barry Warsaw <barry@python.org>
parents: 15722
diff changeset
131
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5008
diff changeset
132 static PyObject *
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
133 method_getattro(PyObject *obj, PyObject *name)
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
134 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
135 PyMethodObject *im = (PyMethodObject *)obj;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
136 PyTypeObject *tp = obj->ob_type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
137 PyObject *descr = NULL;
19956
33669c8914b4 Redo the PyMethod attributes using a dir()-friendly approach, creating
Guido van Rossum <guido@python.org>
parents: 19808
diff changeset
138
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
139 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
140 if (tp->tp_dict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
141 if (PyType_Ready(tp) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
142 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
143 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
144 descr = _PyType_Lookup(tp, name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
145 }
19956
33669c8914b4 Redo the PyMethod attributes using a dir()-friendly approach, creating
Guido van Rossum <guido@python.org>
parents: 19808
diff changeset
146
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
147 if (descr != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
148 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
149 if (f != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
150 return f(descr, obj, (PyObject *)obj->ob_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
151 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
152 Py_INCREF(descr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
153 return descr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
154 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
155 }
19956
33669c8914b4 Redo the PyMethod attributes using a dir()-friendly approach, creating
Guido van Rossum <guido@python.org>
parents: 19808
diff changeset
156
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
157 return PyObject_GetAttr(im->im_func, name);
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
158 }
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
159
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
160 PyDoc_STRVAR(method_doc,
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
161 "method(function, instance)\n\
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23842
diff changeset
162 \n\
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
163 Create a bound instance method object.");
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23842
diff changeset
164
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23842
diff changeset
165 static PyObject *
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
166 method_new(PyTypeObject* type, PyObject* args, PyObject *kw)
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23842
diff changeset
167 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
168 PyObject *func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
169 PyObject *self;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23842
diff changeset
170
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
171 if (!_PyArg_NoKeywords("method", kw))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
172 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
173 if (!PyArg_UnpackTuple(args, "method", 2, 2,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
174 &func, &self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
175 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
176 if (!PyCallable_Check(func)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
177 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
178 "first argument must be callable");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
179 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
180 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
181 if (self == NULL || self == Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
182 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
183 "self must not be None");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
184 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
185 }
34850
aef713de7a23 Backport:
Michael W. Hudson <mwh@python.net>
parents: 33541
diff changeset
186
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
187 return PyMethod_New(func, self);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23842
diff changeset
188 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23842
diff changeset
189
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 static void
85157
e7f6cef7a4cc Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents: 78935
diff changeset
191 method_dealloc(PyMethodObject *im)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
193 _PyObject_GC_UNTRACK(im);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
194 if (im->im_weakreflist != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
195 PyObject_ClearWeakRefs((PyObject *)im);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
196 Py_DECREF(im->im_func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
197 Py_XDECREF(im->im_self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
198 if (numfree < PyMethod_MAXFREELIST) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
199 im->im_self = (PyObject *)free_list;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
200 free_list = im;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
201 numfree++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
202 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
203 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
204 PyObject_GC_Del(im);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
205 }
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
208 static PyObject *
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
209 method_richcompare(PyObject *self, PyObject *other, int op)
1021
0d7c82366704 Compare instance methods by comparing the object and the function.
Guido van Rossum <guido@python.org>
parents: 956
diff changeset
210 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
211 PyMethodObject *a, *b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
212 PyObject *res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
213 int eq;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38669
diff changeset
214
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
215 if ((op != Py_EQ && op != Py_NE) ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
216 !PyMethod_Check(self) ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
217 !PyMethod_Check(other))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
218 {
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 65494
diff changeset
219 Py_RETURN_NOTIMPLEMENTED;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
220 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
221 a = (PyMethodObject *)self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
222 b = (PyMethodObject *)other;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
223 eq = PyObject_RichCompareBool(a->im_func, b->im_func, Py_EQ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
224 if (eq == 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
225 if (a->im_self == NULL || b->im_self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
226 eq = a->im_self == b->im_self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
227 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
228 eq = PyObject_RichCompareBool(a->im_self, b->im_self,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
229 Py_EQ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
230 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
231 if (eq < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
232 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
233 if (op == Py_EQ)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
234 res = eq ? Py_True : Py_False;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
235 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
236 res = eq ? Py_False : Py_True;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
237 Py_INCREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
238 return res;
1021
0d7c82366704 Compare instance methods by comparing the object and the function.
Guido van Rossum <guido@python.org>
parents: 956
diff changeset
239 }
0d7c82366704 Compare instance methods by comparing the object and the function.
Guido van Rossum <guido@python.org>
parents: 956
diff changeset
240
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5008
diff changeset
241 static PyObject *
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
242 method_repr(PyMethodObject *a)
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1272
diff changeset
243 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
244 PyObject *self = a->im_self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
245 PyObject *func = a->im_func;
78934
dcddbd41f08b Py_TYPE() has already dereferenced self before the NULL check. Moved Py_TYPE() after the check for self == NULL
Christian Heimes <christian@cheimes.de>
parents: 78191
diff changeset
246 PyObject *klass;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
247 PyObject *funcname = NULL ,*klassname = NULL, *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
248 char *defname = "?";
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17894
diff changeset
249
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
250 if (self == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
251 PyErr_BadInternalCall();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
252 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
253 }
78934
dcddbd41f08b Py_TYPE() has already dereferenced self before the NULL check. Moved Py_TYPE() after the check for self == NULL
Christian Heimes <christian@cheimes.de>
parents: 78191
diff changeset
254 klass = (PyObject*)Py_TYPE(self);
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
255
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
256 funcname = _PyObject_GetAttrId(func, &PyId___name__);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
257 if (funcname == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
258 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
259 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
260 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
261 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
262 else if (!PyUnicode_Check(funcname)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
263 Py_DECREF(funcname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
264 funcname = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
265 }
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
266
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
267 if (klass == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
268 klassname = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
269 else {
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
270 klassname = _PyObject_GetAttrId(klass, &PyId___name__);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
271 if (klassname == NULL) {
78191
4b724884c81f Issue #15404: Refleak in PyMethodObject repr.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 65494
diff changeset
272 if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
4b724884c81f Issue #15404: Refleak in PyMethodObject repr.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 65494
diff changeset
273 Py_XDECREF(funcname);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
274 return NULL;
78191
4b724884c81f Issue #15404: Refleak in PyMethodObject repr.
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 65494
diff changeset
275 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
276 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
277 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
278 else if (!PyUnicode_Check(klassname)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
279 Py_DECREF(klassname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
280 klassname = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
281 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
282 }
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
283
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
284 /* XXX Shouldn't use repr()/%R here! */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
285 result = PyUnicode_FromFormat("<bound method %V.%V of %R>",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
286 klassname, defname,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
287 funcname, defname, self);
44026
48af6375207e Removed the API to create unbound methods and simplified the API for bound methods. The signature is PyMethod_New(func, instance).
Christian Heimes <christian@cheimes.de>
parents: 42334
diff changeset
288
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
289 Py_XDECREF(funcname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
290 Py_XDECREF(klassname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
291 return result;
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1272
diff changeset
292 }
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1272
diff changeset
293
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
294 static Py_hash_t
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
295 method_hash(PyMethodObject *a)
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
296 {
65494
e8969fb822fc make hashes always the size of pointers; introduce Py_hash_t #9778
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
297 Py_hash_t x, y;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
298 if (a->im_self == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
299 x = PyObject_Hash(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
300 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
301 x = PyObject_Hash(a->im_self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
302 if (x == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
303 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
304 y = PyObject_Hash(a->im_func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
305 if (y == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
306 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
307 x = x ^ y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
308 if (x == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
309 x = -2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
310 return x;
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
311 }
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1252
diff changeset
312
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
313 static int
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
314 method_traverse(PyMethodObject *im, visitproc visit, void *arg)
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
315 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
316 Py_VISIT(im->im_func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
317 Py_VISIT(im->im_self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
318 return 0;
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
319 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
320
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17894
diff changeset
321 static PyObject *
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
322 method_call(PyObject *func, PyObject *arg, PyObject *kw)
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17894
diff changeset
323 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
324 PyObject *self = PyMethod_GET_SELF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
325 PyObject *result;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17894
diff changeset
326
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
327 func = PyMethod_GET_FUNCTION(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
328 if (self == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
329 PyErr_BadInternalCall();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
330 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
331 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
332 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
333 Py_ssize_t argcount = PyTuple_Size(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
334 PyObject *newarg = PyTuple_New(argcount + 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
335 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
336 if (newarg == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
337 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
338 Py_INCREF(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
339 PyTuple_SET_ITEM(newarg, 0, self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
340 for (i = 0; i < argcount; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
341 PyObject *v = PyTuple_GET_ITEM(arg, i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
342 Py_XINCREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
343 PyTuple_SET_ITEM(newarg, i+1, v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
344 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
345 arg = newarg;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
346 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
347 result = PyObject_Call((PyObject *)func, arg, kw);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
348 Py_DECREF(arg);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
349 return result;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17894
diff changeset
350 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17894
diff changeset
351
19280
f10b68eceefc PyMethod_Type: add a tp_descr_get slot function to ensure proper
Guido van Rossum <guido@python.org>
parents: 19051
diff changeset
352 static PyObject *
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39536
diff changeset
353 method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
19280
f10b68eceefc PyMethod_Type: add a tp_descr_get slot function to ensure proper
Guido van Rossum <guido@python.org>
parents: 19051
diff changeset
354 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
355 /* Don't rebind an already bound method of a class that's not a base
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
356 class of cls. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
357 if (PyMethod_GET_SELF(meth) != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
358 /* Already bound */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
359 Py_INCREF(meth);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
360 return meth;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
361 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
362 /* Bind it to obj */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
363 return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj);
19280
f10b68eceefc PyMethod_Type: add a tp_descr_get slot function to ensure proper
Guido van Rossum <guido@python.org>
parents: 19051
diff changeset
364 }
f10b68eceefc PyMethod_Type: add a tp_descr_get slot function to ensure proper
Guido van Rossum <guido@python.org>
parents: 19051
diff changeset
365
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5008
diff changeset
366 PyTypeObject PyMethod_Type = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
367 PyVarObject_HEAD_INIT(&PyType_Type, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
368 "method",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
369 sizeof(PyMethodObject),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
370 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
371 (destructor)method_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
372 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
373 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
374 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
375 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
376 (reprfunc)method_repr, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
377 0, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
378 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
379 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
380 (hashfunc)method_hash, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
381 method_call, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
382 0, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
383 method_getattro, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
384 PyObject_GenericSetAttr, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
385 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
386 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
387 method_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
388 (traverseproc)method_traverse, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
389 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
390 method_richcompare, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
391 offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
392 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
393 0, /* tp_iternext */
87438
992ef855b3ed Issue #17810: Implement PEP 3154, pickle protocol 4.
Antoine Pitrou <solipsis@pitrou.net>
parents: 85157
diff changeset
394 method_methods, /* tp_methods */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
395 method_memberlist, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
396 method_getset, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
397 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
398 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
399 method_descr_get, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
400 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
401 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
402 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
403 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
404 method_new, /* tp_new */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 };
5932
40cfc905c776 Added separate free list for instance method objects, for a few
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
406
40cfc905c776 Added separate free list for instance method objects, for a few
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
407 /* Clear out the free list */
40cfc905c776 Added separate free list for instance method objects, for a few
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
408
45371
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
409 int
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
410 PyMethod_ClearFreeList(void)
5932
40cfc905c776 Added separate free list for instance method objects, for a few
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
411 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
412 int freelist_size = numfree;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
413
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
414 while (free_list) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
415 PyMethodObject *im = free_list;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
416 free_list = (PyMethodObject *)(im->im_self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
417 PyObject_GC_Del(im);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
418 numfree--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
419 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
420 assert(numfree == 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
421 return freelist_size;
45371
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
422 }
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
423
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
424 void
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
425 PyMethod_Fini(void)
7c4c46342137 Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617,60619-60621,60623-60625,60627-60629,60631,60633,60635,60647,60650,60652,60654,60656,60658-60659,60664-60666,60668-60670,60672,60676,60678,60680-60683,60685-60686,60688,60690,60692-60694,60697-60700,60705-60706,60708,60711,60714,60720,60724-60730,60732,60736,60742,60744,60746,60748,60750-60751,60753,60756-60757,60759-60761,60763-60764,60766,60769-60770,60774-60784,60787-60845 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
426 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
427 (void)PyMethod_ClearFreeList();
5932
40cfc905c776 Added separate free list for instance method objects, for a few
Guido van Rossum <guido@python.org>
parents: 5610
diff changeset
428 }
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
429
77577
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
430 /* Print summary info about the state of the optimized allocator */
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
431 void
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
432 _PyMethod_DebugMallocStats(FILE *out)
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
433 {
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
434 _PyDebugAllocatorStats(out,
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
435 "free PyMethodObject",
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
436 numfree, sizeof(PyMethodObject));
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
437 }
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 72925
diff changeset
438
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
439 /* ------------------------------------------------------------------------
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
440 * instance method
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
441 */
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
442
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
443 PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
444 PyInstanceMethod_New(PyObject *func) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
445 PyInstanceMethodObject *method;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
446 method = PyObject_GC_New(PyInstanceMethodObject,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
447 &PyInstanceMethod_Type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
448 if (method == NULL) return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
449 Py_INCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
450 method->func = func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
451 _PyObject_GC_TRACK(method);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
452 return (PyObject *)method;
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
453 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
454
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
455 PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
456 PyInstanceMethod_Function(PyObject *im)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
457 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
458 if (!PyInstanceMethod_Check(im)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
459 PyErr_BadInternalCall();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
460 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
461 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
462 return PyInstanceMethod_GET_FUNCTION(im);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
463 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
464
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
465 #define IMO_OFF(x) offsetof(PyInstanceMethodObject, x)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
466
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
467 static PyMemberDef instancemethod_memberlist[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
468 {"__func__", T_OBJECT, IMO_OFF(func), READONLY|RESTRICTED,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
469 "the function (or other callable) implementing a method"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
470 {NULL} /* Sentinel */
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
471 };
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
472
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
473 static PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
474 instancemethod_get_doc(PyObject *self, void *context)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
475 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
476 static PyObject *docstr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
477 if (docstr == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
478 docstr = PyUnicode_InternFromString("__doc__");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
479 if (docstr == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
480 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
481 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
482 return PyObject_GetAttr(PyInstanceMethod_GET_FUNCTION(self), docstr);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
483 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
484
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
485 static PyGetSetDef instancemethod_getset[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
486 {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
487 {0}
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
488 };
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
489
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
490 static PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
491 instancemethod_getattro(PyObject *self, PyObject *name)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
492 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
493 PyTypeObject *tp = self->ob_type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
494 PyObject *descr = NULL;
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
495
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
496 if (tp->tp_dict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
497 if (PyType_Ready(tp) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
498 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
499 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
500 descr = _PyType_Lookup(tp, name);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
501
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
502 if (descr != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
503 descrgetfunc f = TP_DESCR_GET(descr->ob_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
504 if (f != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
505 return f(descr, self, (PyObject *)self->ob_type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
506 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
507 Py_INCREF(descr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
508 return descr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
509 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
510 }
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
511
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
512 return PyObject_GetAttr(PyInstanceMethod_GET_FUNCTION(self), name);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
513 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
514
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
515 static void
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
516 instancemethod_dealloc(PyObject *self) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
517 _PyObject_GC_UNTRACK(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
518 Py_DECREF(PyInstanceMethod_GET_FUNCTION(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
519 PyObject_GC_Del(self);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
520 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
521
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
522 static int
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
523 instancemethod_traverse(PyObject *self, visitproc visit, void *arg) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
524 Py_VISIT(PyInstanceMethod_GET_FUNCTION(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
525 return 0;
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
526 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
527
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
528 static PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
529 instancemethod_call(PyObject *self, PyObject *arg, PyObject *kw)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
530 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
531 return PyObject_Call(PyMethod_GET_FUNCTION(self), arg, kw);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
532 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
533
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
534 static PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
535 instancemethod_descr_get(PyObject *descr, PyObject *obj, PyObject *type) {
85157
e7f6cef7a4cc Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents: 78935
diff changeset
536 PyObject *func = PyInstanceMethod_GET_FUNCTION(descr);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
537 if (obj == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
538 Py_INCREF(func);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
539 return func;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
540 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
541 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
542 return PyMethod_New(func, obj);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
543 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
544
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
545 static PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
546 instancemethod_richcompare(PyObject *self, PyObject *other, int op)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
547 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
548 PyInstanceMethodObject *a, *b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
549 PyObject *res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
550 int eq;
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
551
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
552 if ((op != Py_EQ && op != Py_NE) ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
553 !PyInstanceMethod_Check(self) ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
554 !PyInstanceMethod_Check(other))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
555 {
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 65494
diff changeset
556 Py_RETURN_NOTIMPLEMENTED;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
557 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
558 a = (PyInstanceMethodObject *)self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
559 b = (PyInstanceMethodObject *)other;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
560 eq = PyObject_RichCompareBool(a->func, b->func, Py_EQ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
561 if (eq < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
562 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
563 if (op == Py_EQ)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
564 res = eq ? Py_True : Py_False;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
565 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
566 res = eq ? Py_False : Py_True;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
567 Py_INCREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
568 return res;
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
569 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
570
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
571 static PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
572 instancemethod_repr(PyObject *self)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
573 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
574 PyObject *func = PyInstanceMethod_Function(self);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
575 PyObject *funcname = NULL , *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
576 char *defname = "?";
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
577
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
578 if (func == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
579 PyErr_BadInternalCall();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
580 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
581 }
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
582
72848
81380082d216 Use identifier API for PyObject_GetAttrString.
Martin v. Löwis <martin@v.loewis.de>
parents: 71810
diff changeset
583 funcname = _PyObject_GetAttrId(func, &PyId___name__);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
584 if (funcname == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
585 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
586 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
587 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
588 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
589 else if (!PyUnicode_Check(funcname)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
590 Py_DECREF(funcname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
591 funcname = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
592 }
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
593
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
594 result = PyUnicode_FromFormat("<instancemethod %V at %p>",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
595 funcname, defname, self);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
596
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
597 Py_XDECREF(funcname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
598 return result;
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
599 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
600
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
601 /*
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
602 static long
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
603 instancemethod_hash(PyObject *self)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
604 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
605 long x, y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
606 x = (long)self;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
607 y = PyObject_Hash(PyInstanceMethod_GET_FUNCTION(self));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
608 if (y == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
609 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
610 x = x ^ y;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
611 if (x == -1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
612 x = -2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
613 return x;
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
614 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
615 */
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
616
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
617 PyDoc_STRVAR(instancemethod_doc,
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
618 "instancemethod(function)\n\
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
619 \n\
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
620 Bind a function to a class.");
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
621
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
622 static PyObject *
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
623 instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
624 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
625 PyObject *func;
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
626
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
627 if (!_PyArg_NoKeywords("instancemethod", kw))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
628 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
629 if (!PyArg_UnpackTuple(args, "instancemethod", 1, 1, &func))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
630 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
631 if (!PyCallable_Check(func)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
632 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
633 "first argument must be callable");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
634 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
635 }
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
636
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
637 return PyInstanceMethod_New(func);
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
638 }
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
639
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
640 PyTypeObject PyInstanceMethod_Type = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
641 PyVarObject_HEAD_INIT(&PyType_Type, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
642 "instancemethod", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
643 sizeof(PyInstanceMethodObject), /* tp_basicsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
644 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
645 instancemethod_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
646 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
647 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
648 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
649 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
650 (reprfunc)instancemethod_repr, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
651 0, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
652 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
653 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
654 0, /*(hashfunc)instancemethod_hash, tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
655 instancemethod_call, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
656 0, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
657 instancemethod_getattro, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
658 PyObject_GenericSetAttr, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
659 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
660 Py_TPFLAGS_DEFAULT
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
661 | Py_TPFLAGS_HAVE_GC, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
662 instancemethod_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
663 instancemethod_traverse, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
664 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
665 instancemethod_richcompare, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
666 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
667 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
668 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
669 0, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
670 instancemethod_memberlist, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
671 instancemethod_getset, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
672 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
673 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
674 instancemethod_descr_get, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
675 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
676 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
677 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
678 0, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55913
diff changeset
679 instancemethod_new, /* tp_new */
44272
3e0867a07765 Issue #1587: Added instancemethod wrapper for PyCFunctions. The Python C API
Christian Heimes <christian@cheimes.de>
parents: 44233
diff changeset
680 };