blob: be986f5fde7bd3efe845d3a29282b4823f600c50 [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 char *s, *end;
63 long x;
64 char buffer[256]; /* For errors */
65
66 s = PyString_AS_STRING(v);
67 while (*s && isspace(Py_CHARMASK(*s)))
68 s++;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000069 errno = 0;
70 x = PyOS_strtol(s, &end, 10);
Guido van Rossumdf3d8751998-08-04 15:02:01 +000071 if (end == s || !isdigit(end[-1]))
72 goto bad;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000073 while (*end && isspace(Py_CHARMASK(*end)))
74 end++;
75 if (*end != '\0') {
Guido van Rossumdf3d8751998-08-04 15:02:01 +000076 bad:
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000077 sprintf(buffer, "invalid literal for int(): %.200s", s);
78 PyErr_SetString(PyExc_ValueError, buffer);
79 return NULL;
80 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +000081 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000082 PyErr_SetString(PyExc_ValueError,
83 "null byte in argument for int()");
84 return NULL;
85 }
86 else if (errno != 0) {
87 sprintf(buffer, "int() literal too large: %.200s", s);
88 PyErr_SetString(PyExc_ValueError, buffer);
89 return NULL;
90 }
91 return PyInt_FromLong(x);
92}
93
94static PyObject *
95long_from_string(v)
96 PyObject *v;
97{
98 char *s, *end;
99 PyObject *x;
100 char buffer[256]; /* For errors */
101
102 s = PyString_AS_STRING(v);
103 while (*s && isspace(Py_CHARMASK(*s)))
104 s++;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000105 x = PyLong_FromString(s, &end, 10);
Guido van Rossumdf3d8751998-08-04 15:02:01 +0000106 if (x == NULL) {
107 if (PyErr_ExceptionMatches(PyExc_ValueError))
108 goto bad;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000109 return NULL;
Guido van Rossumdf3d8751998-08-04 15:02:01 +0000110 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000111 while (*end && isspace(Py_CHARMASK(*end)))
112 end++;
113 if (*end != '\0') {
Guido van Rossumdf3d8751998-08-04 15:02:01 +0000114 bad:
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 sprintf(buffer, "invalid literal for long(): %.200s", s);
116 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumdf3d8751998-08-04 15:02:01 +0000117 Py_XDECREF(x);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 return NULL;
119 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000120 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000121 PyErr_SetString(PyExc_ValueError,
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000122 "null byte in argument for long()");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000123 return NULL;
124 }
125 return x;
126}
127
128static PyObject *
129float_from_string(v)
130 PyObject *v;
131{
132 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossum9d904b91998-10-01 20:35:46 +0000133 char *s, *last, *end;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000134 double x;
135 char buffer[256]; /* For errors */
136
137 s = PyString_AS_STRING(v);
Guido van Rossum9d904b91998-10-01 20:35:46 +0000138 last = s + PyString_GET_SIZE(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139 while (*s && isspace(Py_CHARMASK(*s)))
140 s++;
141 if (s[0] == '\0') {
142 PyErr_SetString(PyExc_ValueError, "empty string for float()");
143 return NULL;
144 }
145 errno = 0;
146 PyFPE_START_PROTECT("float_from_string", return 0)
147 x = strtod(s, &end);
148 PyFPE_END_PROTECT(x)
Guido van Rossum9d904b91998-10-01 20:35:46 +0000149 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
150 byte at the end of the string, when the input is inf(inity) */
151 if (end > last)
152 end = last;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000153 while (*end && isspace(Py_CHARMASK(*end)))
154 end++;
155 if (*end != '\0') {
156 sprintf(buffer, "invalid literal for float(): %.200s", s);
157 PyErr_SetString(PyExc_ValueError, buffer);
158 return NULL;
159 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000160 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000161 PyErr_SetString(PyExc_ValueError,
162 "null byte in argument for float()");
163 return NULL;
164 }
165 else if (errno != 0) {
166 sprintf(buffer, "float() literal too large: %.200s", s);
167 PyErr_SetString(PyExc_ValueError, buffer);
168 return NULL;
169 }
170 return PyFloat_FromDouble(x);
171}
172
173/* Operations on any object */
174
175int
176PyObject_Cmp(o1, o2, result)
177 PyObject *o1;
178 PyObject *o2;
179 int *result;
180{
181 int r;
182
183 if (o1 == NULL || o2 == NULL) {
184 null_error();
185 return -1;
186 }
187 r = PyObject_Compare(o1, o2);
188 if (PyErr_Occurred())
189 return -1;
190 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +0000191 return 0;
192}
Guido van Rossume15dee51995-07-18 14:12:02 +0000193
194PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000195PyObject_Type(o)
196 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000197{
198 PyObject *v;
199
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000200 if (o == NULL)
201 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000202 v = (PyObject *)o->ob_type;
203 Py_INCREF(v);
204 return v;
205}
206
207int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000208PyObject_Length(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000209 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000210{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000211 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000212
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000213 if (o == NULL) {
214 null_error();
215 return -1;
216 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000217
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000218 m = o->ob_type->tp_as_sequence;
219 if (m && m->sq_length)
220 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000222 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000223}
224
225PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000226PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000227 PyObject *o;
228 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000229{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000230 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000232 if (o == NULL || key == NULL)
233 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000234
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000235 m = o->ob_type->tp_as_mapping;
236 if (m && m->mp_subscript)
237 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000238
Guido van Rossum21308241998-08-13 16:44:44 +0000239 if (o->ob_type->tp_as_sequence) {
240 if (PyInt_Check(key))
241 return PySequence_GetItem(o, PyInt_AsLong(key));
242 return type_error("sequence index must be integer");
243 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000244
245 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000246}
247
248int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000249PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000250 PyObject *o;
251 PyObject *key;
252 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000253{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000254 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000255
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000256 if (o == NULL || key == NULL || value == NULL) {
257 null_error();
258 return -1;
259 }
260 m = o->ob_type->tp_as_mapping;
261 if (m && m->mp_ass_subscript)
262 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000263
Guido van Rossum21308241998-08-13 16:44:44 +0000264 if (o->ob_type->tp_as_sequence) {
265 if (PyInt_Check(key))
266 return PySequence_SetItem(o, PyInt_AsLong(key), value);
267 type_error("sequence index must be integer");
268 return -1;
269 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000270
271 type_error("object does not support item assignment");
272 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000273}
274
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000275int
276PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000277 PyObject *o;
278 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000279{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000280 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000281
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000282 if (o == NULL || key == NULL) {
283 null_error();
284 return -1;
285 }
286 m = o->ob_type->tp_as_mapping;
287 if (m && m->mp_ass_subscript)
288 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000289
Guido van Rossum21308241998-08-13 16:44:44 +0000290 if (o->ob_type->tp_as_sequence) {
291 if (PyInt_Check(key))
292 return PySequence_DelItem(o, PyInt_AsLong(key));
293 type_error("sequence index must be integer");
294 return -1;
295 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000296
297 type_error("object does not support item deletion");
298 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000299}
300
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000301/* Operations on numbers */
302
303int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000304PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000305 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000306{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000307 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000308}
309
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000310/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000311
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000312#define BINOP(v, w, opname, ropname, thisfunc) \
313 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000314 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
315
316PyObject *
317PyNumber_Or(v, w)
318 PyObject *v, *w;
319{
320 extern int PyNumber_Coerce();
321
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000322 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000323 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000324 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000325 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
326 if (PyNumber_Coerce(&v, &w) != 0)
327 return NULL;
328 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
329 x = (*f)(v, w);
330 Py_DECREF(v);
331 Py_DECREF(w);
332 if (f != NULL)
333 return x;
334 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000335 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000336}
337
338PyObject *
339PyNumber_Xor(v, w)
340 PyObject *v, *w;
341{
342 extern int PyNumber_Coerce();
343
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000344 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000345 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000346 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000347 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
348 if (PyNumber_Coerce(&v, &w) != 0)
349 return NULL;
350 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
351 x = (*f)(v, w);
352 Py_DECREF(v);
353 Py_DECREF(w);
354 if (f != NULL)
355 return x;
356 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000357 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000358}
359
360PyObject *
361PyNumber_And(v, w)
362 PyObject *v, *w;
363{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000364 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000365 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000366 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000367 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
368 if (PyNumber_Coerce(&v, &w) != 0)
369 return NULL;
370 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
371 x = (*f)(v, w);
372 Py_DECREF(v);
373 Py_DECREF(w);
374 if (f != NULL)
375 return x;
376 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000377 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000378}
379
380PyObject *
381PyNumber_Lshift(v, w)
382 PyObject *v, *w;
383{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000384 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000385 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000386 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000387 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
388 if (PyNumber_Coerce(&v, &w) != 0)
389 return NULL;
390 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
391 x = (*f)(v, w);
392 Py_DECREF(v);
393 Py_DECREF(w);
394 if (f != NULL)
395 return x;
396 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000397 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000398}
399
400PyObject *
401PyNumber_Rshift(v, w)
402 PyObject *v, *w;
403{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000404 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000405 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000406 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000407 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
408 if (PyNumber_Coerce(&v, &w) != 0)
409 return NULL;
410 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
411 x = (*f)(v, w);
412 Py_DECREF(v);
413 Py_DECREF(w);
414 if (f != NULL)
415 return x;
416 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000417 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000418}
419
420PyObject *
421PyNumber_Add(v, w)
422 PyObject *v, *w;
423{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000424 PySequenceMethods *m;
425
426 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
427 m = v->ob_type->tp_as_sequence;
428 if (m && m->sq_concat)
429 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000430 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000431 PyObject *x = NULL;
432 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000433 if (PyNumber_Coerce(&v, &w) != 0)
434 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000435 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
436 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000437 Py_DECREF(v);
438 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000439 if (f != NULL)
440 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000441 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000442 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000443}
444
445PyObject *
446PyNumber_Subtract(v, w)
447 PyObject *v, *w;
448{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000449 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000450 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000451 PyObject *x = NULL;
452 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000453 if (PyNumber_Coerce(&v, &w) != 0)
454 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000455 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
456 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000457 Py_DECREF(v);
458 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000459 if (f != NULL)
460 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000461 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000462 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000463}
464
465PyObject *
466PyNumber_Multiply(v, w)
467 PyObject *v, *w;
468{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000469 PyTypeObject *tp = v->ob_type;
470 PySequenceMethods *m;
471
472 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000473 if (tp->tp_as_number != NULL &&
474 w->ob_type->tp_as_sequence != NULL &&
475 !PyInstance_Check(v)) {
476 /* number*sequence -- swap v and w */
477 PyObject *tmp = v;
478 v = w;
479 w = tmp;
480 tp = v->ob_type;
481 }
482 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000483 PyObject *x = NULL;
484 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000485 if (PyInstance_Check(v)) {
486 /* Instances of user-defined classes get their
487 other argument uncoerced, so they may
488 implement sequence*number as well as
489 number*number. */
490 Py_INCREF(v);
491 Py_INCREF(w);
492 }
493 else if (PyNumber_Coerce(&v, &w) != 0)
494 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000495 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
496 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000497 Py_DECREF(v);
498 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000499 if (f != NULL)
500 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000501 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000502 m = tp->tp_as_sequence;
503 if (m && m->sq_repeat) {
504 if (!PyInt_Check(w))
505 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000506 "can't multiply sequence with non-int");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000507 return (*m->sq_repeat)(v, (int)PyInt_AsLong(w));
Guido van Rossume15dee51995-07-18 14:12:02 +0000508 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000509 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000510}
511
512PyObject *
513PyNumber_Divide(v, w)
514 PyObject *v, *w;
515{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000516 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000517 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000518 PyObject *x = NULL;
519 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000520 if (PyNumber_Coerce(&v, &w) != 0)
521 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000522 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
523 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000524 Py_DECREF(v);
525 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000526 if (f != NULL)
527 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000528 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000529 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000530}
531
532PyObject *
533PyNumber_Remainder(v, w)
534 PyObject *v, *w;
535{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000536 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000537 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000538 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000539 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000540 PyObject *x = NULL;
541 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000542 if (PyNumber_Coerce(&v, &w) != 0)
543 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000544 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
545 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000546 Py_DECREF(v);
547 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000548 if (f != NULL)
549 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000550 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000551 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000552}
553
554PyObject *
555PyNumber_Divmod(v, w)
556 PyObject *v, *w;
557{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000558 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
559 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000560 PyObject *x = NULL;
561 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000562 if (PyNumber_Coerce(&v, &w) != 0)
563 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000564 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
565 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000566 Py_DECREF(v);
567 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000568 if (f != NULL)
569 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000570 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000571 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000572}
573
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000574/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000575
576static PyObject *
577do_pow(v, w)
578 PyObject *v, *w;
579{
580 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000581 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
582 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000583 if (v->ob_type->tp_as_number == NULL ||
584 w->ob_type->tp_as_number == NULL) {
585 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000586 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000587 return NULL;
588 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000589 if (PyNumber_Coerce(&v, &w) != 0)
590 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000591 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
592 res = (*f)(v, w, Py_None);
593 else
594 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000595 Py_DECREF(v);
596 Py_DECREF(w);
597 return res;
598}
599
600PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000601PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000602 PyObject *v, *w, *z;
603{
604 PyObject *res;
605 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000606 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000607
608 if (z == Py_None)
609 return do_pow(v, w);
610 /* XXX The ternary version doesn't do class instance coercions */
611 if (PyInstance_Check(v))
612 return v->ob_type->tp_as_number->nb_power(v, w, z);
613 if (v->ob_type->tp_as_number == NULL ||
614 z->ob_type->tp_as_number == NULL ||
615 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000616 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000617 }
618 if (PyNumber_Coerce(&v, &w) != 0)
619 return NULL;
620 res = NULL;
621 v1 = v;
622 z1 = z;
623 if (PyNumber_Coerce(&v1, &z1) != 0)
624 goto error2;
625 w2 = w;
626 z2 = z1;
627 if (PyNumber_Coerce(&w2, &z2) != 0)
628 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000629 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
630 res = (*f)(v1, w2, z2);
631 else
632 res = type_error(
633 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000634 Py_DECREF(w2);
635 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000636 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000637 Py_DECREF(v1);
638 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000639 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000640 Py_DECREF(v);
641 Py_DECREF(w);
642 return res;
643}
644
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000645/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000646
647PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000648PyNumber_Negative(o)
649 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000650{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000651 PyNumberMethods *m;
652
653 if (o == NULL)
654 return null_error();
655 m = o->ob_type->tp_as_number;
656 if (m && m->nb_negative)
657 return (*m->nb_negative)(o);
658
659 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000660}
661
662PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000663PyNumber_Positive(o)
664 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000665{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000666 PyNumberMethods *m;
667
668 if (o == NULL)
669 return null_error();
670 m = o->ob_type->tp_as_number;
671 if (m && m->nb_positive)
672 return (*m->nb_positive)(o);
673
674 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000675}
676
677PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000678PyNumber_Invert(o)
679 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000680{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000681 PyNumberMethods *m;
682
683 if (o == NULL)
684 return null_error();
685 m = o->ob_type->tp_as_number;
686 if (m && m->nb_invert)
687 return (*m->nb_invert)(o);
688
689 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000690}
691
692PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000693PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000694 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000695{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000696 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000697
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000698 if (o == NULL)
699 return null_error();
700 m = o->ob_type->tp_as_number;
701 if (m && m->nb_absolute)
702 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000703
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000704 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000705}
706
707PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000708PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000709 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000710{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000711 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000712
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000713 if (o == NULL)
714 return null_error();
715 if (PyString_Check(o))
716 return int_from_string(o);
717 m = o->ob_type->tp_as_number;
718 if (m && m->nb_int)
719 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000720
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000721 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000722}
723
724PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000725PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000726 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000727{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000728 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000729
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000730 if (o == NULL)
731 return null_error();
732 if (PyString_Check(o))
733 return long_from_string(o);
734 m = o->ob_type->tp_as_number;
735 if (m && m->nb_long)
736 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000737
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000738 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000739}
740
741PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000742PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000743 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000744{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000745 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000746
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000747 if (o == NULL)
748 return null_error();
749 if (PyString_Check(o))
750 return float_from_string(o);
751 m = o->ob_type->tp_as_number;
752 if (m && m->nb_float)
753 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000754
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000756}
757
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000758/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000759
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000760int
761PySequence_Check(s)
762 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000763{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000764 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000765}
766
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000767int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000768PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000769 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000770{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000771 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000772
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000773 if (s == NULL) {
774 null_error();
775 return -1;
776 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000777
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000778 m = s->ob_type->tp_as_sequence;
779 if (m && m->sq_length)
780 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000781
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000782 type_error("len() of unsized object");
783 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000784}
785
786PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000787PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000788 PyObject *s;
789 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000790{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000791 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000792
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000793 if (s == NULL || o == NULL)
794 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000795
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000796 m = s->ob_type->tp_as_sequence;
797 if (m && m->sq_concat)
798 return m->sq_concat(s, o);
799
800 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000801}
802
803PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000804PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805 PyObject *o;
806 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000807{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000808 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000809
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000810 if (o == NULL)
811 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000812
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000813 m = o->ob_type->tp_as_sequence;
814 if (m && m->sq_repeat)
815 return m->sq_repeat(o, count);
816
817 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000818}
819
820PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000821PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000822 PyObject *s;
823 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000824{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000825 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000826
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000827 if (s == NULL)
828 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000830 m = s->ob_type->tp_as_sequence;
831 if (m && m->sq_item) {
832 if (i < 0) {
833 if (m->sq_length) {
834 int l = (*m->sq_length)(s);
835 if (l < 0)
836 return NULL;
837 i += l;
838 }
839 }
840 return m->sq_item(s, i);
841 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000842
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000843 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000844}
845
846PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000847PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 PyObject *s;
849 int i1;
850 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000851{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000852 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000853
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000854 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000855
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000856 m = s->ob_type->tp_as_sequence;
857 if (m && m->sq_slice) {
858 if (i1 < 0 || i2 < 0) {
859 if (m->sq_length) {
860 int l = (*m->sq_length)(s);
861 if (l < 0)
862 return NULL;
863 if (i1 < 0)
864 i1 += l;
865 if (i2 < 0)
866 i2 += l;
867 }
868 }
869 return m->sq_slice(s, i1, i2);
870 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000871
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000872 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000873}
874
875int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000876PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 PyObject *s;
878 int i;
879 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000880{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000881 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000882
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 if (s == NULL) {
884 null_error();
885 return -1;
886 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000887
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000888 m = s->ob_type->tp_as_sequence;
889 if (m && m->sq_ass_item) {
890 if (i < 0) {
891 if (m->sq_length) {
892 int l = (*m->sq_length)(s);
893 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000894 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000895 i += l;
896 }
897 }
898 return m->sq_ass_item(s, i, o);
899 }
900
901 type_error("object doesn't support item assignment");
902 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000903}
904
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000905int
906PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 PyObject *s;
908 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000909{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000910 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000911
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 if (s == NULL) {
913 null_error();
914 return -1;
915 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000916
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000917 m = s->ob_type->tp_as_sequence;
918 if (m && m->sq_ass_item) {
919 if (i < 0) {
920 if (m->sq_length) {
921 int l = (*m->sq_length)(s);
922 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000923 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000924 i += l;
925 }
926 }
927 return m->sq_ass_item(s, i, (PyObject *)NULL);
928 }
929
930 type_error("object doesn't support item deletion");
931 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000932}
933
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000934int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000935PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000936 PyObject *s;
937 int i1;
938 int i2;
939 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000940{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000941 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000942
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000943 if (s == NULL) {
944 null_error();
945 return -1;
946 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000947
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000948 m = s->ob_type->tp_as_sequence;
949 if (m && m->sq_ass_slice) {
950 if (i1 < 0 || i2 < 0) {
951 if (m->sq_length) {
952 int l = (*m->sq_length)(s);
953 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000954 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000955 if (i1 < 0)
956 i1 += l;
957 if (i2 < 0)
958 i2 += l;
959 }
960 }
961 return m->sq_ass_slice(s, i1, i2, o);
962 }
963 type_error("object doesn't support slice assignment");
964 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000965}
966
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000967int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000968PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000969 PyObject *s;
970 int i1;
971 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000972{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000973 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000974
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 if (s == NULL) {
976 null_error();
977 return -1;
978 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000979
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000980 m = s->ob_type->tp_as_sequence;
981 if (m && m->sq_ass_slice) {
982 if (i1 < 0 || i2 < 0) {
983 if (m->sq_length) {
984 int l = (*m->sq_length)(s);
985 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000986 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000987 if (i1 < 0)
988 i1 += l;
989 if (i2 < 0)
990 i2 += l;
991 }
992 }
993 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
994 }
995 type_error("object doesn't support slice deletion");
996 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000997}
998
Guido van Rossume15dee51995-07-18 14:12:02 +0000999PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001000PySequence_Tuple(v)
1001 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001002{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001004
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001005 if (v == NULL)
1006 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001007
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 if (PyTuple_Check(v)) {
1009 Py_INCREF(v);
1010 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001011 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001012
1013 if (PyList_Check(v))
1014 return PyList_AsTuple(v);
1015
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001016 /* There used to be code for strings here, but tuplifying strings is
1017 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001018
1019 /* Generic sequence object */
1020 m = v->ob_type->tp_as_sequence;
1021 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 int i;
1023 PyObject *t;
1024 int n = PySequence_Length(v);
1025 if (n < 0)
1026 return NULL;
1027 t = PyTuple_New(n);
1028 if (t == NULL)
1029 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001030 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001031 PyObject *item = (*m->sq_item)(v, i);
1032 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001033 if (PyErr_ExceptionMatches(PyExc_IndexError))
1034 PyErr_Clear();
1035 else {
1036 Py_DECREF(t);
1037 t = NULL;
1038 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 break;
1040 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001041 if (i >= n) {
1042 if (n < 500)
1043 n += 10;
1044 else
1045 n += 100;
1046 if (_PyTuple_Resize(&t, n, 0) != 0)
1047 break;
1048 }
1049 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001050 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001051 if (i < n && t != NULL)
1052 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001053 return t;
1054 }
1055
1056 /* None of the above */
1057 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001058}
1059
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001060PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001061PySequence_List(v)
1062 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001063{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001065
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001066 if (v == NULL)
1067 return null_error();
1068
1069 if (PyList_Check(v))
1070 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1071
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001072 m = v->ob_type->tp_as_sequence;
1073 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001074 int i;
1075 PyObject *l;
1076 int n = PySequence_Length(v);
1077 if (n < 0)
1078 return NULL;
1079 l = PyList_New(n);
1080 if (l == NULL)
1081 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001082 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001083 PyObject *item = (*m->sq_item)(v, i);
1084 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001085 if (PyErr_ExceptionMatches(PyExc_IndexError))
1086 PyErr_Clear();
1087 else {
1088 Py_DECREF(l);
1089 l = NULL;
1090 }
1091 break;
1092 }
1093 if (i < n)
1094 PyList_SET_ITEM(l, i, item);
1095 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 Py_DECREF(l);
1097 l = NULL;
1098 break;
1099 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001100 }
1101 if (i < n && l != NULL) {
1102 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1103 Py_DECREF(l);
1104 l = NULL;
1105 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 }
1107 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001108 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001110}
1111
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001112int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001113PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001114 PyObject *s;
1115 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001116{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001117 int l, i, n, cmp, err;
1118 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001119
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 if (s == NULL || o == NULL) {
1121 null_error();
1122 return -1;
1123 }
1124
1125 l = PySequence_Length(s);
1126 if (l < 0)
1127 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001128
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001129 n = 0;
1130 for (i = 0; i < l; i++) {
1131 item = PySequence_GetItem(s, i);
1132 if (item == NULL)
1133 return -1;
1134 err = PyObject_Cmp(item, o, &cmp);
1135 Py_DECREF(item);
1136 if (err < 0)
1137 return err;
1138 if (cmp == 0)
1139 n++;
1140 }
1141 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001142}
1143
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144int
1145PySequence_Contains(w, v) /* v in w */
1146 PyObject *w;
1147 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001148{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 int i, cmp;
1150 PyObject *x;
1151 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001152
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001153 /* Special case for char in string */
1154 if (PyString_Check(w)) {
1155 register char *s, *end;
1156 register char c;
1157 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1158 PyErr_SetString(PyExc_TypeError,
1159 "string member test needs char left operand");
1160 return -1;
1161 }
1162 c = PyString_AsString(v)[0];
1163 s = PyString_AsString(w);
1164 end = s + PyString_Size(w);
1165 while (s < end) {
1166 if (c == *s++)
1167 return 1;
1168 }
1169 return 0;
1170 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001171
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172 sq = w->ob_type->tp_as_sequence;
1173 if (sq == NULL || sq->sq_item == NULL) {
1174 PyErr_SetString(PyExc_TypeError,
1175 "'in' or 'not in' needs sequence right argument");
1176 return -1;
1177 }
1178
1179 for (i = 0; ; i++) {
1180 x = (*sq->sq_item)(w, i);
1181 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001182 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001183 PyErr_Clear();
1184 break;
1185 }
1186 return -1;
1187 }
1188 cmp = PyObject_Compare(v, x);
1189 Py_XDECREF(x);
1190 if (cmp == 0)
1191 return 1;
1192 if (PyErr_Occurred())
1193 return -1;
1194 }
1195
1196 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001197}
1198
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001199/* Backwards compatibility */
1200#undef PySequence_In
1201int
1202PySequence_In(w, v)
1203 PyObject *w;
1204 PyObject *v;
1205{
1206 return PySequence_Contains(w, v);
1207}
1208
1209int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001210PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001211 PyObject *s;
1212 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001213{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001214 int l, i, cmp, err;
1215 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001216
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217 if (s == NULL || o == NULL) {
1218 null_error();
1219 return -1;
1220 }
1221
1222 l = PySequence_Length(s);
1223 if (l < 0)
1224 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001225
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226 for (i = 0; i < l; i++) {
1227 item = PySequence_GetItem(s, i);
1228 if (item == NULL)
1229 return -1;
1230 err = PyObject_Cmp(item, o, &cmp);
1231 Py_DECREF(item);
1232 if (err < 0)
1233 return err;
1234 if (cmp == 0)
1235 return i;
1236 }
1237
1238 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1239 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001240}
1241
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242/* Operations on mappings */
1243
1244int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001245PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001246 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001247{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001249}
1250
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001251int
1252PyMapping_Length(o)
1253 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001254{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 if (o == NULL) {
1258 null_error();
1259 return -1;
1260 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001261
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 m = o->ob_type->tp_as_mapping;
1263 if (m && m->mp_length)
1264 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001265
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001266 type_error("len() of unsized object");
1267 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001268}
1269
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001270PyObject *
1271PyMapping_GetItemString(o, key)
1272 PyObject *o;
1273 char *key;
1274{
1275 PyObject *okey, *r;
1276
1277 if (key == NULL)
1278 return null_error();
1279
1280 okey = PyString_FromString(key);
1281 if (okey == NULL)
1282 return NULL;
1283 r = PyObject_GetItem(o, okey);
1284 Py_DECREF(okey);
1285 return r;
1286}
1287
1288int
1289PyMapping_SetItemString(o, key, value)
1290 PyObject *o;
1291 char *key;
1292 PyObject *value;
1293{
1294 PyObject *okey;
1295 int r;
1296
1297 if (key == NULL) {
1298 null_error();
1299 return -1;
1300 }
1301
1302 okey = PyString_FromString(key);
1303 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001304 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001305 r = PyObject_SetItem(o, okey, value);
1306 Py_DECREF(okey);
1307 return r;
1308}
1309
1310int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001311PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 PyObject *o;
1313 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001314{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001315 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001316
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001317 v = PyMapping_GetItemString(o, key);
1318 if (v) {
1319 Py_DECREF(v);
1320 return 1;
1321 }
1322 PyErr_Clear();
1323 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001324}
1325
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001327PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 PyObject *o;
1329 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001330{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001332
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 v = PyObject_GetItem(o, key);
1334 if (v) {
1335 Py_DECREF(v);
1336 return 1;
1337 }
1338 PyErr_Clear();
1339 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001340}
1341
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342/* Operations on callable objects */
1343
1344/* XXX PyCallable_Check() is in object.c */
1345
Guido van Rossume15dee51995-07-18 14:12:02 +00001346PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001347PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001349{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350 PyObject *r;
1351 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001352
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353 if (args == NULL) {
1354 args = PyTuple_New(0);
1355 if (args == NULL)
1356 return NULL;
1357 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001358
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 r = PyEval_CallObject(o, args);
1360
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001361 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001362 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001363 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001364
1365 return r;
1366}
Guido van Rossume15dee51995-07-18 14:12:02 +00001367
1368PyObject *
1369#ifdef HAVE_STDARG_PROTOTYPES
1370/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001371PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001372#else
1373/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001375#endif
1376{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001377 va_list va;
1378 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001379#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001381#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001382 PyObject *callable;
1383 char *format;
1384 va_start(va);
1385 callable = va_arg(va, PyObject *);
1386 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001387#endif
1388
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001389 if (callable == NULL) {
1390 va_end(va);
1391 return null_error();
1392 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001393
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394 if (format)
1395 args = Py_VaBuildValue(format, va);
1396 else
1397 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001398
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 va_end(va);
1400
1401 if (args == NULL)
1402 return NULL;
1403
1404 if (!PyTuple_Check(args)) {
1405 PyObject *a;
1406
1407 a = PyTuple_New(1);
1408 if (a == NULL)
1409 return NULL;
1410 if (PyTuple_SetItem(a, 0, args) < 0)
1411 return NULL;
1412 args = a;
1413 }
1414 retval = PyObject_CallObject(callable, args);
1415
1416 Py_DECREF(args);
1417
1418 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001419}
1420
1421PyObject *
1422#ifdef HAVE_STDARG_PROTOTYPES
1423/* VARARGS 2 */
1424PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1425#else
1426/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001428#endif
1429{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001430 va_list va;
1431 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001432#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001434#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435 PyObject *o;
1436 char *name;
1437 char *format;
1438 va_start(va);
1439 o = va_arg(va, PyObject *);
1440 name = va_arg(va, char *);
1441 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001442#endif
1443
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001444 if (o == NULL || name == NULL) {
1445 va_end(va);
1446 return null_error();
1447 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001448
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001449 func = PyObject_GetAttrString(o, name);
1450 if (func == NULL) {
1451 va_end(va);
1452 PyErr_SetString(PyExc_AttributeError, name);
1453 return 0;
1454 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001455
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001456 if (!PyCallable_Check(func)) {
1457 va_end(va);
1458 return type_error("call of non-callable attribute");
1459 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001460
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001461 if (format && *format)
1462 args = Py_VaBuildValue(format, va);
1463 else
1464 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001465
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001468 if (!args)
1469 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001470
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001471 if (!PyTuple_Check(args)) {
1472 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001473
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 a = PyTuple_New(1);
1475 if (a == NULL)
1476 return NULL;
1477 if (PyTuple_SetItem(a, 0, args) < 0)
1478 return NULL;
1479 args = a;
1480 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001481
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001482 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001483
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484 Py_DECREF(args);
1485 Py_DECREF(func);
1486
1487 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001488}