blob: 8b67a87e79abf376a9ecd86a8e5a4781f72c3bda [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Method object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036#include "token.h"
37
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000038static PyCFunctionObject *free_list = NULL;
39
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040PyObject *
41PyCFunction_New(ml, self)
42 PyMethodDef *ml;
43 PyObject *self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044{
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000045 PyCFunctionObject *op;
46 op = free_list;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047 if (op != NULL) {
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000048 free_list = (PyCFunctionObject *)(op->m_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +000049 PyObject_INIT(op, &PyCFunction_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 }
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000051 else {
52 op = PyObject_NEW(PyCFunctionObject, &PyCFunction_Type);
53 if (op == NULL)
54 return NULL;
55 }
56 op->m_ml = ml;
57 Py_XINCREF(self);
58 op->m_self = self;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000059 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060}
61
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062PyCFunction
63PyCFunction_GetFunction(op)
64 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 if (!PyCFunction_Check(op)) {
67 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068 return NULL;
69 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070 return ((PyCFunctionObject *)op) -> m_ml -> ml_meth;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000071}
72
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073PyObject *
74PyCFunction_GetSelf(op)
75 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000077 if (!PyCFunction_Check(op)) {
78 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000079 return NULL;
80 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 return ((PyCFunctionObject *)op) -> m_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082}
83
Guido van Rossumc0602291991-12-16 13:07:24 +000084int
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085PyCFunction_GetFlags(op)
86 PyObject *op;
Guido van Rossumc0602291991-12-16 13:07:24 +000087{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 if (!PyCFunction_Check(op)) {
89 PyErr_BadInternalCall();
Guido van Rossumc0602291991-12-16 13:07:24 +000090 return -1;
91 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 return ((PyCFunctionObject *)op) -> m_ml -> ml_flags;
Guido van Rossumc0602291991-12-16 13:07:24 +000093}
94
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095/* Methods (the standard built-in methods, that is) */
96
97static void
98meth_dealloc(m)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 PyCFunctionObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 Py_XDECREF(m->m_self);
Guido van Rossum1f39c5c1997-08-05 02:11:41 +0000102 m->m_self = (PyObject *)free_list;
103 free_list = m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104}
105
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106static PyObject *
Guido van Rossumcab650d1995-01-07 12:34:58 +0000107meth_getattr(m, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 PyCFunctionObject *m;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000109 char *name;
110{
111 if (strcmp(name, "__name__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 return PyString_FromString(m->m_ml->ml_name);
Guido van Rossumcab650d1995-01-07 12:34:58 +0000113 }
114 if (strcmp(name, "__doc__") == 0) {
115 char *doc = m->m_ml->ml_doc;
116 if (doc != NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 return PyString_FromString(doc);
118 Py_INCREF(Py_None);
119 return Py_None;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000120 }
121 if (strcmp(name, "__self__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 PyObject *self;
123 if (PyEval_GetRestricted()) {
124 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum10393b11995-01-10 10:39:49 +0000125 "method.__self__ not accessible in restricted mode");
126 return NULL;
127 }
128 self = m->m_self;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000129 if (self == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 self = Py_None;
131 Py_INCREF(self);
Guido van Rossumcab650d1995-01-07 12:34:58 +0000132 return self;
133 }
134 if (strcmp(name, "__members__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 return Py_BuildValue("[sss]",
136 "__doc__", "__name__", "__self__");
Guido van Rossumcab650d1995-01-07 12:34:58 +0000137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 PyErr_SetString(PyExc_AttributeError, name);
Guido van Rossumcab650d1995-01-07 12:34:58 +0000139 return NULL;
140}
141
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143meth_repr(m)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 PyCFunctionObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145{
146 char buf[200];
147 if (m->m_self == NULL)
Guido van Rossumcab650d1995-01-07 12:34:58 +0000148 sprintf(buf, "<built-in function %.80s>", m->m_ml->ml_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149 else
Guido van Rossum3f5da241990-12-20 15:06:42 +0000150 sprintf(buf,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000151 "<built-in method %.80s of %.80s object at %lx>",
Guido van Rossumcab650d1995-01-07 12:34:58 +0000152 m->m_ml->ml_name, m->m_self->ob_type->tp_name,
Guido van Rossum9bfef441993-03-29 10:43:31 +0000153 (long)m->m_self);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155}
156
Guido van Rossum9bfef441993-03-29 10:43:31 +0000157static int
158meth_compare(a, b)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 PyCFunctionObject *a, *b;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000160{
161 if (a->m_self != b->m_self)
Guido van Rossum13fdf5e1998-12-04 18:52:55 +0000162 return (a->m_self < b->m_self) ? -1 : 1;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000163 if (a->m_ml->ml_meth == b->m_ml->ml_meth)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000164 return 0;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000165 if (strcmp(a->m_ml->ml_name, b->m_ml->ml_name) < 0)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000166 return -1;
167 else
168 return 1;
169}
170
171static long
172meth_hash(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 PyCFunctionObject *a;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000174{
Guido van Rossumd7047b31995-01-02 19:07:15 +0000175 long x;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000176 if (a->m_self == NULL)
177 x = 0;
178 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 x = PyObject_Hash(a->m_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000180 if (x == -1)
181 return -1;
182 }
Guido van Rossumcab650d1995-01-07 12:34:58 +0000183 return x ^ (long) a->m_ml->ml_meth;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000184}
185
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186PyTypeObject PyCFunction_Type = {
187 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188 0,
Guido van Rossum7066dd71992-09-17 17:54:56 +0000189 "builtin_function_or_method",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 sizeof(PyCFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000192 (destructor)meth_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000193 0, /*tp_print*/
Guido van Rossumcab650d1995-01-07 12:34:58 +0000194 (getattrfunc)meth_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000196 (cmpfunc)meth_compare, /*tp_compare*/
197 (reprfunc)meth_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198 0, /*tp_as_number*/
199 0, /*tp_as_sequence*/
200 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000201 (hashfunc)meth_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202};
Guido van Rossum3f5da241990-12-20 15:06:42 +0000203
Guido van Rossum69785031995-01-26 22:58:48 +0000204/* List all methods in a chain -- helper for findmethodinchain */
Guido van Rossume9c430f1991-10-20 20:21:15 +0000205
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206static PyObject *
Guido van Rossum69785031995-01-26 22:58:48 +0000207listmethodchain(chain)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 PyMethodChain *chain;
Guido van Rossume9c430f1991-10-20 20:21:15 +0000209{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 PyMethodChain *c;
211 PyMethodDef *ml;
Guido van Rossume9c430f1991-10-20 20:21:15 +0000212 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 PyObject *v;
Guido van Rossum69785031995-01-26 22:58:48 +0000214
215 n = 0;
216 for (c = chain; c != NULL; c = c->link) {
217 for (ml = c->methods; ml->ml_name != NULL; ml++)
218 n++;
219 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 v = PyList_New(n);
Guido van Rossum69785031995-01-26 22:58:48 +0000221 if (v == NULL)
222 return NULL;
223 i = 0;
224 for (c = chain; c != NULL; c = c->link) {
225 for (ml = c->methods; ml->ml_name != NULL; ml++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyList_SetItem(v, i, PyString_FromString(ml->ml_name));
Guido van Rossum69785031995-01-26 22:58:48 +0000227 i++;
Guido van Rossume9c430f1991-10-20 20:21:15 +0000228 }
229 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 if (PyErr_Occurred()) {
231 Py_DECREF(v);
Guido van Rossum69785031995-01-26 22:58:48 +0000232 return NULL;
233 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 PyList_Sort(v);
Guido van Rossume9c430f1991-10-20 20:21:15 +0000235 return v;
236}
237
Guido van Rossum69785031995-01-26 22:58:48 +0000238/* Find a method in a method chain */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000239
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240PyObject *
241Py_FindMethodInChain(chain, self, name)
242 PyMethodChain *chain;
243 PyObject *self;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000244 char *name;
245{
Guido van Rossum8a92c621998-06-27 18:28:59 +0000246 if (name[0] == '_' && name[1] == '_') {
247 if (strcmp(name, "__methods__") == 0)
248 return listmethodchain(chain);
249 if (strcmp(name, "__doc__") == 0) {
250 char *doc = self->ob_type->tp_doc;
251 if (doc != NULL)
252 return PyString_FromString(doc);
253 }
254 }
Guido van Rossum69785031995-01-26 22:58:48 +0000255 while (chain != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 PyMethodDef *ml = chain->methods;
Guido van Rossum69785031995-01-26 22:58:48 +0000257 for (; ml->ml_name != NULL; ml++) {
258 if (name[0] == ml->ml_name[0] &&
259 strcmp(name+1, ml->ml_name+1) == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000260 return PyCFunction_New(ml, self);
Guido van Rossum69785031995-01-26 22:58:48 +0000261 }
262 chain = chain->link;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 PyErr_SetString(PyExc_AttributeError, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000265 return NULL;
266}
Guido van Rossum69785031995-01-26 22:58:48 +0000267
268/* Find a method in a single method list */
269
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000270PyObject *
271Py_FindMethod(methods, self, name)
272 PyMethodDef *methods;
273 PyObject *self;
Guido van Rossum69785031995-01-26 22:58:48 +0000274 char *name;
275{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276 PyMethodChain chain;
Guido van Rossum69785031995-01-26 22:58:48 +0000277 chain.methods = methods;
278 chain.link = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 return Py_FindMethodInChain(&chain, self, name);
Guido van Rossum69785031995-01-26 22:58:48 +0000280}
Guido van Rossum1f39c5c1997-08-05 02:11:41 +0000281
282/* Clear out the free list */
283
284void
285PyCFunction_Fini()
286{
287 while (free_list) {
288 PyCFunctionObject *v = free_list;
289 free_list = (PyCFunctionObject *)(v->m_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000290 PyObject_DEL(v);
Guido van Rossum1f39c5c1997-08-05 02:11:41 +0000291 }
292}