blob: 288c3cb2d93dc30c93943b214aa438cbb1a91c8c [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 Rossumcea1c8c1998-05-22 00:47:05 +0000589 if (
590#ifndef WITHOUT_COMPLEX
591 !PyComplex_Check(v) &&
592#endif
593 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
Guido van Rossume15dee51995-07-18 14:12:02 +0000594 if (!PyErr_Occurred())
595 PyErr_SetString(PyExc_ValueError,
596 "negative number to float power");
597 return NULL;
598 }
599 if (PyNumber_Coerce(&v, &w) != 0)
600 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000601 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
602 res = (*f)(v, w, Py_None);
603 else
604 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000605 Py_DECREF(v);
606 Py_DECREF(w);
607 return res;
608}
609
610PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000611PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000612 PyObject *v, *w, *z;
613{
614 PyObject *res;
615 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000616 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000617
618 if (z == Py_None)
619 return do_pow(v, w);
620 /* XXX The ternary version doesn't do class instance coercions */
621 if (PyInstance_Check(v))
622 return v->ob_type->tp_as_number->nb_power(v, w, z);
623 if (v->ob_type->tp_as_number == NULL ||
624 z->ob_type->tp_as_number == NULL ||
625 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000626 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000627 }
628 if (PyNumber_Coerce(&v, &w) != 0)
629 return NULL;
630 res = NULL;
631 v1 = v;
632 z1 = z;
633 if (PyNumber_Coerce(&v1, &z1) != 0)
634 goto error2;
635 w2 = w;
636 z2 = z1;
637 if (PyNumber_Coerce(&w2, &z2) != 0)
638 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000639 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
640 res = (*f)(v1, w2, z2);
641 else
642 res = type_error(
643 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000644 Py_DECREF(w2);
645 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000646 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000647 Py_DECREF(v1);
648 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000649 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000650 Py_DECREF(v);
651 Py_DECREF(w);
652 return res;
653}
654
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000655/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000656
657PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000658PyNumber_Negative(o)
659 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000660{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000661 PyNumberMethods *m;
662
663 if (o == NULL)
664 return null_error();
665 m = o->ob_type->tp_as_number;
666 if (m && m->nb_negative)
667 return (*m->nb_negative)(o);
668
669 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000670}
671
672PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000673PyNumber_Positive(o)
674 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000675{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000676 PyNumberMethods *m;
677
678 if (o == NULL)
679 return null_error();
680 m = o->ob_type->tp_as_number;
681 if (m && m->nb_positive)
682 return (*m->nb_positive)(o);
683
684 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000685}
686
687PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000688PyNumber_Invert(o)
689 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000690{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000691 PyNumberMethods *m;
692
693 if (o == NULL)
694 return null_error();
695 m = o->ob_type->tp_as_number;
696 if (m && m->nb_invert)
697 return (*m->nb_invert)(o);
698
699 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000700}
701
702PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000703PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000704 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000705{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000706 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000707
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000708 if (o == NULL)
709 return null_error();
710 m = o->ob_type->tp_as_number;
711 if (m && m->nb_absolute)
712 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000713
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000714 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000715}
716
717PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000718PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000719 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000720{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000721 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000722
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000723 if (o == NULL)
724 return null_error();
725 if (PyString_Check(o))
726 return int_from_string(o);
727 m = o->ob_type->tp_as_number;
728 if (m && m->nb_int)
729 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000730
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000731 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000732}
733
734PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000735PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000736 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000737{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000738 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000739
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000740 if (o == NULL)
741 return null_error();
742 if (PyString_Check(o))
743 return long_from_string(o);
744 m = o->ob_type->tp_as_number;
745 if (m && m->nb_long)
746 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000747
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000748 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000749}
750
751PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000752PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000753 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000754{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000756
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000757 if (o == NULL)
758 return null_error();
759 if (PyString_Check(o))
760 return float_from_string(o);
761 m = o->ob_type->tp_as_number;
762 if (m && m->nb_float)
763 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000764
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000765 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000766}
767
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000768/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000769
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000770int
771PySequence_Check(s)
772 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000773{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000774 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000775}
776
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000777int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000778PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000779 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000780{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000781 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000783 if (s == NULL) {
784 null_error();
785 return -1;
786 }
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_length)
790 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000791
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000792 type_error("len() of unsized object");
793 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000794}
795
796PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000797PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000798 PyObject *s;
799 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000800{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000801 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000802
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803 if (s == NULL || o == NULL)
804 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000805
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000806 m = s->ob_type->tp_as_sequence;
807 if (m && m->sq_concat)
808 return m->sq_concat(s, o);
809
810 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000811}
812
813PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000814PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000815 PyObject *o;
816 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000817{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000818 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000819
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000820 if (o == NULL)
821 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000822
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000823 m = o->ob_type->tp_as_sequence;
824 if (m && m->sq_repeat)
825 return m->sq_repeat(o, count);
826
827 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000828}
829
830PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000831PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000832 PyObject *s;
833 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000834{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000835 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000836
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000837 if (s == NULL)
838 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000839
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000840 m = s->ob_type->tp_as_sequence;
841 if (m && m->sq_item) {
842 if (i < 0) {
843 if (m->sq_length) {
844 int l = (*m->sq_length)(s);
845 if (l < 0)
846 return NULL;
847 i += l;
848 }
849 }
850 return m->sq_item(s, i);
851 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000852
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000853 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000854}
855
856PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000857PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858 PyObject *s;
859 int i1;
860 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000861{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000863
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000865
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000866 m = s->ob_type->tp_as_sequence;
867 if (m && m->sq_slice) {
868 if (i1 < 0 || i2 < 0) {
869 if (m->sq_length) {
870 int l = (*m->sq_length)(s);
871 if (l < 0)
872 return NULL;
873 if (i1 < 0)
874 i1 += l;
875 if (i2 < 0)
876 i2 += l;
877 }
878 }
879 return m->sq_slice(s, i1, i2);
880 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000881
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000882 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000883}
884
885int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000886PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000887 PyObject *s;
888 int i;
889 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000891 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000892
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000893 if (s == NULL) {
894 null_error();
895 return -1;
896 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000897
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000898 m = s->ob_type->tp_as_sequence;
899 if (m && m->sq_ass_item) {
900 if (i < 0) {
901 if (m->sq_length) {
902 int l = (*m->sq_length)(s);
903 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000904 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905 i += l;
906 }
907 }
908 return m->sq_ass_item(s, i, o);
909 }
910
911 type_error("object doesn't support item assignment");
912 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000913}
914
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000915int
916PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000917 PyObject *s;
918 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000919{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000920 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000921
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000922 if (s == NULL) {
923 null_error();
924 return -1;
925 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000926
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000927 m = s->ob_type->tp_as_sequence;
928 if (m && m->sq_ass_item) {
929 if (i < 0) {
930 if (m->sq_length) {
931 int l = (*m->sq_length)(s);
932 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000933 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000934 i += l;
935 }
936 }
937 return m->sq_ass_item(s, i, (PyObject *)NULL);
938 }
939
940 type_error("object doesn't support item deletion");
941 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000942}
943
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000944int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000945PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 PyObject *s;
947 int i1;
948 int i2;
949 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000950{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000951 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000952
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000953 if (s == NULL) {
954 null_error();
955 return -1;
956 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000957
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000958 m = s->ob_type->tp_as_sequence;
959 if (m && m->sq_ass_slice) {
960 if (i1 < 0 || i2 < 0) {
961 if (m->sq_length) {
962 int l = (*m->sq_length)(s);
963 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000964 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 if (i1 < 0)
966 i1 += l;
967 if (i2 < 0)
968 i2 += l;
969 }
970 }
971 return m->sq_ass_slice(s, i1, i2, o);
972 }
973 type_error("object doesn't support slice assignment");
974 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000975}
976
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000977int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000978PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 PyObject *s;
980 int i1;
981 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000982{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000983 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000984
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000985 if (s == NULL) {
986 null_error();
987 return -1;
988 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000989
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000990 m = s->ob_type->tp_as_sequence;
991 if (m && m->sq_ass_slice) {
992 if (i1 < 0 || i2 < 0) {
993 if (m->sq_length) {
994 int l = (*m->sq_length)(s);
995 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000996 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000997 if (i1 < 0)
998 i1 += l;
999 if (i2 < 0)
1000 i2 += l;
1001 }
1002 }
1003 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1004 }
1005 type_error("object doesn't support slice deletion");
1006 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001007}
1008
Guido van Rossume15dee51995-07-18 14:12:02 +00001009PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001010PySequence_Tuple(v)
1011 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001012{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001013 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001014
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001015 if (v == NULL)
1016 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001017
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001018 if (PyTuple_Check(v)) {
1019 Py_INCREF(v);
1020 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001021 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022
1023 if (PyList_Check(v))
1024 return PyList_AsTuple(v);
1025
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001026 /* There used to be code for strings here, but tuplifying strings is
1027 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001028
1029 /* Generic sequence object */
1030 m = v->ob_type->tp_as_sequence;
1031 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 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;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001040 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001041 PyObject *item = (*m->sq_item)(v, i);
1042 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001043 if (PyErr_ExceptionMatches(PyExc_IndexError))
1044 PyErr_Clear();
1045 else {
1046 Py_DECREF(t);
1047 t = NULL;
1048 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001049 break;
1050 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001051 if (i >= n) {
1052 if (n < 500)
1053 n += 10;
1054 else
1055 n += 100;
1056 if (_PyTuple_Resize(&t, n, 0) != 0)
1057 break;
1058 }
1059 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001060 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001061 if (i < n && t != NULL)
1062 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001063 return t;
1064 }
1065
1066 /* None of the above */
1067 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001068}
1069
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001070PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001071PySequence_List(v)
1072 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001073{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001074 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001075
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001076 if (v == NULL)
1077 return null_error();
1078
1079 if (PyList_Check(v))
1080 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1081
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001082 m = v->ob_type->tp_as_sequence;
1083 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001084 int i;
1085 PyObject *l;
1086 int n = PySequence_Length(v);
1087 if (n < 0)
1088 return NULL;
1089 l = PyList_New(n);
1090 if (l == NULL)
1091 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001092 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001093 PyObject *item = (*m->sq_item)(v, i);
1094 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001095 if (PyErr_ExceptionMatches(PyExc_IndexError))
1096 PyErr_Clear();
1097 else {
1098 Py_DECREF(l);
1099 l = NULL;
1100 }
1101 break;
1102 }
1103 if (i < n)
1104 PyList_SET_ITEM(l, i, item);
1105 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 Py_DECREF(l);
1107 l = NULL;
1108 break;
1109 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001110 }
1111 if (i < n && l != NULL) {
1112 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1113 Py_DECREF(l);
1114 l = NULL;
1115 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001116 }
1117 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001118 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001119 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001120}
1121
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001122int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001123PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124 PyObject *s;
1125 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001126{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001127 int l, i, n, cmp, err;
1128 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001129
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 if (s == NULL || o == NULL) {
1131 null_error();
1132 return -1;
1133 }
1134
1135 l = PySequence_Length(s);
1136 if (l < 0)
1137 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001138
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001139 n = 0;
1140 for (i = 0; i < l; i++) {
1141 item = PySequence_GetItem(s, i);
1142 if (item == NULL)
1143 return -1;
1144 err = PyObject_Cmp(item, o, &cmp);
1145 Py_DECREF(item);
1146 if (err < 0)
1147 return err;
1148 if (cmp == 0)
1149 n++;
1150 }
1151 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001152}
1153
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154int
1155PySequence_Contains(w, v) /* v in w */
1156 PyObject *w;
1157 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001158{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 int i, cmp;
1160 PyObject *x;
1161 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001162
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001163 /* Special case for char in string */
1164 if (PyString_Check(w)) {
1165 register char *s, *end;
1166 register char c;
1167 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1168 PyErr_SetString(PyExc_TypeError,
1169 "string member test needs char left operand");
1170 return -1;
1171 }
1172 c = PyString_AsString(v)[0];
1173 s = PyString_AsString(w);
1174 end = s + PyString_Size(w);
1175 while (s < end) {
1176 if (c == *s++)
1177 return 1;
1178 }
1179 return 0;
1180 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001181
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001182 sq = w->ob_type->tp_as_sequence;
1183 if (sq == NULL || sq->sq_item == NULL) {
1184 PyErr_SetString(PyExc_TypeError,
1185 "'in' or 'not in' needs sequence right argument");
1186 return -1;
1187 }
1188
1189 for (i = 0; ; i++) {
1190 x = (*sq->sq_item)(w, i);
1191 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001192 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193 PyErr_Clear();
1194 break;
1195 }
1196 return -1;
1197 }
1198 cmp = PyObject_Compare(v, x);
1199 Py_XDECREF(x);
1200 if (cmp == 0)
1201 return 1;
1202 if (PyErr_Occurred())
1203 return -1;
1204 }
1205
1206 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001207}
1208
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209/* Backwards compatibility */
1210#undef PySequence_In
1211int
1212PySequence_In(w, v)
1213 PyObject *w;
1214 PyObject *v;
1215{
1216 return PySequence_Contains(w, v);
1217}
1218
1219int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001220PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001221 PyObject *s;
1222 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001223{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001224 int l, i, cmp, err;
1225 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001226
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 if (s == NULL || o == NULL) {
1228 null_error();
1229 return -1;
1230 }
1231
1232 l = PySequence_Length(s);
1233 if (l < 0)
1234 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001235
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001236 for (i = 0; i < l; i++) {
1237 item = PySequence_GetItem(s, i);
1238 if (item == NULL)
1239 return -1;
1240 err = PyObject_Cmp(item, o, &cmp);
1241 Py_DECREF(item);
1242 if (err < 0)
1243 return err;
1244 if (cmp == 0)
1245 return i;
1246 }
1247
1248 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1249 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001250}
1251
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252/* Operations on mappings */
1253
1254int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001255PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001256 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001257{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001258 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001259}
1260
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261int
1262PyMapping_Length(o)
1263 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001264{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 if (o == NULL) {
1268 null_error();
1269 return -1;
1270 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001271
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 m = o->ob_type->tp_as_mapping;
1273 if (m && m->mp_length)
1274 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001275
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001276 type_error("len() of unsized object");
1277 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001278}
1279
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001280PyObject *
1281PyMapping_GetItemString(o, key)
1282 PyObject *o;
1283 char *key;
1284{
1285 PyObject *okey, *r;
1286
1287 if (key == NULL)
1288 return null_error();
1289
1290 okey = PyString_FromString(key);
1291 if (okey == NULL)
1292 return NULL;
1293 r = PyObject_GetItem(o, okey);
1294 Py_DECREF(okey);
1295 return r;
1296}
1297
1298int
1299PyMapping_SetItemString(o, key, value)
1300 PyObject *o;
1301 char *key;
1302 PyObject *value;
1303{
1304 PyObject *okey;
1305 int r;
1306
1307 if (key == NULL) {
1308 null_error();
1309 return -1;
1310 }
1311
1312 okey = PyString_FromString(key);
1313 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001314 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001315 r = PyObject_SetItem(o, okey, value);
1316 Py_DECREF(okey);
1317 return r;
1318}
1319
1320int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001321PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001322 PyObject *o;
1323 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001324{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001325 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001326
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001327 v = PyMapping_GetItemString(o, key);
1328 if (v) {
1329 Py_DECREF(v);
1330 return 1;
1331 }
1332 PyErr_Clear();
1333 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001334}
1335
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001336int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001337PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001338 PyObject *o;
1339 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001340{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001341 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001342
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343 v = PyObject_GetItem(o, key);
1344 if (v) {
1345 Py_DECREF(v);
1346 return 1;
1347 }
1348 PyErr_Clear();
1349 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001350}
1351
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001352/* Operations on callable objects */
1353
1354/* XXX PyCallable_Check() is in object.c */
1355
Guido van Rossume15dee51995-07-18 14:12:02 +00001356PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001357PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001358 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001359{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 PyObject *r;
1361 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001362
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001363 if (args == NULL) {
1364 args = PyTuple_New(0);
1365 if (args == NULL)
1366 return NULL;
1367 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001368
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369 r = PyEval_CallObject(o, args);
1370
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001371 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001373 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374
1375 return r;
1376}
Guido van Rossume15dee51995-07-18 14:12:02 +00001377
1378PyObject *
1379#ifdef HAVE_STDARG_PROTOTYPES
1380/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001382#else
1383/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001385#endif
1386{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001387 va_list va;
1388 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001389#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001391#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 PyObject *callable;
1393 char *format;
1394 va_start(va);
1395 callable = va_arg(va, PyObject *);
1396 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001397#endif
1398
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 if (callable == NULL) {
1400 va_end(va);
1401 return null_error();
1402 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001403
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001404 if (format)
1405 args = Py_VaBuildValue(format, va);
1406 else
1407 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001408
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409 va_end(va);
1410
1411 if (args == NULL)
1412 return NULL;
1413
1414 if (!PyTuple_Check(args)) {
1415 PyObject *a;
1416
1417 a = PyTuple_New(1);
1418 if (a == NULL)
1419 return NULL;
1420 if (PyTuple_SetItem(a, 0, args) < 0)
1421 return NULL;
1422 args = a;
1423 }
1424 retval = PyObject_CallObject(callable, args);
1425
1426 Py_DECREF(args);
1427
1428 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001429}
1430
1431PyObject *
1432#ifdef HAVE_STDARG_PROTOTYPES
1433/* VARARGS 2 */
1434PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1435#else
1436/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001438#endif
1439{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 va_list va;
1441 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001442#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001443 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001444#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 PyObject *o;
1446 char *name;
1447 char *format;
1448 va_start(va);
1449 o = va_arg(va, PyObject *);
1450 name = va_arg(va, char *);
1451 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001452#endif
1453
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001454 if (o == NULL || name == NULL) {
1455 va_end(va);
1456 return null_error();
1457 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001458
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001459 func = PyObject_GetAttrString(o, name);
1460 if (func == NULL) {
1461 va_end(va);
1462 PyErr_SetString(PyExc_AttributeError, name);
1463 return 0;
1464 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001465
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 if (!PyCallable_Check(func)) {
1467 va_end(va);
1468 return type_error("call of non-callable attribute");
1469 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001470
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001471 if (format && *format)
1472 args = Py_VaBuildValue(format, va);
1473 else
1474 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001475
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001476 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001477
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001478 if (!args)
1479 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001480
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001481 if (!PyTuple_Check(args)) {
1482 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001483
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484 a = PyTuple_New(1);
1485 if (a == NULL)
1486 return NULL;
1487 if (PyTuple_SetItem(a, 0, args) < 0)
1488 return NULL;
1489 args = a;
1490 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001491
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001492 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001493
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 Py_DECREF(args);
1495 Py_DECREF(func);
1496
1497 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001498}