blob: 123455ae124b11806f67eb6c909ace1c913ee75c [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 **));
134 char *s, *end;
135 double x;
136 char buffer[256]; /* For errors */
137
138 s = PyString_AS_STRING(v);
139 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)
149 while (*end && isspace(Py_CHARMASK(*end)))
150 end++;
151 if (*end != '\0') {
152 sprintf(buffer, "invalid literal for float(): %.200s", s);
153 PyErr_SetString(PyExc_ValueError, buffer);
154 return NULL;
155 }
Guido van Rossum3b2b3471998-06-22 03:54:15 +0000156 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000157 PyErr_SetString(PyExc_ValueError,
158 "null byte in argument for float()");
159 return NULL;
160 }
161 else if (errno != 0) {
162 sprintf(buffer, "float() literal too large: %.200s", s);
163 PyErr_SetString(PyExc_ValueError, buffer);
164 return NULL;
165 }
166 return PyFloat_FromDouble(x);
167}
168
169/* Operations on any object */
170
171int
172PyObject_Cmp(o1, o2, result)
173 PyObject *o1;
174 PyObject *o2;
175 int *result;
176{
177 int r;
178
179 if (o1 == NULL || o2 == NULL) {
180 null_error();
181 return -1;
182 }
183 r = PyObject_Compare(o1, o2);
184 if (PyErr_Occurred())
185 return -1;
186 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +0000187 return 0;
188}
Guido van Rossume15dee51995-07-18 14:12:02 +0000189
190PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000191PyObject_Type(o)
192 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000193{
194 PyObject *v;
195
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000196 if (o == NULL)
197 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000198 v = (PyObject *)o->ob_type;
199 Py_INCREF(v);
200 return v;
201}
202
203int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000204PyObject_Length(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000205 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000206{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000207 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000208
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000209 if (o == NULL) {
210 null_error();
211 return -1;
212 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000213
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000214 m = o->ob_type->tp_as_sequence;
215 if (m && m->sq_length)
216 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000217
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000218 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000219}
220
221PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000222PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000223 PyObject *o;
224 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000225{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000226 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000227
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000228 if (o == NULL || key == NULL)
229 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000230
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000231 m = o->ob_type->tp_as_mapping;
232 if (m && m->mp_subscript)
233 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000234
Guido van Rossum21308241998-08-13 16:44:44 +0000235 if (o->ob_type->tp_as_sequence) {
236 if (PyInt_Check(key))
237 return PySequence_GetItem(o, PyInt_AsLong(key));
238 return type_error("sequence index must be integer");
239 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000240
241 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000242}
243
244int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000245PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000246 PyObject *o;
247 PyObject *key;
248 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000249{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000250 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000251
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000252 if (o == NULL || key == NULL || value == NULL) {
253 null_error();
254 return -1;
255 }
256 m = o->ob_type->tp_as_mapping;
257 if (m && m->mp_ass_subscript)
258 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000259
Guido van Rossum21308241998-08-13 16:44:44 +0000260 if (o->ob_type->tp_as_sequence) {
261 if (PyInt_Check(key))
262 return PySequence_SetItem(o, PyInt_AsLong(key), value);
263 type_error("sequence index must be integer");
264 return -1;
265 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000266
267 type_error("object does not support item assignment");
268 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000269}
270
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000271int
272PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000273 PyObject *o;
274 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000275{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000276 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000277
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000278 if (o == NULL || key == NULL) {
279 null_error();
280 return -1;
281 }
282 m = o->ob_type->tp_as_mapping;
283 if (m && m->mp_ass_subscript)
284 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000285
Guido van Rossum21308241998-08-13 16:44:44 +0000286 if (o->ob_type->tp_as_sequence) {
287 if (PyInt_Check(key))
288 return PySequence_DelItem(o, PyInt_AsLong(key));
289 type_error("sequence index must be integer");
290 return -1;
291 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000292
293 type_error("object does not support item deletion");
294 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000295}
296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000297/* Operations on numbers */
298
299int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000300PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000301 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000302{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000303 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000304}
305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000306/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000307
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000308#define BINOP(v, w, opname, ropname, thisfunc) \
309 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000310 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
311
312PyObject *
313PyNumber_Or(v, w)
314 PyObject *v, *w;
315{
316 extern int PyNumber_Coerce();
317
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000318 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000319 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000320 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000321 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
322 if (PyNumber_Coerce(&v, &w) != 0)
323 return NULL;
324 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
325 x = (*f)(v, w);
326 Py_DECREF(v);
327 Py_DECREF(w);
328 if (f != NULL)
329 return x;
330 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000331 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000332}
333
334PyObject *
335PyNumber_Xor(v, w)
336 PyObject *v, *w;
337{
338 extern int PyNumber_Coerce();
339
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000340 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000341 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000342 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000343 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
344 if (PyNumber_Coerce(&v, &w) != 0)
345 return NULL;
346 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
347 x = (*f)(v, w);
348 Py_DECREF(v);
349 Py_DECREF(w);
350 if (f != NULL)
351 return x;
352 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000353 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000354}
355
356PyObject *
357PyNumber_And(v, w)
358 PyObject *v, *w;
359{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000360 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000361 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000362 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000363 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
364 if (PyNumber_Coerce(&v, &w) != 0)
365 return NULL;
366 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
367 x = (*f)(v, w);
368 Py_DECREF(v);
369 Py_DECREF(w);
370 if (f != NULL)
371 return x;
372 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000373 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000374}
375
376PyObject *
377PyNumber_Lshift(v, w)
378 PyObject *v, *w;
379{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000380 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000381 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000382 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000383 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
384 if (PyNumber_Coerce(&v, &w) != 0)
385 return NULL;
386 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
387 x = (*f)(v, w);
388 Py_DECREF(v);
389 Py_DECREF(w);
390 if (f != NULL)
391 return x;
392 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000393 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000394}
395
396PyObject *
397PyNumber_Rshift(v, w)
398 PyObject *v, *w;
399{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000400 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000401 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000402 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000403 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
404 if (PyNumber_Coerce(&v, &w) != 0)
405 return NULL;
406 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
407 x = (*f)(v, w);
408 Py_DECREF(v);
409 Py_DECREF(w);
410 if (f != NULL)
411 return x;
412 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000413 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000414}
415
416PyObject *
417PyNumber_Add(v, w)
418 PyObject *v, *w;
419{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000420 PySequenceMethods *m;
421
422 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
423 m = v->ob_type->tp_as_sequence;
424 if (m && m->sq_concat)
425 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000426 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000427 PyObject *x = NULL;
428 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000429 if (PyNumber_Coerce(&v, &w) != 0)
430 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000431 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
432 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000433 Py_DECREF(v);
434 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000435 if (f != NULL)
436 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000437 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000438 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000439}
440
441PyObject *
442PyNumber_Subtract(v, w)
443 PyObject *v, *w;
444{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000445 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000446 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000447 PyObject *x = NULL;
448 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000449 if (PyNumber_Coerce(&v, &w) != 0)
450 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000451 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
452 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000453 Py_DECREF(v);
454 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000455 if (f != NULL)
456 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000457 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000458 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000459}
460
461PyObject *
462PyNumber_Multiply(v, w)
463 PyObject *v, *w;
464{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000465 PyTypeObject *tp = v->ob_type;
466 PySequenceMethods *m;
467
468 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000469 if (tp->tp_as_number != NULL &&
470 w->ob_type->tp_as_sequence != NULL &&
471 !PyInstance_Check(v)) {
472 /* number*sequence -- swap v and w */
473 PyObject *tmp = v;
474 v = w;
475 w = tmp;
476 tp = v->ob_type;
477 }
478 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000479 PyObject *x = NULL;
480 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000481 if (PyInstance_Check(v)) {
482 /* Instances of user-defined classes get their
483 other argument uncoerced, so they may
484 implement sequence*number as well as
485 number*number. */
486 Py_INCREF(v);
487 Py_INCREF(w);
488 }
489 else if (PyNumber_Coerce(&v, &w) != 0)
490 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000491 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
492 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000493 Py_DECREF(v);
494 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000495 if (f != NULL)
496 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000497 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000498 m = tp->tp_as_sequence;
499 if (m && m->sq_repeat) {
500 if (!PyInt_Check(w))
501 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000502 "can't multiply sequence with non-int");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000503 return (*m->sq_repeat)(v, (int)PyInt_AsLong(w));
Guido van Rossume15dee51995-07-18 14:12:02 +0000504 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000505 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000506}
507
508PyObject *
509PyNumber_Divide(v, w)
510 PyObject *v, *w;
511{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000512 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000513 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000514 PyObject *x = NULL;
515 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000516 if (PyNumber_Coerce(&v, &w) != 0)
517 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000518 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
519 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000520 Py_DECREF(v);
521 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000522 if (f != NULL)
523 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000524 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000525 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000526}
527
528PyObject *
529PyNumber_Remainder(v, w)
530 PyObject *v, *w;
531{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000532 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000533 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000534 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000535 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000536 PyObject *x = NULL;
537 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000538 if (PyNumber_Coerce(&v, &w) != 0)
539 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000540 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
541 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000542 Py_DECREF(v);
543 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000544 if (f != NULL)
545 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000546 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000547 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000548}
549
550PyObject *
551PyNumber_Divmod(v, w)
552 PyObject *v, *w;
553{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000554 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
555 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000556 PyObject *x = NULL;
557 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000558 if (PyNumber_Coerce(&v, &w) != 0)
559 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000560 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
561 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000562 Py_DECREF(v);
563 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000564 if (f != NULL)
565 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000566 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000567 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000568}
569
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000570/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000571
572static PyObject *
573do_pow(v, w)
574 PyObject *v, *w;
575{
576 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000577 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
578 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000579 if (v->ob_type->tp_as_number == NULL ||
580 w->ob_type->tp_as_number == NULL) {
581 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000582 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000583 return NULL;
584 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000585 if (
586#ifndef WITHOUT_COMPLEX
587 !PyComplex_Check(v) &&
588#endif
589 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
Guido van Rossume15dee51995-07-18 14:12:02 +0000590 if (!PyErr_Occurred())
591 PyErr_SetString(PyExc_ValueError,
592 "negative number to float power");
593 return NULL;
594 }
595 if (PyNumber_Coerce(&v, &w) != 0)
596 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000597 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
598 res = (*f)(v, w, Py_None);
599 else
600 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000601 Py_DECREF(v);
602 Py_DECREF(w);
603 return res;
604}
605
606PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000607PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000608 PyObject *v, *w, *z;
609{
610 PyObject *res;
611 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000612 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000613
614 if (z == Py_None)
615 return do_pow(v, w);
616 /* XXX The ternary version doesn't do class instance coercions */
617 if (PyInstance_Check(v))
618 return v->ob_type->tp_as_number->nb_power(v, w, z);
619 if (v->ob_type->tp_as_number == NULL ||
620 z->ob_type->tp_as_number == NULL ||
621 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000622 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000623 }
624 if (PyNumber_Coerce(&v, &w) != 0)
625 return NULL;
626 res = NULL;
627 v1 = v;
628 z1 = z;
629 if (PyNumber_Coerce(&v1, &z1) != 0)
630 goto error2;
631 w2 = w;
632 z2 = z1;
633 if (PyNumber_Coerce(&w2, &z2) != 0)
634 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000635 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
636 res = (*f)(v1, w2, z2);
637 else
638 res = type_error(
639 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000640 Py_DECREF(w2);
641 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000642 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000643 Py_DECREF(v1);
644 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000645 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000646 Py_DECREF(v);
647 Py_DECREF(w);
648 return res;
649}
650
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000651/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000652
653PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000654PyNumber_Negative(o)
655 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000656{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000657 PyNumberMethods *m;
658
659 if (o == NULL)
660 return null_error();
661 m = o->ob_type->tp_as_number;
662 if (m && m->nb_negative)
663 return (*m->nb_negative)(o);
664
665 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000666}
667
668PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000669PyNumber_Positive(o)
670 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000671{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000672 PyNumberMethods *m;
673
674 if (o == NULL)
675 return null_error();
676 m = o->ob_type->tp_as_number;
677 if (m && m->nb_positive)
678 return (*m->nb_positive)(o);
679
680 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000681}
682
683PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000684PyNumber_Invert(o)
685 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000686{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000687 PyNumberMethods *m;
688
689 if (o == NULL)
690 return null_error();
691 m = o->ob_type->tp_as_number;
692 if (m && m->nb_invert)
693 return (*m->nb_invert)(o);
694
695 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000696}
697
698PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000699PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000700 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000701{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000702 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000703
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000704 if (o == NULL)
705 return null_error();
706 m = o->ob_type->tp_as_number;
707 if (m && m->nb_absolute)
708 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000709
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000710 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000711}
712
713PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000714PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000715 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000716{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000717 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000718
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000719 if (o == NULL)
720 return null_error();
721 if (PyString_Check(o))
722 return int_from_string(o);
723 m = o->ob_type->tp_as_number;
724 if (m && m->nb_int)
725 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000726
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000727 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000728}
729
730PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000731PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000732 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000733{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000734 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000735
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000736 if (o == NULL)
737 return null_error();
738 if (PyString_Check(o))
739 return long_from_string(o);
740 m = o->ob_type->tp_as_number;
741 if (m && m->nb_long)
742 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000743
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000744 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000745}
746
747PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000748PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000749 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000750{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000751 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000752
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000753 if (o == NULL)
754 return null_error();
755 if (PyString_Check(o))
756 return float_from_string(o);
757 m = o->ob_type->tp_as_number;
758 if (m && m->nb_float)
759 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000760
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000761 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000762}
763
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000764/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000765
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000766int
767PySequence_Check(s)
768 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000769{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000770 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000771}
772
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000773int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000774PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000775 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000776{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000777 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000778
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000779 if (s == NULL) {
780 null_error();
781 return -1;
782 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000783
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000784 m = s->ob_type->tp_as_sequence;
785 if (m && m->sq_length)
786 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000787
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000788 type_error("len() of unsized object");
789 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000790}
791
792PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000793PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000794 PyObject *s;
795 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000796{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000797 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000798
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000799 if (s == NULL || o == NULL)
800 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000801
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000802 m = s->ob_type->tp_as_sequence;
803 if (m && m->sq_concat)
804 return m->sq_concat(s, o);
805
806 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000807}
808
809PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000810PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000811 PyObject *o;
812 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000813{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000814 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000815
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000816 if (o == NULL)
817 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000818
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 m = o->ob_type->tp_as_sequence;
820 if (m && m->sq_repeat)
821 return m->sq_repeat(o, count);
822
823 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000824}
825
826PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000827PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000828 PyObject *s;
829 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000830{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000831 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000832
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000833 if (s == NULL)
834 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000835
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000836 m = s->ob_type->tp_as_sequence;
837 if (m && m->sq_item) {
838 if (i < 0) {
839 if (m->sq_length) {
840 int l = (*m->sq_length)(s);
841 if (l < 0)
842 return NULL;
843 i += l;
844 }
845 }
846 return m->sq_item(s, i);
847 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000848
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000849 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000850}
851
852PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000853PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000854 PyObject *s;
855 int i1;
856 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000857{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000859
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000860 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000861
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862 m = s->ob_type->tp_as_sequence;
863 if (m && m->sq_slice) {
864 if (i1 < 0 || i2 < 0) {
865 if (m->sq_length) {
866 int l = (*m->sq_length)(s);
867 if (l < 0)
868 return NULL;
869 if (i1 < 0)
870 i1 += l;
871 if (i2 < 0)
872 i2 += l;
873 }
874 }
875 return m->sq_slice(s, i1, i2);
876 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000877
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000878 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000879}
880
881int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000882PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 PyObject *s;
884 int i;
885 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000886{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000887 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000888
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000889 if (s == NULL) {
890 null_error();
891 return -1;
892 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000893
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 m = s->ob_type->tp_as_sequence;
895 if (m && m->sq_ass_item) {
896 if (i < 0) {
897 if (m->sq_length) {
898 int l = (*m->sq_length)(s);
899 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000900 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000901 i += l;
902 }
903 }
904 return m->sq_ass_item(s, i, o);
905 }
906
907 type_error("object doesn't support item assignment");
908 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000909}
910
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000911int
912PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 PyObject *s;
914 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000915{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000916 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000917
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000918 if (s == NULL) {
919 null_error();
920 return -1;
921 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000922
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000923 m = s->ob_type->tp_as_sequence;
924 if (m && m->sq_ass_item) {
925 if (i < 0) {
926 if (m->sq_length) {
927 int l = (*m->sq_length)(s);
928 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000929 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000930 i += l;
931 }
932 }
933 return m->sq_ass_item(s, i, (PyObject *)NULL);
934 }
935
936 type_error("object doesn't support item deletion");
937 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000938}
939
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000940int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000941PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000942 PyObject *s;
943 int i1;
944 int i2;
945 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000946{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000948
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000949 if (s == NULL) {
950 null_error();
951 return -1;
952 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000953
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000954 m = s->ob_type->tp_as_sequence;
955 if (m && m->sq_ass_slice) {
956 if (i1 < 0 || i2 < 0) {
957 if (m->sq_length) {
958 int l = (*m->sq_length)(s);
959 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000960 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000961 if (i1 < 0)
962 i1 += l;
963 if (i2 < 0)
964 i2 += l;
965 }
966 }
967 return m->sq_ass_slice(s, i1, i2, o);
968 }
969 type_error("object doesn't support slice assignment");
970 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000971}
972
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000973int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000974PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 PyObject *s;
976 int i1;
977 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000978{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000980
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000981 if (s == NULL) {
982 null_error();
983 return -1;
984 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986 m = s->ob_type->tp_as_sequence;
987 if (m && m->sq_ass_slice) {
988 if (i1 < 0 || i2 < 0) {
989 if (m->sq_length) {
990 int l = (*m->sq_length)(s);
991 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000992 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000993 if (i1 < 0)
994 i1 += l;
995 if (i2 < 0)
996 i2 += l;
997 }
998 }
999 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1000 }
1001 type_error("object doesn't support slice deletion");
1002 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001003}
1004
Guido van Rossume15dee51995-07-18 14:12:02 +00001005PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001006PySequence_Tuple(v)
1007 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001008{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001009 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001010
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001011 if (v == NULL)
1012 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001013
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001014 if (PyTuple_Check(v)) {
1015 Py_INCREF(v);
1016 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001017 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001018
1019 if (PyList_Check(v))
1020 return PyList_AsTuple(v);
1021
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001022 /* There used to be code for strings here, but tuplifying strings is
1023 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001024
1025 /* Generic sequence object */
1026 m = v->ob_type->tp_as_sequence;
1027 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001028 int i;
1029 PyObject *t;
1030 int n = PySequence_Length(v);
1031 if (n < 0)
1032 return NULL;
1033 t = PyTuple_New(n);
1034 if (t == NULL)
1035 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001036 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001037 PyObject *item = (*m->sq_item)(v, i);
1038 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001039 if (PyErr_ExceptionMatches(PyExc_IndexError))
1040 PyErr_Clear();
1041 else {
1042 Py_DECREF(t);
1043 t = NULL;
1044 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001045 break;
1046 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001047 if (i >= n) {
1048 if (n < 500)
1049 n += 10;
1050 else
1051 n += 100;
1052 if (_PyTuple_Resize(&t, n, 0) != 0)
1053 break;
1054 }
1055 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001057 if (i < n && t != NULL)
1058 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001059 return t;
1060 }
1061
1062 /* None of the above */
1063 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001064}
1065
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001066PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067PySequence_List(v)
1068 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001069{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001070 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001071
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001072 if (v == NULL)
1073 return null_error();
1074
1075 if (PyList_Check(v))
1076 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1077
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001078 m = v->ob_type->tp_as_sequence;
1079 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001080 int i;
1081 PyObject *l;
1082 int n = PySequence_Length(v);
1083 if (n < 0)
1084 return NULL;
1085 l = PyList_New(n);
1086 if (l == NULL)
1087 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001088 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001089 PyObject *item = (*m->sq_item)(v, i);
1090 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001091 if (PyErr_ExceptionMatches(PyExc_IndexError))
1092 PyErr_Clear();
1093 else {
1094 Py_DECREF(l);
1095 l = NULL;
1096 }
1097 break;
1098 }
1099 if (i < n)
1100 PyList_SET_ITEM(l, i, item);
1101 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001102 Py_DECREF(l);
1103 l = NULL;
1104 break;
1105 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001106 }
1107 if (i < n && l != NULL) {
1108 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1109 Py_DECREF(l);
1110 l = NULL;
1111 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001112 }
1113 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001114 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001115 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001116}
1117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001118int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001119PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 PyObject *s;
1121 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001122{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123 int l, i, n, cmp, err;
1124 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001125
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001126 if (s == NULL || o == NULL) {
1127 null_error();
1128 return -1;
1129 }
1130
1131 l = PySequence_Length(s);
1132 if (l < 0)
1133 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001134
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001135 n = 0;
1136 for (i = 0; i < l; i++) {
1137 item = PySequence_GetItem(s, i);
1138 if (item == NULL)
1139 return -1;
1140 err = PyObject_Cmp(item, o, &cmp);
1141 Py_DECREF(item);
1142 if (err < 0)
1143 return err;
1144 if (cmp == 0)
1145 n++;
1146 }
1147 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001148}
1149
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150int
1151PySequence_Contains(w, v) /* v in w */
1152 PyObject *w;
1153 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001154{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001155 int i, cmp;
1156 PyObject *x;
1157 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001158
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 /* Special case for char in string */
1160 if (PyString_Check(w)) {
1161 register char *s, *end;
1162 register char c;
1163 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1164 PyErr_SetString(PyExc_TypeError,
1165 "string member test needs char left operand");
1166 return -1;
1167 }
1168 c = PyString_AsString(v)[0];
1169 s = PyString_AsString(w);
1170 end = s + PyString_Size(w);
1171 while (s < end) {
1172 if (c == *s++)
1173 return 1;
1174 }
1175 return 0;
1176 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001177
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178 sq = w->ob_type->tp_as_sequence;
1179 if (sq == NULL || sq->sq_item == NULL) {
1180 PyErr_SetString(PyExc_TypeError,
1181 "'in' or 'not in' needs sequence right argument");
1182 return -1;
1183 }
1184
1185 for (i = 0; ; i++) {
1186 x = (*sq->sq_item)(w, i);
1187 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001188 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 PyErr_Clear();
1190 break;
1191 }
1192 return -1;
1193 }
1194 cmp = PyObject_Compare(v, x);
1195 Py_XDECREF(x);
1196 if (cmp == 0)
1197 return 1;
1198 if (PyErr_Occurred())
1199 return -1;
1200 }
1201
1202 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001203}
1204
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205/* Backwards compatibility */
1206#undef PySequence_In
1207int
1208PySequence_In(w, v)
1209 PyObject *w;
1210 PyObject *v;
1211{
1212 return PySequence_Contains(w, v);
1213}
1214
1215int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001216PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217 PyObject *s;
1218 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001219{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001220 int l, i, cmp, err;
1221 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001222
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001223 if (s == NULL || o == NULL) {
1224 null_error();
1225 return -1;
1226 }
1227
1228 l = PySequence_Length(s);
1229 if (l < 0)
1230 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 for (i = 0; i < l; i++) {
1233 item = PySequence_GetItem(s, i);
1234 if (item == NULL)
1235 return -1;
1236 err = PyObject_Cmp(item, o, &cmp);
1237 Py_DECREF(item);
1238 if (err < 0)
1239 return err;
1240 if (cmp == 0)
1241 return i;
1242 }
1243
1244 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1245 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001246}
1247
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248/* Operations on mappings */
1249
1250int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001251PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001253{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001255}
1256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257int
1258PyMapping_Length(o)
1259 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001260{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001262
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263 if (o == NULL) {
1264 null_error();
1265 return -1;
1266 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001267
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001268 m = o->ob_type->tp_as_mapping;
1269 if (m && m->mp_length)
1270 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001271
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 type_error("len() of unsized object");
1273 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001274}
1275
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001276PyObject *
1277PyMapping_GetItemString(o, key)
1278 PyObject *o;
1279 char *key;
1280{
1281 PyObject *okey, *r;
1282
1283 if (key == NULL)
1284 return null_error();
1285
1286 okey = PyString_FromString(key);
1287 if (okey == NULL)
1288 return NULL;
1289 r = PyObject_GetItem(o, okey);
1290 Py_DECREF(okey);
1291 return r;
1292}
1293
1294int
1295PyMapping_SetItemString(o, key, value)
1296 PyObject *o;
1297 char *key;
1298 PyObject *value;
1299{
1300 PyObject *okey;
1301 int r;
1302
1303 if (key == NULL) {
1304 null_error();
1305 return -1;
1306 }
1307
1308 okey = PyString_FromString(key);
1309 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001310 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 r = PyObject_SetItem(o, okey, value);
1312 Py_DECREF(okey);
1313 return r;
1314}
1315
1316int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001317PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001318 PyObject *o;
1319 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001320{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001322
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 v = PyMapping_GetItemString(o, key);
1324 if (v) {
1325 Py_DECREF(v);
1326 return 1;
1327 }
1328 PyErr_Clear();
1329 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001330}
1331
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001332int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001333PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001334 PyObject *o;
1335 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001336{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001337 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001338
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001339 v = PyObject_GetItem(o, key);
1340 if (v) {
1341 Py_DECREF(v);
1342 return 1;
1343 }
1344 PyErr_Clear();
1345 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001346}
1347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348/* Operations on callable objects */
1349
1350/* XXX PyCallable_Check() is in object.c */
1351
Guido van Rossume15dee51995-07-18 14:12:02 +00001352PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001353PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001355{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001356 PyObject *r;
1357 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001358
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 if (args == NULL) {
1360 args = PyTuple_New(0);
1361 if (args == NULL)
1362 return NULL;
1363 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001364
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001365 r = PyEval_CallObject(o, args);
1366
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001367 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001368 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001369 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001370
1371 return r;
1372}
Guido van Rossume15dee51995-07-18 14:12:02 +00001373
1374PyObject *
1375#ifdef HAVE_STDARG_PROTOTYPES
1376/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001377PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001378#else
1379/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001381#endif
1382{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001383 va_list va;
1384 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001385#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001386 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001387#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001388 PyObject *callable;
1389 char *format;
1390 va_start(va);
1391 callable = va_arg(va, PyObject *);
1392 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001393#endif
1394
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001395 if (callable == NULL) {
1396 va_end(va);
1397 return null_error();
1398 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001399
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001400 if (format)
1401 args = Py_VaBuildValue(format, va);
1402 else
1403 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001404
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001405 va_end(va);
1406
1407 if (args == NULL)
1408 return NULL;
1409
1410 if (!PyTuple_Check(args)) {
1411 PyObject *a;
1412
1413 a = PyTuple_New(1);
1414 if (a == NULL)
1415 return NULL;
1416 if (PyTuple_SetItem(a, 0, args) < 0)
1417 return NULL;
1418 args = a;
1419 }
1420 retval = PyObject_CallObject(callable, args);
1421
1422 Py_DECREF(args);
1423
1424 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001425}
1426
1427PyObject *
1428#ifdef HAVE_STDARG_PROTOTYPES
1429/* VARARGS 2 */
1430PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1431#else
1432/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001434#endif
1435{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436 va_list va;
1437 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001438#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001439 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001440#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001441 PyObject *o;
1442 char *name;
1443 char *format;
1444 va_start(va);
1445 o = va_arg(va, PyObject *);
1446 name = va_arg(va, char *);
1447 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001448#endif
1449
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001450 if (o == NULL || name == NULL) {
1451 va_end(va);
1452 return null_error();
1453 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001454
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 func = PyObject_GetAttrString(o, name);
1456 if (func == NULL) {
1457 va_end(va);
1458 PyErr_SetString(PyExc_AttributeError, name);
1459 return 0;
1460 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001461
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462 if (!PyCallable_Check(func)) {
1463 va_end(va);
1464 return type_error("call of non-callable attribute");
1465 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001466
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 if (format && *format)
1468 args = Py_VaBuildValue(format, va);
1469 else
1470 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001471
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001472 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001473
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 if (!args)
1475 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001476
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001477 if (!PyTuple_Check(args)) {
1478 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001479
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001480 a = PyTuple_New(1);
1481 if (a == NULL)
1482 return NULL;
1483 if (PyTuple_SetItem(a, 0, args) < 0)
1484 return NULL;
1485 args = a;
1486 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001487
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001488 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001489
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001490 Py_DECREF(args);
1491 Py_DECREF(func);
1492
1493 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001494}