blob: 7458b94dfb8dd56558b14ec260d38075ef112e27 [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 Rossumcea1c8c1998-05-22 00:47:05 +0000235 if (PyInt_Check(key))
236 return PySequence_GetItem(o, PyInt_AsLong(key));
237
238 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000239}
240
241int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000242PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000243 PyObject *o;
244 PyObject *key;
245 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000246{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000247 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000248
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000249 if (o == NULL || key == NULL || value == NULL) {
250 null_error();
251 return -1;
252 }
253 m = o->ob_type->tp_as_mapping;
254 if (m && m->mp_ass_subscript)
255 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000257 if (PyInt_Check(key))
258 return PySequence_SetItem(o, PyInt_AsLong(key), value);
259
260 type_error("object does not support item assignment");
261 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000262}
263
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000264int
265PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000266 PyObject *o;
267 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000268{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000269 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000270
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000271 if (o == NULL || key == NULL) {
272 null_error();
273 return -1;
274 }
275 m = o->ob_type->tp_as_mapping;
276 if (m && m->mp_ass_subscript)
277 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000278
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000279 if (PyInt_Check(key))
280 return PySequence_DelItem(o, PyInt_AsLong(key));
281
282 type_error("object does not support item deletion");
283 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000284}
285
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000286/* Operations on numbers */
287
288int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000289PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000290 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000291{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000292 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000293}
294
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000295/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000297#define BINOP(v, w, opname, ropname, thisfunc) \
298 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000299 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
300
301PyObject *
302PyNumber_Or(v, w)
303 PyObject *v, *w;
304{
305 extern int PyNumber_Coerce();
306
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000307 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000308 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000309 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000310 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
311 if (PyNumber_Coerce(&v, &w) != 0)
312 return NULL;
313 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
314 x = (*f)(v, w);
315 Py_DECREF(v);
316 Py_DECREF(w);
317 if (f != NULL)
318 return x;
319 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000320 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000321}
322
323PyObject *
324PyNumber_Xor(v, w)
325 PyObject *v, *w;
326{
327 extern int PyNumber_Coerce();
328
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000329 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000330 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000331 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000332 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
333 if (PyNumber_Coerce(&v, &w) != 0)
334 return NULL;
335 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
336 x = (*f)(v, w);
337 Py_DECREF(v);
338 Py_DECREF(w);
339 if (f != NULL)
340 return x;
341 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000342 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000343}
344
345PyObject *
346PyNumber_And(v, w)
347 PyObject *v, *w;
348{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000349 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000350 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000351 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000352 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
353 if (PyNumber_Coerce(&v, &w) != 0)
354 return NULL;
355 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
356 x = (*f)(v, w);
357 Py_DECREF(v);
358 Py_DECREF(w);
359 if (f != NULL)
360 return x;
361 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000362 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000363}
364
365PyObject *
366PyNumber_Lshift(v, w)
367 PyObject *v, *w;
368{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000369 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000370 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000371 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000372 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
373 if (PyNumber_Coerce(&v, &w) != 0)
374 return NULL;
375 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
376 x = (*f)(v, w);
377 Py_DECREF(v);
378 Py_DECREF(w);
379 if (f != NULL)
380 return x;
381 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000382 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000383}
384
385PyObject *
386PyNumber_Rshift(v, w)
387 PyObject *v, *w;
388{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000389 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000390 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000391 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000392 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
393 if (PyNumber_Coerce(&v, &w) != 0)
394 return NULL;
395 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
396 x = (*f)(v, w);
397 Py_DECREF(v);
398 Py_DECREF(w);
399 if (f != NULL)
400 return x;
401 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000402 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000403}
404
405PyObject *
406PyNumber_Add(v, w)
407 PyObject *v, *w;
408{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000409 PySequenceMethods *m;
410
411 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
412 m = v->ob_type->tp_as_sequence;
413 if (m && m->sq_concat)
414 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000415 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000416 PyObject *x = NULL;
417 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000418 if (PyNumber_Coerce(&v, &w) != 0)
419 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000420 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
421 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000422 Py_DECREF(v);
423 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000424 if (f != NULL)
425 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000426 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000427 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000428}
429
430PyObject *
431PyNumber_Subtract(v, w)
432 PyObject *v, *w;
433{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000434 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000435 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000436 PyObject *x = NULL;
437 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000438 if (PyNumber_Coerce(&v, &w) != 0)
439 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000440 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
441 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000442 Py_DECREF(v);
443 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000444 if (f != NULL)
445 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000446 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000447 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000448}
449
450PyObject *
451PyNumber_Multiply(v, w)
452 PyObject *v, *w;
453{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000454 PyTypeObject *tp = v->ob_type;
455 PySequenceMethods *m;
456
457 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000458 if (tp->tp_as_number != NULL &&
459 w->ob_type->tp_as_sequence != NULL &&
460 !PyInstance_Check(v)) {
461 /* number*sequence -- swap v and w */
462 PyObject *tmp = v;
463 v = w;
464 w = tmp;
465 tp = v->ob_type;
466 }
467 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000468 PyObject *x = NULL;
469 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000470 if (PyInstance_Check(v)) {
471 /* Instances of user-defined classes get their
472 other argument uncoerced, so they may
473 implement sequence*number as well as
474 number*number. */
475 Py_INCREF(v);
476 Py_INCREF(w);
477 }
478 else if (PyNumber_Coerce(&v, &w) != 0)
479 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000480 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
481 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000482 Py_DECREF(v);
483 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000484 if (f != NULL)
485 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000486 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000487 m = tp->tp_as_sequence;
488 if (m && m->sq_repeat) {
489 if (!PyInt_Check(w))
490 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000491 "can't multiply sequence with non-int");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000492 return (*m->sq_repeat)(v, (int)PyInt_AsLong(w));
Guido van Rossume15dee51995-07-18 14:12:02 +0000493 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000494 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000495}
496
497PyObject *
498PyNumber_Divide(v, w)
499 PyObject *v, *w;
500{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000501 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000502 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000503 PyObject *x = NULL;
504 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000505 if (PyNumber_Coerce(&v, &w) != 0)
506 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000507 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
508 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000509 Py_DECREF(v);
510 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000511 if (f != NULL)
512 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000513 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000514 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000515}
516
517PyObject *
518PyNumber_Remainder(v, w)
519 PyObject *v, *w;
520{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000521 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000522 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000523 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000524 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000525 PyObject *x = NULL;
526 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000527 if (PyNumber_Coerce(&v, &w) != 0)
528 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000529 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
530 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000531 Py_DECREF(v);
532 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000533 if (f != NULL)
534 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000535 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000536 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000537}
538
539PyObject *
540PyNumber_Divmod(v, w)
541 PyObject *v, *w;
542{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000543 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
544 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000545 PyObject *x = NULL;
546 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000547 if (PyNumber_Coerce(&v, &w) != 0)
548 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000549 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
550 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000551 Py_DECREF(v);
552 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000553 if (f != NULL)
554 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000555 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000556 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000557}
558
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000559/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000560
561static PyObject *
562do_pow(v, w)
563 PyObject *v, *w;
564{
565 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000566 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
567 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000568 if (v->ob_type->tp_as_number == NULL ||
569 w->ob_type->tp_as_number == NULL) {
570 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000571 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000572 return NULL;
573 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000574 if (
575#ifndef WITHOUT_COMPLEX
576 !PyComplex_Check(v) &&
577#endif
578 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
Guido van Rossume15dee51995-07-18 14:12:02 +0000579 if (!PyErr_Occurred())
580 PyErr_SetString(PyExc_ValueError,
581 "negative number to float power");
582 return NULL;
583 }
584 if (PyNumber_Coerce(&v, &w) != 0)
585 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000586 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
587 res = (*f)(v, w, Py_None);
588 else
589 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000590 Py_DECREF(v);
591 Py_DECREF(w);
592 return res;
593}
594
595PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000596PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000597 PyObject *v, *w, *z;
598{
599 PyObject *res;
600 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000601 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000602
603 if (z == Py_None)
604 return do_pow(v, w);
605 /* XXX The ternary version doesn't do class instance coercions */
606 if (PyInstance_Check(v))
607 return v->ob_type->tp_as_number->nb_power(v, w, z);
608 if (v->ob_type->tp_as_number == NULL ||
609 z->ob_type->tp_as_number == NULL ||
610 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000611 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000612 }
613 if (PyNumber_Coerce(&v, &w) != 0)
614 return NULL;
615 res = NULL;
616 v1 = v;
617 z1 = z;
618 if (PyNumber_Coerce(&v1, &z1) != 0)
619 goto error2;
620 w2 = w;
621 z2 = z1;
622 if (PyNumber_Coerce(&w2, &z2) != 0)
623 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000624 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
625 res = (*f)(v1, w2, z2);
626 else
627 res = type_error(
628 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000629 Py_DECREF(w2);
630 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000631 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000632 Py_DECREF(v1);
633 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000634 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000635 Py_DECREF(v);
636 Py_DECREF(w);
637 return res;
638}
639
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000640/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000641
642PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000643PyNumber_Negative(o)
644 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000645{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000646 PyNumberMethods *m;
647
648 if (o == NULL)
649 return null_error();
650 m = o->ob_type->tp_as_number;
651 if (m && m->nb_negative)
652 return (*m->nb_negative)(o);
653
654 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000655}
656
657PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000658PyNumber_Positive(o)
659 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000660{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000661 PyNumberMethods *m;
662
663 if (o == NULL)
664 return null_error();
665 m = o->ob_type->tp_as_number;
666 if (m && m->nb_positive)
667 return (*m->nb_positive)(o);
668
669 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000670}
671
672PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000673PyNumber_Invert(o)
674 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000675{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000676 PyNumberMethods *m;
677
678 if (o == NULL)
679 return null_error();
680 m = o->ob_type->tp_as_number;
681 if (m && m->nb_invert)
682 return (*m->nb_invert)(o);
683
684 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000685}
686
687PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000688PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000689 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000690{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000691 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000692
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000693 if (o == NULL)
694 return null_error();
695 m = o->ob_type->tp_as_number;
696 if (m && m->nb_absolute)
697 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000698
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000699 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000700}
701
702PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000703PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000704 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000705{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000706 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000707
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000708 if (o == NULL)
709 return null_error();
710 if (PyString_Check(o))
711 return int_from_string(o);
712 m = o->ob_type->tp_as_number;
713 if (m && m->nb_int)
714 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000715
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000716 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000717}
718
719PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000720PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000721 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000722{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000723 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000724
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000725 if (o == NULL)
726 return null_error();
727 if (PyString_Check(o))
728 return long_from_string(o);
729 m = o->ob_type->tp_as_number;
730 if (m && m->nb_long)
731 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000732
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000733 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000734}
735
736PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000737PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000738 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000739{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000740 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000741
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000742 if (o == NULL)
743 return null_error();
744 if (PyString_Check(o))
745 return float_from_string(o);
746 m = o->ob_type->tp_as_number;
747 if (m && m->nb_float)
748 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000749
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000750 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000751}
752
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000753/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000754
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755int
756PySequence_Check(s)
757 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000758{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000759 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000760}
761
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000762int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000763PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000764 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000765{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000766 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000767
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000768 if (s == NULL) {
769 null_error();
770 return -1;
771 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000772
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000773 m = s->ob_type->tp_as_sequence;
774 if (m && m->sq_length)
775 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000776
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000777 type_error("len() of unsized object");
778 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000779}
780
781PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000782PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000783 PyObject *s;
784 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000785{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000786 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000787
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000788 if (s == NULL || o == NULL)
789 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000790
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000791 m = s->ob_type->tp_as_sequence;
792 if (m && m->sq_concat)
793 return m->sq_concat(s, o);
794
795 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000796}
797
798PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000799PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000800 PyObject *o;
801 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000802{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000804
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805 if (o == NULL)
806 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000807
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000808 m = o->ob_type->tp_as_sequence;
809 if (m && m->sq_repeat)
810 return m->sq_repeat(o, count);
811
812 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000813}
814
815PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000816PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000817 PyObject *s;
818 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000819{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000820 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000821
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000822 if (s == NULL)
823 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000824
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000825 m = s->ob_type->tp_as_sequence;
826 if (m && m->sq_item) {
827 if (i < 0) {
828 if (m->sq_length) {
829 int l = (*m->sq_length)(s);
830 if (l < 0)
831 return NULL;
832 i += l;
833 }
834 }
835 return m->sq_item(s, i);
836 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000837
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000838 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000839}
840
841PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000842PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000843 PyObject *s;
844 int i1;
845 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000846{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000847 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000848
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000849 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000850
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000851 m = s->ob_type->tp_as_sequence;
852 if (m && m->sq_slice) {
853 if (i1 < 0 || i2 < 0) {
854 if (m->sq_length) {
855 int l = (*m->sq_length)(s);
856 if (l < 0)
857 return NULL;
858 if (i1 < 0)
859 i1 += l;
860 if (i2 < 0)
861 i2 += l;
862 }
863 }
864 return m->sq_slice(s, i1, i2);
865 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000866
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000868}
869
870int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000871PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000872 PyObject *s;
873 int i;
874 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000875{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000876 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000877
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000878 if (s == NULL) {
879 null_error();
880 return -1;
881 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000882
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 m = s->ob_type->tp_as_sequence;
884 if (m && m->sq_ass_item) {
885 if (i < 0) {
886 if (m->sq_length) {
887 int l = (*m->sq_length)(s);
888 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000889 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000890 i += l;
891 }
892 }
893 return m->sq_ass_item(s, i, o);
894 }
895
896 type_error("object doesn't support item assignment");
897 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000898}
899
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000900int
901PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000902 PyObject *s;
903 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000904{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000906
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 if (s == NULL) {
908 null_error();
909 return -1;
910 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000911
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 m = s->ob_type->tp_as_sequence;
913 if (m && m->sq_ass_item) {
914 if (i < 0) {
915 if (m->sq_length) {
916 int l = (*m->sq_length)(s);
917 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000918 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000919 i += l;
920 }
921 }
922 return m->sq_ass_item(s, i, (PyObject *)NULL);
923 }
924
925 type_error("object doesn't support item deletion");
926 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000927}
928
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000929int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000930PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000931 PyObject *s;
932 int i1;
933 int i2;
934 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000935{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000936 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000937
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000938 if (s == NULL) {
939 null_error();
940 return -1;
941 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000942
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000943 m = s->ob_type->tp_as_sequence;
944 if (m && m->sq_ass_slice) {
945 if (i1 < 0 || i2 < 0) {
946 if (m->sq_length) {
947 int l = (*m->sq_length)(s);
948 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000949 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000950 if (i1 < 0)
951 i1 += l;
952 if (i2 < 0)
953 i2 += l;
954 }
955 }
956 return m->sq_ass_slice(s, i1, i2, o);
957 }
958 type_error("object doesn't support slice assignment");
959 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000960}
961
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000962int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000963PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000964 PyObject *s;
965 int i1;
966 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000967{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000968 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000969
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000970 if (s == NULL) {
971 null_error();
972 return -1;
973 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000974
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 m = s->ob_type->tp_as_sequence;
976 if (m && m->sq_ass_slice) {
977 if (i1 < 0 || i2 < 0) {
978 if (m->sq_length) {
979 int l = (*m->sq_length)(s);
980 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000981 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000982 if (i1 < 0)
983 i1 += l;
984 if (i2 < 0)
985 i2 += l;
986 }
987 }
988 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
989 }
990 type_error("object doesn't support slice deletion");
991 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000992}
993
Guido van Rossume15dee51995-07-18 14:12:02 +0000994PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000995PySequence_Tuple(v)
996 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000997{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000999
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001000 if (v == NULL)
1001 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001002
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 if (PyTuple_Check(v)) {
1004 Py_INCREF(v);
1005 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001006 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001007
1008 if (PyList_Check(v))
1009 return PyList_AsTuple(v);
1010
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001011 /* There used to be code for strings here, but tuplifying strings is
1012 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001013
1014 /* Generic sequence object */
1015 m = v->ob_type->tp_as_sequence;
1016 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001017 int i;
1018 PyObject *t;
1019 int n = PySequence_Length(v);
1020 if (n < 0)
1021 return NULL;
1022 t = PyTuple_New(n);
1023 if (t == NULL)
1024 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001025 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001026 PyObject *item = (*m->sq_item)(v, i);
1027 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001028 if (PyErr_ExceptionMatches(PyExc_IndexError))
1029 PyErr_Clear();
1030 else {
1031 Py_DECREF(t);
1032 t = NULL;
1033 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 break;
1035 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001036 if (i >= n) {
1037 if (n < 500)
1038 n += 10;
1039 else
1040 n += 100;
1041 if (_PyTuple_Resize(&t, n, 0) != 0)
1042 break;
1043 }
1044 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001045 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001046 if (i < n && t != NULL)
1047 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001048 return t;
1049 }
1050
1051 /* None of the above */
1052 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001053}
1054
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001055PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056PySequence_List(v)
1057 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001058{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001059 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001060
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001061 if (v == NULL)
1062 return null_error();
1063
1064 if (PyList_Check(v))
1065 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1066
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067 m = v->ob_type->tp_as_sequence;
1068 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001069 int i;
1070 PyObject *l;
1071 int n = PySequence_Length(v);
1072 if (n < 0)
1073 return NULL;
1074 l = PyList_New(n);
1075 if (l == NULL)
1076 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001077 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001078 PyObject *item = (*m->sq_item)(v, i);
1079 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001080 if (PyErr_ExceptionMatches(PyExc_IndexError))
1081 PyErr_Clear();
1082 else {
1083 Py_DECREF(l);
1084 l = NULL;
1085 }
1086 break;
1087 }
1088 if (i < n)
1089 PyList_SET_ITEM(l, i, item);
1090 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001091 Py_DECREF(l);
1092 l = NULL;
1093 break;
1094 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001095 }
1096 if (i < n && l != NULL) {
1097 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1098 Py_DECREF(l);
1099 l = NULL;
1100 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001101 }
1102 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001103 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001105}
1106
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001107int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001108PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 PyObject *s;
1110 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001111{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001112 int l, i, n, cmp, err;
1113 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001115 if (s == NULL || o == NULL) {
1116 null_error();
1117 return -1;
1118 }
1119
1120 l = PySequence_Length(s);
1121 if (l < 0)
1122 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001123
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124 n = 0;
1125 for (i = 0; i < l; i++) {
1126 item = PySequence_GetItem(s, i);
1127 if (item == NULL)
1128 return -1;
1129 err = PyObject_Cmp(item, o, &cmp);
1130 Py_DECREF(item);
1131 if (err < 0)
1132 return err;
1133 if (cmp == 0)
1134 n++;
1135 }
1136 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001137}
1138
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001139int
1140PySequence_Contains(w, v) /* v in w */
1141 PyObject *w;
1142 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001143{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144 int i, cmp;
1145 PyObject *x;
1146 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001147
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001148 /* Special case for char in string */
1149 if (PyString_Check(w)) {
1150 register char *s, *end;
1151 register char c;
1152 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1153 PyErr_SetString(PyExc_TypeError,
1154 "string member test needs char left operand");
1155 return -1;
1156 }
1157 c = PyString_AsString(v)[0];
1158 s = PyString_AsString(w);
1159 end = s + PyString_Size(w);
1160 while (s < end) {
1161 if (c == *s++)
1162 return 1;
1163 }
1164 return 0;
1165 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001166
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001167 sq = w->ob_type->tp_as_sequence;
1168 if (sq == NULL || sq->sq_item == NULL) {
1169 PyErr_SetString(PyExc_TypeError,
1170 "'in' or 'not in' needs sequence right argument");
1171 return -1;
1172 }
1173
1174 for (i = 0; ; i++) {
1175 x = (*sq->sq_item)(w, i);
1176 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001177 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178 PyErr_Clear();
1179 break;
1180 }
1181 return -1;
1182 }
1183 cmp = PyObject_Compare(v, x);
1184 Py_XDECREF(x);
1185 if (cmp == 0)
1186 return 1;
1187 if (PyErr_Occurred())
1188 return -1;
1189 }
1190
1191 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001192}
1193
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194/* Backwards compatibility */
1195#undef PySequence_In
1196int
1197PySequence_In(w, v)
1198 PyObject *w;
1199 PyObject *v;
1200{
1201 return PySequence_Contains(w, v);
1202}
1203
1204int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001205PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001206 PyObject *s;
1207 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001208{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209 int l, i, cmp, err;
1210 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001211
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001212 if (s == NULL || o == NULL) {
1213 null_error();
1214 return -1;
1215 }
1216
1217 l = PySequence_Length(s);
1218 if (l < 0)
1219 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001220
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001221 for (i = 0; i < l; i++) {
1222 item = PySequence_GetItem(s, i);
1223 if (item == NULL)
1224 return -1;
1225 err = PyObject_Cmp(item, o, &cmp);
1226 Py_DECREF(item);
1227 if (err < 0)
1228 return err;
1229 if (cmp == 0)
1230 return i;
1231 }
1232
1233 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1234 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001235}
1236
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237/* Operations on mappings */
1238
1239int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001240PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001242{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001244}
1245
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001246int
1247PyMapping_Length(o)
1248 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001249{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001250 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001251
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252 if (o == NULL) {
1253 null_error();
1254 return -1;
1255 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 m = o->ob_type->tp_as_mapping;
1258 if (m && m->mp_length)
1259 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001260
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261 type_error("len() of unsized object");
1262 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001263}
1264
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265PyObject *
1266PyMapping_GetItemString(o, key)
1267 PyObject *o;
1268 char *key;
1269{
1270 PyObject *okey, *r;
1271
1272 if (key == NULL)
1273 return null_error();
1274
1275 okey = PyString_FromString(key);
1276 if (okey == NULL)
1277 return NULL;
1278 r = PyObject_GetItem(o, okey);
1279 Py_DECREF(okey);
1280 return r;
1281}
1282
1283int
1284PyMapping_SetItemString(o, key, value)
1285 PyObject *o;
1286 char *key;
1287 PyObject *value;
1288{
1289 PyObject *okey;
1290 int r;
1291
1292 if (key == NULL) {
1293 null_error();
1294 return -1;
1295 }
1296
1297 okey = PyString_FromString(key);
1298 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001299 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001300 r = PyObject_SetItem(o, okey, value);
1301 Py_DECREF(okey);
1302 return r;
1303}
1304
1305int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001306PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 PyObject *o;
1308 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001309{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001310 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001311
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 v = PyMapping_GetItemString(o, key);
1313 if (v) {
1314 Py_DECREF(v);
1315 return 1;
1316 }
1317 PyErr_Clear();
1318 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001319}
1320
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001322PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323 PyObject *o;
1324 PyObject *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 = PyObject_GetItem(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 +00001337/* Operations on callable objects */
1338
1339/* XXX PyCallable_Check() is in object.c */
1340
Guido van Rossume15dee51995-07-18 14:12:02 +00001341PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001342PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001344{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 PyObject *r;
1346 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348 if (args == NULL) {
1349 args = PyTuple_New(0);
1350 if (args == NULL)
1351 return NULL;
1352 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001353
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354 r = PyEval_CallObject(o, args);
1355
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001356 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001357 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001358 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359
1360 return r;
1361}
Guido van Rossume15dee51995-07-18 14:12:02 +00001362
1363PyObject *
1364#ifdef HAVE_STDARG_PROTOTYPES
1365/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001366PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001367#else
1368/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001370#endif
1371{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 va_list va;
1373 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001374#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001376#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001377 PyObject *callable;
1378 char *format;
1379 va_start(va);
1380 callable = va_arg(va, PyObject *);
1381 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001382#endif
1383
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 if (callable == NULL) {
1385 va_end(va);
1386 return null_error();
1387 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001388
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001389 if (format)
1390 args = Py_VaBuildValue(format, va);
1391 else
1392 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001393
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394 va_end(va);
1395
1396 if (args == NULL)
1397 return NULL;
1398
1399 if (!PyTuple_Check(args)) {
1400 PyObject *a;
1401
1402 a = PyTuple_New(1);
1403 if (a == NULL)
1404 return NULL;
1405 if (PyTuple_SetItem(a, 0, args) < 0)
1406 return NULL;
1407 args = a;
1408 }
1409 retval = PyObject_CallObject(callable, args);
1410
1411 Py_DECREF(args);
1412
1413 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001414}
1415
1416PyObject *
1417#ifdef HAVE_STDARG_PROTOTYPES
1418/* VARARGS 2 */
1419PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1420#else
1421/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001422 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001423#endif
1424{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 va_list va;
1426 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001427#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001429#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001430 PyObject *o;
1431 char *name;
1432 char *format;
1433 va_start(va);
1434 o = va_arg(va, PyObject *);
1435 name = va_arg(va, char *);
1436 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001437#endif
1438
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001439 if (o == NULL || name == NULL) {
1440 va_end(va);
1441 return null_error();
1442 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001443
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001444 func = PyObject_GetAttrString(o, name);
1445 if (func == NULL) {
1446 va_end(va);
1447 PyErr_SetString(PyExc_AttributeError, name);
1448 return 0;
1449 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001450
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001451 if (!PyCallable_Check(func)) {
1452 va_end(va);
1453 return type_error("call of non-callable attribute");
1454 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001455
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001456 if (format && *format)
1457 args = Py_VaBuildValue(format, va);
1458 else
1459 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001460
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001461 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001462
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001463 if (!args)
1464 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001465
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 if (!PyTuple_Check(args)) {
1467 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001468
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001469 a = PyTuple_New(1);
1470 if (a == NULL)
1471 return NULL;
1472 if (PyTuple_SetItem(a, 0, args) < 0)
1473 return NULL;
1474 args = a;
1475 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001476
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001477 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001478
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001479 Py_DECREF(args);
1480 Py_DECREF(func);
1481
1482 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001483}