blob: 96b5fe81837f2865025aa7011be292a7167a22a9 [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{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000301 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000302 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000303 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000304 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000305 if (PyNumber_Coerce(&v, &w) != 0)
306 return NULL;
307 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
308 x = (*f)(v, w);
309 Py_DECREF(v);
310 Py_DECREF(w);
311 if (f != NULL)
312 return x;
313 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000314 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000315}
316
317PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000318PyNumber_Xor(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000319{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000320 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000321 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000322 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000323 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000324 if (PyNumber_Coerce(&v, &w) != 0)
325 return NULL;
326 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
327 x = (*f)(v, w);
328 Py_DECREF(v);
329 Py_DECREF(w);
330 if (f != NULL)
331 return x;
332 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000333 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000334}
335
336PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000337PyNumber_And(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000338{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000339 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000340 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000341 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000342 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000343 if (PyNumber_Coerce(&v, &w) != 0)
344 return NULL;
345 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
346 x = (*f)(v, w);
347 Py_DECREF(v);
348 Py_DECREF(w);
349 if (f != NULL)
350 return x;
351 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000352 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000353}
354
355PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000356PyNumber_Lshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000357{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000358 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000359 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000360 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000361 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000362 if (PyNumber_Coerce(&v, &w) != 0)
363 return NULL;
364 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
365 x = (*f)(v, w);
366 Py_DECREF(v);
367 Py_DECREF(w);
368 if (f != NULL)
369 return x;
370 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000371 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000372}
373
374PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000375PyNumber_Rshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000376{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000377 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000378 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000379 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000380 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000381 if (PyNumber_Coerce(&v, &w) != 0)
382 return NULL;
383 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
384 x = (*f)(v, w);
385 Py_DECREF(v);
386 Py_DECREF(w);
387 if (f != NULL)
388 return x;
389 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000390 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000391}
392
393PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000394PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000395{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000396 PySequenceMethods *m;
397
398 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
399 m = v->ob_type->tp_as_sequence;
400 if (m && m->sq_concat)
401 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000402 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000403 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000404 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000405 if (PyNumber_Coerce(&v, &w) != 0)
406 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000407 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
408 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000409 Py_DECREF(v);
410 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000411 if (f != NULL)
412 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000413 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000414 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000415}
416
417PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000418PyNumber_Subtract(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000419{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000420 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000421 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000422 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000423 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000424 if (PyNumber_Coerce(&v, &w) != 0)
425 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000426 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
427 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000428 Py_DECREF(v);
429 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000430 if (f != NULL)
431 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000432 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000433 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000434}
435
436PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000437PyNumber_Multiply(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000438{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000439 PyTypeObject *tp = v->ob_type;
440 PySequenceMethods *m;
441
442 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000443 if (tp->tp_as_number != NULL &&
444 w->ob_type->tp_as_sequence != NULL &&
445 !PyInstance_Check(v)) {
446 /* number*sequence -- swap v and w */
447 PyObject *tmp = v;
448 v = w;
449 w = tmp;
450 tp = v->ob_type;
451 }
452 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000453 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000454 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000455 if (PyInstance_Check(v)) {
456 /* Instances of user-defined classes get their
457 other argument uncoerced, so they may
458 implement sequence*number as well as
459 number*number. */
460 Py_INCREF(v);
461 Py_INCREF(w);
462 }
463 else if (PyNumber_Coerce(&v, &w) != 0)
464 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000465 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
466 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000467 Py_DECREF(v);
468 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000469 if (f != NULL)
470 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000471 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000472 m = tp->tp_as_sequence;
473 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000474 long mul_value;
475
476 if (PyInt_Check(w)) {
477 mul_value = PyInt_AsLong(w);
478 }
479 else if (PyLong_Check(w)) {
480 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000481 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000482 return NULL;
483 }
484 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000485 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000486 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000487 }
488 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000489 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000490 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000491}
492
493PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000494PyNumber_Divide(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000495{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000496 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000497 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000498 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000499 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000500 if (PyNumber_Coerce(&v, &w) != 0)
501 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000502 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
503 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000504 Py_DECREF(v);
505 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000506 if (f != NULL)
507 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000508 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000509 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000510}
511
512PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000513PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000514{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000515 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000516 return PyString_Format(v, w);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000517 else if (PyUnicode_Check(v))
518 return PyUnicode_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000519 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000520 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000521 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000522 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000523 if (PyNumber_Coerce(&v, &w) != 0)
524 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000525 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
526 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000527 Py_DECREF(v);
528 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000529 if (f != NULL)
530 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000531 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000532 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000533}
534
535PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000536PyNumber_Divmod(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000537{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000538 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
539 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000540 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000541 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000542 if (PyNumber_Coerce(&v, &w) != 0)
543 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000544 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
545 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000546 Py_DECREF(v);
547 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000548 if (f != NULL)
549 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000550 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000551 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000552}
553
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000554/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000555
556static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000557do_pow(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000558{
559 PyObject *res;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000560 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000561 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000562 if (v->ob_type->tp_as_number == NULL ||
563 w->ob_type->tp_as_number == NULL) {
564 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000565 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000566 return NULL;
567 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000568 if (PyNumber_Coerce(&v, &w) != 0)
569 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000570 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
571 res = (*f)(v, w, Py_None);
572 else
573 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000574 Py_DECREF(v);
575 Py_DECREF(w);
576 return res;
577}
578
579PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000580PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000581{
582 PyObject *res;
583 PyObject *v1, *z1, *w2, *z2;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000584 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000585
586 if (z == Py_None)
587 return do_pow(v, w);
588 /* XXX The ternary version doesn't do class instance coercions */
589 if (PyInstance_Check(v))
590 return v->ob_type->tp_as_number->nb_power(v, w, z);
591 if (v->ob_type->tp_as_number == NULL ||
592 z->ob_type->tp_as_number == NULL ||
593 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000594 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000595 }
596 if (PyNumber_Coerce(&v, &w) != 0)
597 return NULL;
598 res = NULL;
599 v1 = v;
600 z1 = z;
601 if (PyNumber_Coerce(&v1, &z1) != 0)
602 goto error2;
603 w2 = w;
604 z2 = z1;
605 if (PyNumber_Coerce(&w2, &z2) != 0)
606 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000607 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
608 res = (*f)(v1, w2, z2);
609 else
610 res = type_error(
611 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000612 Py_DECREF(w2);
613 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000614 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000615 Py_DECREF(v1);
616 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000617 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000618 Py_DECREF(v);
619 Py_DECREF(w);
620 return res;
621}
622
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000623/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000624
625PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000626PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000627{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000628 PyNumberMethods *m;
629
630 if (o == NULL)
631 return null_error();
632 m = o->ob_type->tp_as_number;
633 if (m && m->nb_negative)
634 return (*m->nb_negative)(o);
635
636 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000637}
638
639PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000640PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000641{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000642 PyNumberMethods *m;
643
644 if (o == NULL)
645 return null_error();
646 m = o->ob_type->tp_as_number;
647 if (m && m->nb_positive)
648 return (*m->nb_positive)(o);
649
650 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000651}
652
653PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000654PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000655{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000656 PyNumberMethods *m;
657
658 if (o == NULL)
659 return null_error();
660 m = o->ob_type->tp_as_number;
661 if (m && m->nb_invert)
662 return (*m->nb_invert)(o);
663
664 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000665}
666
667PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000668PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000669{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000670 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000671
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000672 if (o == NULL)
673 return null_error();
674 m = o->ob_type->tp_as_number;
675 if (m && m->nb_absolute)
676 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000677
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000678 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000679}
680
Guido van Rossum9e896b32000-04-05 20:11:21 +0000681/* Add a check for embedded NULL-bytes in the argument. */
682static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000683int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000684{
685 char *end;
686 PyObject *x;
687
688 x = PyInt_FromString((char*)s, &end, 10);
689 if (x == NULL)
690 return NULL;
691 if (end != s + len) {
692 PyErr_SetString(PyExc_ValueError,
693 "null byte in argument for int()");
694 Py_DECREF(x);
695 return NULL;
696 }
697 return x;
698}
699
Guido van Rossume15dee51995-07-18 14:12:02 +0000700PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000701PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000702{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000703 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000704 const char *buffer;
705 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000706
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000707 if (o == NULL)
708 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000709 if (PyInt_Check(o)) {
710 Py_INCREF(o);
711 return o;
712 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000713 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000714 return int_from_string(PyString_AS_STRING(o),
715 PyString_GET_SIZE(o));
716 if (PyUnicode_Check(o))
717 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
718 PyUnicode_GET_SIZE(o),
719 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000720 m = o->ob_type->tp_as_number;
721 if (m && m->nb_int)
722 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000723 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000724 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000725
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000726 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000727}
728
Guido van Rossum9e896b32000-04-05 20:11:21 +0000729/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000730static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000731long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000732{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000733 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000734 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000735
Guido van Rossum4c08d552000-03-10 22:55:18 +0000736 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000737 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000738 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000739 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000740 PyErr_SetString(PyExc_ValueError,
741 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000742 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000743 return NULL;
744 }
745 return x;
746}
747
Guido van Rossume15dee51995-07-18 14:12:02 +0000748PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000749PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000750{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000751 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000752 const char *buffer;
753 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000754
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755 if (o == NULL)
756 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000757 if (PyLong_Check(o)) {
758 Py_INCREF(o);
759 return o;
760 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000761 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000762 /* need to do extra error checking that PyLong_FromString()
763 * doesn't do. In particular long('9.5') must raise an
764 * exception, not truncate the float.
765 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000766 return long_from_string(PyString_AS_STRING(o),
767 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000768 if (PyUnicode_Check(o))
769 /* The above check is done in PyLong_FromUnicode(). */
770 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
771 PyUnicode_GET_SIZE(o),
772 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000773 m = o->ob_type->tp_as_number;
774 if (m && m->nb_long)
775 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000776 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
777 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000778
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000779 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000780}
781
782PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000783PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000784{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000785 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000786
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000787 if (o == NULL)
788 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000789 if (PyFloat_Check(o)) {
790 Py_INCREF(o);
791 return o;
792 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000793 if (!PyString_Check(o)) {
794 m = o->ob_type->tp_as_number;
795 if (m && m->nb_float)
796 return m->nb_float(o);
797 }
798 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000799}
800
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000801/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000802
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803int
Fred Drake79912472000-07-09 04:06:11 +0000804PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000805{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000806 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000807}
808
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000809int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000810PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000811{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000812 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000813
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000814 if (s == NULL) {
815 null_error();
816 return -1;
817 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000818
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 m = s->ob_type->tp_as_sequence;
820 if (m && m->sq_length)
821 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000822
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000823 type_error("len() of unsized object");
824 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000825}
826
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000827#undef PySequence_Length
828int
829PySequence_Length(PyObject *s)
830{
831 return PySequence_Size(s);
832}
833#define PySequence_Length PySequence_Size
834
Guido van Rossume15dee51995-07-18 14:12:02 +0000835PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000836PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000837{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000838 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000839
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000840 if (s == NULL || o == NULL)
841 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000842
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000843 m = s->ob_type->tp_as_sequence;
844 if (m && m->sq_concat)
845 return m->sq_concat(s, o);
846
847 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000848}
849
850PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000851PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000852{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000853 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000854
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000855 if (o == NULL)
856 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858 m = o->ob_type->tp_as_sequence;
859 if (m && m->sq_repeat)
860 return m->sq_repeat(o, count);
861
862 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000863}
864
865PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000866PySequence_GetItem(PyObject *s, int i)
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)
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_item) {
875 if (i < 0) {
876 if (m->sq_length) {
877 int l = (*m->sq_length)(s);
878 if (l < 0)
879 return NULL;
880 i += l;
881 }
882 }
883 return m->sq_item(s, i);
884 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000885
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000886 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000887}
888
889PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000890PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +0000891{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000892 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000893
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000895
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000896 m = s->ob_type->tp_as_sequence;
897 if (m && m->sq_slice) {
898 if (i1 < 0 || i2 < 0) {
899 if (m->sq_length) {
900 int l = (*m->sq_length)(s);
901 if (l < 0)
902 return NULL;
903 if (i1 < 0)
904 i1 += l;
905 if (i2 < 0)
906 i2 += l;
907 }
908 }
909 return m->sq_slice(s, i1, i2);
910 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000911
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000913}
914
915int
Fred Drake79912472000-07-09 04:06:11 +0000916PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000917{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000918 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000919
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000920 if (s == NULL) {
921 null_error();
922 return -1;
923 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000924
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000925 m = s->ob_type->tp_as_sequence;
926 if (m && m->sq_ass_item) {
927 if (i < 0) {
928 if (m->sq_length) {
929 int l = (*m->sq_length)(s);
930 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000931 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000932 i += l;
933 }
934 }
935 return m->sq_ass_item(s, i, o);
936 }
937
938 type_error("object doesn't support item assignment");
939 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000940}
941
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000942int
Fred Drake79912472000-07-09 04:06:11 +0000943PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000944{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000945 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000946
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 if (s == NULL) {
948 null_error();
949 return -1;
950 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000951
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000952 m = s->ob_type->tp_as_sequence;
953 if (m && m->sq_ass_item) {
954 if (i < 0) {
955 if (m->sq_length) {
956 int l = (*m->sq_length)(s);
957 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000958 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000959 i += l;
960 }
961 }
962 return m->sq_ass_item(s, i, (PyObject *)NULL);
963 }
964
965 type_error("object doesn't support item deletion");
966 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000967}
968
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000969int
Fred Drake79912472000-07-09 04:06:11 +0000970PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000971{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000972 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000973
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000974 if (s == NULL) {
975 null_error();
976 return -1;
977 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000978
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 m = s->ob_type->tp_as_sequence;
980 if (m && m->sq_ass_slice) {
981 if (i1 < 0 || i2 < 0) {
982 if (m->sq_length) {
983 int l = (*m->sq_length)(s);
984 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000985 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986 if (i1 < 0)
987 i1 += l;
988 if (i2 < 0)
989 i2 += l;
990 }
991 }
992 return m->sq_ass_slice(s, i1, i2, o);
993 }
994 type_error("object doesn't support slice assignment");
995 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000996}
997
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998int
Fred Drake79912472000-07-09 04:06:11 +0000999PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001000{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001002
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 if (s == NULL) {
1004 null_error();
1005 return -1;
1006 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001007
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 m = s->ob_type->tp_as_sequence;
1009 if (m && m->sq_ass_slice) {
1010 if (i1 < 0 || i2 < 0) {
1011 if (m->sq_length) {
1012 int l = (*m->sq_length)(s);
1013 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001014 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001015 if (i1 < 0)
1016 i1 += l;
1017 if (i2 < 0)
1018 i2 += l;
1019 }
1020 }
1021 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1022 }
1023 type_error("object doesn't support slice deletion");
1024 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001025}
1026
Guido van Rossume15dee51995-07-18 14:12:02 +00001027PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001028PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001029{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001030 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001031
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 if (v == NULL)
1033 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001034
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001035 if (PyTuple_Check(v)) {
1036 Py_INCREF(v);
1037 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001038 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039
1040 if (PyList_Check(v))
1041 return PyList_AsTuple(v);
1042
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001043 /* There used to be code for strings here, but tuplifying strings is
1044 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001045
1046 /* Generic sequence object */
1047 m = v->ob_type->tp_as_sequence;
1048 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001049 int i;
1050 PyObject *t;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001051 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001052 if (n < 0)
1053 return NULL;
1054 t = PyTuple_New(n);
1055 if (t == NULL)
1056 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001057 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001058 PyObject *item = (*m->sq_item)(v, i);
1059 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001060 if (PyErr_ExceptionMatches(PyExc_IndexError))
1061 PyErr_Clear();
1062 else {
1063 Py_DECREF(t);
1064 t = NULL;
1065 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066 break;
1067 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001068 if (i >= n) {
1069 if (n < 500)
1070 n += 10;
1071 else
1072 n += 100;
1073 if (_PyTuple_Resize(&t, n, 0) != 0)
1074 break;
1075 }
1076 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001077 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001078 if (i < n && t != NULL)
1079 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001080 return t;
1081 }
1082
1083 /* None of the above */
1084 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001085}
1086
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001087PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001088PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001089{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001090 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001091
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001092 if (v == NULL)
1093 return null_error();
1094
1095 if (PyList_Check(v))
1096 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1097
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001098 m = v->ob_type->tp_as_sequence;
1099 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001100 int i;
1101 PyObject *l;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001102 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001103 if (n < 0)
1104 return NULL;
1105 l = PyList_New(n);
1106 if (l == NULL)
1107 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001108 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 PyObject *item = (*m->sq_item)(v, i);
1110 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001111 if (PyErr_ExceptionMatches(PyExc_IndexError))
1112 PyErr_Clear();
1113 else {
1114 Py_DECREF(l);
1115 l = NULL;
1116 }
1117 break;
1118 }
1119 if (i < n)
1120 PyList_SET_ITEM(l, i, item);
1121 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001122 Py_DECREF(l);
1123 l = NULL;
1124 break;
1125 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001126 }
1127 if (i < n && l != NULL) {
1128 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1129 Py_DECREF(l);
1130 l = NULL;
1131 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 }
1133 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001134 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001135 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001136}
1137
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001138PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001139PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001140{
1141 if (v == NULL)
1142 return null_error();
1143
1144 if (PyList_Check(v) || PyTuple_Check(v)) {
1145 Py_INCREF(v);
1146 return v;
1147 }
1148
1149 v = PySequence_Tuple(v);
1150 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1151 return type_error(m);
1152
1153 return v;
1154}
1155
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156int
Fred Drake79912472000-07-09 04:06:11 +00001157PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001158{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 int l, i, n, cmp, err;
1160 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001161
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 if (s == NULL || o == NULL) {
1163 null_error();
1164 return -1;
1165 }
1166
Jeremy Hylton6253f832000-07-12 12:56:19 +00001167 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001168 if (l < 0)
1169 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001170
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001171 n = 0;
1172 for (i = 0; i < l; i++) {
1173 item = PySequence_GetItem(s, i);
1174 if (item == NULL)
1175 return -1;
1176 err = PyObject_Cmp(item, o, &cmp);
1177 Py_DECREF(item);
1178 if (err < 0)
1179 return err;
1180 if (cmp == 0)
1181 n++;
1182 }
1183 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001184}
1185
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001186int
Fred Drake79912472000-07-09 04:06:11 +00001187PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001188{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 int i, cmp;
1190 PyObject *x;
1191 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001192
Guido van Rossum46c6b202000-02-28 15:01:46 +00001193 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1194 sq = w->ob_type->tp_as_sequence;
1195 if(sq != NULL && sq->sq_contains != NULL)
1196 return (*sq->sq_contains)(w, v);
1197 }
1198
1199 /* If there is no better way to check whether an item is is contained,
1200 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001201 sq = w->ob_type->tp_as_sequence;
1202 if (sq == NULL || sq->sq_item == NULL) {
1203 PyErr_SetString(PyExc_TypeError,
1204 "'in' or 'not in' needs sequence right argument");
1205 return -1;
1206 }
1207
1208 for (i = 0; ; i++) {
1209 x = (*sq->sq_item)(w, i);
1210 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001211 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001212 PyErr_Clear();
1213 break;
1214 }
1215 return -1;
1216 }
1217 cmp = PyObject_Compare(v, x);
1218 Py_XDECREF(x);
1219 if (cmp == 0)
1220 return 1;
1221 if (PyErr_Occurred())
1222 return -1;
1223 }
1224
1225 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001226}
1227
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001228/* Backwards compatibility */
1229#undef PySequence_In
1230int
Fred Drake79912472000-07-09 04:06:11 +00001231PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232{
1233 return PySequence_Contains(w, v);
1234}
1235
1236int
Fred Drake79912472000-07-09 04:06:11 +00001237PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001238{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001239 int l, i, cmp, err;
1240 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001241
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242 if (s == NULL || o == NULL) {
1243 null_error();
1244 return -1;
1245 }
1246
Jeremy Hylton6253f832000-07-12 12:56:19 +00001247 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248 if (l < 0)
1249 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001250
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001251 for (i = 0; i < l; i++) {
1252 item = PySequence_GetItem(s, i);
1253 if (item == NULL)
1254 return -1;
1255 err = PyObject_Cmp(item, o, &cmp);
1256 Py_DECREF(item);
1257 if (err < 0)
1258 return err;
1259 if (cmp == 0)
1260 return i;
1261 }
1262
1263 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1264 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001265}
1266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267/* Operations on mappings */
1268
1269int
Fred Drake79912472000-07-09 04:06:11 +00001270PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001271{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001273}
1274
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001276PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001277{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001278 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001279
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001280 if (o == NULL) {
1281 null_error();
1282 return -1;
1283 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001284
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001285 m = o->ob_type->tp_as_mapping;
1286 if (m && m->mp_length)
1287 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001288
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001289 type_error("len() of unsized object");
1290 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001291}
1292
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001293#undef PyMapping_Length
1294int
1295PyMapping_Length(PyObject *o)
1296{
1297 return PyMapping_Size(o);
1298}
1299#define PyMapping_Length PyMapping_Size
1300
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001302PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303{
1304 PyObject *okey, *r;
1305
1306 if (key == NULL)
1307 return null_error();
1308
1309 okey = PyString_FromString(key);
1310 if (okey == NULL)
1311 return NULL;
1312 r = PyObject_GetItem(o, okey);
1313 Py_DECREF(okey);
1314 return r;
1315}
1316
1317int
Fred Drake79912472000-07-09 04:06:11 +00001318PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319{
1320 PyObject *okey;
1321 int r;
1322
1323 if (key == NULL) {
1324 null_error();
1325 return -1;
1326 }
1327
1328 okey = PyString_FromString(key);
1329 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001330 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 r = PyObject_SetItem(o, okey, value);
1332 Py_DECREF(okey);
1333 return r;
1334}
1335
1336int
Fred Drake79912472000-07-09 04:06:11 +00001337PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001338{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001339 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001340
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001341 v = PyMapping_GetItemString(o, key);
1342 if (v) {
1343 Py_DECREF(v);
1344 return 1;
1345 }
1346 PyErr_Clear();
1347 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001348}
1349
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350int
Fred Drake79912472000-07-09 04:06:11 +00001351PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001352{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001354
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001355 v = PyObject_GetItem(o, key);
1356 if (v) {
1357 Py_DECREF(v);
1358 return 1;
1359 }
1360 PyErr_Clear();
1361 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001362}
1363
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001364/* Operations on callable objects */
1365
1366/* XXX PyCallable_Check() is in object.c */
1367
Guido van Rossume15dee51995-07-18 14:12:02 +00001368PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001369PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001370{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001371 PyObject *r;
1372 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001373
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001374 if (args == NULL) {
1375 args = PyTuple_New(0);
1376 if (args == NULL)
1377 return NULL;
1378 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001379
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380 r = PyEval_CallObject(o, args);
1381
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001382 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001383 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001384 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001385
1386 return r;
1387}
Guido van Rossume15dee51995-07-18 14:12:02 +00001388
1389PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001391{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 va_list va;
1393 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001395
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 if (callable == NULL) {
1397 va_end(va);
1398 return null_error();
1399 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001400
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001401 if (format)
1402 args = Py_VaBuildValue(format, va);
1403 else
1404 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001405
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001406 va_end(va);
1407
1408 if (args == NULL)
1409 return NULL;
1410
1411 if (!PyTuple_Check(args)) {
1412 PyObject *a;
1413
1414 a = PyTuple_New(1);
1415 if (a == NULL)
1416 return NULL;
1417 if (PyTuple_SetItem(a, 0, args) < 0)
1418 return NULL;
1419 args = a;
1420 }
1421 retval = PyObject_CallObject(callable, args);
1422
1423 Py_DECREF(args);
1424
1425 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001426}
1427
1428PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001429PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001430{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001431 va_list va;
1432 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001434
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435 if (o == NULL || name == NULL) {
1436 va_end(va);
1437 return null_error();
1438 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001439
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 func = PyObject_GetAttrString(o, name);
1441 if (func == NULL) {
1442 va_end(va);
1443 PyErr_SetString(PyExc_AttributeError, name);
1444 return 0;
1445 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001446
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001447 if (!PyCallable_Check(func)) {
1448 va_end(va);
1449 return type_error("call of non-callable attribute");
1450 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001451
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001452 if (format && *format)
1453 args = Py_VaBuildValue(format, va);
1454 else
1455 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001456
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001458
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001459 if (!args)
1460 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001461
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462 if (!PyTuple_Check(args)) {
1463 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001464
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001465 a = PyTuple_New(1);
1466 if (a == NULL)
1467 return NULL;
1468 if (PyTuple_SetItem(a, 0, args) < 0)
1469 return NULL;
1470 args = a;
1471 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001472
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001473 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001474
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001475 Py_DECREF(args);
1476 Py_DECREF(func);
1477
1478 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001479}