blob: cfa4cc839c8c7c7570b829502d338138b5e7b5d1 [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/* Copied with modifications from stropmodule.c: atoi, atof, atol */
Guido van Rossume15dee51995-07-18 14:12:02 +000057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000058static PyObject *
59int_from_string(v)
60 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
63 char *s, *end;
64 long x;
65 char buffer[256]; /* For errors */
66
67 s = PyString_AS_STRING(v);
68 while (*s && isspace(Py_CHARMASK(*s)))
69 s++;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 errno = 0;
71 x = PyOS_strtol(s, &end, 10);
Guido van Rossum3b2b3471998-06-22 03:54:15 +000072 if (end == s || !isdigit(end[-1])) {
73 PyErr_SetString(PyExc_ValueError, "no digits in int constant");
74 return NULL;
75 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000076 while (*end && isspace(Py_CHARMASK(*end)))
77 end++;
78 if (*end != '\0') {
79 sprintf(buffer, "invalid literal for int(): %.200s", s);
80 PyErr_SetString(PyExc_ValueError, buffer);
81 return NULL;
82 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +000083 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000084 PyErr_SetString(PyExc_ValueError,
85 "null byte in argument for int()");
86 return NULL;
87 }
88 else if (errno != 0) {
89 sprintf(buffer, "int() literal too large: %.200s", s);
90 PyErr_SetString(PyExc_ValueError, buffer);
91 return NULL;
92 }
93 return PyInt_FromLong(x);
94}
95
96static PyObject *
97long_from_string(v)
98 PyObject *v;
99{
100 char *s, *end;
101 PyObject *x;
102 char buffer[256]; /* For errors */
103
104 s = PyString_AS_STRING(v);
105 while (*s && isspace(Py_CHARMASK(*s)))
106 s++;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000107 x = PyLong_FromString(s, &end, 10);
108 if (x == NULL)
109 return NULL;
110 while (*end && isspace(Py_CHARMASK(*end)))
111 end++;
112 if (*end != '\0') {
113 sprintf(buffer, "invalid literal for long(): %.200s", s);
114 PyErr_SetString(PyExc_ValueError, buffer);
115 Py_DECREF(x);
116 return NULL;
117 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000118 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000119 PyErr_SetString(PyExc_ValueError,
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000120 "null byte in argument for long()");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000121 return NULL;
122 }
123 return x;
124}
125
126static PyObject *
127float_from_string(v)
128 PyObject *v;
129{
130 extern double strtod Py_PROTO((const char *, char **));
131 char *s, *end;
132 double x;
133 char buffer[256]; /* For errors */
134
135 s = PyString_AS_STRING(v);
136 while (*s && isspace(Py_CHARMASK(*s)))
137 s++;
138 if (s[0] == '\0') {
139 PyErr_SetString(PyExc_ValueError, "empty string for float()");
140 return NULL;
141 }
142 errno = 0;
143 PyFPE_START_PROTECT("float_from_string", return 0)
144 x = strtod(s, &end);
145 PyFPE_END_PROTECT(x)
146 while (*end && isspace(Py_CHARMASK(*end)))
147 end++;
148 if (*end != '\0') {
149 sprintf(buffer, "invalid literal for float(): %.200s", s);
150 PyErr_SetString(PyExc_ValueError, buffer);
151 return NULL;
152 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000153 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000154 PyErr_SetString(PyExc_ValueError,
155 "null byte in argument for float()");
156 return NULL;
157 }
158 else if (errno != 0) {
159 sprintf(buffer, "float() literal too large: %.200s", s);
160 PyErr_SetString(PyExc_ValueError, buffer);
161 return NULL;
162 }
163 return PyFloat_FromDouble(x);
164}
165
166/* Operations on any object */
167
168int
169PyObject_Cmp(o1, o2, result)
170 PyObject *o1;
171 PyObject *o2;
172 int *result;
173{
174 int r;
175
176 if (o1 == NULL || o2 == NULL) {
177 null_error();
178 return -1;
179 }
180 r = PyObject_Compare(o1, o2);
181 if (PyErr_Occurred())
182 return -1;
183 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +0000184 return 0;
185}
Guido van Rossume15dee51995-07-18 14:12:02 +0000186
187PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000188PyObject_Type(o)
189 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000190{
191 PyObject *v;
192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000193 if (o == NULL)
194 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000195 v = (PyObject *)o->ob_type;
196 Py_INCREF(v);
197 return v;
198}
199
200int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000201PyObject_Length(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000202 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000203{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000204 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000205
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000206 if (o == NULL) {
207 null_error();
208 return -1;
209 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000210
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000211 m = o->ob_type->tp_as_sequence;
212 if (m && m->sq_length)
213 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000214
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000215 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000216}
217
218PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000219PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000220 PyObject *o;
221 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000222{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000223 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000224
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000225 if (o == NULL || key == NULL)
226 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000227
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000228 m = o->ob_type->tp_as_mapping;
229 if (m && m->mp_subscript)
230 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000232 if (PyInt_Check(key))
233 return PySequence_GetItem(o, PyInt_AsLong(key));
234
235 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000236}
237
238int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000239PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000240 PyObject *o;
241 PyObject *key;
242 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000243{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000244 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000245
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000246 if (o == NULL || key == NULL || value == NULL) {
247 null_error();
248 return -1;
249 }
250 m = o->ob_type->tp_as_mapping;
251 if (m && m->mp_ass_subscript)
252 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000253
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000254 if (PyInt_Check(key))
255 return PySequence_SetItem(o, PyInt_AsLong(key), value);
256
257 type_error("object does not support item assignment");
258 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000259}
260
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000261int
262PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000263 PyObject *o;
264 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000265{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000266 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000267
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000268 if (o == NULL || key == NULL) {
269 null_error();
270 return -1;
271 }
272 m = o->ob_type->tp_as_mapping;
273 if (m && m->mp_ass_subscript)
274 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000275
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000276 if (PyInt_Check(key))
277 return PySequence_DelItem(o, PyInt_AsLong(key));
278
279 type_error("object does not support item deletion");
280 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000281}
282
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000283/* Operations on numbers */
284
285int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000286PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000287 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000288{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000289 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000290}
291
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000292/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000293
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000294#define BINOP(v, w, opname, ropname, thisfunc) \
295 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000296 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
297
298PyObject *
299PyNumber_Or(v, w)
300 PyObject *v, *w;
301{
302 extern int PyNumber_Coerce();
303
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000304 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000305 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000306 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000307 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
308 if (PyNumber_Coerce(&v, &w) != 0)
309 return NULL;
310 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
311 x = (*f)(v, w);
312 Py_DECREF(v);
313 Py_DECREF(w);
314 if (f != NULL)
315 return x;
316 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000317 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000318}
319
320PyObject *
321PyNumber_Xor(v, w)
322 PyObject *v, *w;
323{
324 extern int PyNumber_Coerce();
325
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000326 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000327 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000328 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000329 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
330 if (PyNumber_Coerce(&v, &w) != 0)
331 return NULL;
332 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
333 x = (*f)(v, w);
334 Py_DECREF(v);
335 Py_DECREF(w);
336 if (f != NULL)
337 return x;
338 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000339 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000340}
341
342PyObject *
343PyNumber_And(v, w)
344 PyObject *v, *w;
345{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000346 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000347 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000348 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000349 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
350 if (PyNumber_Coerce(&v, &w) != 0)
351 return NULL;
352 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
353 x = (*f)(v, w);
354 Py_DECREF(v);
355 Py_DECREF(w);
356 if (f != NULL)
357 return x;
358 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000359 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000360}
361
362PyObject *
363PyNumber_Lshift(v, w)
364 PyObject *v, *w;
365{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000366 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000367 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000368 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000369 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
370 if (PyNumber_Coerce(&v, &w) != 0)
371 return NULL;
372 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
373 x = (*f)(v, w);
374 Py_DECREF(v);
375 Py_DECREF(w);
376 if (f != NULL)
377 return x;
378 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000379 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000380}
381
382PyObject *
383PyNumber_Rshift(v, w)
384 PyObject *v, *w;
385{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000386 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000387 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000388 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000389 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
390 if (PyNumber_Coerce(&v, &w) != 0)
391 return NULL;
392 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
393 x = (*f)(v, w);
394 Py_DECREF(v);
395 Py_DECREF(w);
396 if (f != NULL)
397 return x;
398 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000399 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000400}
401
402PyObject *
403PyNumber_Add(v, w)
404 PyObject *v, *w;
405{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000406 PySequenceMethods *m;
407
408 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
409 m = v->ob_type->tp_as_sequence;
410 if (m && m->sq_concat)
411 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000412 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000413 PyObject *x = NULL;
414 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000415 if (PyNumber_Coerce(&v, &w) != 0)
416 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000417 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
418 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000419 Py_DECREF(v);
420 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000421 if (f != NULL)
422 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000423 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000424 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000425}
426
427PyObject *
428PyNumber_Subtract(v, w)
429 PyObject *v, *w;
430{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000431 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000432 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000433 PyObject *x = NULL;
434 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000435 if (PyNumber_Coerce(&v, &w) != 0)
436 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000437 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
438 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000439 Py_DECREF(v);
440 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000441 if (f != NULL)
442 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000443 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000444 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000445}
446
447PyObject *
448PyNumber_Multiply(v, w)
449 PyObject *v, *w;
450{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000451 PyTypeObject *tp = v->ob_type;
452 PySequenceMethods *m;
453
454 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000455 if (tp->tp_as_number != NULL &&
456 w->ob_type->tp_as_sequence != NULL &&
457 !PyInstance_Check(v)) {
458 /* number*sequence -- swap v and w */
459 PyObject *tmp = v;
460 v = w;
461 w = tmp;
462 tp = v->ob_type;
463 }
464 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000465 PyObject *x = NULL;
466 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000467 if (PyInstance_Check(v)) {
468 /* Instances of user-defined classes get their
469 other argument uncoerced, so they may
470 implement sequence*number as well as
471 number*number. */
472 Py_INCREF(v);
473 Py_INCREF(w);
474 }
475 else if (PyNumber_Coerce(&v, &w) != 0)
476 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000477 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
478 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000479 Py_DECREF(v);
480 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000481 if (f != NULL)
482 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000483 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000484 m = tp->tp_as_sequence;
485 if (m && m->sq_repeat) {
486 if (!PyInt_Check(w))
487 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000488 "can't multiply sequence with non-int");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000489 return (*m->sq_repeat)(v, (int)PyInt_AsLong(w));
Guido van Rossume15dee51995-07-18 14:12:02 +0000490 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000491 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000492}
493
494PyObject *
495PyNumber_Divide(v, w)
496 PyObject *v, *w;
497{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000498 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000499 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000500 PyObject *x = NULL;
501 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000502 if (PyNumber_Coerce(&v, &w) != 0)
503 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000504 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
505 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000506 Py_DECREF(v);
507 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000508 if (f != NULL)
509 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000510 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000511 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000512}
513
514PyObject *
515PyNumber_Remainder(v, w)
516 PyObject *v, *w;
517{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000518 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000519 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000520 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000521 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000522 PyObject *x = NULL;
523 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000524 if (PyNumber_Coerce(&v, &w) != 0)
525 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000526 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
527 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000528 Py_DECREF(v);
529 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000530 if (f != NULL)
531 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000532 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000533 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000534}
535
536PyObject *
537PyNumber_Divmod(v, w)
538 PyObject *v, *w;
539{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000540 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
541 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000542 PyObject *x = NULL;
543 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000544 if (PyNumber_Coerce(&v, &w) != 0)
545 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000546 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
547 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000548 Py_DECREF(v);
549 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000550 if (f != NULL)
551 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000552 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000553 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000554}
555
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000556/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000557
558static PyObject *
559do_pow(v, w)
560 PyObject *v, *w;
561{
562 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000563 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
564 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000565 if (v->ob_type->tp_as_number == NULL ||
566 w->ob_type->tp_as_number == NULL) {
567 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000568 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000569 return NULL;
570 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000571 if (
572#ifndef WITHOUT_COMPLEX
573 !PyComplex_Check(v) &&
574#endif
575 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
Guido van Rossume15dee51995-07-18 14:12:02 +0000576 if (!PyErr_Occurred())
577 PyErr_SetString(PyExc_ValueError,
578 "negative number to float power");
579 return NULL;
580 }
581 if (PyNumber_Coerce(&v, &w) != 0)
582 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000583 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
584 res = (*f)(v, w, Py_None);
585 else
586 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000587 Py_DECREF(v);
588 Py_DECREF(w);
589 return res;
590}
591
592PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000593PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000594 PyObject *v, *w, *z;
595{
596 PyObject *res;
597 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000598 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000599
600 if (z == Py_None)
601 return do_pow(v, w);
602 /* XXX The ternary version doesn't do class instance coercions */
603 if (PyInstance_Check(v))
604 return v->ob_type->tp_as_number->nb_power(v, w, z);
605 if (v->ob_type->tp_as_number == NULL ||
606 z->ob_type->tp_as_number == NULL ||
607 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000608 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000609 }
610 if (PyNumber_Coerce(&v, &w) != 0)
611 return NULL;
612 res = NULL;
613 v1 = v;
614 z1 = z;
615 if (PyNumber_Coerce(&v1, &z1) != 0)
616 goto error2;
617 w2 = w;
618 z2 = z1;
619 if (PyNumber_Coerce(&w2, &z2) != 0)
620 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000621 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
622 res = (*f)(v1, w2, z2);
623 else
624 res = type_error(
625 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000626 Py_DECREF(w2);
627 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000628 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000629 Py_DECREF(v1);
630 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000631 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000632 Py_DECREF(v);
633 Py_DECREF(w);
634 return res;
635}
636
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000637/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000638
639PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000640PyNumber_Negative(o)
641 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000642{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000643 PyNumberMethods *m;
644
645 if (o == NULL)
646 return null_error();
647 m = o->ob_type->tp_as_number;
648 if (m && m->nb_negative)
649 return (*m->nb_negative)(o);
650
651 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000652}
653
654PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000655PyNumber_Positive(o)
656 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000657{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000658 PyNumberMethods *m;
659
660 if (o == NULL)
661 return null_error();
662 m = o->ob_type->tp_as_number;
663 if (m && m->nb_positive)
664 return (*m->nb_positive)(o);
665
666 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000667}
668
669PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000670PyNumber_Invert(o)
671 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000672{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000673 PyNumberMethods *m;
674
675 if (o == NULL)
676 return null_error();
677 m = o->ob_type->tp_as_number;
678 if (m && m->nb_invert)
679 return (*m->nb_invert)(o);
680
681 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000682}
683
684PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000685PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000686 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000687{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000688 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000689
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000690 if (o == NULL)
691 return null_error();
692 m = o->ob_type->tp_as_number;
693 if (m && m->nb_absolute)
694 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000695
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000696 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000697}
698
699PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000700PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000701 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000702{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000703 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000704
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000705 if (o == NULL)
706 return null_error();
707 if (PyString_Check(o))
708 return int_from_string(o);
709 m = o->ob_type->tp_as_number;
710 if (m && m->nb_int)
711 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000712
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000713 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000714}
715
716PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000717PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000718 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000719{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000720 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000721
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000722 if (o == NULL)
723 return null_error();
724 if (PyString_Check(o))
725 return long_from_string(o);
726 m = o->ob_type->tp_as_number;
727 if (m && m->nb_long)
728 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000729
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000730 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000731}
732
733PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000734PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000735 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000736{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000737 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000738
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000739 if (o == NULL)
740 return null_error();
741 if (PyString_Check(o))
742 return float_from_string(o);
743 m = o->ob_type->tp_as_number;
744 if (m && m->nb_float)
745 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000746
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000747 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000748}
749
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000750/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000751
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000752int
753PySequence_Check(s)
754 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000755{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000756 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000757}
758
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000759int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000760PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000761 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000762{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000763 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000764
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000765 if (s == NULL) {
766 null_error();
767 return -1;
768 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000769
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000770 m = s->ob_type->tp_as_sequence;
771 if (m && m->sq_length)
772 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000773
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000774 type_error("len() of unsized object");
775 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000776}
777
778PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000779PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000780 PyObject *s;
781 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000782{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000783 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000784
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000785 if (s == NULL || o == NULL)
786 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000787
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000788 m = s->ob_type->tp_as_sequence;
789 if (m && m->sq_concat)
790 return m->sq_concat(s, o);
791
792 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000793}
794
795PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000796PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000797 PyObject *o;
798 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000799{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000800 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000801
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000802 if (o == NULL)
803 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000804
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805 m = o->ob_type->tp_as_sequence;
806 if (m && m->sq_repeat)
807 return m->sq_repeat(o, count);
808
809 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000810}
811
812PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000813PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000814 PyObject *s;
815 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000816{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000817 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000818
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 if (s == NULL)
820 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000821
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000822 m = s->ob_type->tp_as_sequence;
823 if (m && m->sq_item) {
824 if (i < 0) {
825 if (m->sq_length) {
826 int l = (*m->sq_length)(s);
827 if (l < 0)
828 return NULL;
829 i += l;
830 }
831 }
832 return m->sq_item(s, i);
833 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000834
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000835 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000836}
837
838PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000839PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000840 PyObject *s;
841 int i1;
842 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000843{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000844 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000845
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000846 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000847
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 m = s->ob_type->tp_as_sequence;
849 if (m && m->sq_slice) {
850 if (i1 < 0 || i2 < 0) {
851 if (m->sq_length) {
852 int l = (*m->sq_length)(s);
853 if (l < 0)
854 return NULL;
855 if (i1 < 0)
856 i1 += l;
857 if (i2 < 0)
858 i2 += l;
859 }
860 }
861 return m->sq_slice(s, i1, i2);
862 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000863
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000865}
866
867int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000868PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000869 PyObject *s;
870 int i;
871 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000872{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000873 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000874
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000875 if (s == NULL) {
876 null_error();
877 return -1;
878 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000879
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000880 m = s->ob_type->tp_as_sequence;
881 if (m && m->sq_ass_item) {
882 if (i < 0) {
883 if (m->sq_length) {
884 int l = (*m->sq_length)(s);
885 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000886 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000887 i += l;
888 }
889 }
890 return m->sq_ass_item(s, i, o);
891 }
892
893 type_error("object doesn't support item assignment");
894 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000895}
896
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000897int
898PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000899 PyObject *s;
900 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000901{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000902 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000903
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000904 if (s == NULL) {
905 null_error();
906 return -1;
907 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000908
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000909 m = s->ob_type->tp_as_sequence;
910 if (m && m->sq_ass_item) {
911 if (i < 0) {
912 if (m->sq_length) {
913 int l = (*m->sq_length)(s);
914 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000915 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000916 i += l;
917 }
918 }
919 return m->sq_ass_item(s, i, (PyObject *)NULL);
920 }
921
922 type_error("object doesn't support item deletion");
923 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000924}
925
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000927PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 PyObject *s;
929 int i1;
930 int i2;
931 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000932{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000933 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000934
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 if (s == NULL) {
936 null_error();
937 return -1;
938 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000939
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000940 m = s->ob_type->tp_as_sequence;
941 if (m && m->sq_ass_slice) {
942 if (i1 < 0 || i2 < 0) {
943 if (m->sq_length) {
944 int l = (*m->sq_length)(s);
945 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000946 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 if (i1 < 0)
948 i1 += l;
949 if (i2 < 0)
950 i2 += l;
951 }
952 }
953 return m->sq_ass_slice(s, i1, i2, o);
954 }
955 type_error("object doesn't support slice assignment");
956 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000957}
958
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000959int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000960PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000961 PyObject *s;
962 int i1;
963 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000964{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000966
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000967 if (s == NULL) {
968 null_error();
969 return -1;
970 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000971
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000972 m = s->ob_type->tp_as_sequence;
973 if (m && m->sq_ass_slice) {
974 if (i1 < 0 || i2 < 0) {
975 if (m->sq_length) {
976 int l = (*m->sq_length)(s);
977 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000978 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 if (i1 < 0)
980 i1 += l;
981 if (i2 < 0)
982 i2 += l;
983 }
984 }
985 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
986 }
987 type_error("object doesn't support slice deletion");
988 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000989}
990
Guido van Rossume15dee51995-07-18 14:12:02 +0000991PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992PySequence_Tuple(v)
993 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000994{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000995 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000996
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000997 if (v == NULL)
998 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000999
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001000 if (PyTuple_Check(v)) {
1001 Py_INCREF(v);
1002 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001003 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001004
1005 if (PyList_Check(v))
1006 return PyList_AsTuple(v);
1007
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001008 /* There used to be code for strings here, but tuplifying strings is
1009 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001010
1011 /* Generic sequence object */
1012 m = v->ob_type->tp_as_sequence;
1013 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001014 int i;
1015 PyObject *t;
1016 int n = PySequence_Length(v);
1017 if (n < 0)
1018 return NULL;
1019 t = PyTuple_New(n);
1020 if (t == NULL)
1021 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001022 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023 PyObject *item = (*m->sq_item)(v, i);
1024 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001025 if (PyErr_ExceptionMatches(PyExc_IndexError))
1026 PyErr_Clear();
1027 else {
1028 Py_DECREF(t);
1029 t = NULL;
1030 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001031 break;
1032 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001033 if (i >= n) {
1034 if (n < 500)
1035 n += 10;
1036 else
1037 n += 100;
1038 if (_PyTuple_Resize(&t, n, 0) != 0)
1039 break;
1040 }
1041 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001042 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001043 if (i < n && t != NULL)
1044 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001045 return t;
1046 }
1047
1048 /* None of the above */
1049 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001050}
1051
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001052PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001053PySequence_List(v)
1054 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001055{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001057
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001058 if (v == NULL)
1059 return null_error();
1060
1061 if (PyList_Check(v))
1062 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 m = v->ob_type->tp_as_sequence;
1065 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066 int i;
1067 PyObject *l;
1068 int n = PySequence_Length(v);
1069 if (n < 0)
1070 return NULL;
1071 l = PyList_New(n);
1072 if (l == NULL)
1073 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001074 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001075 PyObject *item = (*m->sq_item)(v, i);
1076 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001077 if (PyErr_ExceptionMatches(PyExc_IndexError))
1078 PyErr_Clear();
1079 else {
1080 Py_DECREF(l);
1081 l = NULL;
1082 }
1083 break;
1084 }
1085 if (i < n)
1086 PyList_SET_ITEM(l, i, item);
1087 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001088 Py_DECREF(l);
1089 l = NULL;
1090 break;
1091 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001092 }
1093 if (i < n && l != NULL) {
1094 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1095 Py_DECREF(l);
1096 l = NULL;
1097 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001098 }
1099 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001100 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001101 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001102}
1103
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001105PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 PyObject *s;
1107 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001108{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 int l, i, n, cmp, err;
1110 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001111
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001112 if (s == NULL || o == NULL) {
1113 null_error();
1114 return -1;
1115 }
1116
1117 l = PySequence_Length(s);
1118 if (l < 0)
1119 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001120
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001121 n = 0;
1122 for (i = 0; i < l; i++) {
1123 item = PySequence_GetItem(s, i);
1124 if (item == NULL)
1125 return -1;
1126 err = PyObject_Cmp(item, o, &cmp);
1127 Py_DECREF(item);
1128 if (err < 0)
1129 return err;
1130 if (cmp == 0)
1131 n++;
1132 }
1133 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001134}
1135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136int
1137PySequence_Contains(w, v) /* v in w */
1138 PyObject *w;
1139 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001140{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001141 int i, cmp;
1142 PyObject *x;
1143 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001144
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001145 /* Special case for char in string */
1146 if (PyString_Check(w)) {
1147 register char *s, *end;
1148 register char c;
1149 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1150 PyErr_SetString(PyExc_TypeError,
1151 "string member test needs char left operand");
1152 return -1;
1153 }
1154 c = PyString_AsString(v)[0];
1155 s = PyString_AsString(w);
1156 end = s + PyString_Size(w);
1157 while (s < end) {
1158 if (c == *s++)
1159 return 1;
1160 }
1161 return 0;
1162 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001163
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 sq = w->ob_type->tp_as_sequence;
1165 if (sq == NULL || sq->sq_item == NULL) {
1166 PyErr_SetString(PyExc_TypeError,
1167 "'in' or 'not in' needs sequence right argument");
1168 return -1;
1169 }
1170
1171 for (i = 0; ; i++) {
1172 x = (*sq->sq_item)(w, i);
1173 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001174 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001175 PyErr_Clear();
1176 break;
1177 }
1178 return -1;
1179 }
1180 cmp = PyObject_Compare(v, x);
1181 Py_XDECREF(x);
1182 if (cmp == 0)
1183 return 1;
1184 if (PyErr_Occurred())
1185 return -1;
1186 }
1187
1188 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001189}
1190
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001191/* Backwards compatibility */
1192#undef PySequence_In
1193int
1194PySequence_In(w, v)
1195 PyObject *w;
1196 PyObject *v;
1197{
1198 return PySequence_Contains(w, v);
1199}
1200
1201int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001202PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001203 PyObject *s;
1204 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001205{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001206 int l, i, cmp, err;
1207 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001208
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209 if (s == NULL || o == NULL) {
1210 null_error();
1211 return -1;
1212 }
1213
1214 l = PySequence_Length(s);
1215 if (l < 0)
1216 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001217
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218 for (i = 0; i < l; i++) {
1219 item = PySequence_GetItem(s, i);
1220 if (item == NULL)
1221 return -1;
1222 err = PyObject_Cmp(item, o, &cmp);
1223 Py_DECREF(item);
1224 if (err < 0)
1225 return err;
1226 if (cmp == 0)
1227 return i;
1228 }
1229
1230 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1231 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001232}
1233
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001234/* Operations on mappings */
1235
1236int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001237PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001239{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001241}
1242
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243int
1244PyMapping_Length(o)
1245 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001246{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001248
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001249 if (o == NULL) {
1250 null_error();
1251 return -1;
1252 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001253
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254 m = o->ob_type->tp_as_mapping;
1255 if (m && m->mp_length)
1256 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001257
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001258 type_error("len() of unsized object");
1259 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001260}
1261
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262PyObject *
1263PyMapping_GetItemString(o, key)
1264 PyObject *o;
1265 char *key;
1266{
1267 PyObject *okey, *r;
1268
1269 if (key == NULL)
1270 return null_error();
1271
1272 okey = PyString_FromString(key);
1273 if (okey == NULL)
1274 return NULL;
1275 r = PyObject_GetItem(o, okey);
1276 Py_DECREF(okey);
1277 return r;
1278}
1279
1280int
1281PyMapping_SetItemString(o, key, value)
1282 PyObject *o;
1283 char *key;
1284 PyObject *value;
1285{
1286 PyObject *okey;
1287 int r;
1288
1289 if (key == NULL) {
1290 null_error();
1291 return -1;
1292 }
1293
1294 okey = PyString_FromString(key);
1295 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001296 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 r = PyObject_SetItem(o, okey, value);
1298 Py_DECREF(okey);
1299 return r;
1300}
1301
1302int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001303PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 PyObject *o;
1305 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001306{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001308
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309 v = PyMapping_GetItemString(o, key);
1310 if (v) {
1311 Py_DECREF(v);
1312 return 1;
1313 }
1314 PyErr_Clear();
1315 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001316}
1317
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001319PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001320 PyObject *o;
1321 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001322{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001324
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001325 v = PyObject_GetItem(o, key);
1326 if (v) {
1327 Py_DECREF(v);
1328 return 1;
1329 }
1330 PyErr_Clear();
1331 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001332}
1333
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001334/* Operations on callable objects */
1335
1336/* XXX PyCallable_Check() is in object.c */
1337
Guido van Rossume15dee51995-07-18 14:12:02 +00001338PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001339PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001340 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001341{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342 PyObject *r;
1343 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001344
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 if (args == NULL) {
1346 args = PyTuple_New(0);
1347 if (args == NULL)
1348 return NULL;
1349 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001350
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001351 r = PyEval_CallObject(o, args);
1352
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001353 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001355 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001356
1357 return r;
1358}
Guido van Rossume15dee51995-07-18 14:12:02 +00001359
1360PyObject *
1361#ifdef HAVE_STDARG_PROTOTYPES
1362/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001363PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001364#else
1365/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001366 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001367#endif
1368{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369 va_list va;
1370 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001371#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001373#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374 PyObject *callable;
1375 char *format;
1376 va_start(va);
1377 callable = va_arg(va, PyObject *);
1378 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001379#endif
1380
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 if (callable == NULL) {
1382 va_end(va);
1383 return null_error();
1384 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001385
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001386 if (format)
1387 args = Py_VaBuildValue(format, va);
1388 else
1389 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001390
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391 va_end(va);
1392
1393 if (args == NULL)
1394 return NULL;
1395
1396 if (!PyTuple_Check(args)) {
1397 PyObject *a;
1398
1399 a = PyTuple_New(1);
1400 if (a == NULL)
1401 return NULL;
1402 if (PyTuple_SetItem(a, 0, args) < 0)
1403 return NULL;
1404 args = a;
1405 }
1406 retval = PyObject_CallObject(callable, args);
1407
1408 Py_DECREF(args);
1409
1410 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001411}
1412
1413PyObject *
1414#ifdef HAVE_STDARG_PROTOTYPES
1415/* VARARGS 2 */
1416PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1417#else
1418/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001420#endif
1421{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001422 va_list va;
1423 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001424#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001426#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 PyObject *o;
1428 char *name;
1429 char *format;
1430 va_start(va);
1431 o = va_arg(va, PyObject *);
1432 name = va_arg(va, char *);
1433 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001434#endif
1435
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436 if (o == NULL || name == NULL) {
1437 va_end(va);
1438 return null_error();
1439 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001440
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001441 func = PyObject_GetAttrString(o, name);
1442 if (func == NULL) {
1443 va_end(va);
1444 PyErr_SetString(PyExc_AttributeError, name);
1445 return 0;
1446 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001447
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001448 if (!PyCallable_Check(func)) {
1449 va_end(va);
1450 return type_error("call of non-callable attribute");
1451 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001452
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 if (format && *format)
1454 args = Py_VaBuildValue(format, va);
1455 else
1456 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001457
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001458 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001459
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 if (!args)
1461 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001462
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001463 if (!PyTuple_Check(args)) {
1464 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001465
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 a = PyTuple_New(1);
1467 if (a == NULL)
1468 return NULL;
1469 if (PyTuple_SetItem(a, 0, args) < 0)
1470 return NULL;
1471 args = a;
1472 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001473
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001475
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001476 Py_DECREF(args);
1477 Py_DECREF(func);
1478
1479 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001480}