blob: c120769687dbece44d131c6cf9cc7c8b17728240 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
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 Rossume15dee51995-07-18 14:12:02 +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 Rossume15dee51995-07-18 14:12:02 +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 Rossume15dee51995-07-18 14:12:02 +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 Rossume15dee51995-07-18 14:12:02 +000029
30******************************************************************/
31
32/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033
Guido van Rossume15dee51995-07-18 14:12:02 +000034#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +000035#include <ctype.h>
Guido van Rossume15dee51995-07-18 14:12:02 +000036
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000037/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000038
39static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000040type_error(msg)
41 char *msg;
Guido van Rossume15dee51995-07-18 14:12:02 +000042{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000043 PyErr_SetString(PyExc_TypeError, msg);
44 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000045}
46
Guido van Rossum052b7e11996-11-11 15:08:19 +000047static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000048null_error()
Guido van Rossume15dee51995-07-18 14:12:02 +000049{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000050 if (!PyErr_Occurred())
51 PyErr_SetString(PyExc_SystemError,
52 "null argument to internal routine");
53 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000054}
55
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000056/* Operations on any object */
57
58int
59PyObject_Cmp(o1, o2, result)
60 PyObject *o1;
61 PyObject *o2;
62 int *result;
63{
64 int r;
65
66 if (o1 == NULL || o2 == NULL) {
67 null_error();
68 return -1;
69 }
70 r = PyObject_Compare(o1, o2);
71 if (PyErr_Occurred())
72 return -1;
73 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000074 return 0;
75}
Guido van Rossume15dee51995-07-18 14:12:02 +000076
77PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000078PyObject_Type(o)
79 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000080{
81 PyObject *v;
82
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000083 if (o == NULL)
84 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000085 v = (PyObject *)o->ob_type;
86 Py_INCREF(v);
87 return v;
88}
89
90int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000091PyObject_Length(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000092 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000093{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000094 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000096 if (o == NULL) {
97 null_error();
98 return -1;
99 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000100
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000101 m = o->ob_type->tp_as_sequence;
102 if (m && m->sq_length)
103 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000104
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000105 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000106}
107
108PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000109PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000110 PyObject *o;
111 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000112{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000113 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 if (o == NULL || key == NULL)
116 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 m = o->ob_type->tp_as_mapping;
119 if (m && m->mp_subscript)
120 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000121
Guido van Rossum21308241998-08-13 16:44:44 +0000122 if (o->ob_type->tp_as_sequence) {
123 if (PyInt_Check(key))
124 return PySequence_GetItem(o, PyInt_AsLong(key));
125 return type_error("sequence index must be integer");
126 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000127
128 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000129}
130
131int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000132PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133 PyObject *o;
134 PyObject *key;
135 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000136{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000137 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000138
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139 if (o == NULL || key == NULL || value == NULL) {
140 null_error();
141 return -1;
142 }
143 m = o->ob_type->tp_as_mapping;
144 if (m && m->mp_ass_subscript)
145 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000146
Guido van Rossum21308241998-08-13 16:44:44 +0000147 if (o->ob_type->tp_as_sequence) {
148 if (PyInt_Check(key))
149 return PySequence_SetItem(o, PyInt_AsLong(key), value);
150 type_error("sequence index must be integer");
151 return -1;
152 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000153
154 type_error("object does not support item assignment");
155 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000156}
157
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000158int
159PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000160 PyObject *o;
161 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000162{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000163 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000164
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000165 if (o == NULL || key == NULL) {
166 null_error();
167 return -1;
168 }
169 m = o->ob_type->tp_as_mapping;
170 if (m && m->mp_ass_subscript)
171 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000172
Guido van Rossum21308241998-08-13 16:44:44 +0000173 if (o->ob_type->tp_as_sequence) {
174 if (PyInt_Check(key))
175 return PySequence_DelItem(o, PyInt_AsLong(key));
176 type_error("sequence index must be integer");
177 return -1;
178 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000179
180 type_error("object does not support item deletion");
181 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000182}
183
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000184/* Operations on numbers */
185
186int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000187PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000188 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000189{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000190 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000191}
192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000193/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000194
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000195#define BINOP(v, w, opname, ropname, thisfunc) \
196 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000197 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
198
199PyObject *
200PyNumber_Or(v, w)
201 PyObject *v, *w;
202{
203 extern int PyNumber_Coerce();
204
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000205 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000206 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000207 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000208 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
209 if (PyNumber_Coerce(&v, &w) != 0)
210 return NULL;
211 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
212 x = (*f)(v, w);
213 Py_DECREF(v);
214 Py_DECREF(w);
215 if (f != NULL)
216 return x;
217 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000218 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000219}
220
221PyObject *
222PyNumber_Xor(v, w)
223 PyObject *v, *w;
224{
225 extern int PyNumber_Coerce();
226
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000227 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000228 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000229 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000230 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
231 if (PyNumber_Coerce(&v, &w) != 0)
232 return NULL;
233 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
234 x = (*f)(v, w);
235 Py_DECREF(v);
236 Py_DECREF(w);
237 if (f != NULL)
238 return x;
239 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000240 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000241}
242
243PyObject *
244PyNumber_And(v, w)
245 PyObject *v, *w;
246{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000247 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000248 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000249 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000250 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
251 if (PyNumber_Coerce(&v, &w) != 0)
252 return NULL;
253 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
254 x = (*f)(v, w);
255 Py_DECREF(v);
256 Py_DECREF(w);
257 if (f != NULL)
258 return x;
259 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000260 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000261}
262
263PyObject *
264PyNumber_Lshift(v, w)
265 PyObject *v, *w;
266{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000267 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000268 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000269 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000270 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
271 if (PyNumber_Coerce(&v, &w) != 0)
272 return NULL;
273 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
274 x = (*f)(v, w);
275 Py_DECREF(v);
276 Py_DECREF(w);
277 if (f != NULL)
278 return x;
279 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000280 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000281}
282
283PyObject *
284PyNumber_Rshift(v, w)
285 PyObject *v, *w;
286{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000287 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000288 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000289 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000290 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
291 if (PyNumber_Coerce(&v, &w) != 0)
292 return NULL;
293 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
294 x = (*f)(v, w);
295 Py_DECREF(v);
296 Py_DECREF(w);
297 if (f != NULL)
298 return x;
299 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000300 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000301}
302
303PyObject *
304PyNumber_Add(v, w)
305 PyObject *v, *w;
306{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000307 PySequenceMethods *m;
308
309 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
310 m = v->ob_type->tp_as_sequence;
311 if (m && m->sq_concat)
312 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000313 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000314 PyObject *x = NULL;
315 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000316 if (PyNumber_Coerce(&v, &w) != 0)
317 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000318 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
319 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000320 Py_DECREF(v);
321 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000322 if (f != NULL)
323 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000324 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000325 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000326}
327
328PyObject *
329PyNumber_Subtract(v, w)
330 PyObject *v, *w;
331{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000332 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000333 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000334 PyObject *x = NULL;
335 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000336 if (PyNumber_Coerce(&v, &w) != 0)
337 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000338 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
339 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000340 Py_DECREF(v);
341 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000342 if (f != NULL)
343 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000344 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000345 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000346}
347
348PyObject *
349PyNumber_Multiply(v, w)
350 PyObject *v, *w;
351{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000352 PyTypeObject *tp = v->ob_type;
353 PySequenceMethods *m;
354
355 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000356 if (tp->tp_as_number != NULL &&
357 w->ob_type->tp_as_sequence != NULL &&
358 !PyInstance_Check(v)) {
359 /* number*sequence -- swap v and w */
360 PyObject *tmp = v;
361 v = w;
362 w = tmp;
363 tp = v->ob_type;
364 }
365 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000366 PyObject *x = NULL;
367 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000368 if (PyInstance_Check(v)) {
369 /* Instances of user-defined classes get their
370 other argument uncoerced, so they may
371 implement sequence*number as well as
372 number*number. */
373 Py_INCREF(v);
374 Py_INCREF(w);
375 }
376 else if (PyNumber_Coerce(&v, &w) != 0)
377 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000378 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
379 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000380 Py_DECREF(v);
381 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000382 if (f != NULL)
383 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000384 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000385 m = tp->tp_as_sequence;
386 if (m && m->sq_repeat) {
387 if (!PyInt_Check(w))
388 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000389 "can't multiply sequence with non-int");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000390 return (*m->sq_repeat)(v, (int)PyInt_AsLong(w));
Guido van Rossume15dee51995-07-18 14:12:02 +0000391 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000392 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000393}
394
395PyObject *
396PyNumber_Divide(v, w)
397 PyObject *v, *w;
398{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000399 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000400 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000401 PyObject *x = NULL;
402 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000403 if (PyNumber_Coerce(&v, &w) != 0)
404 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000405 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
406 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000407 Py_DECREF(v);
408 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000409 if (f != NULL)
410 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000411 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000412 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000413}
414
415PyObject *
416PyNumber_Remainder(v, w)
417 PyObject *v, *w;
418{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000419 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000420 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000421 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000422 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000423 PyObject *x = NULL;
424 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000425 if (PyNumber_Coerce(&v, &w) != 0)
426 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000427 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
428 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000429 Py_DECREF(v);
430 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000431 if (f != NULL)
432 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000433 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000434 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000435}
436
437PyObject *
438PyNumber_Divmod(v, w)
439 PyObject *v, *w;
440{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000441 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
442 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000443 PyObject *x = NULL;
444 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000445 if (PyNumber_Coerce(&v, &w) != 0)
446 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000447 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
448 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000449 Py_DECREF(v);
450 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000451 if (f != NULL)
452 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000453 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000454 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000455}
456
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000457/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000458
459static PyObject *
460do_pow(v, w)
461 PyObject *v, *w;
462{
463 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000464 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
465 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000466 if (v->ob_type->tp_as_number == NULL ||
467 w->ob_type->tp_as_number == NULL) {
468 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000469 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000470 return NULL;
471 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000472 if (PyNumber_Coerce(&v, &w) != 0)
473 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000474 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
475 res = (*f)(v, w, Py_None);
476 else
477 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000478 Py_DECREF(v);
479 Py_DECREF(w);
480 return res;
481}
482
483PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000484PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000485 PyObject *v, *w, *z;
486{
487 PyObject *res;
488 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000489 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000490
491 if (z == Py_None)
492 return do_pow(v, w);
493 /* XXX The ternary version doesn't do class instance coercions */
494 if (PyInstance_Check(v))
495 return v->ob_type->tp_as_number->nb_power(v, w, z);
496 if (v->ob_type->tp_as_number == NULL ||
497 z->ob_type->tp_as_number == NULL ||
498 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000499 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000500 }
501 if (PyNumber_Coerce(&v, &w) != 0)
502 return NULL;
503 res = NULL;
504 v1 = v;
505 z1 = z;
506 if (PyNumber_Coerce(&v1, &z1) != 0)
507 goto error2;
508 w2 = w;
509 z2 = z1;
510 if (PyNumber_Coerce(&w2, &z2) != 0)
511 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000512 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
513 res = (*f)(v1, w2, z2);
514 else
515 res = type_error(
516 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000517 Py_DECREF(w2);
518 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000519 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000520 Py_DECREF(v1);
521 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000522 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000523 Py_DECREF(v);
524 Py_DECREF(w);
525 return res;
526}
527
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000528/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000529
530PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000531PyNumber_Negative(o)
532 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000533{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000534 PyNumberMethods *m;
535
536 if (o == NULL)
537 return null_error();
538 m = o->ob_type->tp_as_number;
539 if (m && m->nb_negative)
540 return (*m->nb_negative)(o);
541
542 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000543}
544
545PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000546PyNumber_Positive(o)
547 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000548{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000549 PyNumberMethods *m;
550
551 if (o == NULL)
552 return null_error();
553 m = o->ob_type->tp_as_number;
554 if (m && m->nb_positive)
555 return (*m->nb_positive)(o);
556
557 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000558}
559
560PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000561PyNumber_Invert(o)
562 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000563{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000564 PyNumberMethods *m;
565
566 if (o == NULL)
567 return null_error();
568 m = o->ob_type->tp_as_number;
569 if (m && m->nb_invert)
570 return (*m->nb_invert)(o);
571
572 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000573}
574
575PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000576PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000577 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000578{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000579 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000580
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000581 if (o == NULL)
582 return null_error();
583 m = o->ob_type->tp_as_number;
584 if (m && m->nb_absolute)
585 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000586
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000587 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000588}
589
590PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000591PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000592 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000593{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000594 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000595
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000596 if (o == NULL)
597 return null_error();
598 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000599 return PyInt_FromString(PyString_AS_STRING(o), NULL, 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000600 m = o->ob_type->tp_as_number;
601 if (m && m->nb_int)
602 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000603
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000604 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000605}
606
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000607/* There are two C API functions for converting a string to a long,
608 * PyNumber_Long() and PyLong_FromString(). Both are used in builtin_long,
609 * reachable from Python with the built-in function long().
610 *
611 * The difference is this: PyNumber_Long will raise an exception when the
612 * string cannot be converted to a long. The most common situation is
613 * where a float string is passed in; this raises a ValueError.
614 * PyLong_FromString does not raise an exception; it silently truncates the
615 * float to an integer.
616 *
617 * You can see the different behavior from Python with the following:
618 *
619 * long('9.5')
620 * => ValueError: invalid literal for long(): 9.5
621 *
622 * long('9.5', 10)
623 * => 9L
624 *
625 * The first example ends up calling PyNumber_Long(), while the second one
626 * calls PyLong_FromString().
627 */
628static PyObject *
629long_from_string(v)
630 PyObject *v;
631{
632 char *s, *end;
633 PyObject *x;
634 char buffer[256]; /* For errors */
635
636 s = PyString_AS_STRING(v);
637 while (*s && isspace(Py_CHARMASK(*s)))
638 s++;
639 x = PyLong_FromString(s, &end, 10);
640 if (x == NULL) {
641 if (PyErr_ExceptionMatches(PyExc_ValueError))
642 goto bad;
643 return NULL;
644 }
645 while (*end && isspace(Py_CHARMASK(*end)))
646 end++;
647 if (*end != '\0') {
648 bad:
649 sprintf(buffer, "invalid literal for long(): %.200s", s);
650 PyErr_SetString(PyExc_ValueError, buffer);
651 Py_XDECREF(x);
652 return NULL;
653 }
654 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
655 PyErr_SetString(PyExc_ValueError,
656 "null byte in argument for long()");
657 return NULL;
658 }
659 return x;
660}
661
Guido van Rossume15dee51995-07-18 14:12:02 +0000662PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000663PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000664 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000665{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000666 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000667
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000668 if (o == NULL)
669 return null_error();
670 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000671 /* need to do extra error checking that PyLong_FromString()
672 * doesn't do. In particular long('9.5') must raise an
673 * exception, not truncate the float.
674 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000675 return long_from_string(o);
676 m = o->ob_type->tp_as_number;
677 if (m && m->nb_long)
678 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000679
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000680 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000681}
682
683PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000684PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000685 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000686{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000687 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000688
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000689 if (o == NULL)
690 return null_error();
691 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000692 return PyFloat_FromString(o, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000693 m = o->ob_type->tp_as_number;
694 if (m && m->nb_float)
695 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000696
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000697 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000698}
699
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000700/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000701
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000702int
703PySequence_Check(s)
704 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000705{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000706 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000707}
708
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000709int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000710PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000711 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000712{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000713 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000714
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000715 if (s == NULL) {
716 null_error();
717 return -1;
718 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000720 m = s->ob_type->tp_as_sequence;
721 if (m && m->sq_length)
722 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000723
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000724 type_error("len() of unsized object");
725 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000726}
727
728PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000729PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000730 PyObject *s;
731 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000732{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000733 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000734
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000735 if (s == NULL || o == NULL)
736 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000737
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000738 m = s->ob_type->tp_as_sequence;
739 if (m && m->sq_concat)
740 return m->sq_concat(s, o);
741
742 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000743}
744
745PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000746PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000747 PyObject *o;
748 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000749{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000750 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000751
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000752 if (o == NULL)
753 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000754
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755 m = o->ob_type->tp_as_sequence;
756 if (m && m->sq_repeat)
757 return m->sq_repeat(o, count);
758
759 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000760}
761
762PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000763PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000764 PyObject *s;
765 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000766{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000767 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000769 if (s == NULL)
770 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000771
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000772 m = s->ob_type->tp_as_sequence;
773 if (m && m->sq_item) {
774 if (i < 0) {
775 if (m->sq_length) {
776 int l = (*m->sq_length)(s);
777 if (l < 0)
778 return NULL;
779 i += l;
780 }
781 }
782 return m->sq_item(s, i);
783 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000784
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000785 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000786}
787
788PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000789PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000790 PyObject *s;
791 int i1;
792 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000793{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000794 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000795
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000796 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000797
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000798 m = s->ob_type->tp_as_sequence;
799 if (m && m->sq_slice) {
800 if (i1 < 0 || i2 < 0) {
801 if (m->sq_length) {
802 int l = (*m->sq_length)(s);
803 if (l < 0)
804 return NULL;
805 if (i1 < 0)
806 i1 += l;
807 if (i2 < 0)
808 i2 += l;
809 }
810 }
811 return m->sq_slice(s, i1, i2);
812 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000813
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000814 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000815}
816
817int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000818PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 PyObject *s;
820 int i;
821 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000822{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000823 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000824
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000825 if (s == NULL) {
826 null_error();
827 return -1;
828 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000830 m = s->ob_type->tp_as_sequence;
831 if (m && m->sq_ass_item) {
832 if (i < 0) {
833 if (m->sq_length) {
834 int l = (*m->sq_length)(s);
835 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000836 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000837 i += l;
838 }
839 }
840 return m->sq_ass_item(s, i, o);
841 }
842
843 type_error("object doesn't support item assignment");
844 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000845}
846
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000847int
848PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000849 PyObject *s;
850 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000851{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000852 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000853
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000854 if (s == NULL) {
855 null_error();
856 return -1;
857 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000858
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859 m = s->ob_type->tp_as_sequence;
860 if (m && m->sq_ass_item) {
861 if (i < 0) {
862 if (m->sq_length) {
863 int l = (*m->sq_length)(s);
864 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000865 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000866 i += l;
867 }
868 }
869 return m->sq_ass_item(s, i, (PyObject *)NULL);
870 }
871
872 type_error("object doesn't support item deletion");
873 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000874}
875
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000876int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000877PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000878 PyObject *s;
879 int i1;
880 int i2;
881 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000882{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000884
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000885 if (s == NULL) {
886 null_error();
887 return -1;
888 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000889
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000890 m = s->ob_type->tp_as_sequence;
891 if (m && m->sq_ass_slice) {
892 if (i1 < 0 || i2 < 0) {
893 if (m->sq_length) {
894 int l = (*m->sq_length)(s);
895 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000896 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000897 if (i1 < 0)
898 i1 += l;
899 if (i2 < 0)
900 i2 += l;
901 }
902 }
903 return m->sq_ass_slice(s, i1, i2, o);
904 }
905 type_error("object doesn't support slice assignment");
906 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000907}
908
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000909int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000910PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 PyObject *s;
912 int i1;
913 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000914{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000915 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000916
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000917 if (s == NULL) {
918 null_error();
919 return -1;
920 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000921
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000922 m = s->ob_type->tp_as_sequence;
923 if (m && m->sq_ass_slice) {
924 if (i1 < 0 || i2 < 0) {
925 if (m->sq_length) {
926 int l = (*m->sq_length)(s);
927 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000928 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000929 if (i1 < 0)
930 i1 += l;
931 if (i2 < 0)
932 i2 += l;
933 }
934 }
935 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
936 }
937 type_error("object doesn't support slice deletion");
938 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000939}
940
Guido van Rossume15dee51995-07-18 14:12:02 +0000941PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000942PySequence_Tuple(v)
943 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000944{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000945 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000946
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 if (v == NULL)
948 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000949
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000950 if (PyTuple_Check(v)) {
951 Py_INCREF(v);
952 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000953 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000954
955 if (PyList_Check(v))
956 return PyList_AsTuple(v);
957
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000958 /* There used to be code for strings here, but tuplifying strings is
959 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000960
961 /* Generic sequence object */
962 m = v->ob_type->tp_as_sequence;
963 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000964 int i;
965 PyObject *t;
966 int n = PySequence_Length(v);
967 if (n < 0)
968 return NULL;
969 t = PyTuple_New(n);
970 if (t == NULL)
971 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000972 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000973 PyObject *item = (*m->sq_item)(v, i);
974 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000975 if (PyErr_ExceptionMatches(PyExc_IndexError))
976 PyErr_Clear();
977 else {
978 Py_DECREF(t);
979 t = NULL;
980 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000981 break;
982 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000983 if (i >= n) {
984 if (n < 500)
985 n += 10;
986 else
987 n += 100;
988 if (_PyTuple_Resize(&t, n, 0) != 0)
989 break;
990 }
991 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000993 if (i < n && t != NULL)
994 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000995 return t;
996 }
997
998 /* None of the above */
999 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001000}
1001
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001002PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003PySequence_List(v)
1004 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001005{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001006 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001007
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001008 if (v == NULL)
1009 return null_error();
1010
1011 if (PyList_Check(v))
1012 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1013
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001014 m = v->ob_type->tp_as_sequence;
1015 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001016 int i;
1017 PyObject *l;
1018 int n = PySequence_Length(v);
1019 if (n < 0)
1020 return NULL;
1021 l = PyList_New(n);
1022 if (l == NULL)
1023 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001024 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025 PyObject *item = (*m->sq_item)(v, i);
1026 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001027 if (PyErr_ExceptionMatches(PyExc_IndexError))
1028 PyErr_Clear();
1029 else {
1030 Py_DECREF(l);
1031 l = NULL;
1032 }
1033 break;
1034 }
1035 if (i < n)
1036 PyList_SET_ITEM(l, i, item);
1037 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001038 Py_DECREF(l);
1039 l = NULL;
1040 break;
1041 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001042 }
1043 if (i < n && l != NULL) {
1044 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1045 Py_DECREF(l);
1046 l = NULL;
1047 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001048 }
1049 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001050 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001051 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001052}
1053
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001054int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001055PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056 PyObject *s;
1057 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001058{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001059 int l, i, n, cmp, err;
1060 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001061
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001062 if (s == NULL || o == NULL) {
1063 null_error();
1064 return -1;
1065 }
1066
1067 l = PySequence_Length(s);
1068 if (l < 0)
1069 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001070
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001071 n = 0;
1072 for (i = 0; i < l; i++) {
1073 item = PySequence_GetItem(s, i);
1074 if (item == NULL)
1075 return -1;
1076 err = PyObject_Cmp(item, o, &cmp);
1077 Py_DECREF(item);
1078 if (err < 0)
1079 return err;
1080 if (cmp == 0)
1081 n++;
1082 }
1083 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001084}
1085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001086int
1087PySequence_Contains(w, v) /* v in w */
1088 PyObject *w;
1089 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001090{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001091 int i, cmp;
1092 PyObject *x;
1093 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001094
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095 /* Special case for char in string */
1096 if (PyString_Check(w)) {
1097 register char *s, *end;
1098 register char c;
1099 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1100 PyErr_SetString(PyExc_TypeError,
1101 "string member test needs char left operand");
1102 return -1;
1103 }
1104 c = PyString_AsString(v)[0];
1105 s = PyString_AsString(w);
1106 end = s + PyString_Size(w);
1107 while (s < end) {
1108 if (c == *s++)
1109 return 1;
1110 }
1111 return 0;
1112 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001113
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001114 sq = w->ob_type->tp_as_sequence;
1115 if (sq == NULL || sq->sq_item == NULL) {
1116 PyErr_SetString(PyExc_TypeError,
1117 "'in' or 'not in' needs sequence right argument");
1118 return -1;
1119 }
1120
1121 for (i = 0; ; i++) {
1122 x = (*sq->sq_item)(w, i);
1123 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001124 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001125 PyErr_Clear();
1126 break;
1127 }
1128 return -1;
1129 }
1130 cmp = PyObject_Compare(v, x);
1131 Py_XDECREF(x);
1132 if (cmp == 0)
1133 return 1;
1134 if (PyErr_Occurred())
1135 return -1;
1136 }
1137
1138 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001139}
1140
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001141/* Backwards compatibility */
1142#undef PySequence_In
1143int
1144PySequence_In(w, v)
1145 PyObject *w;
1146 PyObject *v;
1147{
1148 return PySequence_Contains(w, v);
1149}
1150
1151int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001152PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001153 PyObject *s;
1154 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001155{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 int l, i, cmp, err;
1157 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001158
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 if (s == NULL || o == NULL) {
1160 null_error();
1161 return -1;
1162 }
1163
1164 l = PySequence_Length(s);
1165 if (l < 0)
1166 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001167
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001168 for (i = 0; i < l; i++) {
1169 item = PySequence_GetItem(s, i);
1170 if (item == NULL)
1171 return -1;
1172 err = PyObject_Cmp(item, o, &cmp);
1173 Py_DECREF(item);
1174 if (err < 0)
1175 return err;
1176 if (cmp == 0)
1177 return i;
1178 }
1179
1180 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1181 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001182}
1183
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001184/* Operations on mappings */
1185
1186int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001187PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001188 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001189{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001191}
1192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193int
1194PyMapping_Length(o)
1195 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001196{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001198
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001199 if (o == NULL) {
1200 null_error();
1201 return -1;
1202 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001203
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001204 m = o->ob_type->tp_as_mapping;
1205 if (m && m->mp_length)
1206 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001207
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001208 type_error("len() of unsized object");
1209 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001210}
1211
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001212PyObject *
1213PyMapping_GetItemString(o, key)
1214 PyObject *o;
1215 char *key;
1216{
1217 PyObject *okey, *r;
1218
1219 if (key == NULL)
1220 return null_error();
1221
1222 okey = PyString_FromString(key);
1223 if (okey == NULL)
1224 return NULL;
1225 r = PyObject_GetItem(o, okey);
1226 Py_DECREF(okey);
1227 return r;
1228}
1229
1230int
1231PyMapping_SetItemString(o, key, value)
1232 PyObject *o;
1233 char *key;
1234 PyObject *value;
1235{
1236 PyObject *okey;
1237 int r;
1238
1239 if (key == NULL) {
1240 null_error();
1241 return -1;
1242 }
1243
1244 okey = PyString_FromString(key);
1245 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001246 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 r = PyObject_SetItem(o, okey, value);
1248 Py_DECREF(okey);
1249 return r;
1250}
1251
1252int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001253PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254 PyObject *o;
1255 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001256{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001258
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 v = PyMapping_GetItemString(o, key);
1260 if (v) {
1261 Py_DECREF(v);
1262 return 1;
1263 }
1264 PyErr_Clear();
1265 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001266}
1267
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001268int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001269PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001270 PyObject *o;
1271 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001272{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001273 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001274
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275 v = PyObject_GetItem(o, key);
1276 if (v) {
1277 Py_DECREF(v);
1278 return 1;
1279 }
1280 PyErr_Clear();
1281 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001282}
1283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001284/* Operations on callable objects */
1285
1286/* XXX PyCallable_Check() is in object.c */
1287
Guido van Rossume15dee51995-07-18 14:12:02 +00001288PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001289PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001291{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001292 PyObject *r;
1293 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001294
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001295 if (args == NULL) {
1296 args = PyTuple_New(0);
1297 if (args == NULL)
1298 return NULL;
1299 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001300
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301 r = PyEval_CallObject(o, args);
1302
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001303 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001305 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306
1307 return r;
1308}
Guido van Rossume15dee51995-07-18 14:12:02 +00001309
1310PyObject *
1311#ifdef HAVE_STDARG_PROTOTYPES
1312/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001313PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001314#else
1315/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001317#endif
1318{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 va_list va;
1320 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001321#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001322 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001323#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324 PyObject *callable;
1325 char *format;
1326 va_start(va);
1327 callable = va_arg(va, PyObject *);
1328 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001329#endif
1330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 if (callable == NULL) {
1332 va_end(va);
1333 return null_error();
1334 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001335
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001336 if (format)
1337 args = Py_VaBuildValue(format, va);
1338 else
1339 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001340
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001341 va_end(va);
1342
1343 if (args == NULL)
1344 return NULL;
1345
1346 if (!PyTuple_Check(args)) {
1347 PyObject *a;
1348
1349 a = PyTuple_New(1);
1350 if (a == NULL)
1351 return NULL;
1352 if (PyTuple_SetItem(a, 0, args) < 0)
1353 return NULL;
1354 args = a;
1355 }
1356 retval = PyObject_CallObject(callable, args);
1357
1358 Py_DECREF(args);
1359
1360 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001361}
1362
1363PyObject *
1364#ifdef HAVE_STDARG_PROTOTYPES
1365/* VARARGS 2 */
1366PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1367#else
1368/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001370#endif
1371{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 va_list va;
1373 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001374#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001376#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001377 PyObject *o;
1378 char *name;
1379 char *format;
1380 va_start(va);
1381 o = va_arg(va, PyObject *);
1382 name = va_arg(va, char *);
1383 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001384#endif
1385
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001386 if (o == NULL || name == NULL) {
1387 va_end(va);
1388 return null_error();
1389 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001390
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391 func = PyObject_GetAttrString(o, name);
1392 if (func == NULL) {
1393 va_end(va);
1394 PyErr_SetString(PyExc_AttributeError, name);
1395 return 0;
1396 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001397
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001398 if (!PyCallable_Check(func)) {
1399 va_end(va);
1400 return type_error("call of non-callable attribute");
1401 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001402
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001403 if (format && *format)
1404 args = Py_VaBuildValue(format, va);
1405 else
1406 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001407
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001408 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001409
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001410 if (!args)
1411 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001412
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 if (!PyTuple_Check(args)) {
1414 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001415
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001416 a = PyTuple_New(1);
1417 if (a == NULL)
1418 return NULL;
1419 if (PyTuple_SetItem(a, 0, args) < 0)
1420 return NULL;
1421 args = a;
1422 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001425
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001426 Py_DECREF(args);
1427 Py_DECREF(func);
1428
1429 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001430}