blob: 3fc312a7fe71caf774d986cc31dcfb54d79c19b2 [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) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000387 long mul_value;
388
389 if (PyInt_Check(w)) {
390 mul_value = PyInt_AsLong(w);
391 }
392 else if (PyLong_Check(w)) {
393 mul_value = PyLong_AsLong(w);
394 if (PyErr_Occurred())
395 return NULL;
396 }
397 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000398 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000399 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000400 }
401 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000402 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000403 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000404}
405
406PyObject *
407PyNumber_Divide(v, w)
408 PyObject *v, *w;
409{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000410 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000411 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000412 PyObject *x = NULL;
413 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000414 if (PyNumber_Coerce(&v, &w) != 0)
415 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000416 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
417 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000418 Py_DECREF(v);
419 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000420 if (f != NULL)
421 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000422 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000423 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000424}
425
426PyObject *
427PyNumber_Remainder(v, w)
428 PyObject *v, *w;
429{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000430 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000431 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000432 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000433 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000434 PyObject *x = NULL;
435 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000436 if (PyNumber_Coerce(&v, &w) != 0)
437 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000438 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
439 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000440 Py_DECREF(v);
441 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000442 if (f != NULL)
443 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000444 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000445 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000446}
447
448PyObject *
449PyNumber_Divmod(v, w)
450 PyObject *v, *w;
451{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000452 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
453 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000454 PyObject *x = NULL;
455 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000456 if (PyNumber_Coerce(&v, &w) != 0)
457 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000458 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
459 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000460 Py_DECREF(v);
461 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000462 if (f != NULL)
463 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000464 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000465 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000466}
467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000468/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000469
470static PyObject *
471do_pow(v, w)
472 PyObject *v, *w;
473{
474 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000475 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
476 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000477 if (v->ob_type->tp_as_number == NULL ||
478 w->ob_type->tp_as_number == NULL) {
479 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000480 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000481 return NULL;
482 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000483 if (PyNumber_Coerce(&v, &w) != 0)
484 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000485 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
486 res = (*f)(v, w, Py_None);
487 else
488 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000489 Py_DECREF(v);
490 Py_DECREF(w);
491 return res;
492}
493
494PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000495PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000496 PyObject *v, *w, *z;
497{
498 PyObject *res;
499 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000500 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000501
502 if (z == Py_None)
503 return do_pow(v, w);
504 /* XXX The ternary version doesn't do class instance coercions */
505 if (PyInstance_Check(v))
506 return v->ob_type->tp_as_number->nb_power(v, w, z);
507 if (v->ob_type->tp_as_number == NULL ||
508 z->ob_type->tp_as_number == NULL ||
509 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000510 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000511 }
512 if (PyNumber_Coerce(&v, &w) != 0)
513 return NULL;
514 res = NULL;
515 v1 = v;
516 z1 = z;
517 if (PyNumber_Coerce(&v1, &z1) != 0)
518 goto error2;
519 w2 = w;
520 z2 = z1;
521 if (PyNumber_Coerce(&w2, &z2) != 0)
522 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000523 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
524 res = (*f)(v1, w2, z2);
525 else
526 res = type_error(
527 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000528 Py_DECREF(w2);
529 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000530 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000531 Py_DECREF(v1);
532 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000533 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000534 Py_DECREF(v);
535 Py_DECREF(w);
536 return res;
537}
538
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000539/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000540
541PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000542PyNumber_Negative(o)
543 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000544{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000545 PyNumberMethods *m;
546
547 if (o == NULL)
548 return null_error();
549 m = o->ob_type->tp_as_number;
550 if (m && m->nb_negative)
551 return (*m->nb_negative)(o);
552
553 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000554}
555
556PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000557PyNumber_Positive(o)
558 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000559{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000560 PyNumberMethods *m;
561
562 if (o == NULL)
563 return null_error();
564 m = o->ob_type->tp_as_number;
565 if (m && m->nb_positive)
566 return (*m->nb_positive)(o);
567
568 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000569}
570
571PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000572PyNumber_Invert(o)
573 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000574{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000575 PyNumberMethods *m;
576
577 if (o == NULL)
578 return null_error();
579 m = o->ob_type->tp_as_number;
580 if (m && m->nb_invert)
581 return (*m->nb_invert)(o);
582
583 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000584}
585
586PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000587PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000588 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000589{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000590 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000591
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000592 if (o == NULL)
593 return null_error();
594 m = o->ob_type->tp_as_number;
595 if (m && m->nb_absolute)
596 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000597
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000598 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000599}
600
601PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000602PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000603 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000604{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000605 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000606
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000607 if (o == NULL)
608 return null_error();
609 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000610 return PyInt_FromString(PyString_AS_STRING(o), NULL, 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000611 m = o->ob_type->tp_as_number;
612 if (m && m->nb_int)
613 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000614
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000615 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000616}
617
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000618/* There are two C API functions for converting a string to a long,
619 * PyNumber_Long() and PyLong_FromString(). Both are used in builtin_long,
620 * reachable from Python with the built-in function long().
621 *
622 * The difference is this: PyNumber_Long will raise an exception when the
623 * string cannot be converted to a long. The most common situation is
624 * where a float string is passed in; this raises a ValueError.
625 * PyLong_FromString does not raise an exception; it silently truncates the
626 * float to an integer.
627 *
628 * You can see the different behavior from Python with the following:
629 *
630 * long('9.5')
631 * => ValueError: invalid literal for long(): 9.5
632 *
633 * long('9.5', 10)
634 * => 9L
635 *
636 * The first example ends up calling PyNumber_Long(), while the second one
637 * calls PyLong_FromString().
638 */
639static PyObject *
640long_from_string(v)
641 PyObject *v;
642{
643 char *s, *end;
644 PyObject *x;
645 char buffer[256]; /* For errors */
646
647 s = PyString_AS_STRING(v);
648 while (*s && isspace(Py_CHARMASK(*s)))
649 s++;
650 x = PyLong_FromString(s, &end, 10);
651 if (x == NULL) {
652 if (PyErr_ExceptionMatches(PyExc_ValueError))
653 goto bad;
654 return NULL;
655 }
656 while (*end && isspace(Py_CHARMASK(*end)))
657 end++;
658 if (*end != '\0') {
659 bad:
660 sprintf(buffer, "invalid literal for long(): %.200s", s);
661 PyErr_SetString(PyExc_ValueError, buffer);
662 Py_XDECREF(x);
663 return NULL;
664 }
665 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
666 PyErr_SetString(PyExc_ValueError,
667 "null byte in argument for long()");
668 return NULL;
669 }
670 return x;
671}
672
Guido van Rossume15dee51995-07-18 14:12:02 +0000673PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000674PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000675 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000676{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000677 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000678
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000679 if (o == NULL)
680 return null_error();
681 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000682 /* need to do extra error checking that PyLong_FromString()
683 * doesn't do. In particular long('9.5') must raise an
684 * exception, not truncate the float.
685 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000686 return long_from_string(o);
687 m = o->ob_type->tp_as_number;
688 if (m && m->nb_long)
689 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000690
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000691 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000692}
693
694PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000695PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000696 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000697{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000698 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000699
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000700 if (o == NULL)
701 return null_error();
702 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000703 return PyFloat_FromString(o, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000704 m = o->ob_type->tp_as_number;
705 if (m && m->nb_float)
706 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000707
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000708 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000709}
710
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000711/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000712
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000713int
714PySequence_Check(s)
715 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000716{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000717 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000718}
719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000720int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000721PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000722 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000723{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000724 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000725
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000726 if (s == NULL) {
727 null_error();
728 return -1;
729 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000730
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000731 m = s->ob_type->tp_as_sequence;
732 if (m && m->sq_length)
733 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000734
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000735 type_error("len() of unsized object");
736 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000737}
738
739PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000740PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000741 PyObject *s;
742 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000743{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000744 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000745
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000746 if (s == NULL || o == NULL)
747 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000748
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000749 m = s->ob_type->tp_as_sequence;
750 if (m && m->sq_concat)
751 return m->sq_concat(s, o);
752
753 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000754}
755
756PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000757PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000758 PyObject *o;
759 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000760{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000761 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000762
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000763 if (o == NULL)
764 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000765
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000766 m = o->ob_type->tp_as_sequence;
767 if (m && m->sq_repeat)
768 return m->sq_repeat(o, count);
769
770 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000771}
772
773PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000774PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000775 PyObject *s;
776 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000777{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000778 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000779
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000780 if (s == NULL)
781 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000783 m = s->ob_type->tp_as_sequence;
784 if (m && m->sq_item) {
785 if (i < 0) {
786 if (m->sq_length) {
787 int l = (*m->sq_length)(s);
788 if (l < 0)
789 return NULL;
790 i += l;
791 }
792 }
793 return m->sq_item(s, i);
794 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000795
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000796 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000797}
798
799PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000800PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000801 PyObject *s;
802 int i1;
803 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000804{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000806
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000807 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000808
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000809 m = s->ob_type->tp_as_sequence;
810 if (m && m->sq_slice) {
811 if (i1 < 0 || i2 < 0) {
812 if (m->sq_length) {
813 int l = (*m->sq_length)(s);
814 if (l < 0)
815 return NULL;
816 if (i1 < 0)
817 i1 += l;
818 if (i2 < 0)
819 i2 += l;
820 }
821 }
822 return m->sq_slice(s, i1, i2);
823 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000824
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000825 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000826}
827
828int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000829PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000830 PyObject *s;
831 int i;
832 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000833{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000834 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000835
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000836 if (s == NULL) {
837 null_error();
838 return -1;
839 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000840
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000841 m = s->ob_type->tp_as_sequence;
842 if (m && m->sq_ass_item) {
843 if (i < 0) {
844 if (m->sq_length) {
845 int l = (*m->sq_length)(s);
846 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000847 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 i += l;
849 }
850 }
851 return m->sq_ass_item(s, i, o);
852 }
853
854 type_error("object doesn't support item assignment");
855 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000856}
857
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000858int
859PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000860 PyObject *s;
861 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000862{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000864
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000865 if (s == NULL) {
866 null_error();
867 return -1;
868 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000869
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000870 m = s->ob_type->tp_as_sequence;
871 if (m && m->sq_ass_item) {
872 if (i < 0) {
873 if (m->sq_length) {
874 int l = (*m->sq_length)(s);
875 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000876 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 i += l;
878 }
879 }
880 return m->sq_ass_item(s, i, (PyObject *)NULL);
881 }
882
883 type_error("object doesn't support item deletion");
884 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000885}
886
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000887int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000888PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000889 PyObject *s;
890 int i1;
891 int i2;
892 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000893{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000895
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000896 if (s == NULL) {
897 null_error();
898 return -1;
899 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000900
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000901 m = s->ob_type->tp_as_sequence;
902 if (m && m->sq_ass_slice) {
903 if (i1 < 0 || i2 < 0) {
904 if (m->sq_length) {
905 int l = (*m->sq_length)(s);
906 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000907 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 if (i1 < 0)
909 i1 += l;
910 if (i2 < 0)
911 i2 += l;
912 }
913 }
914 return m->sq_ass_slice(s, i1, i2, o);
915 }
916 type_error("object doesn't support slice assignment");
917 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000918}
919
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000920int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000921PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000922 PyObject *s;
923 int i1;
924 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000925{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000927
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 if (s == NULL) {
929 null_error();
930 return -1;
931 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000932
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000933 m = s->ob_type->tp_as_sequence;
934 if (m && m->sq_ass_slice) {
935 if (i1 < 0 || i2 < 0) {
936 if (m->sq_length) {
937 int l = (*m->sq_length)(s);
938 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000939 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000940 if (i1 < 0)
941 i1 += l;
942 if (i2 < 0)
943 i2 += l;
944 }
945 }
946 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
947 }
948 type_error("object doesn't support slice deletion");
949 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000950}
951
Guido van Rossume15dee51995-07-18 14:12:02 +0000952PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000953PySequence_Tuple(v)
954 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000955{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000957
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000958 if (v == NULL)
959 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000960
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000961 if (PyTuple_Check(v)) {
962 Py_INCREF(v);
963 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000964 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965
966 if (PyList_Check(v))
967 return PyList_AsTuple(v);
968
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000969 /* There used to be code for strings here, but tuplifying strings is
970 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000971
972 /* Generic sequence object */
973 m = v->ob_type->tp_as_sequence;
974 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 int i;
976 PyObject *t;
977 int n = PySequence_Length(v);
978 if (n < 0)
979 return NULL;
980 t = PyTuple_New(n);
981 if (t == NULL)
982 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000983 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000984 PyObject *item = (*m->sq_item)(v, i);
985 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000986 if (PyErr_ExceptionMatches(PyExc_IndexError))
987 PyErr_Clear();
988 else {
989 Py_DECREF(t);
990 t = NULL;
991 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992 break;
993 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000994 if (i >= n) {
995 if (n < 500)
996 n += 10;
997 else
998 n += 100;
999 if (_PyTuple_Resize(&t, n, 0) != 0)
1000 break;
1001 }
1002 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001004 if (i < n && t != NULL)
1005 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001006 return t;
1007 }
1008
1009 /* None of the above */
1010 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001011}
1012
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001013PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001014PySequence_List(v)
1015 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001016{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001017 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001018
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001019 if (v == NULL)
1020 return null_error();
1021
1022 if (PyList_Check(v))
1023 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1024
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025 m = v->ob_type->tp_as_sequence;
1026 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001027 int i;
1028 PyObject *l;
1029 int n = PySequence_Length(v);
1030 if (n < 0)
1031 return NULL;
1032 l = PyList_New(n);
1033 if (l == NULL)
1034 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001035 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001036 PyObject *item = (*m->sq_item)(v, i);
1037 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001038 if (PyErr_ExceptionMatches(PyExc_IndexError))
1039 PyErr_Clear();
1040 else {
1041 Py_DECREF(l);
1042 l = NULL;
1043 }
1044 break;
1045 }
1046 if (i < n)
1047 PyList_SET_ITEM(l, i, item);
1048 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001049 Py_DECREF(l);
1050 l = NULL;
1051 break;
1052 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001053 }
1054 if (i < n && l != NULL) {
1055 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1056 Py_DECREF(l);
1057 l = NULL;
1058 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001059 }
1060 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001061 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001062 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001063}
1064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001065int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001066PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067 PyObject *s;
1068 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001069{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001070 int l, i, n, cmp, err;
1071 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001072
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001073 if (s == NULL || o == NULL) {
1074 null_error();
1075 return -1;
1076 }
1077
1078 l = PySequence_Length(s);
1079 if (l < 0)
1080 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001081
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001082 n = 0;
1083 for (i = 0; i < l; i++) {
1084 item = PySequence_GetItem(s, i);
1085 if (item == NULL)
1086 return -1;
1087 err = PyObject_Cmp(item, o, &cmp);
1088 Py_DECREF(item);
1089 if (err < 0)
1090 return err;
1091 if (cmp == 0)
1092 n++;
1093 }
1094 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001095}
1096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097int
1098PySequence_Contains(w, v) /* v in w */
1099 PyObject *w;
1100 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001101{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001102 int i, cmp;
1103 PyObject *x;
1104 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001105
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 /* Special case for char in string */
1107 if (PyString_Check(w)) {
1108 register char *s, *end;
1109 register char c;
1110 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1111 PyErr_SetString(PyExc_TypeError,
1112 "string member test needs char left operand");
1113 return -1;
1114 }
1115 c = PyString_AsString(v)[0];
1116 s = PyString_AsString(w);
1117 end = s + PyString_Size(w);
1118 while (s < end) {
1119 if (c == *s++)
1120 return 1;
1121 }
1122 return 0;
1123 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001124
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001125 sq = w->ob_type->tp_as_sequence;
1126 if (sq == NULL || sq->sq_item == NULL) {
1127 PyErr_SetString(PyExc_TypeError,
1128 "'in' or 'not in' needs sequence right argument");
1129 return -1;
1130 }
1131
1132 for (i = 0; ; i++) {
1133 x = (*sq->sq_item)(w, i);
1134 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001135 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136 PyErr_Clear();
1137 break;
1138 }
1139 return -1;
1140 }
1141 cmp = PyObject_Compare(v, x);
1142 Py_XDECREF(x);
1143 if (cmp == 0)
1144 return 1;
1145 if (PyErr_Occurred())
1146 return -1;
1147 }
1148
1149 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001150}
1151
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152/* Backwards compatibility */
1153#undef PySequence_In
1154int
1155PySequence_In(w, v)
1156 PyObject *w;
1157 PyObject *v;
1158{
1159 return PySequence_Contains(w, v);
1160}
1161
1162int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001163PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 PyObject *s;
1165 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001166{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001167 int l, i, cmp, err;
1168 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001169
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170 if (s == NULL || o == NULL) {
1171 null_error();
1172 return -1;
1173 }
1174
1175 l = PySequence_Length(s);
1176 if (l < 0)
1177 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001178
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001179 for (i = 0; i < l; i++) {
1180 item = PySequence_GetItem(s, i);
1181 if (item == NULL)
1182 return -1;
1183 err = PyObject_Cmp(item, o, &cmp);
1184 Py_DECREF(item);
1185 if (err < 0)
1186 return err;
1187 if (cmp == 0)
1188 return i;
1189 }
1190
1191 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1192 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001193}
1194
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195/* Operations on mappings */
1196
1197int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001198PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001199 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001200{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001201 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001202}
1203
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001204int
1205PyMapping_Length(o)
1206 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001207{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001208 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001209
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001210 if (o == NULL) {
1211 null_error();
1212 return -1;
1213 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001214
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001215 m = o->ob_type->tp_as_mapping;
1216 if (m && m->mp_length)
1217 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001218
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001219 type_error("len() of unsized object");
1220 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001221}
1222
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001223PyObject *
1224PyMapping_GetItemString(o, key)
1225 PyObject *o;
1226 char *key;
1227{
1228 PyObject *okey, *r;
1229
1230 if (key == NULL)
1231 return null_error();
1232
1233 okey = PyString_FromString(key);
1234 if (okey == NULL)
1235 return NULL;
1236 r = PyObject_GetItem(o, okey);
1237 Py_DECREF(okey);
1238 return r;
1239}
1240
1241int
1242PyMapping_SetItemString(o, key, value)
1243 PyObject *o;
1244 char *key;
1245 PyObject *value;
1246{
1247 PyObject *okey;
1248 int r;
1249
1250 if (key == NULL) {
1251 null_error();
1252 return -1;
1253 }
1254
1255 okey = PyString_FromString(key);
1256 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001257 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001258 r = PyObject_SetItem(o, okey, value);
1259 Py_DECREF(okey);
1260 return r;
1261}
1262
1263int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001264PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265 PyObject *o;
1266 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001267{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001268 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001269
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001270 v = PyMapping_GetItemString(o, key);
1271 if (v) {
1272 Py_DECREF(v);
1273 return 1;
1274 }
1275 PyErr_Clear();
1276 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001277}
1278
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001280PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281 PyObject *o;
1282 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001283{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001284 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001285
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001286 v = PyObject_GetItem(o, key);
1287 if (v) {
1288 Py_DECREF(v);
1289 return 1;
1290 }
1291 PyErr_Clear();
1292 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001293}
1294
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001295/* Operations on callable objects */
1296
1297/* XXX PyCallable_Check() is in object.c */
1298
Guido van Rossume15dee51995-07-18 14:12:02 +00001299PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001300PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001302{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 PyObject *r;
1304 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306 if (args == NULL) {
1307 args = PyTuple_New(0);
1308 if (args == NULL)
1309 return NULL;
1310 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001311
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 r = PyEval_CallObject(o, args);
1313
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001314 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001315 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001316 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001317
1318 return r;
1319}
Guido van Rossume15dee51995-07-18 14:12:02 +00001320
1321PyObject *
1322#ifdef HAVE_STDARG_PROTOTYPES
1323/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001325#else
1326/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001327 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001328#endif
1329{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330 va_list va;
1331 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001332#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001334#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 PyObject *callable;
1336 char *format;
1337 va_start(va);
1338 callable = va_arg(va, PyObject *);
1339 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001340#endif
1341
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342 if (callable == NULL) {
1343 va_end(va);
1344 return null_error();
1345 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001346
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001347 if (format)
1348 args = Py_VaBuildValue(format, va);
1349 else
1350 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001351
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001352 va_end(va);
1353
1354 if (args == NULL)
1355 return NULL;
1356
1357 if (!PyTuple_Check(args)) {
1358 PyObject *a;
1359
1360 a = PyTuple_New(1);
1361 if (a == NULL)
1362 return NULL;
1363 if (PyTuple_SetItem(a, 0, args) < 0)
1364 return NULL;
1365 args = a;
1366 }
1367 retval = PyObject_CallObject(callable, args);
1368
1369 Py_DECREF(args);
1370
1371 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001372}
1373
1374PyObject *
1375#ifdef HAVE_STDARG_PROTOTYPES
1376/* VARARGS 2 */
1377PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1378#else
1379/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001381#endif
1382{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001383 va_list va;
1384 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001385#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001386 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001387#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001388 PyObject *o;
1389 char *name;
1390 char *format;
1391 va_start(va);
1392 o = va_arg(va, PyObject *);
1393 name = va_arg(va, char *);
1394 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001395#endif
1396
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 if (o == NULL || name == NULL) {
1398 va_end(va);
1399 return null_error();
1400 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001401
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 func = PyObject_GetAttrString(o, name);
1403 if (func == NULL) {
1404 va_end(va);
1405 PyErr_SetString(PyExc_AttributeError, name);
1406 return 0;
1407 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001408
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409 if (!PyCallable_Check(func)) {
1410 va_end(va);
1411 return type_error("call of non-callable attribute");
1412 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001413
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001414 if (format && *format)
1415 args = Py_VaBuildValue(format, va);
1416 else
1417 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001418
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001420
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001421 if (!args)
1422 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 if (!PyTuple_Check(args)) {
1425 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001426
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 a = PyTuple_New(1);
1428 if (a == NULL)
1429 return NULL;
1430 if (PyTuple_SetItem(a, 0, args) < 0)
1431 return NULL;
1432 args = a;
1433 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001434
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001436
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 Py_DECREF(args);
1438 Py_DECREF(func);
1439
1440 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001441}