blob: 086987ef16312486b748bf31311cecab83f75cba [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
1008 if (PyString_Check(v)) {
1009 int n = PyString_Size(v);
1010 PyObject *t = PyTuple_New(n);
1011 if (t != NULL) {
1012 int i;
1013 char *p = PyString_AsString(v);
1014 for (i = 0; i < n; i++) {
1015 PyObject *item =
1016 PyString_FromStringAndSize(p+i, 1);
1017 if (item == NULL) {
1018 Py_DECREF(t);
1019 t = NULL;
1020 break;
1021 }
1022 PyTuple_SetItem(t, i, item);
1023 }
1024 }
1025 return t;
1026 }
1027
1028 /* Generic sequence object */
1029 m = v->ob_type->tp_as_sequence;
1030 if (m && m->sq_item) {
1031 /* XXX Should support indefinite-length sequences */
1032 int i;
1033 PyObject *t;
1034 int n = PySequence_Length(v);
1035 if (n < 0)
1036 return NULL;
1037 t = PyTuple_New(n);
1038 if (t == NULL)
1039 return NULL;
1040 for (i = 0; i < n; i++) {
1041 PyObject *item = (*m->sq_item)(v, i);
1042 if (item == NULL) {
1043 Py_DECREF(t);
1044 t = NULL;
1045 break;
1046 }
1047 PyTuple_SetItem(t, i, item);
1048 }
1049 return t;
1050 }
1051
1052 /* None of the above */
1053 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001054}
1055
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001056PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001057PySequence_List(v)
1058 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001059{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001060 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001061
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001062 m = v->ob_type->tp_as_sequence;
1063 if (m && m->sq_item) {
1064 /* XXX Should support indefinite-length sequences */
1065 int i;
1066 PyObject *l;
1067 int n = PySequence_Length(v);
1068 if (n < 0)
1069 return NULL;
1070 l = PyList_New(n);
1071 if (l == NULL)
1072 return NULL;
1073 for (i = 0; i < n; i++) {
1074 PyObject *item = (*m->sq_item)(v, i);
1075 if (item == NULL) {
1076 Py_DECREF(l);
1077 l = NULL;
1078 break;
1079 }
1080 PyList_SetItem(l, i, item);
1081 }
1082 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001083 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001084 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001085}
1086
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001087int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001088PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001089 PyObject *s;
1090 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001091{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001092 int l, i, n, cmp, err;
1093 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001094
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095 if (s == NULL || o == NULL) {
1096 null_error();
1097 return -1;
1098 }
1099
1100 l = PySequence_Length(s);
1101 if (l < 0)
1102 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001103
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 n = 0;
1105 for (i = 0; i < l; i++) {
1106 item = PySequence_GetItem(s, i);
1107 if (item == NULL)
1108 return -1;
1109 err = PyObject_Cmp(item, o, &cmp);
1110 Py_DECREF(item);
1111 if (err < 0)
1112 return err;
1113 if (cmp == 0)
1114 n++;
1115 }
1116 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001117}
1118
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001119int
1120PySequence_Contains(w, v) /* v in w */
1121 PyObject *w;
1122 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001123{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124 int i, cmp;
1125 PyObject *x;
1126 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001127
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001128 /* Special case for char in string */
1129 if (PyString_Check(w)) {
1130 register char *s, *end;
1131 register char c;
1132 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1133 PyErr_SetString(PyExc_TypeError,
1134 "string member test needs char left operand");
1135 return -1;
1136 }
1137 c = PyString_AsString(v)[0];
1138 s = PyString_AsString(w);
1139 end = s + PyString_Size(w);
1140 while (s < end) {
1141 if (c == *s++)
1142 return 1;
1143 }
1144 return 0;
1145 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001146
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001147 sq = w->ob_type->tp_as_sequence;
1148 if (sq == NULL || sq->sq_item == NULL) {
1149 PyErr_SetString(PyExc_TypeError,
1150 "'in' or 'not in' needs sequence right argument");
1151 return -1;
1152 }
1153
1154 for (i = 0; ; i++) {
1155 x = (*sq->sq_item)(w, i);
1156 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001157 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 PyErr_Clear();
1159 break;
1160 }
1161 return -1;
1162 }
1163 cmp = PyObject_Compare(v, x);
1164 Py_XDECREF(x);
1165 if (cmp == 0)
1166 return 1;
1167 if (PyErr_Occurred())
1168 return -1;
1169 }
1170
1171 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001172}
1173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174/* Backwards compatibility */
1175#undef PySequence_In
1176int
1177PySequence_In(w, v)
1178 PyObject *w;
1179 PyObject *v;
1180{
1181 return PySequence_Contains(w, v);
1182}
1183
1184int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001185PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001186 PyObject *s;
1187 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001188{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 int l, i, cmp, err;
1190 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001191
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001192 if (s == NULL || o == NULL) {
1193 null_error();
1194 return -1;
1195 }
1196
1197 l = PySequence_Length(s);
1198 if (l < 0)
1199 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001200
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001201 for (i = 0; i < l; i++) {
1202 item = PySequence_GetItem(s, i);
1203 if (item == NULL)
1204 return -1;
1205 err = PyObject_Cmp(item, o, &cmp);
1206 Py_DECREF(item);
1207 if (err < 0)
1208 return err;
1209 if (cmp == 0)
1210 return i;
1211 }
1212
1213 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1214 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001215}
1216
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217/* Operations on mappings */
1218
1219int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001220PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001221 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001222{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001223 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001224}
1225
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226int
1227PyMapping_Length(o)
1228 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001229{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 if (o == NULL) {
1233 null_error();
1234 return -1;
1235 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001236
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 m = o->ob_type->tp_as_mapping;
1238 if (m && m->mp_length)
1239 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001240
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241 type_error("len() of unsized object");
1242 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001243}
1244
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001245PyObject *
1246PyMapping_GetItemString(o, key)
1247 PyObject *o;
1248 char *key;
1249{
1250 PyObject *okey, *r;
1251
1252 if (key == NULL)
1253 return null_error();
1254
1255 okey = PyString_FromString(key);
1256 if (okey == NULL)
1257 return NULL;
1258 r = PyObject_GetItem(o, okey);
1259 Py_DECREF(okey);
1260 return r;
1261}
1262
1263int
1264PyMapping_SetItemString(o, key, value)
1265 PyObject *o;
1266 char *key;
1267 PyObject *value;
1268{
1269 PyObject *okey;
1270 int r;
1271
1272 if (key == NULL) {
1273 null_error();
1274 return -1;
1275 }
1276
1277 okey = PyString_FromString(key);
1278 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001279 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001280 r = PyObject_SetItem(o, okey, value);
1281 Py_DECREF(okey);
1282 return r;
1283}
1284
1285int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001286PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001287 PyObject *o;
1288 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001289{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001291
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001292 v = PyMapping_GetItemString(o, key);
1293 if (v) {
1294 Py_DECREF(v);
1295 return 1;
1296 }
1297 PyErr_Clear();
1298 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001299}
1300
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001302PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 PyObject *o;
1304 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001305{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001307
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001308 v = PyObject_GetItem(o, key);
1309 if (v) {
1310 Py_DECREF(v);
1311 return 1;
1312 }
1313 PyErr_Clear();
1314 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001315}
1316
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001317/* Operations on callable objects */
1318
1319/* XXX PyCallable_Check() is in object.c */
1320
Guido van Rossume15dee51995-07-18 14:12:02 +00001321PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001322PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001324{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001325 PyObject *r;
1326 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 if (args == NULL) {
1329 args = PyTuple_New(0);
1330 if (args == NULL)
1331 return NULL;
1332 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001333
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001334 r = PyEval_CallObject(o, args);
1335
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001336 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001337 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001338 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001339
1340 return r;
1341}
Guido van Rossume15dee51995-07-18 14:12:02 +00001342
1343PyObject *
1344#ifdef HAVE_STDARG_PROTOTYPES
1345/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001346PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001347#else
1348/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001349 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001350#endif
1351{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001352 va_list va;
1353 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001354#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001355 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001356#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001357 PyObject *callable;
1358 char *format;
1359 va_start(va);
1360 callable = va_arg(va, PyObject *);
1361 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001362#endif
1363
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001364 if (callable == NULL) {
1365 va_end(va);
1366 return null_error();
1367 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001368
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369 if (format)
1370 args = Py_VaBuildValue(format, va);
1371 else
1372 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001373
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374 va_end(va);
1375
1376 if (args == NULL)
1377 return NULL;
1378
1379 if (!PyTuple_Check(args)) {
1380 PyObject *a;
1381
1382 a = PyTuple_New(1);
1383 if (a == NULL)
1384 return NULL;
1385 if (PyTuple_SetItem(a, 0, args) < 0)
1386 return NULL;
1387 args = a;
1388 }
1389 retval = PyObject_CallObject(callable, args);
1390
1391 Py_DECREF(args);
1392
1393 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001394}
1395
1396PyObject *
1397#ifdef HAVE_STDARG_PROTOTYPES
1398/* VARARGS 2 */
1399PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1400#else
1401/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001403#endif
1404{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001405 va_list va;
1406 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001407#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001408 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001409#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001410 PyObject *o;
1411 char *name;
1412 char *format;
1413 va_start(va);
1414 o = va_arg(va, PyObject *);
1415 name = va_arg(va, char *);
1416 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001417#endif
1418
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 if (o == NULL || name == NULL) {
1420 va_end(va);
1421 return null_error();
1422 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 func = PyObject_GetAttrString(o, name);
1425 if (func == NULL) {
1426 va_end(va);
1427 PyErr_SetString(PyExc_AttributeError, name);
1428 return 0;
1429 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001430
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001431 if (!PyCallable_Check(func)) {
1432 va_end(va);
1433 return type_error("call of non-callable attribute");
1434 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001435
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436 if (format && *format)
1437 args = Py_VaBuildValue(format, va);
1438 else
1439 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001440
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001441 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001442
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001443 if (!args)
1444 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001445
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001446 if (!PyTuple_Check(args)) {
1447 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001448
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001449 a = PyTuple_New(1);
1450 if (a == NULL)
1451 return NULL;
1452 if (PyTuple_SetItem(a, 0, args) < 0)
1453 return NULL;
1454 args = a;
1455 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001456
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001458
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001459 Py_DECREF(args);
1460 Py_DECREF(func);
1461
1462 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001463}