blob: 1800912548f136262484b22a924aa0a99aa9ea34 [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 *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000019type_error(msg)
20 char *msg;
Guido van Rossume15dee51995-07-18 14:12:02 +000021{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000022 PyErr_SetString(PyExc_TypeError, msg);
23 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000024}
25
Guido van Rossum052b7e11996-11-11 15:08:19 +000026static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000027null_error()
Guido van Rossume15dee51995-07-18 14:12:02 +000028{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000029 if (!PyErr_Occurred())
30 PyErr_SetString(PyExc_SystemError,
31 "null argument to internal routine");
32 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000033}
34
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000035/* Operations on any object */
36
37int
38PyObject_Cmp(o1, o2, result)
39 PyObject *o1;
40 PyObject *o2;
41 int *result;
42{
43 int r;
44
45 if (o1 == NULL || o2 == NULL) {
46 null_error();
47 return -1;
48 }
49 r = PyObject_Compare(o1, o2);
50 if (PyErr_Occurred())
51 return -1;
52 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000053 return 0;
54}
Guido van Rossume15dee51995-07-18 14:12:02 +000055
56PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000057PyObject_Type(o)
58 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000059{
60 PyObject *v;
61
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 if (o == NULL)
63 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000064 v = (PyObject *)o->ob_type;
65 Py_INCREF(v);
66 return v;
67}
68
69int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000070PyObject_Length(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000071 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000072{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000073 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000074
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000075 if (o == NULL) {
76 null_error();
77 return -1;
78 }
Guido van Rossume15dee51995-07-18 14:12:02 +000079
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000080 m = o->ob_type->tp_as_sequence;
81 if (m && m->sq_length)
82 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000083
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000084 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000085}
86
87PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000088PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000089 PyObject *o;
90 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +000091{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000092 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000093
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000094 if (o == NULL || key == NULL)
95 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000097 m = o->ob_type->tp_as_mapping;
98 if (m && m->mp_subscript)
99 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000100
Guido van Rossum21308241998-08-13 16:44:44 +0000101 if (o->ob_type->tp_as_sequence) {
102 if (PyInt_Check(key))
103 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000104 else if (PyLong_Check(key)) {
105 long key_value = PyLong_AsLong(key);
106 if (key_value == -1 && PyErr_Occurred())
107 return NULL;
108 return PySequence_GetItem(o, key_value);
109 }
Guido van Rossum21308241998-08-13 16:44:44 +0000110 return type_error("sequence index must be integer");
111 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000112
113 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000114}
115
116int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000117PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 PyObject *o;
119 PyObject *key;
120 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000121{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000122 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000123
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000124 if (o == NULL || key == NULL || value == NULL) {
125 null_error();
126 return -1;
127 }
128 m = o->ob_type->tp_as_mapping;
129 if (m && m->mp_ass_subscript)
130 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000131
Guido van Rossum21308241998-08-13 16:44:44 +0000132 if (o->ob_type->tp_as_sequence) {
133 if (PyInt_Check(key))
134 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000135 else if (PyLong_Check(key)) {
136 long key_value = PyLong_AsLong(key);
137 if (key_value == -1 && PyErr_Occurred())
138 return -1;
139 return PySequence_SetItem(o, key_value, value);
140 }
Guido van Rossum21308241998-08-13 16:44:44 +0000141 type_error("sequence index must be integer");
142 return -1;
143 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000144
145 type_error("object does not support item assignment");
146 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000147}
148
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000149int
150PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000151 PyObject *o;
152 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000153{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000154 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000155
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000156 if (o == NULL || key == NULL) {
157 null_error();
158 return -1;
159 }
160 m = o->ob_type->tp_as_mapping;
161 if (m && m->mp_ass_subscript)
162 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000163
Guido van Rossum21308241998-08-13 16:44:44 +0000164 if (o->ob_type->tp_as_sequence) {
165 if (PyInt_Check(key))
166 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000167 else if (PyLong_Check(key)) {
168 long key_value = PyLong_AsLong(key);
169 if (key_value == -1 && PyErr_Occurred())
170 return -1;
171 return PySequence_DelItem(o, key_value);
172 }
Guido van Rossum21308241998-08-13 16:44:44 +0000173 type_error("sequence index must be integer");
174 return -1;
175 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000176
177 type_error("object does not support item deletion");
178 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000179}
180
Guido van Rossum4c08d552000-03-10 22:55:18 +0000181int PyObject_AsCharBuffer(PyObject *obj,
182 const char **buffer,
183 int *buffer_len)
184{
185 PyBufferProcs *pb;
186 const char *pp;
187 int len;
188
189 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
190 null_error();
191 return -1;
192 }
193 pb = obj->ob_type->tp_as_buffer;
194 if ( pb == NULL ||
195 pb->bf_getcharbuffer == NULL ||
196 pb->bf_getsegcount == NULL ) {
197 PyErr_SetString(PyExc_TypeError,
198 "expected a character buffer object");
199 goto onError;
200 }
201 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
202 PyErr_SetString(PyExc_TypeError,
203 "expected a single-segment buffer object");
204 goto onError;
205 }
206 len = (*pb->bf_getcharbuffer)(obj,0,&pp);
207 if (len < 0)
208 goto onError;
209 *buffer = pp;
210 *buffer_len = len;
211 return 0;
212
213 onError:
214 return -1;
215}
216
217int PyObject_AsReadBuffer(PyObject *obj,
218 const void **buffer,
219 int *buffer_len)
220{
221 PyBufferProcs *pb;
222 void *pp;
223 int len;
224
225 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
226 null_error();
227 return -1;
228 }
229 pb = obj->ob_type->tp_as_buffer;
230 if ( pb == NULL ||
231 pb->bf_getreadbuffer == NULL ||
232 pb->bf_getsegcount == NULL ) {
233 PyErr_SetString(PyExc_TypeError,
234 "expected a readable buffer object");
235 goto onError;
236 }
237 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
238 PyErr_SetString(PyExc_TypeError,
239 "expected a single-segment buffer object");
240 goto onError;
241 }
242 len = (*pb->bf_getreadbuffer)(obj,0,&pp);
243 if (len < 0)
244 goto onError;
245 *buffer = pp;
246 *buffer_len = len;
247 return 0;
248
249 onError:
250 return -1;
251}
252
253int PyObject_AsWriteBuffer(PyObject *obj,
254 void **buffer,
255 int *buffer_len)
256{
257 PyBufferProcs *pb;
258 void*pp;
259 int len;
260
261 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
262 null_error();
263 return -1;
264 }
265 pb = obj->ob_type->tp_as_buffer;
266 if ( pb == NULL ||
267 pb->bf_getwritebuffer == NULL ||
268 pb->bf_getsegcount == NULL ) {
269 PyErr_SetString(PyExc_TypeError,
270 "expected a writeable buffer object");
271 goto onError;
272 }
273 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
274 PyErr_SetString(PyExc_TypeError,
275 "expected a single-segment buffer object");
276 goto onError;
277 }
278 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
279 if (len < 0)
280 goto onError;
281 *buffer = pp;
282 *buffer_len = len;
283 return 0;
284
285 onError:
286 return -1;
287}
288
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000289/* Operations on numbers */
290
291int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000292PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000293 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000294{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000295 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000296}
297
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000298/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000299
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000300#define BINOP(v, w, opname, ropname, thisfunc) \
301 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000302 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
303
304PyObject *
305PyNumber_Or(v, w)
306 PyObject *v, *w;
307{
308 extern int PyNumber_Coerce();
309
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000310 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000311 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000312 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000313 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
314 if (PyNumber_Coerce(&v, &w) != 0)
315 return NULL;
316 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
317 x = (*f)(v, w);
318 Py_DECREF(v);
319 Py_DECREF(w);
320 if (f != NULL)
321 return x;
322 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000323 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000324}
325
326PyObject *
327PyNumber_Xor(v, w)
328 PyObject *v, *w;
329{
330 extern int PyNumber_Coerce();
331
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000332 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000333 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000334 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000335 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
336 if (PyNumber_Coerce(&v, &w) != 0)
337 return NULL;
338 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
339 x = (*f)(v, w);
340 Py_DECREF(v);
341 Py_DECREF(w);
342 if (f != NULL)
343 return x;
344 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000345 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000346}
347
348PyObject *
349PyNumber_And(v, w)
350 PyObject *v, *w;
351{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000352 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000353 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000354 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000355 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
356 if (PyNumber_Coerce(&v, &w) != 0)
357 return NULL;
358 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
359 x = (*f)(v, w);
360 Py_DECREF(v);
361 Py_DECREF(w);
362 if (f != NULL)
363 return x;
364 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000365 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000366}
367
368PyObject *
369PyNumber_Lshift(v, w)
370 PyObject *v, *w;
371{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000372 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000373 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000374 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000375 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
376 if (PyNumber_Coerce(&v, &w) != 0)
377 return NULL;
378 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
379 x = (*f)(v, w);
380 Py_DECREF(v);
381 Py_DECREF(w);
382 if (f != NULL)
383 return x;
384 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000385 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000386}
387
388PyObject *
389PyNumber_Rshift(v, w)
390 PyObject *v, *w;
391{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000392 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000393 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000394 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000395 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
396 if (PyNumber_Coerce(&v, &w) != 0)
397 return NULL;
398 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
399 x = (*f)(v, w);
400 Py_DECREF(v);
401 Py_DECREF(w);
402 if (f != NULL)
403 return x;
404 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000405 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000406}
407
408PyObject *
409PyNumber_Add(v, w)
410 PyObject *v, *w;
411{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000412 PySequenceMethods *m;
413
414 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
415 m = v->ob_type->tp_as_sequence;
416 if (m && m->sq_concat)
417 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000418 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000419 PyObject *x = NULL;
420 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000421 if (PyNumber_Coerce(&v, &w) != 0)
422 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000423 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
424 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000425 Py_DECREF(v);
426 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000427 if (f != NULL)
428 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000429 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000430 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000431}
432
433PyObject *
434PyNumber_Subtract(v, w)
435 PyObject *v, *w;
436{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000437 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000438 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000439 PyObject *x = NULL;
440 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000441 if (PyNumber_Coerce(&v, &w) != 0)
442 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000443 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
444 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000445 Py_DECREF(v);
446 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000447 if (f != NULL)
448 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000449 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000450 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000451}
452
453PyObject *
454PyNumber_Multiply(v, w)
455 PyObject *v, *w;
456{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000457 PyTypeObject *tp = v->ob_type;
458 PySequenceMethods *m;
459
460 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000461 if (tp->tp_as_number != NULL &&
462 w->ob_type->tp_as_sequence != NULL &&
463 !PyInstance_Check(v)) {
464 /* number*sequence -- swap v and w */
465 PyObject *tmp = v;
466 v = w;
467 w = tmp;
468 tp = v->ob_type;
469 }
470 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000471 PyObject *x = NULL;
472 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000473 if (PyInstance_Check(v)) {
474 /* Instances of user-defined classes get their
475 other argument uncoerced, so they may
476 implement sequence*number as well as
477 number*number. */
478 Py_INCREF(v);
479 Py_INCREF(w);
480 }
481 else if (PyNumber_Coerce(&v, &w) != 0)
482 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000483 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
484 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000485 Py_DECREF(v);
486 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000487 if (f != NULL)
488 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000489 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000490 m = tp->tp_as_sequence;
491 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000492 long mul_value;
493
494 if (PyInt_Check(w)) {
495 mul_value = PyInt_AsLong(w);
496 }
497 else if (PyLong_Check(w)) {
498 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000499 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000500 return NULL;
501 }
502 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000503 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000504 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000505 }
506 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000507 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000508 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000509}
510
511PyObject *
512PyNumber_Divide(v, w)
513 PyObject *v, *w;
514{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000515 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
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;
518 PyObject * (*f) Py_FPROTO((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_divide) != 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 *
532PyNumber_Remainder(v, w)
533 PyObject *v, *w;
534{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000535 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000536 return PyString_Format(v, w);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000537 else if (PyUnicode_Check(v))
538 return PyUnicode_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000539 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000540 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000541 PyObject *x = NULL;
542 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000543 if (PyNumber_Coerce(&v, &w) != 0)
544 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000545 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
546 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000547 Py_DECREF(v);
548 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000549 if (f != NULL)
550 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000551 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000552 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000553}
554
555PyObject *
556PyNumber_Divmod(v, w)
557 PyObject *v, *w;
558{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000559 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
560 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000561 PyObject *x = NULL;
562 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000563 if (PyNumber_Coerce(&v, &w) != 0)
564 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000565 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
566 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000567 Py_DECREF(v);
568 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000569 if (f != NULL)
570 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000571 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000572 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000573}
574
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000575/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000576
577static PyObject *
578do_pow(v, w)
579 PyObject *v, *w;
580{
581 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000582 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
583 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000584 if (v->ob_type->tp_as_number == NULL ||
585 w->ob_type->tp_as_number == NULL) {
586 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000587 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000588 return NULL;
589 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000590 if (PyNumber_Coerce(&v, &w) != 0)
591 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000592 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
593 res = (*f)(v, w, Py_None);
594 else
595 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000596 Py_DECREF(v);
597 Py_DECREF(w);
598 return res;
599}
600
601PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000602PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000603 PyObject *v, *w, *z;
604{
605 PyObject *res;
606 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000607 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000608
609 if (z == Py_None)
610 return do_pow(v, w);
611 /* XXX The ternary version doesn't do class instance coercions */
612 if (PyInstance_Check(v))
613 return v->ob_type->tp_as_number->nb_power(v, w, z);
614 if (v->ob_type->tp_as_number == NULL ||
615 z->ob_type->tp_as_number == NULL ||
616 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000617 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000618 }
619 if (PyNumber_Coerce(&v, &w) != 0)
620 return NULL;
621 res = NULL;
622 v1 = v;
623 z1 = z;
624 if (PyNumber_Coerce(&v1, &z1) != 0)
625 goto error2;
626 w2 = w;
627 z2 = z1;
628 if (PyNumber_Coerce(&w2, &z2) != 0)
629 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000630 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
631 res = (*f)(v1, w2, z2);
632 else
633 res = type_error(
634 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000635 Py_DECREF(w2);
636 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000637 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000638 Py_DECREF(v1);
639 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000640 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000641 Py_DECREF(v);
642 Py_DECREF(w);
643 return res;
644}
645
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000646/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000647
648PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000649PyNumber_Negative(o)
650 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_negative)
658 return (*m->nb_negative)(o);
659
660 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000661}
662
663PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000664PyNumber_Positive(o)
665 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000666{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000667 PyNumberMethods *m;
668
669 if (o == NULL)
670 return null_error();
671 m = o->ob_type->tp_as_number;
672 if (m && m->nb_positive)
673 return (*m->nb_positive)(o);
674
675 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000676}
677
678PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000679PyNumber_Invert(o)
680 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000681{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000682 PyNumberMethods *m;
683
684 if (o == NULL)
685 return null_error();
686 m = o->ob_type->tp_as_number;
687 if (m && m->nb_invert)
688 return (*m->nb_invert)(o);
689
690 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000691}
692
693PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000694PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000695 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000696{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000697 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000698
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000699 if (o == NULL)
700 return null_error();
701 m = o->ob_type->tp_as_number;
702 if (m && m->nb_absolute)
703 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000704
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000705 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000706}
707
Guido van Rossum9e896b32000-04-05 20:11:21 +0000708/* Add a check for embedded NULL-bytes in the argument. */
709static PyObject *
710int_from_string(s, len)
711 const char *s;
712 int len;
713{
714 char *end;
715 PyObject *x;
716
717 x = PyInt_FromString((char*)s, &end, 10);
718 if (x == NULL)
719 return NULL;
720 if (end != s + len) {
721 PyErr_SetString(PyExc_ValueError,
722 "null byte in argument for int()");
723 Py_DECREF(x);
724 return NULL;
725 }
726 return x;
727}
728
Guido van Rossume15dee51995-07-18 14:12:02 +0000729PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000730PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000731 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000732{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000733 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000734 const char *buffer;
735 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000736
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000737 if (o == NULL)
738 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000739 if (PyInt_Check(o)) {
740 Py_INCREF(o);
741 return o;
742 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000743 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000744 return int_from_string(PyString_AS_STRING(o),
745 PyString_GET_SIZE(o));
746 if (PyUnicode_Check(o))
747 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
748 PyUnicode_GET_SIZE(o),
749 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000750 m = o->ob_type->tp_as_number;
751 if (m && m->nb_int)
752 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000753 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000754 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000755
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000756 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000757}
758
Guido van Rossum9e896b32000-04-05 20:11:21 +0000759/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000760static PyObject *
Guido van Rossum4c08d552000-03-10 22:55:18 +0000761long_from_string(s, len)
762 const char *s;
763 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000764{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000765 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000766 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000767
Guido van Rossum4c08d552000-03-10 22:55:18 +0000768 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000769 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000770 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000771 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000772 PyErr_SetString(PyExc_ValueError,
773 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000774 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000775 return NULL;
776 }
777 return x;
778}
779
Guido van Rossume15dee51995-07-18 14:12:02 +0000780PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000781PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000782 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000783{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000784 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000785 const char *buffer;
786 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000787
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000788 if (o == NULL)
789 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000790 if (PyLong_Check(o)) {
791 Py_INCREF(o);
792 return o;
793 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000794 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000795 /* need to do extra error checking that PyLong_FromString()
796 * doesn't do. In particular long('9.5') must raise an
797 * exception, not truncate the float.
798 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000799 return long_from_string(PyString_AS_STRING(o),
800 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000801 if (PyUnicode_Check(o))
802 /* The above check is done in PyLong_FromUnicode(). */
803 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
804 PyUnicode_GET_SIZE(o),
805 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000806 m = o->ob_type->tp_as_number;
807 if (m && m->nb_long)
808 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000809 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
810 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000811
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000812 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000813}
814
815PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000816PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000817 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000818{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000820
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000821 if (o == NULL)
822 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000823 if (PyFloat_Check(o)) {
824 Py_INCREF(o);
825 return o;
826 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000827 if (!PyString_Check(o)) {
828 m = o->ob_type->tp_as_number;
829 if (m && m->nb_float)
830 return m->nb_float(o);
831 }
832 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000833}
834
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000835/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000836
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000837int
838PySequence_Check(s)
839 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000840{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000841 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000842}
843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000844int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000845PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000846 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000847{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000849
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000850 if (s == NULL) {
851 null_error();
852 return -1;
853 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000854
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000855 m = s->ob_type->tp_as_sequence;
856 if (m && m->sq_length)
857 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000858
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859 type_error("len() of unsized object");
860 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000861}
862
863PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000864PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000865 PyObject *s;
866 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000867{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000868 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000869
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000870 if (s == NULL || o == NULL)
871 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000872
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000873 m = s->ob_type->tp_as_sequence;
874 if (m && m->sq_concat)
875 return m->sq_concat(s, o);
876
877 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000878}
879
880PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000881PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000882 PyObject *o;
883 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000884{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000885 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000886
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000887 if (o == NULL)
888 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000889
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000890 m = o->ob_type->tp_as_sequence;
891 if (m && m->sq_repeat)
892 return m->sq_repeat(o, count);
893
894 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000895}
896
897PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000898PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000899 PyObject *s;
900 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000901{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000902 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000903
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000904 if (s == NULL)
905 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000906
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 m = s->ob_type->tp_as_sequence;
908 if (m && m->sq_item) {
909 if (i < 0) {
910 if (m->sq_length) {
911 int l = (*m->sq_length)(s);
912 if (l < 0)
913 return NULL;
914 i += l;
915 }
916 }
917 return m->sq_item(s, i);
918 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000919
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000920 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000921}
922
923PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000924PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000925 PyObject *s;
926 int i1;
927 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000928{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000929 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000930
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000931 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000932
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000933 m = s->ob_type->tp_as_sequence;
934 if (m && m->sq_slice) {
935 if (i1 < 0 || i2 < 0) {
936 if (m->sq_length) {
937 int l = (*m->sq_length)(s);
938 if (l < 0)
939 return NULL;
940 if (i1 < 0)
941 i1 += l;
942 if (i2 < 0)
943 i2 += l;
944 }
945 }
946 return m->sq_slice(s, i1, i2);
947 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000948
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000949 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000950}
951
952int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000953PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000954 PyObject *s;
955 int i;
956 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000957{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000958 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000959
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000960 if (s == NULL) {
961 null_error();
962 return -1;
963 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000964
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 m = s->ob_type->tp_as_sequence;
966 if (m && m->sq_ass_item) {
967 if (i < 0) {
968 if (m->sq_length) {
969 int l = (*m->sq_length)(s);
970 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000971 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000972 i += l;
973 }
974 }
975 return m->sq_ass_item(s, i, o);
976 }
977
978 type_error("object doesn't support item assignment");
979 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000980}
981
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000982int
983PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000984 PyObject *s;
985 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000986{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000987 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000988
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000989 if (s == NULL) {
990 null_error();
991 return -1;
992 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000993
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000994 m = s->ob_type->tp_as_sequence;
995 if (m && m->sq_ass_item) {
996 if (i < 0) {
997 if (m->sq_length) {
998 int l = (*m->sq_length)(s);
999 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001000 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 i += l;
1002 }
1003 }
1004 return m->sq_ass_item(s, i, (PyObject *)NULL);
1005 }
1006
1007 type_error("object doesn't support item deletion");
1008 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001009}
1010
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001011int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001012PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001013 PyObject *s;
1014 int i1;
1015 int i2;
1016 PyObject *o;
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 (s == NULL) {
1021 null_error();
1022 return -1;
1023 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001024
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025 m = s->ob_type->tp_as_sequence;
1026 if (m && m->sq_ass_slice) {
1027 if (i1 < 0 || i2 < 0) {
1028 if (m->sq_length) {
1029 int l = (*m->sq_length)(s);
1030 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001031 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 if (i1 < 0)
1033 i1 += l;
1034 if (i2 < 0)
1035 i2 += l;
1036 }
1037 }
1038 return m->sq_ass_slice(s, i1, i2, o);
1039 }
1040 type_error("object doesn't support slice assignment");
1041 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001042}
1043
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001044int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001045PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001046 PyObject *s;
1047 int i1;
1048 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001049{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001050 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001051
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001052 if (s == NULL) {
1053 null_error();
1054 return -1;
1055 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001056
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001057 m = s->ob_type->tp_as_sequence;
1058 if (m && m->sq_ass_slice) {
1059 if (i1 < 0 || i2 < 0) {
1060 if (m->sq_length) {
1061 int l = (*m->sq_length)(s);
1062 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001063 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 if (i1 < 0)
1065 i1 += l;
1066 if (i2 < 0)
1067 i2 += l;
1068 }
1069 }
1070 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1071 }
1072 type_error("object doesn't support slice deletion");
1073 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001074}
1075
Guido van Rossume15dee51995-07-18 14:12:02 +00001076PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001077PySequence_Tuple(v)
1078 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001079{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001080 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001081
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001082 if (v == NULL)
1083 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001084
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085 if (PyTuple_Check(v)) {
1086 Py_INCREF(v);
1087 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001088 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001089
1090 if (PyList_Check(v))
1091 return PyList_AsTuple(v);
1092
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001093 /* There used to be code for strings here, but tuplifying strings is
1094 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001095
1096 /* Generic sequence object */
1097 m = v->ob_type->tp_as_sequence;
1098 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 int i;
1100 PyObject *t;
1101 int n = PySequence_Length(v);
1102 if (n < 0)
1103 return NULL;
1104 t = PyTuple_New(n);
1105 if (t == NULL)
1106 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001107 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 PyObject *item = (*m->sq_item)(v, i);
1109 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001110 if (PyErr_ExceptionMatches(PyExc_IndexError))
1111 PyErr_Clear();
1112 else {
1113 Py_DECREF(t);
1114 t = NULL;
1115 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001116 break;
1117 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001118 if (i >= n) {
1119 if (n < 500)
1120 n += 10;
1121 else
1122 n += 100;
1123 if (_PyTuple_Resize(&t, n, 0) != 0)
1124 break;
1125 }
1126 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001127 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001128 if (i < n && t != NULL)
1129 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 return t;
1131 }
1132
1133 /* None of the above */
1134 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001135}
1136
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001137PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001138PySequence_List(v)
1139 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001140{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001141 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001142
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001143 if (v == NULL)
1144 return null_error();
1145
1146 if (PyList_Check(v))
1147 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1148
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 m = v->ob_type->tp_as_sequence;
1150 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001151 int i;
1152 PyObject *l;
1153 int n = PySequence_Length(v);
1154 if (n < 0)
1155 return NULL;
1156 l = PyList_New(n);
1157 if (l == NULL)
1158 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001159 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001160 PyObject *item = (*m->sq_item)(v, i);
1161 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001162 if (PyErr_ExceptionMatches(PyExc_IndexError))
1163 PyErr_Clear();
1164 else {
1165 Py_DECREF(l);
1166 l = NULL;
1167 }
1168 break;
1169 }
1170 if (i < n)
1171 PyList_SET_ITEM(l, i, item);
1172 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001173 Py_DECREF(l);
1174 l = NULL;
1175 break;
1176 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001177 }
1178 if (i < n && l != NULL) {
1179 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1180 Py_DECREF(l);
1181 l = NULL;
1182 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001183 }
1184 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001185 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001186 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001187}
1188
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001189PyObject *
1190PySequence_Fast(v, m)
1191 PyObject *v;
1192 const char* m;
1193{
1194 if (v == NULL)
1195 return null_error();
1196
1197 if (PyList_Check(v) || PyTuple_Check(v)) {
1198 Py_INCREF(v);
1199 return v;
1200 }
1201
1202 v = PySequence_Tuple(v);
1203 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1204 return type_error(m);
1205
1206 return v;
1207}
1208
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001210PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001211 PyObject *s;
1212 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001213{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001214 int l, i, n, cmp, err;
1215 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001216
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217 if (s == NULL || o == NULL) {
1218 null_error();
1219 return -1;
1220 }
1221
1222 l = PySequence_Length(s);
1223 if (l < 0)
1224 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001225
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226 n = 0;
1227 for (i = 0; i < l; i++) {
1228 item = PySequence_GetItem(s, i);
1229 if (item == NULL)
1230 return -1;
1231 err = PyObject_Cmp(item, o, &cmp);
1232 Py_DECREF(item);
1233 if (err < 0)
1234 return err;
1235 if (cmp == 0)
1236 n++;
1237 }
1238 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001239}
1240
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241int
1242PySequence_Contains(w, v) /* v in w */
1243 PyObject *w;
1244 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001245{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001246 int i, cmp;
1247 PyObject *x;
1248 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001249
Guido van Rossum46c6b202000-02-28 15:01:46 +00001250 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1251 sq = w->ob_type->tp_as_sequence;
1252 if(sq != NULL && sq->sq_contains != NULL)
1253 return (*sq->sq_contains)(w, v);
1254 }
1255
1256 /* If there is no better way to check whether an item is is contained,
1257 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001258 sq = w->ob_type->tp_as_sequence;
1259 if (sq == NULL || sq->sq_item == NULL) {
1260 PyErr_SetString(PyExc_TypeError,
1261 "'in' or 'not in' needs sequence right argument");
1262 return -1;
1263 }
1264
1265 for (i = 0; ; i++) {
1266 x = (*sq->sq_item)(w, i);
1267 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001268 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001269 PyErr_Clear();
1270 break;
1271 }
1272 return -1;
1273 }
1274 cmp = PyObject_Compare(v, x);
1275 Py_XDECREF(x);
1276 if (cmp == 0)
1277 return 1;
1278 if (PyErr_Occurred())
1279 return -1;
1280 }
1281
1282 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001283}
1284
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001285/* Backwards compatibility */
1286#undef PySequence_In
1287int
1288PySequence_In(w, v)
1289 PyObject *w;
1290 PyObject *v;
1291{
1292 return PySequence_Contains(w, v);
1293}
1294
1295int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001296PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 PyObject *s;
1298 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001299{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001300 int l, i, cmp, err;
1301 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001302
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 if (s == NULL || o == NULL) {
1304 null_error();
1305 return -1;
1306 }
1307
1308 l = PySequence_Length(s);
1309 if (l < 0)
1310 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001311
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 for (i = 0; i < l; i++) {
1313 item = PySequence_GetItem(s, i);
1314 if (item == NULL)
1315 return -1;
1316 err = PyObject_Cmp(item, o, &cmp);
1317 Py_DECREF(item);
1318 if (err < 0)
1319 return err;
1320 if (cmp == 0)
1321 return i;
1322 }
1323
1324 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1325 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001326}
1327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328/* Operations on mappings */
1329
1330int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001331PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001332 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001333{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001334 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001335}
1336
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001337int
1338PyMapping_Length(o)
1339 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001340{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001341 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001342
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343 if (o == NULL) {
1344 null_error();
1345 return -1;
1346 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348 m = o->ob_type->tp_as_mapping;
1349 if (m && m->mp_length)
1350 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001351
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001352 type_error("len() of unsized object");
1353 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001354}
1355
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001356PyObject *
1357PyMapping_GetItemString(o, key)
1358 PyObject *o;
1359 char *key;
1360{
1361 PyObject *okey, *r;
1362
1363 if (key == NULL)
1364 return null_error();
1365
1366 okey = PyString_FromString(key);
1367 if (okey == NULL)
1368 return NULL;
1369 r = PyObject_GetItem(o, okey);
1370 Py_DECREF(okey);
1371 return r;
1372}
1373
1374int
1375PyMapping_SetItemString(o, key, value)
1376 PyObject *o;
1377 char *key;
1378 PyObject *value;
1379{
1380 PyObject *okey;
1381 int r;
1382
1383 if (key == NULL) {
1384 null_error();
1385 return -1;
1386 }
1387
1388 okey = PyString_FromString(key);
1389 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001390 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391 r = PyObject_SetItem(o, okey, value);
1392 Py_DECREF(okey);
1393 return r;
1394}
1395
1396int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001397PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001398 PyObject *o;
1399 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001400{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001401 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001402
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001403 v = PyMapping_GetItemString(o, key);
1404 if (v) {
1405 Py_DECREF(v);
1406 return 1;
1407 }
1408 PyErr_Clear();
1409 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001410}
1411
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001412int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001413PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001414 PyObject *o;
1415 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001416{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001417 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001418
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 v = PyObject_GetItem(o, key);
1420 if (v) {
1421 Py_DECREF(v);
1422 return 1;
1423 }
1424 PyErr_Clear();
1425 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001426}
1427
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428/* Operations on callable objects */
1429
1430/* XXX PyCallable_Check() is in object.c */
1431
Guido van Rossume15dee51995-07-18 14:12:02 +00001432PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001433PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001434 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001435{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001436 PyObject *r;
1437 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001438
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001439 if (args == NULL) {
1440 args = PyTuple_New(0);
1441 if (args == NULL)
1442 return NULL;
1443 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001444
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 r = PyEval_CallObject(o, args);
1446
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001447 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001448 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001449 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001450
1451 return r;
1452}
Guido van Rossume15dee51995-07-18 14:12:02 +00001453
1454PyObject *
1455#ifdef HAVE_STDARG_PROTOTYPES
1456/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001458#else
1459/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001461#endif
1462{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001463 va_list va;
1464 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001465#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001467#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001468 PyObject *callable;
1469 char *format;
1470 va_start(va);
1471 callable = va_arg(va, PyObject *);
1472 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001473#endif
1474
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001475 if (callable == NULL) {
1476 va_end(va);
1477 return null_error();
1478 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001479
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001480 if (format)
1481 args = Py_VaBuildValue(format, va);
1482 else
1483 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001484
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001485 va_end(va);
1486
1487 if (args == NULL)
1488 return NULL;
1489
1490 if (!PyTuple_Check(args)) {
1491 PyObject *a;
1492
1493 a = PyTuple_New(1);
1494 if (a == NULL)
1495 return NULL;
1496 if (PyTuple_SetItem(a, 0, args) < 0)
1497 return NULL;
1498 args = a;
1499 }
1500 retval = PyObject_CallObject(callable, args);
1501
1502 Py_DECREF(args);
1503
1504 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001505}
1506
1507PyObject *
1508#ifdef HAVE_STDARG_PROTOTYPES
1509/* VARARGS 2 */
1510PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1511#else
1512/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001513 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001514#endif
1515{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001516 va_list va;
1517 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001518#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001519 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001520#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001521 PyObject *o;
1522 char *name;
1523 char *format;
1524 va_start(va);
1525 o = va_arg(va, PyObject *);
1526 name = va_arg(va, char *);
1527 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001528#endif
1529
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001530 if (o == NULL || name == NULL) {
1531 va_end(va);
1532 return null_error();
1533 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001534
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001535 func = PyObject_GetAttrString(o, name);
1536 if (func == NULL) {
1537 va_end(va);
1538 PyErr_SetString(PyExc_AttributeError, name);
1539 return 0;
1540 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001541
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001542 if (!PyCallable_Check(func)) {
1543 va_end(va);
1544 return type_error("call of non-callable attribute");
1545 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001546
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001547 if (format && *format)
1548 args = Py_VaBuildValue(format, va);
1549 else
1550 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001551
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001552 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001553
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001554 if (!args)
1555 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001556
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001557 if (!PyTuple_Check(args)) {
1558 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001559
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560 a = PyTuple_New(1);
1561 if (a == NULL)
1562 return NULL;
1563 if (PyTuple_SetItem(a, 0, args) < 0)
1564 return NULL;
1565 args = a;
1566 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001567
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001568 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001569
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001570 Py_DECREF(args);
1571 Py_DECREF(func);
1572
1573 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001574}