blob: c13cb72d66fe5e62b07f2c9f8f5af666ed0a79e2 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossume15dee51995-07-18 14:12:02 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossume15dee51995-07-18 14:12:02 +00009******************************************************************/
10
11/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012
Guido van Rossume15dee51995-07-18 14:12:02 +000013#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +000014#include <ctype.h>
Guido van Rossume15dee51995-07-18 14:12:02 +000015
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000016/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000017
18static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000019type_error(char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000020{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000021 PyErr_SetString(PyExc_TypeError, msg);
22 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000023}
24
Guido van Rossum052b7e11996-11-11 15:08:19 +000025static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000026null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000027{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000028 if (!PyErr_Occurred())
29 PyErr_SetString(PyExc_SystemError,
30 "null argument to internal routine");
31 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000032}
33
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034/* Operations on any object */
35
36int
Fred Drake79912472000-07-09 04:06:11 +000037PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000038{
39 int r;
40
41 if (o1 == NULL || o2 == NULL) {
42 null_error();
43 return -1;
44 }
45 r = PyObject_Compare(o1, o2);
46 if (PyErr_Occurred())
47 return -1;
48 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000049 return 0;
50}
Guido van Rossume15dee51995-07-18 14:12:02 +000051
52PyObject *
Fred Drake79912472000-07-09 04:06:11 +000053PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000054{
55 PyObject *v;
56
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000057 if (o == NULL)
58 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000059 v = (PyObject *)o->ob_type;
60 Py_INCREF(v);
61 return v;
62}
63
64int
Fred Drake79912472000-07-09 04:06:11 +000065PyObject_Length(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000066{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000067 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000068
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000069 if (o == NULL) {
70 null_error();
71 return -1;
72 }
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000074 m = o->ob_type->tp_as_sequence;
75 if (m && m->sq_length)
76 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000077
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000078 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000079}
80
81PyObject *
Fred Drake79912472000-07-09 04:06:11 +000082PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +000083{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000084 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000086 if (o == NULL || key == NULL)
87 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000088
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000089 m = o->ob_type->tp_as_mapping;
90 if (m && m->mp_subscript)
91 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +000092
Guido van Rossum21308241998-08-13 16:44:44 +000093 if (o->ob_type->tp_as_sequence) {
94 if (PyInt_Check(key))
95 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +000096 else if (PyLong_Check(key)) {
97 long key_value = PyLong_AsLong(key);
98 if (key_value == -1 && PyErr_Occurred())
99 return NULL;
100 return PySequence_GetItem(o, key_value);
101 }
Guido van Rossum21308241998-08-13 16:44:44 +0000102 return type_error("sequence index must be integer");
103 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000104
105 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000106}
107
108int
Fred Drake79912472000-07-09 04:06:11 +0000109PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000110{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000111 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000112
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000113 if (o == NULL || key == NULL || value == NULL) {
114 null_error();
115 return -1;
116 }
117 m = o->ob_type->tp_as_mapping;
118 if (m && m->mp_ass_subscript)
119 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000120
Guido van Rossum21308241998-08-13 16:44:44 +0000121 if (o->ob_type->tp_as_sequence) {
122 if (PyInt_Check(key))
123 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000124 else if (PyLong_Check(key)) {
125 long key_value = PyLong_AsLong(key);
126 if (key_value == -1 && PyErr_Occurred())
127 return -1;
128 return PySequence_SetItem(o, key_value, value);
129 }
Guido van Rossum21308241998-08-13 16:44:44 +0000130 type_error("sequence index must be integer");
131 return -1;
132 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133
134 type_error("object does not support item assignment");
135 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000136}
137
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000138int
Fred Drake79912472000-07-09 04:06:11 +0000139PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000140{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000141 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000142
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000143 if (o == NULL || key == NULL) {
144 null_error();
145 return -1;
146 }
147 m = o->ob_type->tp_as_mapping;
148 if (m && m->mp_ass_subscript)
149 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000150
Guido van Rossum21308241998-08-13 16:44:44 +0000151 if (o->ob_type->tp_as_sequence) {
152 if (PyInt_Check(key))
153 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000154 else if (PyLong_Check(key)) {
155 long key_value = PyLong_AsLong(key);
156 if (key_value == -1 && PyErr_Occurred())
157 return -1;
158 return PySequence_DelItem(o, key_value);
159 }
Guido van Rossum21308241998-08-13 16:44:44 +0000160 type_error("sequence index must be integer");
161 return -1;
162 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000163
164 type_error("object does not support item deletion");
165 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000166}
167
Guido van Rossum4c08d552000-03-10 22:55:18 +0000168int PyObject_AsCharBuffer(PyObject *obj,
169 const char **buffer,
170 int *buffer_len)
171{
172 PyBufferProcs *pb;
173 const char *pp;
174 int len;
175
176 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
177 null_error();
178 return -1;
179 }
180 pb = obj->ob_type->tp_as_buffer;
181 if ( pb == NULL ||
182 pb->bf_getcharbuffer == NULL ||
183 pb->bf_getsegcount == NULL ) {
184 PyErr_SetString(PyExc_TypeError,
185 "expected a character buffer object");
186 goto onError;
187 }
188 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
189 PyErr_SetString(PyExc_TypeError,
190 "expected a single-segment buffer object");
191 goto onError;
192 }
193 len = (*pb->bf_getcharbuffer)(obj,0,&pp);
194 if (len < 0)
195 goto onError;
196 *buffer = pp;
197 *buffer_len = len;
198 return 0;
199
200 onError:
201 return -1;
202}
203
204int PyObject_AsReadBuffer(PyObject *obj,
205 const void **buffer,
206 int *buffer_len)
207{
208 PyBufferProcs *pb;
209 void *pp;
210 int len;
211
212 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
213 null_error();
214 return -1;
215 }
216 pb = obj->ob_type->tp_as_buffer;
217 if ( pb == NULL ||
218 pb->bf_getreadbuffer == NULL ||
219 pb->bf_getsegcount == NULL ) {
220 PyErr_SetString(PyExc_TypeError,
221 "expected a readable buffer object");
222 goto onError;
223 }
224 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
225 PyErr_SetString(PyExc_TypeError,
226 "expected a single-segment buffer object");
227 goto onError;
228 }
229 len = (*pb->bf_getreadbuffer)(obj,0,&pp);
230 if (len < 0)
231 goto onError;
232 *buffer = pp;
233 *buffer_len = len;
234 return 0;
235
236 onError:
237 return -1;
238}
239
240int PyObject_AsWriteBuffer(PyObject *obj,
241 void **buffer,
242 int *buffer_len)
243{
244 PyBufferProcs *pb;
245 void*pp;
246 int len;
247
248 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
249 null_error();
250 return -1;
251 }
252 pb = obj->ob_type->tp_as_buffer;
253 if ( pb == NULL ||
254 pb->bf_getwritebuffer == NULL ||
255 pb->bf_getsegcount == NULL ) {
256 PyErr_SetString(PyExc_TypeError,
257 "expected a writeable buffer object");
258 goto onError;
259 }
260 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
261 PyErr_SetString(PyExc_TypeError,
262 "expected a single-segment buffer object");
263 goto onError;
264 }
265 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
266 if (len < 0)
267 goto onError;
268 *buffer = pp;
269 *buffer_len = len;
270 return 0;
271
272 onError:
273 return -1;
274}
275
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000276/* Operations on numbers */
277
278int
Fred Drake79912472000-07-09 04:06:11 +0000279PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000280{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000281 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000282}
283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000284/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000285
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000286#define BINOP(v, w, opname, ropname, thisfunc) \
287 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000288 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
289
290PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000291PyNumber_Or(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000292{
293 extern int PyNumber_Coerce();
294
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000295 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000296 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000297 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000298 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000299 if (PyNumber_Coerce(&v, &w) != 0)
300 return NULL;
301 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
302 x = (*f)(v, w);
303 Py_DECREF(v);
304 Py_DECREF(w);
305 if (f != NULL)
306 return x;
307 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000308 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000309}
310
311PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000312PyNumber_Xor(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000313{
314 extern int PyNumber_Coerce();
315
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000316 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000317 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000318 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000319 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000320 if (PyNumber_Coerce(&v, &w) != 0)
321 return NULL;
322 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
323 x = (*f)(v, w);
324 Py_DECREF(v);
325 Py_DECREF(w);
326 if (f != NULL)
327 return x;
328 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000329 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000330}
331
332PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000333PyNumber_And(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000334{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000335 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000336 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000337 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000338 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000339 if (PyNumber_Coerce(&v, &w) != 0)
340 return NULL;
341 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
342 x = (*f)(v, w);
343 Py_DECREF(v);
344 Py_DECREF(w);
345 if (f != NULL)
346 return x;
347 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000348 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000349}
350
351PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000352PyNumber_Lshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000353{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000354 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000355 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000356 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000357 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000358 if (PyNumber_Coerce(&v, &w) != 0)
359 return NULL;
360 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
361 x = (*f)(v, w);
362 Py_DECREF(v);
363 Py_DECREF(w);
364 if (f != NULL)
365 return x;
366 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000367 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000368}
369
370PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000371PyNumber_Rshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000372{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000373 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000374 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000375 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000376 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000377 if (PyNumber_Coerce(&v, &w) != 0)
378 return NULL;
379 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
380 x = (*f)(v, w);
381 Py_DECREF(v);
382 Py_DECREF(w);
383 if (f != NULL)
384 return x;
385 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000386 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000387}
388
389PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000390PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000391{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000392 PySequenceMethods *m;
393
394 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
395 m = v->ob_type->tp_as_sequence;
396 if (m && m->sq_concat)
397 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000398 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000399 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000400 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000401 if (PyNumber_Coerce(&v, &w) != 0)
402 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000403 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
404 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000405 Py_DECREF(v);
406 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000407 if (f != NULL)
408 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000409 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000410 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000411}
412
413PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000414PyNumber_Subtract(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000415{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000416 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000417 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000418 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000419 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000420 if (PyNumber_Coerce(&v, &w) != 0)
421 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000422 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
423 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000424 Py_DECREF(v);
425 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000426 if (f != NULL)
427 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000428 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000429 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000430}
431
432PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000433PyNumber_Multiply(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000434{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000435 PyTypeObject *tp = v->ob_type;
436 PySequenceMethods *m;
437
438 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000439 if (tp->tp_as_number != NULL &&
440 w->ob_type->tp_as_sequence != NULL &&
441 !PyInstance_Check(v)) {
442 /* number*sequence -- swap v and w */
443 PyObject *tmp = v;
444 v = w;
445 w = tmp;
446 tp = v->ob_type;
447 }
448 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000449 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000450 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000451 if (PyInstance_Check(v)) {
452 /* Instances of user-defined classes get their
453 other argument uncoerced, so they may
454 implement sequence*number as well as
455 number*number. */
456 Py_INCREF(v);
457 Py_INCREF(w);
458 }
459 else if (PyNumber_Coerce(&v, &w) != 0)
460 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000461 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
462 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000463 Py_DECREF(v);
464 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000465 if (f != NULL)
466 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000467 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000468 m = tp->tp_as_sequence;
469 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000470 long mul_value;
471
472 if (PyInt_Check(w)) {
473 mul_value = PyInt_AsLong(w);
474 }
475 else if (PyLong_Check(w)) {
476 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000477 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000478 return NULL;
479 }
480 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000481 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000482 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000483 }
484 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000485 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000486 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000487}
488
489PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000490PyNumber_Divide(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000491{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000492 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000493 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000494 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000495 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000496 if (PyNumber_Coerce(&v, &w) != 0)
497 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000498 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
499 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000500 Py_DECREF(v);
501 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000502 if (f != NULL)
503 return x;
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 *
Fred Drake79912472000-07-09 04:06:11 +0000509PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000510{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000511 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000512 return PyString_Format(v, w);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000513 else if (PyUnicode_Check(v))
514 return PyUnicode_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000515 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000516 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000517 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000518 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000519 if (PyNumber_Coerce(&v, &w) != 0)
520 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000521 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
522 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000523 Py_DECREF(v);
524 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000525 if (f != NULL)
526 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000527 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000528 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000529}
530
531PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000532PyNumber_Divmod(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000533{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000534 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
535 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000536 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000537 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +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_divmod) != NULL)
541 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +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 divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000548}
549
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000550/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000551
552static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000553do_pow(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000554{
555 PyObject *res;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000556 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000557 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000558 if (v->ob_type->tp_as_number == NULL ||
559 w->ob_type->tp_as_number == NULL) {
560 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000561 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000562 return NULL;
563 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000564 if (PyNumber_Coerce(&v, &w) != 0)
565 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000566 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
567 res = (*f)(v, w, Py_None);
568 else
569 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000570 Py_DECREF(v);
571 Py_DECREF(w);
572 return res;
573}
574
575PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000576PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000577{
578 PyObject *res;
579 PyObject *v1, *z1, *w2, *z2;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000580 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000581
582 if (z == Py_None)
583 return do_pow(v, w);
584 /* XXX The ternary version doesn't do class instance coercions */
585 if (PyInstance_Check(v))
586 return v->ob_type->tp_as_number->nb_power(v, w, z);
587 if (v->ob_type->tp_as_number == NULL ||
588 z->ob_type->tp_as_number == NULL ||
589 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000590 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000591 }
592 if (PyNumber_Coerce(&v, &w) != 0)
593 return NULL;
594 res = NULL;
595 v1 = v;
596 z1 = z;
597 if (PyNumber_Coerce(&v1, &z1) != 0)
598 goto error2;
599 w2 = w;
600 z2 = z1;
601 if (PyNumber_Coerce(&w2, &z2) != 0)
602 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000603 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
604 res = (*f)(v1, w2, z2);
605 else
606 res = type_error(
607 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000608 Py_DECREF(w2);
609 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000610 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000611 Py_DECREF(v1);
612 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000613 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000614 Py_DECREF(v);
615 Py_DECREF(w);
616 return res;
617}
618
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000619/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000620
621PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000622PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000623{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000624 PyNumberMethods *m;
625
626 if (o == NULL)
627 return null_error();
628 m = o->ob_type->tp_as_number;
629 if (m && m->nb_negative)
630 return (*m->nb_negative)(o);
631
632 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000633}
634
635PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000636PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000637{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000638 PyNumberMethods *m;
639
640 if (o == NULL)
641 return null_error();
642 m = o->ob_type->tp_as_number;
643 if (m && m->nb_positive)
644 return (*m->nb_positive)(o);
645
646 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000647}
648
649PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000650PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000651{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000652 PyNumberMethods *m;
653
654 if (o == NULL)
655 return null_error();
656 m = o->ob_type->tp_as_number;
657 if (m && m->nb_invert)
658 return (*m->nb_invert)(o);
659
660 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000661}
662
663PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000664PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000665{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000666 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000667
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000668 if (o == NULL)
669 return null_error();
670 m = o->ob_type->tp_as_number;
671 if (m && m->nb_absolute)
672 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000673
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000674 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000675}
676
Guido van Rossum9e896b32000-04-05 20:11:21 +0000677/* Add a check for embedded NULL-bytes in the argument. */
678static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000679int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000680{
681 char *end;
682 PyObject *x;
683
684 x = PyInt_FromString((char*)s, &end, 10);
685 if (x == NULL)
686 return NULL;
687 if (end != s + len) {
688 PyErr_SetString(PyExc_ValueError,
689 "null byte in argument for int()");
690 Py_DECREF(x);
691 return NULL;
692 }
693 return x;
694}
695
Guido van Rossume15dee51995-07-18 14:12:02 +0000696PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000697PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000698{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000699 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000700 const char *buffer;
701 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000702
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000703 if (o == NULL)
704 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000705 if (PyInt_Check(o)) {
706 Py_INCREF(o);
707 return o;
708 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000709 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000710 return int_from_string(PyString_AS_STRING(o),
711 PyString_GET_SIZE(o));
712 if (PyUnicode_Check(o))
713 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
714 PyUnicode_GET_SIZE(o),
715 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000716 m = o->ob_type->tp_as_number;
717 if (m && m->nb_int)
718 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000719 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000720 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000721
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000722 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000723}
724
Guido van Rossum9e896b32000-04-05 20:11:21 +0000725/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000726static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000727long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000728{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000729 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000730 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000731
Guido van Rossum4c08d552000-03-10 22:55:18 +0000732 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000733 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000734 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000735 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000736 PyErr_SetString(PyExc_ValueError,
737 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000738 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000739 return NULL;
740 }
741 return x;
742}
743
Guido van Rossume15dee51995-07-18 14:12:02 +0000744PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000745PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000746{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000747 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000748 const char *buffer;
749 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000750
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000751 if (o == NULL)
752 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000753 if (PyLong_Check(o)) {
754 Py_INCREF(o);
755 return o;
756 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000757 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000758 /* need to do extra error checking that PyLong_FromString()
759 * doesn't do. In particular long('9.5') must raise an
760 * exception, not truncate the float.
761 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000762 return long_from_string(PyString_AS_STRING(o),
763 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000764 if (PyUnicode_Check(o))
765 /* The above check is done in PyLong_FromUnicode(). */
766 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
767 PyUnicode_GET_SIZE(o),
768 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000769 m = o->ob_type->tp_as_number;
770 if (m && m->nb_long)
771 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000772 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
773 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000774
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000775 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000776}
777
778PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000779PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000780{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000781 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000783 if (o == NULL)
784 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000785 if (PyFloat_Check(o)) {
786 Py_INCREF(o);
787 return o;
788 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000789 if (!PyString_Check(o)) {
790 m = o->ob_type->tp_as_number;
791 if (m && m->nb_float)
792 return m->nb_float(o);
793 }
794 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000795}
796
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000797/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000798
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000799int
Fred Drake79912472000-07-09 04:06:11 +0000800PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000801{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000802 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000803}
804
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805int
Fred Drake79912472000-07-09 04:06:11 +0000806PySequence_Length(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000807{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000808 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000809
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000810 if (s == NULL) {
811 null_error();
812 return -1;
813 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000814
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000815 m = s->ob_type->tp_as_sequence;
816 if (m && m->sq_length)
817 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000818
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 type_error("len() of unsized object");
820 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000821}
822
823PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000824PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000825{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000826 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000827
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000828 if (s == NULL || o == NULL)
829 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000830
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000831 m = s->ob_type->tp_as_sequence;
832 if (m && m->sq_concat)
833 return m->sq_concat(s, o);
834
835 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000836}
837
838PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000839PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000840{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000841 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000842
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000843 if (o == NULL)
844 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000845
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000846 m = o->ob_type->tp_as_sequence;
847 if (m && m->sq_repeat)
848 return m->sq_repeat(o, count);
849
850 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000851}
852
853PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000854PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +0000855{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000856 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858 if (s == NULL)
859 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000860
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000861 m = s->ob_type->tp_as_sequence;
862 if (m && m->sq_item) {
863 if (i < 0) {
864 if (m->sq_length) {
865 int l = (*m->sq_length)(s);
866 if (l < 0)
867 return NULL;
868 i += l;
869 }
870 }
871 return m->sq_item(s, i);
872 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000873
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000874 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000875}
876
877PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000878PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +0000879{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000880 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000881
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000882 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000883
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000884 m = s->ob_type->tp_as_sequence;
885 if (m && m->sq_slice) {
886 if (i1 < 0 || i2 < 0) {
887 if (m->sq_length) {
888 int l = (*m->sq_length)(s);
889 if (l < 0)
890 return NULL;
891 if (i1 < 0)
892 i1 += l;
893 if (i2 < 0)
894 i2 += l;
895 }
896 }
897 return m->sq_slice(s, i1, i2);
898 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000899
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000900 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000901}
902
903int
Fred Drake79912472000-07-09 04:06:11 +0000904PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000905{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000906 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000907
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 if (s == NULL) {
909 null_error();
910 return -1;
911 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000912
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 m = s->ob_type->tp_as_sequence;
914 if (m && m->sq_ass_item) {
915 if (i < 0) {
916 if (m->sq_length) {
917 int l = (*m->sq_length)(s);
918 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000919 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000920 i += l;
921 }
922 }
923 return m->sq_ass_item(s, i, o);
924 }
925
926 type_error("object doesn't support item assignment");
927 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000928}
929
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000930int
Fred Drake79912472000-07-09 04:06:11 +0000931PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000932{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000933 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000934
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 if (s == NULL) {
936 null_error();
937 return -1;
938 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000939
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000940 m = s->ob_type->tp_as_sequence;
941 if (m && m->sq_ass_item) {
942 if (i < 0) {
943 if (m->sq_length) {
944 int l = (*m->sq_length)(s);
945 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000946 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 i += l;
948 }
949 }
950 return m->sq_ass_item(s, i, (PyObject *)NULL);
951 }
952
953 type_error("object doesn't support item deletion");
954 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000955}
956
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000957int
Fred Drake79912472000-07-09 04:06:11 +0000958PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000959{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000960 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000961
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000962 if (s == NULL) {
963 null_error();
964 return -1;
965 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000966
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000967 m = s->ob_type->tp_as_sequence;
968 if (m && m->sq_ass_slice) {
969 if (i1 < 0 || i2 < 0) {
970 if (m->sq_length) {
971 int l = (*m->sq_length)(s);
972 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000973 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000974 if (i1 < 0)
975 i1 += l;
976 if (i2 < 0)
977 i2 += l;
978 }
979 }
980 return m->sq_ass_slice(s, i1, i2, o);
981 }
982 type_error("object doesn't support slice assignment");
983 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000984}
985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986int
Fred Drake79912472000-07-09 04:06:11 +0000987PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000988{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000989 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000990
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000991 if (s == NULL) {
992 null_error();
993 return -1;
994 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000995
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000996 m = s->ob_type->tp_as_sequence;
997 if (m && m->sq_ass_slice) {
998 if (i1 < 0 || i2 < 0) {
999 if (m->sq_length) {
1000 int l = (*m->sq_length)(s);
1001 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001002 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 if (i1 < 0)
1004 i1 += l;
1005 if (i2 < 0)
1006 i2 += l;
1007 }
1008 }
1009 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1010 }
1011 type_error("object doesn't support slice deletion");
1012 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001013}
1014
Guido van Rossume15dee51995-07-18 14:12:02 +00001015PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001016PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001017{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001018 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001019
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001020 if (v == NULL)
1021 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001022
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023 if (PyTuple_Check(v)) {
1024 Py_INCREF(v);
1025 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001026 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001027
1028 if (PyList_Check(v))
1029 return PyList_AsTuple(v);
1030
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001031 /* There used to be code for strings here, but tuplifying strings is
1032 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001033
1034 /* Generic sequence object */
1035 m = v->ob_type->tp_as_sequence;
1036 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001037 int i;
1038 PyObject *t;
1039 int n = PySequence_Length(v);
1040 if (n < 0)
1041 return NULL;
1042 t = PyTuple_New(n);
1043 if (t == NULL)
1044 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001045 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001046 PyObject *item = (*m->sq_item)(v, i);
1047 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001048 if (PyErr_ExceptionMatches(PyExc_IndexError))
1049 PyErr_Clear();
1050 else {
1051 Py_DECREF(t);
1052 t = NULL;
1053 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001054 break;
1055 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001056 if (i >= n) {
1057 if (n < 500)
1058 n += 10;
1059 else
1060 n += 100;
1061 if (_PyTuple_Resize(&t, n, 0) != 0)
1062 break;
1063 }
1064 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001065 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001066 if (i < n && t != NULL)
1067 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001068 return t;
1069 }
1070
1071 /* None of the above */
1072 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001073}
1074
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001075PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001076PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001077{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001078 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001079
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001080 if (v == NULL)
1081 return null_error();
1082
1083 if (PyList_Check(v))
1084 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001086 m = v->ob_type->tp_as_sequence;
1087 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001088 int i;
1089 PyObject *l;
1090 int n = PySequence_Length(v);
1091 if (n < 0)
1092 return NULL;
1093 l = PyList_New(n);
1094 if (l == NULL)
1095 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001096 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 PyObject *item = (*m->sq_item)(v, i);
1098 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001099 if (PyErr_ExceptionMatches(PyExc_IndexError))
1100 PyErr_Clear();
1101 else {
1102 Py_DECREF(l);
1103 l = NULL;
1104 }
1105 break;
1106 }
1107 if (i < n)
1108 PyList_SET_ITEM(l, i, item);
1109 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110 Py_DECREF(l);
1111 l = NULL;
1112 break;
1113 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001114 }
1115 if (i < n && l != NULL) {
1116 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1117 Py_DECREF(l);
1118 l = NULL;
1119 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 }
1121 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001122 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001124}
1125
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001126PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001127PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001128{
1129 if (v == NULL)
1130 return null_error();
1131
1132 if (PyList_Check(v) || PyTuple_Check(v)) {
1133 Py_INCREF(v);
1134 return v;
1135 }
1136
1137 v = PySequence_Tuple(v);
1138 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1139 return type_error(m);
1140
1141 return v;
1142}
1143
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144int
Fred Drake79912472000-07-09 04:06:11 +00001145PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001146{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001147 int l, i, n, cmp, err;
1148 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001149
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001150 if (s == NULL || o == NULL) {
1151 null_error();
1152 return -1;
1153 }
1154
1155 l = PySequence_Length(s);
1156 if (l < 0)
1157 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001158
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 n = 0;
1160 for (i = 0; i < l; i++) {
1161 item = PySequence_GetItem(s, i);
1162 if (item == NULL)
1163 return -1;
1164 err = PyObject_Cmp(item, o, &cmp);
1165 Py_DECREF(item);
1166 if (err < 0)
1167 return err;
1168 if (cmp == 0)
1169 n++;
1170 }
1171 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001172}
1173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174int
Fred Drake79912472000-07-09 04:06:11 +00001175PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001176{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001177 int i, cmp;
1178 PyObject *x;
1179 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001180
Guido van Rossum46c6b202000-02-28 15:01:46 +00001181 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1182 sq = w->ob_type->tp_as_sequence;
1183 if(sq != NULL && sq->sq_contains != NULL)
1184 return (*sq->sq_contains)(w, v);
1185 }
1186
1187 /* If there is no better way to check whether an item is is contained,
1188 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 sq = w->ob_type->tp_as_sequence;
1190 if (sq == NULL || sq->sq_item == NULL) {
1191 PyErr_SetString(PyExc_TypeError,
1192 "'in' or 'not in' needs sequence right argument");
1193 return -1;
1194 }
1195
1196 for (i = 0; ; i++) {
1197 x = (*sq->sq_item)(w, i);
1198 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001199 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001200 PyErr_Clear();
1201 break;
1202 }
1203 return -1;
1204 }
1205 cmp = PyObject_Compare(v, x);
1206 Py_XDECREF(x);
1207 if (cmp == 0)
1208 return 1;
1209 if (PyErr_Occurred())
1210 return -1;
1211 }
1212
1213 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001214}
1215
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001216/* Backwards compatibility */
1217#undef PySequence_In
1218int
Fred Drake79912472000-07-09 04:06:11 +00001219PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001220{
1221 return PySequence_Contains(w, v);
1222}
1223
1224int
Fred Drake79912472000-07-09 04:06:11 +00001225PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001226{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 int l, i, cmp, err;
1228 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001229
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230 if (s == NULL || o == NULL) {
1231 null_error();
1232 return -1;
1233 }
1234
1235 l = PySequence_Length(s);
1236 if (l < 0)
1237 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001238
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001239 for (i = 0; i < l; i++) {
1240 item = PySequence_GetItem(s, i);
1241 if (item == NULL)
1242 return -1;
1243 err = PyObject_Cmp(item, o, &cmp);
1244 Py_DECREF(item);
1245 if (err < 0)
1246 return err;
1247 if (cmp == 0)
1248 return i;
1249 }
1250
1251 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1252 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001253}
1254
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255/* Operations on mappings */
1256
1257int
Fred Drake79912472000-07-09 04:06:11 +00001258PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001259{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001260 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001261}
1262
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263int
Fred Drake79912472000-07-09 04:06:11 +00001264PyMapping_Length(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001265{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001266 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001267
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001268 if (o == NULL) {
1269 null_error();
1270 return -1;
1271 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001272
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001273 m = o->ob_type->tp_as_mapping;
1274 if (m && m->mp_length)
1275 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001276
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001277 type_error("len() of unsized object");
1278 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001279}
1280
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001282PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283{
1284 PyObject *okey, *r;
1285
1286 if (key == NULL)
1287 return null_error();
1288
1289 okey = PyString_FromString(key);
1290 if (okey == NULL)
1291 return NULL;
1292 r = PyObject_GetItem(o, okey);
1293 Py_DECREF(okey);
1294 return r;
1295}
1296
1297int
Fred Drake79912472000-07-09 04:06:11 +00001298PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299{
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
Fred Drake79912472000-07-09 04:06:11 +00001317PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001318{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001320
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321 v = PyMapping_GetItemString(o, key);
1322 if (v) {
1323 Py_DECREF(v);
1324 return 1;
1325 }
1326 PyErr_Clear();
1327 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001328}
1329
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330int
Fred Drake79912472000-07-09 04:06:11 +00001331PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001332{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001334
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 v = PyObject_GetItem(o, key);
1336 if (v) {
1337 Py_DECREF(v);
1338 return 1;
1339 }
1340 PyErr_Clear();
1341 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001342}
1343
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001344/* Operations on callable objects */
1345
1346/* XXX PyCallable_Check() is in object.c */
1347
Guido van Rossume15dee51995-07-18 14:12:02 +00001348PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001349PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001350{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001351 PyObject *r;
1352 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001353
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354 if (args == NULL) {
1355 args = PyTuple_New(0);
1356 if (args == NULL)
1357 return NULL;
1358 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001359
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 r = PyEval_CallObject(o, args);
1361
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001362 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001363 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001364 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001365
1366 return r;
1367}
Guido van Rossume15dee51995-07-18 14:12:02 +00001368
1369PyObject *
1370#ifdef HAVE_STDARG_PROTOTYPES
1371/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001373#else
1374/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001376#endif
1377{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001378 va_list va;
1379 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001380#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001382#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001383 PyObject *callable;
1384 char *format;
1385 va_start(va);
1386 callable = va_arg(va, PyObject *);
1387 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001388#endif
1389
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 if (callable == NULL) {
1391 va_end(va);
1392 return null_error();
1393 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001394
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001395 if (format)
1396 args = Py_VaBuildValue(format, va);
1397 else
1398 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001399
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001400 va_end(va);
1401
1402 if (args == NULL)
1403 return NULL;
1404
1405 if (!PyTuple_Check(args)) {
1406 PyObject *a;
1407
1408 a = PyTuple_New(1);
1409 if (a == NULL)
1410 return NULL;
1411 if (PyTuple_SetItem(a, 0, args) < 0)
1412 return NULL;
1413 args = a;
1414 }
1415 retval = PyObject_CallObject(callable, args);
1416
1417 Py_DECREF(args);
1418
1419 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001420}
1421
1422PyObject *
1423#ifdef HAVE_STDARG_PROTOTYPES
1424/* VARARGS 2 */
1425PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1426#else
1427/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001429#endif
1430{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001431 va_list va;
1432 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001433#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001434 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001435#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436 PyObject *o;
1437 char *name;
1438 char *format;
1439 va_start(va);
1440 o = va_arg(va, PyObject *);
1441 name = va_arg(va, char *);
1442 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001443#endif
1444
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 if (o == NULL || name == NULL) {
1446 va_end(va);
1447 return null_error();
1448 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001449
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001450 func = PyObject_GetAttrString(o, name);
1451 if (func == NULL) {
1452 va_end(va);
1453 PyErr_SetString(PyExc_AttributeError, name);
1454 return 0;
1455 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001456
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457 if (!PyCallable_Check(func)) {
1458 va_end(va);
1459 return type_error("call of non-callable attribute");
1460 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001461
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462 if (format && *format)
1463 args = Py_VaBuildValue(format, va);
1464 else
1465 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001466
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001468
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001469 if (!args)
1470 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001471
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001472 if (!PyTuple_Check(args)) {
1473 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001474
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001475 a = PyTuple_New(1);
1476 if (a == NULL)
1477 return NULL;
1478 if (PyTuple_SetItem(a, 0, args) < 0)
1479 return NULL;
1480 args = a;
1481 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001482
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001483 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001484
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001485 Py_DECREF(args);
1486 Py_DECREF(func);
1487
1488 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001489}