blob: 17e905be4b9900e964760958558cc96780672868 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Method object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +00005#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Christian Heimes6075a822008-02-06 12:44:34 +00007/* Free list for method objects to safe malloc/free overhead
8 * The m_self element is used to chain the objects.
9 */
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000010static PyCFunctionObject *free_list = NULL;
Christian Heimes6075a822008-02-06 12:44:34 +000011static int numfree = 0;
12#define MAXFREELIST 256
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000013
Guido van Rossumc0b618a1997-05-02 03:12:38 +000014PyObject *
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000015PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000016{
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000017 PyCFunctionObject *op;
18 op = free_list;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019 if (op != NULL) {
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000020 free_list = (PyCFunctionObject *)(op->m_self);
Guido van Rossumb18618d2000-05-03 23:44:39 +000021 PyObject_INIT(op, &PyCFunction_Type);
Christian Heimes6075a822008-02-06 12:44:34 +000022 numfree--;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023 }
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000024 else {
Neil Schemenauerd91eec92002-03-18 20:44:53 +000025 op = PyObject_GC_New(PyCFunctionObject, &PyCFunction_Type);
Guido van Rossum1f39c5c1997-08-05 02:11:41 +000026 if (op == NULL)
27 return NULL;
28 }
29 op->m_ml = ml;
30 Py_XINCREF(self);
31 op->m_self = self;
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +000032 Py_XINCREF(module);
33 op->m_module = module;
Neil Schemenauerd91eec92002-03-18 20:44:53 +000034 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035 return (PyObject *)op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036}
37
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038PyCFunction
Fred Drakeee238b92000-07-09 06:03:25 +000039PyCFunction_GetFunction(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 if (!PyCFunction_Check(op)) {
42 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043 return NULL;
44 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 return ((PyCFunctionObject *)op) -> m_ml -> ml_meth;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046}
47
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000049PyCFunction_GetSelf(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 if (!PyCFunction_Check(op)) {
52 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 return NULL;
54 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055 return ((PyCFunctionObject *)op) -> m_self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056}
57
Guido van Rossumc0602291991-12-16 13:07:24 +000058int
Fred Drakeee238b92000-07-09 06:03:25 +000059PyCFunction_GetFlags(PyObject *op)
Guido van Rossumc0602291991-12-16 13:07:24 +000060{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 if (!PyCFunction_Check(op)) {
62 PyErr_BadInternalCall();
Guido van Rossumc0602291991-12-16 13:07:24 +000063 return -1;
64 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065 return ((PyCFunctionObject *)op) -> m_ml -> ml_flags;
Guido van Rossumc0602291991-12-16 13:07:24 +000066}
67
Jeremy Hylton910d7d42001-08-12 21:52:24 +000068PyObject *
69PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
70{
71 PyCFunctionObject* f = (PyCFunctionObject*)func;
72 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
73 PyObject *self = PyCFunction_GET_SELF(func);
Martin v. Löwiseb079f12006-02-16 14:32:27 +000074 Py_ssize_t size;
Jeremy Hylton910d7d42001-08-12 21:52:24 +000075
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +000076 switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000077 case METH_VARARGS:
Raymond Hettingerbf43f8a2003-01-04 00:37:53 +000078 if (kw == NULL || PyDict_Size(kw) == 0)
79 return (*meth)(self, arg);
80 break;
81 case METH_VARARGS | METH_KEYWORDS:
Tim Peters541ceec2003-01-05 07:22:44 +000082 case METH_OLDARGS | METH_KEYWORDS:
Raymond Hettingerbf43f8a2003-01-04 00:37:53 +000083 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000084 case METH_NOARGS:
Raymond Hettingerbf43f8a2003-01-04 00:37:53 +000085 if (kw == NULL || PyDict_Size(kw) == 0) {
86 size = PyTuple_GET_SIZE(arg);
87 if (size == 0)
88 return (*meth)(self, NULL);
89 PyErr_Format(PyExc_TypeError,
Martin v. Löwiseb079f12006-02-16 14:32:27 +000090 "%.200s() takes no arguments (%zd given)",
Raymond Hettingerbf43f8a2003-01-04 00:37:53 +000091 f->m_ml->ml_name, size);
92 return NULL;
93 }
94 break;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000095 case METH_O:
Raymond Hettingerbf43f8a2003-01-04 00:37:53 +000096 if (kw == NULL || PyDict_Size(kw) == 0) {
97 size = PyTuple_GET_SIZE(arg);
98 if (size == 1)
99 return (*meth)(self, PyTuple_GET_ITEM(arg, 0));
100 PyErr_Format(PyExc_TypeError,
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000101 "%.200s() takes exactly one argument (%zd given)",
Raymond Hettingerbf43f8a2003-01-04 00:37:53 +0000102 f->m_ml->ml_name, size);
103 return NULL;
104 }
105 break;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000106 case METH_OLDARGS:
Jeremy Hylton910d7d42001-08-12 21:52:24 +0000107 /* the really old style */
Raymond Hettingerbf43f8a2003-01-04 00:37:53 +0000108 if (kw == NULL || PyDict_Size(kw) == 0) {
109 size = PyTuple_GET_SIZE(arg);
110 if (size == 1)
111 arg = PyTuple_GET_ITEM(arg, 0);
112 else if (size == 0)
113 arg = NULL;
114 return (*meth)(self, arg);
115 }
116 break;
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000117 default:
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000118 PyErr_BadInternalCall();
119 return NULL;
Jeremy Hylton910d7d42001-08-12 21:52:24 +0000120 }
Raymond Hettingerbf43f8a2003-01-04 00:37:53 +0000121 PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
122 f->m_ml->ml_name);
123 return NULL;
Jeremy Hylton910d7d42001-08-12 21:52:24 +0000124}
125
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126/* Methods (the standard built-in methods, that is) */
127
128static void
Fred Drakeee238b92000-07-09 06:03:25 +0000129meth_dealloc(PyCFunctionObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130{
Neil Schemenauerd91eec92002-03-18 20:44:53 +0000131 _PyObject_GC_UNTRACK(m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 Py_XDECREF(m->m_self);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000133 Py_XDECREF(m->m_module);
Christian Heimes6075a822008-02-06 12:44:34 +0000134 if (numfree < MAXFREELIST) {
135 m->m_self = (PyObject *)free_list;
136 free_list = m;
137 numfree++;
138 }
139 else {
140 PyObject_GC_Del(m);
141 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142}
143
Tim Peters6d6c1a32001-08-02 04:15:00 +0000144static PyObject *
145meth_get__doc__(PyCFunctionObject *m, void *closure)
146{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000147 const char *doc = m->m_ml->ml_doc;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000148
149 if (doc != NULL)
150 return PyString_FromString(doc);
151 Py_INCREF(Py_None);
152 return Py_None;
153}
154
155static PyObject *
156meth_get__name__(PyCFunctionObject *m, void *closure)
157{
158 return PyString_FromString(m->m_ml->ml_name);
159}
160
Neil Schemenauer10c66922001-07-12 13:27:35 +0000161static int
162meth_traverse(PyCFunctionObject *m, visitproc visit, void *arg)
163{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000164 Py_VISIT(m->m_self);
165 Py_VISIT(m->m_module);
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000166 return 0;
Neil Schemenauer10c66922001-07-12 13:27:35 +0000167}
168
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170meth_get__self__(PyCFunctionObject *m, void *closure)
Guido van Rossumcab650d1995-01-07 12:34:58 +0000171{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000172 PyObject *self;
173 if (PyEval_GetRestricted()) {
174 PyErr_SetString(PyExc_RuntimeError,
175 "method.__self__ not accessible in restricted mode");
176 return NULL;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000177 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 self = m->m_self;
179 if (self == NULL)
180 self = Py_None;
181 Py_INCREF(self);
182 return self;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000183}
184
Guido van Rossum32d34c82001-09-20 21:45:26 +0000185static PyGetSetDef meth_getsets [] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000186 {"__doc__", (getter)meth_get__doc__, NULL, NULL},
187 {"__name__", (getter)meth_get__name__, NULL, NULL},
188 {"__self__", (getter)meth_get__self__, NULL, NULL},
189 {0}
190};
191
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000192#define OFF(x) offsetof(PyCFunctionObject, x)
193
194static PyMemberDef meth_members[] = {
Christian Heimese8954f82007-11-22 11:21:16 +0000195 {"__module__", T_OBJECT, OFF(m_module), PY_WRITE_RESTRICTED},
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000196 {NULL}
197};
198
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000200meth_repr(PyCFunctionObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202 if (m->m_self == NULL)
Barry Warsaw7ce36942001-08-24 18:34:26 +0000203 return PyString_FromFormat("<built-in function %s>",
204 m->m_ml->ml_name);
205 return PyString_FromFormat("<built-in method %s of %s object at %p>",
206 m->m_ml->ml_name,
207 m->m_self->ob_type->tp_name,
208 m->m_self);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209}
210
Guido van Rossum9bfef441993-03-29 10:43:31 +0000211static int
Fred Drakeee238b92000-07-09 06:03:25 +0000212meth_compare(PyCFunctionObject *a, PyCFunctionObject *b)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000213{
214 if (a->m_self != b->m_self)
Guido van Rossum13fdf5e1998-12-04 18:52:55 +0000215 return (a->m_self < b->m_self) ? -1 : 1;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000216 if (a->m_ml->ml_meth == b->m_ml->ml_meth)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000217 return 0;
Guido van Rossumcab650d1995-01-07 12:34:58 +0000218 if (strcmp(a->m_ml->ml_name, b->m_ml->ml_name) < 0)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000219 return -1;
220 else
221 return 1;
222}
223
224static long
Fred Drakeee238b92000-07-09 06:03:25 +0000225meth_hash(PyCFunctionObject *a)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000226{
Fred Drake13634cf2000-06-29 19:17:04 +0000227 long x,y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000228 if (a->m_self == NULL)
229 x = 0;
230 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 x = PyObject_Hash(a->m_self);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000232 if (x == -1)
233 return -1;
234 }
Guido van Rossum9a15c212000-06-30 22:46:04 +0000235 y = _Py_HashPointer((void*)(a->m_ml->ml_meth));
Fred Drake13634cf2000-06-29 19:17:04 +0000236 if (y == -1)
237 return -1;
238 x ^= y;
239 if (x == -1)
240 x = -2;
241 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000242}
243
Tim Peters6d6c1a32001-08-02 04:15:00 +0000244
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245PyTypeObject PyCFunction_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000246 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum7066dd71992-09-17 17:54:56 +0000247 "builtin_function_or_method",
Neil Schemenauerd91eec92002-03-18 20:44:53 +0000248 sizeof(PyCFunctionObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 0,
Neil Schemenauer10c66922001-07-12 13:27:35 +0000250 (destructor)meth_dealloc, /* tp_dealloc */
251 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000252 0, /* tp_getattr */
Neil Schemenauer10c66922001-07-12 13:27:35 +0000253 0, /* tp_setattr */
254 (cmpfunc)meth_compare, /* tp_compare */
255 (reprfunc)meth_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)meth_hash, /* tp_hash */
Jeremy Hylton910d7d42001-08-12 21:52:24 +0000260 PyCFunction_Call, /* tp_call */
Neil Schemenauer10c66922001-07-12 13:27:35 +0000261 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000262 PyObject_GenericGetAttr, /* tp_getattro */
Neil Schemenauer10c66922001-07-12 13:27:35 +0000263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
Neil Schemenauerd91eec92002-03-18 20:44:53 +0000265 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Neil Schemenauer10c66922001-07-12 13:27:35 +0000266 0, /* tp_doc */
267 (traverseproc)meth_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000274 meth_members, /* tp_members */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000275 meth_getsets, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278};
Guido van Rossum3f5da241990-12-20 15:06:42 +0000279
Guido van Rossum69785031995-01-26 22:58:48 +0000280/* List all methods in a chain -- helper for findmethodinchain */
Guido van Rossume9c430f1991-10-20 20:21:15 +0000281
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000283listmethodchain(PyMethodChain *chain)
Guido van Rossume9c430f1991-10-20 20:21:15 +0000284{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285 PyMethodChain *c;
286 PyMethodDef *ml;
Guido van Rossume9c430f1991-10-20 20:21:15 +0000287 int i, n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000288 PyObject *v;
Tim Peters541ceec2003-01-05 07:22:44 +0000289
Guido van Rossum69785031995-01-26 22:58:48 +0000290 n = 0;
291 for (c = chain; c != NULL; c = c->link) {
292 for (ml = c->methods; ml->ml_name != NULL; ml++)
293 n++;
294 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000295 v = PyList_New(n);
Guido van Rossum69785031995-01-26 22:58:48 +0000296 if (v == NULL)
297 return NULL;
298 i = 0;
299 for (c = chain; c != NULL; c = c->link) {
300 for (ml = c->methods; ml->ml_name != NULL; ml++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 PyList_SetItem(v, i, PyString_FromString(ml->ml_name));
Guido van Rossum69785031995-01-26 22:58:48 +0000302 i++;
Guido van Rossume9c430f1991-10-20 20:21:15 +0000303 }
304 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 if (PyErr_Occurred()) {
306 Py_DECREF(v);
Guido van Rossum69785031995-01-26 22:58:48 +0000307 return NULL;
308 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 PyList_Sort(v);
Guido van Rossume9c430f1991-10-20 20:21:15 +0000310 return v;
311}
312
Guido van Rossum69785031995-01-26 22:58:48 +0000313/* Find a method in a method chain */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000314
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000316Py_FindMethodInChain(PyMethodChain *chain, PyObject *self, const char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000317{
Guido van Rossum8a92c621998-06-27 18:28:59 +0000318 if (name[0] == '_' && name[1] == '_') {
319 if (strcmp(name, "__methods__") == 0)
320 return listmethodchain(chain);
321 if (strcmp(name, "__doc__") == 0) {
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000322 const char *doc = self->ob_type->tp_doc;
Guido van Rossum8a92c621998-06-27 18:28:59 +0000323 if (doc != NULL)
324 return PyString_FromString(doc);
325 }
326 }
Guido van Rossum69785031995-01-26 22:58:48 +0000327 while (chain != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 PyMethodDef *ml = chain->methods;
Guido van Rossum69785031995-01-26 22:58:48 +0000329 for (; ml->ml_name != NULL; ml++) {
330 if (name[0] == ml->ml_name[0] &&
331 strcmp(name+1, ml->ml_name+1) == 0)
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000332 /* XXX */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 return PyCFunction_New(ml, self);
Guido van Rossum69785031995-01-26 22:58:48 +0000334 }
335 chain = chain->link;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000336 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 PyErr_SetString(PyExc_AttributeError, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000338 return NULL;
339}
Guido van Rossum69785031995-01-26 22:58:48 +0000340
341/* Find a method in a single method list */
342
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000344Py_FindMethod(PyMethodDef *methods, PyObject *self, const char *name)
Guido van Rossum69785031995-01-26 22:58:48 +0000345{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 PyMethodChain chain;
Guido van Rossum69785031995-01-26 22:58:48 +0000347 chain.methods = methods;
348 chain.link = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 return Py_FindMethodInChain(&chain, self, name);
Guido van Rossum69785031995-01-26 22:58:48 +0000350}
Guido van Rossum1f39c5c1997-08-05 02:11:41 +0000351
352/* Clear out the free list */
353
354void
Fred Drakeee238b92000-07-09 06:03:25 +0000355PyCFunction_Fini(void)
Guido van Rossum1f39c5c1997-08-05 02:11:41 +0000356{
357 while (free_list) {
358 PyCFunctionObject *v = free_list;
359 free_list = (PyCFunctionObject *)(v->m_self);
Neil Schemenauerd91eec92002-03-18 20:44:53 +0000360 PyObject_GC_Del(v);
Christian Heimes6075a822008-02-06 12:44:34 +0000361 numfree--;
Guido van Rossum1f39c5c1997-08-05 02:11:41 +0000362 }
Christian Heimes6075a822008-02-06 12:44:34 +0000363 assert(numfree == 0);
Guido van Rossum1f39c5c1997-08-05 02:11:41 +0000364}
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000365
366/* PyCFunction_New() is now just a macro that calls PyCFunction_NewEx(),
367 but it's part of the API so we need to keep a function around that
368 existing C extensions can call.
369*/
Christian Heimes6075a822008-02-06 12:44:34 +0000370
Jeremy Hylton4f0dcc92003-01-31 18:33:18 +0000371#undef PyCFunction_New
372PyAPI_FUNC(PyObject *) PyCFunction_New(PyMethodDef *, PyObject *);
373
374PyObject *
375PyCFunction_New(PyMethodDef *ml, PyObject *self)
376{
377 return PyCFunction_NewEx(ml, self, NULL);
378}