blob: 1d990194d5defae7d2536b35955379f531833b7d [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 Drake4201b9e2000-07-09 04:34:13 +000019type_error(const 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
Jeremy Hylton6253f832000-07-12 12:56:19 +000065PyObject_Size(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
Jeremy Hylton6253f832000-07-12 12:56:19 +000078 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000079}
80
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000081#undef PyObject_Length
82int
83PyObject_Length(PyObject *o)
84{
85 return PyObject_Size(o);
86}
87#define PyObject_Length PyObject_Size
88
Guido van Rossume15dee51995-07-18 14:12:02 +000089PyObject *
Fred Drake79912472000-07-09 04:06:11 +000090PyObject_GetItem(PyObject *o, 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
Fred Drake79912472000-07-09 04:06:11 +0000117PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000118{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000119 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000120
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000121 if (o == NULL || key == NULL || value == NULL) {
122 null_error();
123 return -1;
124 }
125 m = o->ob_type->tp_as_mapping;
126 if (m && m->mp_ass_subscript)
127 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000128
Guido van Rossum21308241998-08-13 16:44:44 +0000129 if (o->ob_type->tp_as_sequence) {
130 if (PyInt_Check(key))
131 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000132 else if (PyLong_Check(key)) {
133 long key_value = PyLong_AsLong(key);
134 if (key_value == -1 && PyErr_Occurred())
135 return -1;
136 return PySequence_SetItem(o, key_value, value);
137 }
Guido van Rossum21308241998-08-13 16:44:44 +0000138 type_error("sequence index must be integer");
139 return -1;
140 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000141
142 type_error("object does not support item assignment");
143 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000144}
145
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000146int
Fred Drake79912472000-07-09 04:06:11 +0000147PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000148{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000149 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000150
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000151 if (o == NULL || key == NULL) {
152 null_error();
153 return -1;
154 }
155 m = o->ob_type->tp_as_mapping;
156 if (m && m->mp_ass_subscript)
157 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000158
Guido van Rossum21308241998-08-13 16:44:44 +0000159 if (o->ob_type->tp_as_sequence) {
160 if (PyInt_Check(key))
161 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000162 else if (PyLong_Check(key)) {
163 long key_value = PyLong_AsLong(key);
164 if (key_value == -1 && PyErr_Occurred())
165 return -1;
166 return PySequence_DelItem(o, key_value);
167 }
Guido van Rossum21308241998-08-13 16:44:44 +0000168 type_error("sequence index must be integer");
169 return -1;
170 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000171
172 type_error("object does not support item deletion");
173 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174}
175
Guido van Rossum4c08d552000-03-10 22:55:18 +0000176int PyObject_AsCharBuffer(PyObject *obj,
177 const char **buffer,
178 int *buffer_len)
179{
180 PyBufferProcs *pb;
181 const char *pp;
182 int len;
183
184 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
185 null_error();
186 return -1;
187 }
188 pb = obj->ob_type->tp_as_buffer;
189 if ( pb == NULL ||
190 pb->bf_getcharbuffer == NULL ||
191 pb->bf_getsegcount == NULL ) {
192 PyErr_SetString(PyExc_TypeError,
193 "expected a character buffer object");
194 goto onError;
195 }
196 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
197 PyErr_SetString(PyExc_TypeError,
198 "expected a single-segment buffer object");
199 goto onError;
200 }
201 len = (*pb->bf_getcharbuffer)(obj,0,&pp);
202 if (len < 0)
203 goto onError;
204 *buffer = pp;
205 *buffer_len = len;
206 return 0;
207
208 onError:
209 return -1;
210}
211
212int PyObject_AsReadBuffer(PyObject *obj,
213 const void **buffer,
214 int *buffer_len)
215{
216 PyBufferProcs *pb;
217 void *pp;
218 int len;
219
220 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
221 null_error();
222 return -1;
223 }
224 pb = obj->ob_type->tp_as_buffer;
225 if ( pb == NULL ||
226 pb->bf_getreadbuffer == NULL ||
227 pb->bf_getsegcount == NULL ) {
228 PyErr_SetString(PyExc_TypeError,
229 "expected a readable buffer object");
230 goto onError;
231 }
232 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
233 PyErr_SetString(PyExc_TypeError,
234 "expected a single-segment buffer object");
235 goto onError;
236 }
237 len = (*pb->bf_getreadbuffer)(obj,0,&pp);
238 if (len < 0)
239 goto onError;
240 *buffer = pp;
241 *buffer_len = len;
242 return 0;
243
244 onError:
245 return -1;
246}
247
248int PyObject_AsWriteBuffer(PyObject *obj,
249 void **buffer,
250 int *buffer_len)
251{
252 PyBufferProcs *pb;
253 void*pp;
254 int len;
255
256 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
257 null_error();
258 return -1;
259 }
260 pb = obj->ob_type->tp_as_buffer;
261 if ( pb == NULL ||
262 pb->bf_getwritebuffer == NULL ||
263 pb->bf_getsegcount == NULL ) {
264 PyErr_SetString(PyExc_TypeError,
265 "expected a writeable buffer object");
266 goto onError;
267 }
268 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
269 PyErr_SetString(PyExc_TypeError,
270 "expected a single-segment buffer object");
271 goto onError;
272 }
273 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
274 if (len < 0)
275 goto onError;
276 *buffer = pp;
277 *buffer_len = len;
278 return 0;
279
280 onError:
281 return -1;
282}
283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000284/* Operations on numbers */
285
286int
Fred Drake79912472000-07-09 04:06:11 +0000287PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000288{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000289 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000290}
291
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000292/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000293
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000294#define BINOP(v, w, opname, ropname, thisfunc) \
295 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000296 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
297
298PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000299PyNumber_Or(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000300{
301 extern int PyNumber_Coerce();
302
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000303 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000304 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000305 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000306 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000307 if (PyNumber_Coerce(&v, &w) != 0)
308 return NULL;
309 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
310 x = (*f)(v, w);
311 Py_DECREF(v);
312 Py_DECREF(w);
313 if (f != NULL)
314 return x;
315 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000316 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000317}
318
319PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000320PyNumber_Xor(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000321{
322 extern int PyNumber_Coerce();
323
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000324 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000325 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000326 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000327 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000328 if (PyNumber_Coerce(&v, &w) != 0)
329 return NULL;
330 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
331 x = (*f)(v, w);
332 Py_DECREF(v);
333 Py_DECREF(w);
334 if (f != NULL)
335 return x;
336 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000337 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000338}
339
340PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000341PyNumber_And(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000342{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000343 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000344 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000345 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000346 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000347 if (PyNumber_Coerce(&v, &w) != 0)
348 return NULL;
349 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
350 x = (*f)(v, w);
351 Py_DECREF(v);
352 Py_DECREF(w);
353 if (f != NULL)
354 return x;
355 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000356 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000357}
358
359PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000360PyNumber_Lshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000361{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000362 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000363 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000364 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000365 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000366 if (PyNumber_Coerce(&v, &w) != 0)
367 return NULL;
368 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
369 x = (*f)(v, w);
370 Py_DECREF(v);
371 Py_DECREF(w);
372 if (f != NULL)
373 return x;
374 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000375 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000376}
377
378PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000379PyNumber_Rshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000380{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000381 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000382 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000383 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000384 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000385 if (PyNumber_Coerce(&v, &w) != 0)
386 return NULL;
387 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
388 x = (*f)(v, w);
389 Py_DECREF(v);
390 Py_DECREF(w);
391 if (f != NULL)
392 return x;
393 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000394 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000395}
396
397PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000398PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000399{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000400 PySequenceMethods *m;
401
402 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
403 m = v->ob_type->tp_as_sequence;
404 if (m && m->sq_concat)
405 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000406 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000407 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000408 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000409 if (PyNumber_Coerce(&v, &w) != 0)
410 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000411 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
412 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000413 Py_DECREF(v);
414 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000415 if (f != NULL)
416 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000417 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000418 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000419}
420
421PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000422PyNumber_Subtract(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000423{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000424 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000425 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000426 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000427 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000428 if (PyNumber_Coerce(&v, &w) != 0)
429 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000430 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
431 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000432 Py_DECREF(v);
433 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000434 if (f != NULL)
435 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000436 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000437 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000438}
439
440PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000441PyNumber_Multiply(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000442{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000443 PyTypeObject *tp = v->ob_type;
444 PySequenceMethods *m;
445
446 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000447 if (tp->tp_as_number != NULL &&
448 w->ob_type->tp_as_sequence != NULL &&
449 !PyInstance_Check(v)) {
450 /* number*sequence -- swap v and w */
451 PyObject *tmp = v;
452 v = w;
453 w = tmp;
454 tp = v->ob_type;
455 }
456 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000457 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000458 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000459 if (PyInstance_Check(v)) {
460 /* Instances of user-defined classes get their
461 other argument uncoerced, so they may
462 implement sequence*number as well as
463 number*number. */
464 Py_INCREF(v);
465 Py_INCREF(w);
466 }
467 else if (PyNumber_Coerce(&v, &w) != 0)
468 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000469 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
470 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000471 Py_DECREF(v);
472 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000473 if (f != NULL)
474 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000475 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000476 m = tp->tp_as_sequence;
477 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000478 long mul_value;
479
480 if (PyInt_Check(w)) {
481 mul_value = PyInt_AsLong(w);
482 }
483 else if (PyLong_Check(w)) {
484 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000485 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000486 return NULL;
487 }
488 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000489 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000490 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000491 }
492 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000493 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000494 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000495}
496
497PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000498PyNumber_Divide(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000499{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000500 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000501 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000502 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000503 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000504 if (PyNumber_Coerce(&v, &w) != 0)
505 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000506 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
507 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000508 Py_DECREF(v);
509 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000510 if (f != NULL)
511 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000512 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000513 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000514}
515
516PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000517PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000518{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000519 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000520 return PyString_Format(v, w);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000521 else if (PyUnicode_Check(v))
522 return PyUnicode_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000523 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000524 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000525 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000526 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000527 if (PyNumber_Coerce(&v, &w) != 0)
528 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000529 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
530 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000531 Py_DECREF(v);
532 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000533 if (f != NULL)
534 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000535 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000536 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000537}
538
539PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000540PyNumber_Divmod(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000541{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000542 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
543 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000544 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000545 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000546 if (PyNumber_Coerce(&v, &w) != 0)
547 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000548 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
549 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000550 Py_DECREF(v);
551 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000552 if (f != NULL)
553 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000554 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000555 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000556}
557
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000558/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000559
560static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000561do_pow(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000562{
563 PyObject *res;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000564 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000565 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000566 if (v->ob_type->tp_as_number == NULL ||
567 w->ob_type->tp_as_number == NULL) {
568 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000569 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000570 return NULL;
571 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000572 if (PyNumber_Coerce(&v, &w) != 0)
573 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000574 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
575 res = (*f)(v, w, Py_None);
576 else
577 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000578 Py_DECREF(v);
579 Py_DECREF(w);
580 return res;
581}
582
583PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000584PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000585{
586 PyObject *res;
587 PyObject *v1, *z1, *w2, *z2;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000588 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000589
590 if (z == Py_None)
591 return do_pow(v, w);
592 /* XXX The ternary version doesn't do class instance coercions */
593 if (PyInstance_Check(v))
594 return v->ob_type->tp_as_number->nb_power(v, w, z);
595 if (v->ob_type->tp_as_number == NULL ||
596 z->ob_type->tp_as_number == NULL ||
597 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000598 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000599 }
600 if (PyNumber_Coerce(&v, &w) != 0)
601 return NULL;
602 res = NULL;
603 v1 = v;
604 z1 = z;
605 if (PyNumber_Coerce(&v1, &z1) != 0)
606 goto error2;
607 w2 = w;
608 z2 = z1;
609 if (PyNumber_Coerce(&w2, &z2) != 0)
610 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000611 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
612 res = (*f)(v1, w2, z2);
613 else
614 res = type_error(
615 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000616 Py_DECREF(w2);
617 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000618 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000619 Py_DECREF(v1);
620 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000621 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000622 Py_DECREF(v);
623 Py_DECREF(w);
624 return res;
625}
626
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000627/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000628
629PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000630PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000631{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000632 PyNumberMethods *m;
633
634 if (o == NULL)
635 return null_error();
636 m = o->ob_type->tp_as_number;
637 if (m && m->nb_negative)
638 return (*m->nb_negative)(o);
639
640 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000641}
642
643PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000644PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000645{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000646 PyNumberMethods *m;
647
648 if (o == NULL)
649 return null_error();
650 m = o->ob_type->tp_as_number;
651 if (m && m->nb_positive)
652 return (*m->nb_positive)(o);
653
654 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000655}
656
657PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000658PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000659{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000660 PyNumberMethods *m;
661
662 if (o == NULL)
663 return null_error();
664 m = o->ob_type->tp_as_number;
665 if (m && m->nb_invert)
666 return (*m->nb_invert)(o);
667
668 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000669}
670
671PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000672PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000673{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000674 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000675
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000676 if (o == NULL)
677 return null_error();
678 m = o->ob_type->tp_as_number;
679 if (m && m->nb_absolute)
680 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000681
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000682 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000683}
684
Guido van Rossum9e896b32000-04-05 20:11:21 +0000685/* Add a check for embedded NULL-bytes in the argument. */
686static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000687int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000688{
689 char *end;
690 PyObject *x;
691
692 x = PyInt_FromString((char*)s, &end, 10);
693 if (x == NULL)
694 return NULL;
695 if (end != s + len) {
696 PyErr_SetString(PyExc_ValueError,
697 "null byte in argument for int()");
698 Py_DECREF(x);
699 return NULL;
700 }
701 return x;
702}
703
Guido van Rossume15dee51995-07-18 14:12:02 +0000704PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000705PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000706{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000707 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000708 const char *buffer;
709 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000710
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000711 if (o == NULL)
712 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000713 if (PyInt_Check(o)) {
714 Py_INCREF(o);
715 return o;
716 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000717 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000718 return int_from_string(PyString_AS_STRING(o),
719 PyString_GET_SIZE(o));
720 if (PyUnicode_Check(o))
721 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
722 PyUnicode_GET_SIZE(o),
723 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000724 m = o->ob_type->tp_as_number;
725 if (m && m->nb_int)
726 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000727 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000728 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000729
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000730 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000731}
732
Guido van Rossum9e896b32000-04-05 20:11:21 +0000733/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000734static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000735long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000736{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000737 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000738 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000739
Guido van Rossum4c08d552000-03-10 22:55:18 +0000740 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000741 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000742 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000743 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000744 PyErr_SetString(PyExc_ValueError,
745 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000746 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000747 return NULL;
748 }
749 return x;
750}
751
Guido van Rossume15dee51995-07-18 14:12:02 +0000752PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000753PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000754{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000756 const char *buffer;
757 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000758
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000759 if (o == NULL)
760 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000761 if (PyLong_Check(o)) {
762 Py_INCREF(o);
763 return o;
764 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000765 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000766 /* need to do extra error checking that PyLong_FromString()
767 * doesn't do. In particular long('9.5') must raise an
768 * exception, not truncate the float.
769 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000770 return long_from_string(PyString_AS_STRING(o),
771 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000772 if (PyUnicode_Check(o))
773 /* The above check is done in PyLong_FromUnicode(). */
774 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
775 PyUnicode_GET_SIZE(o),
776 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000777 m = o->ob_type->tp_as_number;
778 if (m && m->nb_long)
779 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000780 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
781 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000782
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000783 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000784}
785
786PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000787PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000788{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000789 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000790
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000791 if (o == NULL)
792 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000793 if (PyFloat_Check(o)) {
794 Py_INCREF(o);
795 return o;
796 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000797 if (!PyString_Check(o)) {
798 m = o->ob_type->tp_as_number;
799 if (m && m->nb_float)
800 return m->nb_float(o);
801 }
802 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000803}
804
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000806
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000807int
Fred Drake79912472000-07-09 04:06:11 +0000808PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000809{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000810 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000811}
812
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000813int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000814PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000815{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000816 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000817
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000818 if (s == NULL) {
819 null_error();
820 return -1;
821 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000822
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000823 m = s->ob_type->tp_as_sequence;
824 if (m && m->sq_length)
825 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000826
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000827 type_error("len() of unsized object");
828 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000829}
830
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000831#undef PySequence_Length
832int
833PySequence_Length(PyObject *s)
834{
835 return PySequence_Size(s);
836}
837#define PySequence_Length PySequence_Size
838
Guido van Rossume15dee51995-07-18 14:12:02 +0000839PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000840PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000841{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000842 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000844 if (s == NULL || o == NULL)
845 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000846
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000847 m = s->ob_type->tp_as_sequence;
848 if (m && m->sq_concat)
849 return m->sq_concat(s, o);
850
851 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000852}
853
854PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000855PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000856{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000857 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000858
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859 if (o == NULL)
860 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000861
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862 m = o->ob_type->tp_as_sequence;
863 if (m && m->sq_repeat)
864 return m->sq_repeat(o, count);
865
866 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000867}
868
869PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000870PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +0000871{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000872 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000873
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000874 if (s == NULL)
875 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000876
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 m = s->ob_type->tp_as_sequence;
878 if (m && m->sq_item) {
879 if (i < 0) {
880 if (m->sq_length) {
881 int l = (*m->sq_length)(s);
882 if (l < 0)
883 return NULL;
884 i += l;
885 }
886 }
887 return m->sq_item(s, i);
888 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000889
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000890 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000891}
892
893PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000894PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +0000895{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000896 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000897
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000898 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000899
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000900 m = s->ob_type->tp_as_sequence;
901 if (m && m->sq_slice) {
902 if (i1 < 0 || i2 < 0) {
903 if (m->sq_length) {
904 int l = (*m->sq_length)(s);
905 if (l < 0)
906 return NULL;
907 if (i1 < 0)
908 i1 += l;
909 if (i2 < 0)
910 i2 += l;
911 }
912 }
913 return m->sq_slice(s, i1, i2);
914 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000915
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000916 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000917}
918
919int
Fred Drake79912472000-07-09 04:06:11 +0000920PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000921{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000922 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000923
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000924 if (s == NULL) {
925 null_error();
926 return -1;
927 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000928
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000929 m = s->ob_type->tp_as_sequence;
930 if (m && m->sq_ass_item) {
931 if (i < 0) {
932 if (m->sq_length) {
933 int l = (*m->sq_length)(s);
934 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000935 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000936 i += l;
937 }
938 }
939 return m->sq_ass_item(s, i, o);
940 }
941
942 type_error("object doesn't support item assignment");
943 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000944}
945
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000946int
Fred Drake79912472000-07-09 04:06:11 +0000947PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000948{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000949 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000950
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000951 if (s == NULL) {
952 null_error();
953 return -1;
954 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000955
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 m = s->ob_type->tp_as_sequence;
957 if (m && m->sq_ass_item) {
958 if (i < 0) {
959 if (m->sq_length) {
960 int l = (*m->sq_length)(s);
961 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000962 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000963 i += l;
964 }
965 }
966 return m->sq_ass_item(s, i, (PyObject *)NULL);
967 }
968
969 type_error("object doesn't support item deletion");
970 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000971}
972
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000973int
Fred Drake79912472000-07-09 04:06:11 +0000974PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000975{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000976 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000977
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000978 if (s == NULL) {
979 null_error();
980 return -1;
981 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000982
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000983 m = s->ob_type->tp_as_sequence;
984 if (m && m->sq_ass_slice) {
985 if (i1 < 0 || i2 < 0) {
986 if (m->sq_length) {
987 int l = (*m->sq_length)(s);
988 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000989 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000990 if (i1 < 0)
991 i1 += l;
992 if (i2 < 0)
993 i2 += l;
994 }
995 }
996 return m->sq_ass_slice(s, i1, i2, o);
997 }
998 type_error("object doesn't support slice assignment");
999 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001000}
1001
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001002int
Fred Drake79912472000-07-09 04:06:11 +00001003PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001004{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001005 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001006
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001007 if (s == NULL) {
1008 null_error();
1009 return -1;
1010 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001012 m = s->ob_type->tp_as_sequence;
1013 if (m && m->sq_ass_slice) {
1014 if (i1 < 0 || i2 < 0) {
1015 if (m->sq_length) {
1016 int l = (*m->sq_length)(s);
1017 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001018 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 if (i1 < 0)
1020 i1 += l;
1021 if (i2 < 0)
1022 i2 += l;
1023 }
1024 }
1025 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1026 }
1027 type_error("object doesn't support slice deletion");
1028 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001029}
1030
Guido van Rossume15dee51995-07-18 14:12:02 +00001031PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001032PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001033{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001035
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001036 if (v == NULL)
1037 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001038
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 if (PyTuple_Check(v)) {
1040 Py_INCREF(v);
1041 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001042 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001043
1044 if (PyList_Check(v))
1045 return PyList_AsTuple(v);
1046
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001047 /* There used to be code for strings here, but tuplifying strings is
1048 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001049
1050 /* Generic sequence object */
1051 m = v->ob_type->tp_as_sequence;
1052 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001053 int i;
1054 PyObject *t;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001055 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056 if (n < 0)
1057 return NULL;
1058 t = PyTuple_New(n);
1059 if (t == NULL)
1060 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001061 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001062 PyObject *item = (*m->sq_item)(v, i);
1063 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001064 if (PyErr_ExceptionMatches(PyExc_IndexError))
1065 PyErr_Clear();
1066 else {
1067 Py_DECREF(t);
1068 t = NULL;
1069 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001070 break;
1071 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001072 if (i >= n) {
1073 if (n < 500)
1074 n += 10;
1075 else
1076 n += 100;
1077 if (_PyTuple_Resize(&t, n, 0) != 0)
1078 break;
1079 }
1080 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001081 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001082 if (i < n && t != NULL)
1083 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001084 return t;
1085 }
1086
1087 /* None of the above */
1088 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001089}
1090
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001091PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001092PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001093{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001095
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001096 if (v == NULL)
1097 return null_error();
1098
1099 if (PyList_Check(v))
1100 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1101
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001102 m = v->ob_type->tp_as_sequence;
1103 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 int i;
1105 PyObject *l;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001106 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001107 if (n < 0)
1108 return NULL;
1109 l = PyList_New(n);
1110 if (l == NULL)
1111 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001112 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001113 PyObject *item = (*m->sq_item)(v, i);
1114 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001115 if (PyErr_ExceptionMatches(PyExc_IndexError))
1116 PyErr_Clear();
1117 else {
1118 Py_DECREF(l);
1119 l = NULL;
1120 }
1121 break;
1122 }
1123 if (i < n)
1124 PyList_SET_ITEM(l, i, item);
1125 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001126 Py_DECREF(l);
1127 l = NULL;
1128 break;
1129 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001130 }
1131 if (i < n && l != NULL) {
1132 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1133 Py_DECREF(l);
1134 l = NULL;
1135 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136 }
1137 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001138 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001139 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001140}
1141
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001142PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001143PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001144{
1145 if (v == NULL)
1146 return null_error();
1147
1148 if (PyList_Check(v) || PyTuple_Check(v)) {
1149 Py_INCREF(v);
1150 return v;
1151 }
1152
1153 v = PySequence_Tuple(v);
1154 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1155 return type_error(m);
1156
1157 return v;
1158}
1159
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001160int
Fred Drake79912472000-07-09 04:06:11 +00001161PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001162{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001163 int l, i, n, cmp, err;
1164 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001165
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001166 if (s == NULL || o == NULL) {
1167 null_error();
1168 return -1;
1169 }
1170
Jeremy Hylton6253f832000-07-12 12:56:19 +00001171 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172 if (l < 0)
1173 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001174
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001175 n = 0;
1176 for (i = 0; i < l; i++) {
1177 item = PySequence_GetItem(s, i);
1178 if (item == NULL)
1179 return -1;
1180 err = PyObject_Cmp(item, o, &cmp);
1181 Py_DECREF(item);
1182 if (err < 0)
1183 return err;
1184 if (cmp == 0)
1185 n++;
1186 }
1187 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001188}
1189
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190int
Fred Drake79912472000-07-09 04:06:11 +00001191PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001192{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193 int i, cmp;
1194 PyObject *x;
1195 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001196
Guido van Rossum46c6b202000-02-28 15:01:46 +00001197 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1198 sq = w->ob_type->tp_as_sequence;
1199 if(sq != NULL && sq->sq_contains != NULL)
1200 return (*sq->sq_contains)(w, v);
1201 }
1202
1203 /* If there is no better way to check whether an item is is contained,
1204 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205 sq = w->ob_type->tp_as_sequence;
1206 if (sq == NULL || sq->sq_item == NULL) {
1207 PyErr_SetString(PyExc_TypeError,
1208 "'in' or 'not in' needs sequence right argument");
1209 return -1;
1210 }
1211
1212 for (i = 0; ; i++) {
1213 x = (*sq->sq_item)(w, i);
1214 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001215 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001216 PyErr_Clear();
1217 break;
1218 }
1219 return -1;
1220 }
1221 cmp = PyObject_Compare(v, x);
1222 Py_XDECREF(x);
1223 if (cmp == 0)
1224 return 1;
1225 if (PyErr_Occurred())
1226 return -1;
1227 }
1228
1229 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001230}
1231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232/* Backwards compatibility */
1233#undef PySequence_In
1234int
Fred Drake79912472000-07-09 04:06:11 +00001235PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001236{
1237 return PySequence_Contains(w, v);
1238}
1239
1240int
Fred Drake79912472000-07-09 04:06:11 +00001241PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001242{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 int l, i, cmp, err;
1244 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001245
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001246 if (s == NULL || o == NULL) {
1247 null_error();
1248 return -1;
1249 }
1250
Jeremy Hylton6253f832000-07-12 12:56:19 +00001251 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252 if (l < 0)
1253 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001254
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 for (i = 0; i < l; i++) {
1256 item = PySequence_GetItem(s, i);
1257 if (item == NULL)
1258 return -1;
1259 err = PyObject_Cmp(item, o, &cmp);
1260 Py_DECREF(item);
1261 if (err < 0)
1262 return err;
1263 if (cmp == 0)
1264 return i;
1265 }
1266
1267 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1268 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001269}
1270
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001271/* Operations on mappings */
1272
1273int
Fred Drake79912472000-07-09 04:06:11 +00001274PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001275{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001276 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001277}
1278
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001280PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001281{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001282 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001284 if (o == NULL) {
1285 null_error();
1286 return -1;
1287 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001288
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001289 m = o->ob_type->tp_as_mapping;
1290 if (m && m->mp_length)
1291 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001292
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001293 type_error("len() of unsized object");
1294 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001295}
1296
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001297#undef PyMapping_Length
1298int
1299PyMapping_Length(PyObject *o)
1300{
1301 return PyMapping_Size(o);
1302}
1303#define PyMapping_Length PyMapping_Size
1304
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001305PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001306PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307{
1308 PyObject *okey, *r;
1309
1310 if (key == NULL)
1311 return null_error();
1312
1313 okey = PyString_FromString(key);
1314 if (okey == NULL)
1315 return NULL;
1316 r = PyObject_GetItem(o, okey);
1317 Py_DECREF(okey);
1318 return r;
1319}
1320
1321int
Fred Drake79912472000-07-09 04:06:11 +00001322PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323{
1324 PyObject *okey;
1325 int r;
1326
1327 if (key == NULL) {
1328 null_error();
1329 return -1;
1330 }
1331
1332 okey = PyString_FromString(key);
1333 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001334 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 r = PyObject_SetItem(o, okey, value);
1336 Py_DECREF(okey);
1337 return r;
1338}
1339
1340int
Fred Drake79912472000-07-09 04:06:11 +00001341PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001342{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001344
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 v = PyMapping_GetItemString(o, key);
1346 if (v) {
1347 Py_DECREF(v);
1348 return 1;
1349 }
1350 PyErr_Clear();
1351 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001352}
1353
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001354int
Fred Drake79912472000-07-09 04:06:11 +00001355PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001356{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001357 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001358
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 v = PyObject_GetItem(o, key);
1360 if (v) {
1361 Py_DECREF(v);
1362 return 1;
1363 }
1364 PyErr_Clear();
1365 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001366}
1367
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001368/* Operations on callable objects */
1369
1370/* XXX PyCallable_Check() is in object.c */
1371
Guido van Rossume15dee51995-07-18 14:12:02 +00001372PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001373PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001374{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375 PyObject *r;
1376 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001377
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001378 if (args == NULL) {
1379 args = PyTuple_New(0);
1380 if (args == NULL)
1381 return NULL;
1382 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001383
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 r = PyEval_CallObject(o, args);
1385
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001386 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001387 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001388 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001389
1390 return r;
1391}
Guido van Rossume15dee51995-07-18 14:12:02 +00001392
1393PyObject *
1394#ifdef HAVE_STDARG_PROTOTYPES
1395/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001397#else
1398/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001400#endif
1401{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 va_list va;
1403 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001404#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001405 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001406#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001407 PyObject *callable;
1408 char *format;
1409 va_start(va);
1410 callable = va_arg(va, PyObject *);
1411 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001412#endif
1413
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001414 if (callable == NULL) {
1415 va_end(va);
1416 return null_error();
1417 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001418
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 if (format)
1420 args = Py_VaBuildValue(format, va);
1421 else
1422 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001423
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001424 va_end(va);
1425
1426 if (args == NULL)
1427 return NULL;
1428
1429 if (!PyTuple_Check(args)) {
1430 PyObject *a;
1431
1432 a = PyTuple_New(1);
1433 if (a == NULL)
1434 return NULL;
1435 if (PyTuple_SetItem(a, 0, args) < 0)
1436 return NULL;
1437 args = a;
1438 }
1439 retval = PyObject_CallObject(callable, args);
1440
1441 Py_DECREF(args);
1442
1443 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001444}
1445
1446PyObject *
1447#ifdef HAVE_STDARG_PROTOTYPES
1448/* VARARGS 2 */
1449PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1450#else
1451/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001452 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001453#endif
1454{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 va_list va;
1456 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001457#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001458 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001459#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 PyObject *o;
1461 char *name;
1462 char *format;
1463 va_start(va);
1464 o = va_arg(va, PyObject *);
1465 name = va_arg(va, char *);
1466 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001467#endif
1468
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001469 if (o == NULL || name == NULL) {
1470 va_end(va);
1471 return null_error();
1472 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001473
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 func = PyObject_GetAttrString(o, name);
1475 if (func == NULL) {
1476 va_end(va);
1477 PyErr_SetString(PyExc_AttributeError, name);
1478 return 0;
1479 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001480
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001481 if (!PyCallable_Check(func)) {
1482 va_end(va);
1483 return type_error("call of non-callable attribute");
1484 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001485
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001486 if (format && *format)
1487 args = Py_VaBuildValue(format, va);
1488 else
1489 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001490
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001491 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001492
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001493 if (!args)
1494 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001495
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001496 if (!PyTuple_Check(args)) {
1497 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001498
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001499 a = PyTuple_New(1);
1500 if (a == NULL)
1501 return NULL;
1502 if (PyTuple_SetItem(a, 0, args) < 0)
1503 return NULL;
1504 args = a;
1505 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001506
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001507 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001508
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001509 Py_DECREF(args);
1510 Py_DECREF(func);
1511
1512 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001513}