blob: bfc08114cac1fa10180e93988dff77b56ad5b775 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossume15dee51995-07-18 14:12:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossume15dee51995-07-18 14:12:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossume15dee51995-07-18 14:12:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossume15dee51995-07-18 14:12:02 +000029
30******************************************************************/
31
32/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033
Guido van Rossume15dee51995-07-18 14:12:02 +000034#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +000035#include <ctype.h>
Guido van Rossume15dee51995-07-18 14:12:02 +000036
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000037/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000038
39static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000040type_error(msg)
41 char *msg;
Guido van Rossume15dee51995-07-18 14:12:02 +000042{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000043 PyErr_SetString(PyExc_TypeError, msg);
44 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000045}
46
Guido van Rossum052b7e11996-11-11 15:08:19 +000047static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000048null_error()
Guido van Rossume15dee51995-07-18 14:12:02 +000049{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000050 if (!PyErr_Occurred())
51 PyErr_SetString(PyExc_SystemError,
52 "null argument to internal routine");
53 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000054}
55
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000056/* Copied with modifications from stropmodule.c: atoi, atof, atol */
Guido van Rossume15dee51995-07-18 14:12:02 +000057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000058static PyObject *
59int_from_string(v)
60 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
63 char *s, *end;
64 long x;
65 char buffer[256]; /* For errors */
66
67 s = PyString_AS_STRING(v);
68 while (*s && isspace(Py_CHARMASK(*s)))
69 s++;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 errno = 0;
71 x = PyOS_strtol(s, &end, 10);
Guido van Rossumdf3d8751998-08-04 15:02:01 +000072 if (end == s || !isdigit(end[-1]))
73 goto bad;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000074 while (*end && isspace(Py_CHARMASK(*end)))
75 end++;
76 if (*end != '\0') {
Guido van Rossumdf3d8751998-08-04 15:02:01 +000077 bad:
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000078 sprintf(buffer, "invalid literal for int(): %.200s", s);
79 PyErr_SetString(PyExc_ValueError, buffer);
80 return NULL;
81 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +000082 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000083 PyErr_SetString(PyExc_ValueError,
84 "null byte in argument for int()");
85 return NULL;
86 }
87 else if (errno != 0) {
88 sprintf(buffer, "int() literal too large: %.200s", s);
89 PyErr_SetString(PyExc_ValueError, buffer);
90 return NULL;
91 }
92 return PyInt_FromLong(x);
93}
94
95static PyObject *
96long_from_string(v)
97 PyObject *v;
98{
99 char *s, *end;
100 PyObject *x;
101 char buffer[256]; /* For errors */
102
103 s = PyString_AS_STRING(v);
104 while (*s && isspace(Py_CHARMASK(*s)))
105 s++;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000106 x = PyLong_FromString(s, &end, 10);
Guido van Rossumdf3d8751998-08-04 15:02:01 +0000107 if (x == NULL) {
108 if (PyErr_ExceptionMatches(PyExc_ValueError))
109 goto bad;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000110 return NULL;
Guido van Rossumdf3d8751998-08-04 15:02:01 +0000111 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000112 while (*end && isspace(Py_CHARMASK(*end)))
113 end++;
114 if (*end != '\0') {
Guido van Rossumdf3d8751998-08-04 15:02:01 +0000115 bad:
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000116 sprintf(buffer, "invalid literal for long(): %.200s", s);
117 PyErr_SetString(PyExc_ValueError, buffer);
Guido van Rossumdf3d8751998-08-04 15:02:01 +0000118 Py_XDECREF(x);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000119 return NULL;
120 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000121 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000122 PyErr_SetString(PyExc_ValueError,
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000123 "null byte in argument for long()");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000124 return NULL;
125 }
126 return x;
127}
128
129static PyObject *
130float_from_string(v)
131 PyObject *v;
132{
133 extern double strtod Py_PROTO((const char *, char **));
Guido van Rossum9d904b91998-10-01 20:35:46 +0000134 char *s, *last, *end;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000135 double x;
136 char buffer[256]; /* For errors */
137
138 s = PyString_AS_STRING(v);
Guido van Rossum9d904b91998-10-01 20:35:46 +0000139 last = s + PyString_GET_SIZE(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000140 while (*s && isspace(Py_CHARMASK(*s)))
141 s++;
142 if (s[0] == '\0') {
143 PyErr_SetString(PyExc_ValueError, "empty string for float()");
144 return NULL;
145 }
146 errno = 0;
147 PyFPE_START_PROTECT("float_from_string", return 0)
148 x = strtod(s, &end);
149 PyFPE_END_PROTECT(x)
Guido van Rossum9d904b91998-10-01 20:35:46 +0000150 /* Believe it or not, Solaris 2.6 can move end *beyond* the null
151 byte at the end of the string, when the input is inf(inity) */
152 if (end > last)
153 end = last;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000154 while (*end && isspace(Py_CHARMASK(*end)))
155 end++;
156 if (*end != '\0') {
157 sprintf(buffer, "invalid literal for float(): %.200s", s);
158 PyErr_SetString(PyExc_ValueError, buffer);
159 return NULL;
160 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000161 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000162 PyErr_SetString(PyExc_ValueError,
163 "null byte in argument for float()");
164 return NULL;
165 }
166 else if (errno != 0) {
167 sprintf(buffer, "float() literal too large: %.200s", s);
168 PyErr_SetString(PyExc_ValueError, buffer);
169 return NULL;
170 }
171 return PyFloat_FromDouble(x);
172}
173
174/* Operations on any object */
175
176int
177PyObject_Cmp(o1, o2, result)
178 PyObject *o1;
179 PyObject *o2;
180 int *result;
181{
182 int r;
183
184 if (o1 == NULL || o2 == NULL) {
185 null_error();
186 return -1;
187 }
188 r = PyObject_Compare(o1, o2);
189 if (PyErr_Occurred())
190 return -1;
191 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +0000192 return 0;
193}
Guido van Rossume15dee51995-07-18 14:12:02 +0000194
195PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000196PyObject_Type(o)
197 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000198{
199 PyObject *v;
200
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000201 if (o == NULL)
202 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000203 v = (PyObject *)o->ob_type;
204 Py_INCREF(v);
205 return v;
206}
207
208int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000209PyObject_Length(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000210 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000211{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000212 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000213
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000214 if (o == NULL) {
215 null_error();
216 return -1;
217 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000218
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000219 m = o->ob_type->tp_as_sequence;
220 if (m && m->sq_length)
221 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000222
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000223 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000224}
225
226PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000227PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000228 PyObject *o;
229 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000230{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000231 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000232
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000233 if (o == NULL || key == NULL)
234 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000235
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000236 m = o->ob_type->tp_as_mapping;
237 if (m && m->mp_subscript)
238 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000239
Guido van Rossum21308241998-08-13 16:44:44 +0000240 if (o->ob_type->tp_as_sequence) {
241 if (PyInt_Check(key))
242 return PySequence_GetItem(o, PyInt_AsLong(key));
243 return type_error("sequence index must be integer");
244 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000245
246 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000247}
248
249int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000250PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000251 PyObject *o;
252 PyObject *key;
253 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000254{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000255 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000257 if (o == NULL || key == NULL || value == NULL) {
258 null_error();
259 return -1;
260 }
261 m = o->ob_type->tp_as_mapping;
262 if (m && m->mp_ass_subscript)
263 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000264
Guido van Rossum21308241998-08-13 16:44:44 +0000265 if (o->ob_type->tp_as_sequence) {
266 if (PyInt_Check(key))
267 return PySequence_SetItem(o, PyInt_AsLong(key), value);
268 type_error("sequence index must be integer");
269 return -1;
270 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000271
272 type_error("object does not support item assignment");
273 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000274}
275
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000276int
277PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000278 PyObject *o;
279 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000280{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000281 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000282
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000283 if (o == NULL || key == NULL) {
284 null_error();
285 return -1;
286 }
287 m = o->ob_type->tp_as_mapping;
288 if (m && m->mp_ass_subscript)
289 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000290
Guido van Rossum21308241998-08-13 16:44:44 +0000291 if (o->ob_type->tp_as_sequence) {
292 if (PyInt_Check(key))
293 return PySequence_DelItem(o, PyInt_AsLong(key));
294 type_error("sequence index must be integer");
295 return -1;
296 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000297
298 type_error("object does not support item deletion");
299 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000300}
301
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000302/* Operations on numbers */
303
304int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000305PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000306 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000307{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000308 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000309}
310
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000311/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000312
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000313#define BINOP(v, w, opname, ropname, thisfunc) \
314 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000315 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
316
317PyObject *
318PyNumber_Or(v, w)
319 PyObject *v, *w;
320{
321 extern int PyNumber_Coerce();
322
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000323 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000324 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000325 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000326 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
327 if (PyNumber_Coerce(&v, &w) != 0)
328 return NULL;
329 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
330 x = (*f)(v, w);
331 Py_DECREF(v);
332 Py_DECREF(w);
333 if (f != NULL)
334 return x;
335 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000336 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000337}
338
339PyObject *
340PyNumber_Xor(v, w)
341 PyObject *v, *w;
342{
343 extern int PyNumber_Coerce();
344
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000345 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000346 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000347 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000348 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
349 if (PyNumber_Coerce(&v, &w) != 0)
350 return NULL;
351 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
352 x = (*f)(v, w);
353 Py_DECREF(v);
354 Py_DECREF(w);
355 if (f != NULL)
356 return x;
357 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000358 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000359}
360
361PyObject *
362PyNumber_And(v, w)
363 PyObject *v, *w;
364{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000365 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000366 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000367 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000368 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
369 if (PyNumber_Coerce(&v, &w) != 0)
370 return NULL;
371 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
372 x = (*f)(v, w);
373 Py_DECREF(v);
374 Py_DECREF(w);
375 if (f != NULL)
376 return x;
377 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000378 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000379}
380
381PyObject *
382PyNumber_Lshift(v, w)
383 PyObject *v, *w;
384{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000385 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000386 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000387 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000388 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
389 if (PyNumber_Coerce(&v, &w) != 0)
390 return NULL;
391 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
392 x = (*f)(v, w);
393 Py_DECREF(v);
394 Py_DECREF(w);
395 if (f != NULL)
396 return x;
397 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000398 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000399}
400
401PyObject *
402PyNumber_Rshift(v, w)
403 PyObject *v, *w;
404{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000405 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000406 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000407 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000408 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
409 if (PyNumber_Coerce(&v, &w) != 0)
410 return NULL;
411 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
412 x = (*f)(v, w);
413 Py_DECREF(v);
414 Py_DECREF(w);
415 if (f != NULL)
416 return x;
417 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000418 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000419}
420
421PyObject *
422PyNumber_Add(v, w)
423 PyObject *v, *w;
424{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000425 PySequenceMethods *m;
426
427 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
428 m = v->ob_type->tp_as_sequence;
429 if (m && m->sq_concat)
430 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000431 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000432 PyObject *x = NULL;
433 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000434 if (PyNumber_Coerce(&v, &w) != 0)
435 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000436 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
437 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000438 Py_DECREF(v);
439 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000440 if (f != NULL)
441 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000442 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000443 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000444}
445
446PyObject *
447PyNumber_Subtract(v, w)
448 PyObject *v, *w;
449{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000450 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000451 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000452 PyObject *x = NULL;
453 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000454 if (PyNumber_Coerce(&v, &w) != 0)
455 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000456 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
457 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000458 Py_DECREF(v);
459 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000460 if (f != NULL)
461 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000462 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000463 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000464}
465
466PyObject *
467PyNumber_Multiply(v, w)
468 PyObject *v, *w;
469{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000470 PyTypeObject *tp = v->ob_type;
471 PySequenceMethods *m;
472
473 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000474 if (tp->tp_as_number != NULL &&
475 w->ob_type->tp_as_sequence != NULL &&
476 !PyInstance_Check(v)) {
477 /* number*sequence -- swap v and w */
478 PyObject *tmp = v;
479 v = w;
480 w = tmp;
481 tp = v->ob_type;
482 }
483 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000484 PyObject *x = NULL;
485 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000486 if (PyInstance_Check(v)) {
487 /* Instances of user-defined classes get their
488 other argument uncoerced, so they may
489 implement sequence*number as well as
490 number*number. */
491 Py_INCREF(v);
492 Py_INCREF(w);
493 }
494 else if (PyNumber_Coerce(&v, &w) != 0)
495 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000496 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
497 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000498 Py_DECREF(v);
499 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000500 if (f != NULL)
501 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000502 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000503 m = tp->tp_as_sequence;
504 if (m && m->sq_repeat) {
505 if (!PyInt_Check(w))
506 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000507 "can't multiply sequence with non-int");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000508 return (*m->sq_repeat)(v, (int)PyInt_AsLong(w));
Guido van Rossume15dee51995-07-18 14:12:02 +0000509 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000510 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000511}
512
513PyObject *
514PyNumber_Divide(v, w)
515 PyObject *v, *w;
516{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000517 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000518 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000519 PyObject *x = NULL;
520 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000521 if (PyNumber_Coerce(&v, &w) != 0)
522 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000523 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
524 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000525 Py_DECREF(v);
526 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000527 if (f != NULL)
528 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000529 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000530 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000531}
532
533PyObject *
534PyNumber_Remainder(v, w)
535 PyObject *v, *w;
536{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000537 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000538 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000539 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000540 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000541 PyObject *x = NULL;
542 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000543 if (PyNumber_Coerce(&v, &w) != 0)
544 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000545 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
546 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000547 Py_DECREF(v);
548 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000549 if (f != NULL)
550 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000551 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000552 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000553}
554
555PyObject *
556PyNumber_Divmod(v, w)
557 PyObject *v, *w;
558{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000559 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
560 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000561 PyObject *x = NULL;
562 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000563 if (PyNumber_Coerce(&v, &w) != 0)
564 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000565 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
566 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000567 Py_DECREF(v);
568 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000569 if (f != NULL)
570 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000571 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000572 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000573}
574
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000575/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000576
577static PyObject *
578do_pow(v, w)
579 PyObject *v, *w;
580{
581 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000582 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
583 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000584 if (v->ob_type->tp_as_number == NULL ||
585 w->ob_type->tp_as_number == NULL) {
586 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000587 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000588 return NULL;
589 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000590 if (
591#ifndef WITHOUT_COMPLEX
592 !PyComplex_Check(v) &&
593#endif
594 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
Guido van Rossume15dee51995-07-18 14:12:02 +0000595 if (!PyErr_Occurred())
596 PyErr_SetString(PyExc_ValueError,
597 "negative number to float power");
598 return NULL;
599 }
600 if (PyNumber_Coerce(&v, &w) != 0)
601 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000602 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
603 res = (*f)(v, w, Py_None);
604 else
605 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000606 Py_DECREF(v);
607 Py_DECREF(w);
608 return res;
609}
610
611PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000612PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000613 PyObject *v, *w, *z;
614{
615 PyObject *res;
616 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000617 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000618
619 if (z == Py_None)
620 return do_pow(v, w);
621 /* XXX The ternary version doesn't do class instance coercions */
622 if (PyInstance_Check(v))
623 return v->ob_type->tp_as_number->nb_power(v, w, z);
624 if (v->ob_type->tp_as_number == NULL ||
625 z->ob_type->tp_as_number == NULL ||
626 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000627 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000628 }
629 if (PyNumber_Coerce(&v, &w) != 0)
630 return NULL;
631 res = NULL;
632 v1 = v;
633 z1 = z;
634 if (PyNumber_Coerce(&v1, &z1) != 0)
635 goto error2;
636 w2 = w;
637 z2 = z1;
638 if (PyNumber_Coerce(&w2, &z2) != 0)
639 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000640 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
641 res = (*f)(v1, w2, z2);
642 else
643 res = type_error(
644 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000645 Py_DECREF(w2);
646 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000647 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000648 Py_DECREF(v1);
649 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000650 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000651 Py_DECREF(v);
652 Py_DECREF(w);
653 return res;
654}
655
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000656/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000657
658PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000659PyNumber_Negative(o)
660 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000661{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000662 PyNumberMethods *m;
663
664 if (o == NULL)
665 return null_error();
666 m = o->ob_type->tp_as_number;
667 if (m && m->nb_negative)
668 return (*m->nb_negative)(o);
669
670 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000671}
672
673PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000674PyNumber_Positive(o)
675 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000676{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000677 PyNumberMethods *m;
678
679 if (o == NULL)
680 return null_error();
681 m = o->ob_type->tp_as_number;
682 if (m && m->nb_positive)
683 return (*m->nb_positive)(o);
684
685 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000686}
687
688PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000689PyNumber_Invert(o)
690 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000691{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000692 PyNumberMethods *m;
693
694 if (o == NULL)
695 return null_error();
696 m = o->ob_type->tp_as_number;
697 if (m && m->nb_invert)
698 return (*m->nb_invert)(o);
699
700 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000701}
702
703PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000704PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000705 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000706{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000707 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000708
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000709 if (o == NULL)
710 return null_error();
711 m = o->ob_type->tp_as_number;
712 if (m && m->nb_absolute)
713 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000714
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000715 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000716}
717
718PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000719PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000720 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000721{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000722 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000723
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000724 if (o == NULL)
725 return null_error();
726 if (PyString_Check(o))
727 return int_from_string(o);
728 m = o->ob_type->tp_as_number;
729 if (m && m->nb_int)
730 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000731
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000732 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000733}
734
735PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000736PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000737 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000738{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000739 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000740
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000741 if (o == NULL)
742 return null_error();
743 if (PyString_Check(o))
744 return long_from_string(o);
745 m = o->ob_type->tp_as_number;
746 if (m && m->nb_long)
747 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000748
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000749 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000750}
751
752PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000753PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000754 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000755{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000756 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000757
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000758 if (o == NULL)
759 return null_error();
760 if (PyString_Check(o))
761 return float_from_string(o);
762 m = o->ob_type->tp_as_number;
763 if (m && m->nb_float)
764 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000765
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000766 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000767}
768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000769/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000770
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000771int
772PySequence_Check(s)
773 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000774{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000775 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000776}
777
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000778int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000779PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000780 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000781{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000782 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000783
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000784 if (s == NULL) {
785 null_error();
786 return -1;
787 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000788
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000789 m = s->ob_type->tp_as_sequence;
790 if (m && m->sq_length)
791 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000792
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000793 type_error("len() of unsized object");
794 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000795}
796
797PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000798PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000799 PyObject *s;
800 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000801{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000802 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000803
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000804 if (s == NULL || o == NULL)
805 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000806
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000807 m = s->ob_type->tp_as_sequence;
808 if (m && m->sq_concat)
809 return m->sq_concat(s, o);
810
811 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000812}
813
814PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000815PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000816 PyObject *o;
817 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000818{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000820
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000821 if (o == NULL)
822 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000823
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000824 m = o->ob_type->tp_as_sequence;
825 if (m && m->sq_repeat)
826 return m->sq_repeat(o, count);
827
828 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000829}
830
831PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000832PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000833 PyObject *s;
834 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000835{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000836 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000837
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000838 if (s == NULL)
839 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000840
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000841 m = s->ob_type->tp_as_sequence;
842 if (m && m->sq_item) {
843 if (i < 0) {
844 if (m->sq_length) {
845 int l = (*m->sq_length)(s);
846 if (l < 0)
847 return NULL;
848 i += l;
849 }
850 }
851 return m->sq_item(s, i);
852 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000853
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000854 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000855}
856
857PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000858PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859 PyObject *s;
860 int i1;
861 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000862{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000864
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000865 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000866
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 m = s->ob_type->tp_as_sequence;
868 if (m && m->sq_slice) {
869 if (i1 < 0 || i2 < 0) {
870 if (m->sq_length) {
871 int l = (*m->sq_length)(s);
872 if (l < 0)
873 return NULL;
874 if (i1 < 0)
875 i1 += l;
876 if (i2 < 0)
877 i2 += l;
878 }
879 }
880 return m->sq_slice(s, i1, i2);
881 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000882
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000884}
885
886int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000887PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000888 PyObject *s;
889 int i;
890 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000891{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000892 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000893
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 if (s == NULL) {
895 null_error();
896 return -1;
897 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000898
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000899 m = s->ob_type->tp_as_sequence;
900 if (m && m->sq_ass_item) {
901 if (i < 0) {
902 if (m->sq_length) {
903 int l = (*m->sq_length)(s);
904 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000905 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000906 i += l;
907 }
908 }
909 return m->sq_ass_item(s, i, o);
910 }
911
912 type_error("object doesn't support item assignment");
913 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000914}
915
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000916int
917PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000918 PyObject *s;
919 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000920{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000921 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000922
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000923 if (s == NULL) {
924 null_error();
925 return -1;
926 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000927
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 m = s->ob_type->tp_as_sequence;
929 if (m && m->sq_ass_item) {
930 if (i < 0) {
931 if (m->sq_length) {
932 int l = (*m->sq_length)(s);
933 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000934 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 i += l;
936 }
937 }
938 return m->sq_ass_item(s, i, (PyObject *)NULL);
939 }
940
941 type_error("object doesn't support item deletion");
942 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000943}
944
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000945int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000946PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 PyObject *s;
948 int i1;
949 int i2;
950 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000951{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000952 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000953
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000954 if (s == NULL) {
955 null_error();
956 return -1;
957 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000958
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000959 m = s->ob_type->tp_as_sequence;
960 if (m && m->sq_ass_slice) {
961 if (i1 < 0 || i2 < 0) {
962 if (m->sq_length) {
963 int l = (*m->sq_length)(s);
964 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000965 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966 if (i1 < 0)
967 i1 += l;
968 if (i2 < 0)
969 i2 += l;
970 }
971 }
972 return m->sq_ass_slice(s, i1, i2, o);
973 }
974 type_error("object doesn't support slice assignment");
975 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000976}
977
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000978int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000979PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000980 PyObject *s;
981 int i1;
982 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000983{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000984 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986 if (s == NULL) {
987 null_error();
988 return -1;
989 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000990
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000991 m = s->ob_type->tp_as_sequence;
992 if (m && m->sq_ass_slice) {
993 if (i1 < 0 || i2 < 0) {
994 if (m->sq_length) {
995 int l = (*m->sq_length)(s);
996 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000997 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998 if (i1 < 0)
999 i1 += l;
1000 if (i2 < 0)
1001 i2 += l;
1002 }
1003 }
1004 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1005 }
1006 type_error("object doesn't support slice deletion");
1007 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001008}
1009
Guido van Rossume15dee51995-07-18 14:12:02 +00001010PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001011PySequence_Tuple(v)
1012 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001013{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001014 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001015
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001016 if (v == NULL)
1017 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001018
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 if (PyTuple_Check(v)) {
1020 Py_INCREF(v);
1021 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001022 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023
1024 if (PyList_Check(v))
1025 return PyList_AsTuple(v);
1026
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001027 /* There used to be code for strings here, but tuplifying strings is
1028 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001029
1030 /* Generic sequence object */
1031 m = v->ob_type->tp_as_sequence;
1032 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001033 int i;
1034 PyObject *t;
1035 int n = PySequence_Length(v);
1036 if (n < 0)
1037 return NULL;
1038 t = PyTuple_New(n);
1039 if (t == NULL)
1040 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001041 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001042 PyObject *item = (*m->sq_item)(v, i);
1043 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001044 if (PyErr_ExceptionMatches(PyExc_IndexError))
1045 PyErr_Clear();
1046 else {
1047 Py_DECREF(t);
1048 t = NULL;
1049 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001050 break;
1051 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001052 if (i >= n) {
1053 if (n < 500)
1054 n += 10;
1055 else
1056 n += 100;
1057 if (_PyTuple_Resize(&t, n, 0) != 0)
1058 break;
1059 }
1060 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001061 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001062 if (i < n && t != NULL)
1063 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 return t;
1065 }
1066
1067 /* None of the above */
1068 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001069}
1070
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001071PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001072PySequence_List(v)
1073 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001074{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001075 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001076
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001077 if (v == NULL)
1078 return null_error();
1079
1080 if (PyList_Check(v))
1081 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1082
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001083 m = v->ob_type->tp_as_sequence;
1084 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085 int i;
1086 PyObject *l;
1087 int n = PySequence_Length(v);
1088 if (n < 0)
1089 return NULL;
1090 l = PyList_New(n);
1091 if (l == NULL)
1092 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001093 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094 PyObject *item = (*m->sq_item)(v, i);
1095 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001096 if (PyErr_ExceptionMatches(PyExc_IndexError))
1097 PyErr_Clear();
1098 else {
1099 Py_DECREF(l);
1100 l = NULL;
1101 }
1102 break;
1103 }
1104 if (i < n)
1105 PyList_SET_ITEM(l, i, item);
1106 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001107 Py_DECREF(l);
1108 l = NULL;
1109 break;
1110 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001111 }
1112 if (i < n && l != NULL) {
1113 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1114 Py_DECREF(l);
1115 l = NULL;
1116 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001117 }
1118 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001119 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001121}
1122
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001124PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001125 PyObject *s;
1126 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001127{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001128 int l, i, n, cmp, err;
1129 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001130
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001131 if (s == NULL || o == NULL) {
1132 null_error();
1133 return -1;
1134 }
1135
1136 l = PySequence_Length(s);
1137 if (l < 0)
1138 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001139
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001140 n = 0;
1141 for (i = 0; i < l; i++) {
1142 item = PySequence_GetItem(s, i);
1143 if (item == NULL)
1144 return -1;
1145 err = PyObject_Cmp(item, o, &cmp);
1146 Py_DECREF(item);
1147 if (err < 0)
1148 return err;
1149 if (cmp == 0)
1150 n++;
1151 }
1152 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001153}
1154
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001155int
1156PySequence_Contains(w, v) /* v in w */
1157 PyObject *w;
1158 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001159{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001160 int i, cmp;
1161 PyObject *x;
1162 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001163
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001164 /* Special case for char in string */
1165 if (PyString_Check(w)) {
1166 register char *s, *end;
1167 register char c;
1168 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1169 PyErr_SetString(PyExc_TypeError,
1170 "string member test needs char left operand");
1171 return -1;
1172 }
1173 c = PyString_AsString(v)[0];
1174 s = PyString_AsString(w);
1175 end = s + PyString_Size(w);
1176 while (s < end) {
1177 if (c == *s++)
1178 return 1;
1179 }
1180 return 0;
1181 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001182
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001183 sq = w->ob_type->tp_as_sequence;
1184 if (sq == NULL || sq->sq_item == NULL) {
1185 PyErr_SetString(PyExc_TypeError,
1186 "'in' or 'not in' needs sequence right argument");
1187 return -1;
1188 }
1189
1190 for (i = 0; ; i++) {
1191 x = (*sq->sq_item)(w, i);
1192 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001193 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194 PyErr_Clear();
1195 break;
1196 }
1197 return -1;
1198 }
1199 cmp = PyObject_Compare(v, x);
1200 Py_XDECREF(x);
1201 if (cmp == 0)
1202 return 1;
1203 if (PyErr_Occurred())
1204 return -1;
1205 }
1206
1207 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001208}
1209
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001210/* Backwards compatibility */
1211#undef PySequence_In
1212int
1213PySequence_In(w, v)
1214 PyObject *w;
1215 PyObject *v;
1216{
1217 return PySequence_Contains(w, v);
1218}
1219
1220int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001221PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222 PyObject *s;
1223 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001224{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001225 int l, i, cmp, err;
1226 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001227
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001228 if (s == NULL || o == NULL) {
1229 null_error();
1230 return -1;
1231 }
1232
1233 l = PySequence_Length(s);
1234 if (l < 0)
1235 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001236
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 for (i = 0; i < l; i++) {
1238 item = PySequence_GetItem(s, i);
1239 if (item == NULL)
1240 return -1;
1241 err = PyObject_Cmp(item, o, &cmp);
1242 Py_DECREF(item);
1243 if (err < 0)
1244 return err;
1245 if (cmp == 0)
1246 return i;
1247 }
1248
1249 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1250 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001251}
1252
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001253/* Operations on mappings */
1254
1255int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001256PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001258{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001260}
1261
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262int
1263PyMapping_Length(o)
1264 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001265{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001266 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001267
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001268 if (o == NULL) {
1269 null_error();
1270 return -1;
1271 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001272
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001273 m = o->ob_type->tp_as_mapping;
1274 if (m && m->mp_length)
1275 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001276
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001277 type_error("len() of unsized object");
1278 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001279}
1280
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281PyObject *
1282PyMapping_GetItemString(o, key)
1283 PyObject *o;
1284 char *key;
1285{
1286 PyObject *okey, *r;
1287
1288 if (key == NULL)
1289 return null_error();
1290
1291 okey = PyString_FromString(key);
1292 if (okey == NULL)
1293 return NULL;
1294 r = PyObject_GetItem(o, okey);
1295 Py_DECREF(okey);
1296 return r;
1297}
1298
1299int
1300PyMapping_SetItemString(o, key, value)
1301 PyObject *o;
1302 char *key;
1303 PyObject *value;
1304{
1305 PyObject *okey;
1306 int r;
1307
1308 if (key == NULL) {
1309 null_error();
1310 return -1;
1311 }
1312
1313 okey = PyString_FromString(key);
1314 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001315 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 r = PyObject_SetItem(o, okey, value);
1317 Py_DECREF(okey);
1318 return r;
1319}
1320
1321int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001322PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 PyObject *o;
1324 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001325{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 v = PyMapping_GetItemString(o, key);
1329 if (v) {
1330 Py_DECREF(v);
1331 return 1;
1332 }
1333 PyErr_Clear();
1334 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001335}
1336
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001337int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001338PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001339 PyObject *o;
1340 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001341{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001343
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001344 v = PyObject_GetItem(o, key);
1345 if (v) {
1346 Py_DECREF(v);
1347 return 1;
1348 }
1349 PyErr_Clear();
1350 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001351}
1352
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353/* Operations on callable objects */
1354
1355/* XXX PyCallable_Check() is in object.c */
1356
Guido van Rossume15dee51995-07-18 14:12:02 +00001357PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001358PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001360{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001361 PyObject *r;
1362 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001363
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001364 if (args == NULL) {
1365 args = PyTuple_New(0);
1366 if (args == NULL)
1367 return NULL;
1368 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001369
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001370 r = PyEval_CallObject(o, args);
1371
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001372 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001374 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375
1376 return r;
1377}
Guido van Rossume15dee51995-07-18 14:12:02 +00001378
1379PyObject *
1380#ifdef HAVE_STDARG_PROTOTYPES
1381/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001382PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001383#else
1384/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001385 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001386#endif
1387{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001388 va_list va;
1389 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001390#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001392#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001393 PyObject *callable;
1394 char *format;
1395 va_start(va);
1396 callable = va_arg(va, PyObject *);
1397 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001398#endif
1399
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001400 if (callable == NULL) {
1401 va_end(va);
1402 return null_error();
1403 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001404
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001405 if (format)
1406 args = Py_VaBuildValue(format, va);
1407 else
1408 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001409
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001410 va_end(va);
1411
1412 if (args == NULL)
1413 return NULL;
1414
1415 if (!PyTuple_Check(args)) {
1416 PyObject *a;
1417
1418 a = PyTuple_New(1);
1419 if (a == NULL)
1420 return NULL;
1421 if (PyTuple_SetItem(a, 0, args) < 0)
1422 return NULL;
1423 args = a;
1424 }
1425 retval = PyObject_CallObject(callable, args);
1426
1427 Py_DECREF(args);
1428
1429 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001430}
1431
1432PyObject *
1433#ifdef HAVE_STDARG_PROTOTYPES
1434/* VARARGS 2 */
1435PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1436#else
1437/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001438 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001439#endif
1440{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001441 va_list va;
1442 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001443#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001444 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001445#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001446 PyObject *o;
1447 char *name;
1448 char *format;
1449 va_start(va);
1450 o = va_arg(va, PyObject *);
1451 name = va_arg(va, char *);
1452 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001453#endif
1454
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 if (o == NULL || name == NULL) {
1456 va_end(va);
1457 return null_error();
1458 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001459
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 func = PyObject_GetAttrString(o, name);
1461 if (func == NULL) {
1462 va_end(va);
1463 PyErr_SetString(PyExc_AttributeError, name);
1464 return 0;
1465 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001466
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 if (!PyCallable_Check(func)) {
1468 va_end(va);
1469 return type_error("call of non-callable attribute");
1470 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001471
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001472 if (format && *format)
1473 args = Py_VaBuildValue(format, va);
1474 else
1475 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001476
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001477 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001478
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001479 if (!args)
1480 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001481
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001482 if (!PyTuple_Check(args)) {
1483 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001484
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001485 a = PyTuple_New(1);
1486 if (a == NULL)
1487 return NULL;
1488 if (PyTuple_SetItem(a, 0, args) < 0)
1489 return NULL;
1490 args = a;
1491 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001492
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001493 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001494
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001495 Py_DECREF(args);
1496 Py_DECREF(func);
1497
1498 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001499}