blob: 4a64daa7ce6126a8171be3469d2d49193468e058 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Guido van Rossume15dee51995-07-18 14:12:02 +00005
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00006/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +00007
8static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +00009type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000010{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000011 PyErr_SetString(PyExc_TypeError, msg);
12 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000013}
14
Guido van Rossum052b7e11996-11-11 15:08:19 +000015static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000016null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000017{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000018 if (!PyErr_Occurred())
19 PyErr_SetString(PyExc_SystemError,
20 "null argument to internal routine");
21 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000022}
23
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024/* Operations on any object */
25
26int
Fred Drake79912472000-07-09 04:06:11 +000027PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000028{
29 int r;
30
31 if (o1 == NULL || o2 == NULL) {
32 null_error();
33 return -1;
34 }
35 r = PyObject_Compare(o1, o2);
36 if (PyErr_Occurred())
37 return -1;
38 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000039 return 0;
40}
Guido van Rossume15dee51995-07-18 14:12:02 +000041
42PyObject *
Fred Drake79912472000-07-09 04:06:11 +000043PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000044{
45 PyObject *v;
46
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000047 if (o == NULL)
48 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000049 v = (PyObject *)o->ob_type;
50 Py_INCREF(v);
51 return v;
52}
53
54int
Jeremy Hylton6253f832000-07-12 12:56:19 +000055PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000056{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000057 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000058
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000059 if (o == NULL) {
60 null_error();
61 return -1;
62 }
Guido van Rossume15dee51995-07-18 14:12:02 +000063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000064 m = o->ob_type->tp_as_sequence;
65 if (m && m->sq_length)
66 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000067
Jeremy Hylton6253f832000-07-12 12:56:19 +000068 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000069}
70
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000071#undef PyObject_Length
72int
73PyObject_Length(PyObject *o)
74{
75 return PyObject_Size(o);
76}
77#define PyObject_Length PyObject_Size
78
Guido van Rossume15dee51995-07-18 14:12:02 +000079PyObject *
Fred Drake79912472000-07-09 04:06:11 +000080PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +000081{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000082 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000083
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000084 if (o == NULL || key == NULL)
85 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000086
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000087 m = o->ob_type->tp_as_mapping;
88 if (m && m->mp_subscript)
89 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +000090
Guido van Rossum21308241998-08-13 16:44:44 +000091 if (o->ob_type->tp_as_sequence) {
92 if (PyInt_Check(key))
93 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +000094 else if (PyLong_Check(key)) {
95 long key_value = PyLong_AsLong(key);
96 if (key_value == -1 && PyErr_Occurred())
97 return NULL;
98 return PySequence_GetItem(o, key_value);
99 }
Guido van Rossum21308241998-08-13 16:44:44 +0000100 return type_error("sequence index must be integer");
101 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000102
103 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000104}
105
106int
Fred Drake79912472000-07-09 04:06:11 +0000107PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000108{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000109 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000110
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000111 if (o == NULL || key == NULL || value == NULL) {
112 null_error();
113 return -1;
114 }
115 m = o->ob_type->tp_as_mapping;
116 if (m && m->mp_ass_subscript)
117 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000118
Guido van Rossum21308241998-08-13 16:44:44 +0000119 if (o->ob_type->tp_as_sequence) {
120 if (PyInt_Check(key))
121 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000122 else if (PyLong_Check(key)) {
123 long key_value = PyLong_AsLong(key);
124 if (key_value == -1 && PyErr_Occurred())
125 return -1;
126 return PySequence_SetItem(o, key_value, value);
127 }
Guido van Rossum21308241998-08-13 16:44:44 +0000128 type_error("sequence index must be integer");
129 return -1;
130 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000131
132 type_error("object does not support item assignment");
133 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000134}
135
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000136int
Fred Drake79912472000-07-09 04:06:11 +0000137PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000138{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000140
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000141 if (o == NULL || key == NULL) {
142 null_error();
143 return -1;
144 }
145 m = o->ob_type->tp_as_mapping;
146 if (m && m->mp_ass_subscript)
147 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000148
Guido van Rossum21308241998-08-13 16:44:44 +0000149 if (o->ob_type->tp_as_sequence) {
150 if (PyInt_Check(key))
151 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000152 else if (PyLong_Check(key)) {
153 long key_value = PyLong_AsLong(key);
154 if (key_value == -1 && PyErr_Occurred())
155 return -1;
156 return PySequence_DelItem(o, key_value);
157 }
Guido van Rossum21308241998-08-13 16:44:44 +0000158 type_error("sequence index must be integer");
159 return -1;
160 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000161
162 type_error("object does not support item deletion");
163 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000164}
165
Guido van Rossum4c08d552000-03-10 22:55:18 +0000166int PyObject_AsCharBuffer(PyObject *obj,
167 const char **buffer,
168 int *buffer_len)
169{
170 PyBufferProcs *pb;
171 const char *pp;
172 int len;
173
174 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
175 null_error();
176 return -1;
177 }
178 pb = obj->ob_type->tp_as_buffer;
179 if ( pb == NULL ||
180 pb->bf_getcharbuffer == NULL ||
181 pb->bf_getsegcount == NULL ) {
182 PyErr_SetString(PyExc_TypeError,
183 "expected a character buffer object");
184 goto onError;
185 }
186 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
187 PyErr_SetString(PyExc_TypeError,
188 "expected a single-segment buffer object");
189 goto onError;
190 }
191 len = (*pb->bf_getcharbuffer)(obj,0,&pp);
192 if (len < 0)
193 goto onError;
194 *buffer = pp;
195 *buffer_len = len;
196 return 0;
197
198 onError:
199 return -1;
200}
201
202int PyObject_AsReadBuffer(PyObject *obj,
203 const void **buffer,
204 int *buffer_len)
205{
206 PyBufferProcs *pb;
207 void *pp;
208 int len;
209
210 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
211 null_error();
212 return -1;
213 }
214 pb = obj->ob_type->tp_as_buffer;
215 if ( pb == NULL ||
216 pb->bf_getreadbuffer == NULL ||
217 pb->bf_getsegcount == NULL ) {
218 PyErr_SetString(PyExc_TypeError,
219 "expected a readable buffer object");
220 goto onError;
221 }
222 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
223 PyErr_SetString(PyExc_TypeError,
224 "expected a single-segment buffer object");
225 goto onError;
226 }
227 len = (*pb->bf_getreadbuffer)(obj,0,&pp);
228 if (len < 0)
229 goto onError;
230 *buffer = pp;
231 *buffer_len = len;
232 return 0;
233
234 onError:
235 return -1;
236}
237
238int PyObject_AsWriteBuffer(PyObject *obj,
239 void **buffer,
240 int *buffer_len)
241{
242 PyBufferProcs *pb;
243 void*pp;
244 int len;
245
246 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
247 null_error();
248 return -1;
249 }
250 pb = obj->ob_type->tp_as_buffer;
251 if ( pb == NULL ||
252 pb->bf_getwritebuffer == NULL ||
253 pb->bf_getsegcount == NULL ) {
254 PyErr_SetString(PyExc_TypeError,
255 "expected a writeable buffer object");
256 goto onError;
257 }
258 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
259 PyErr_SetString(PyExc_TypeError,
260 "expected a single-segment buffer object");
261 goto onError;
262 }
263 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
264 if (len < 0)
265 goto onError;
266 *buffer = pp;
267 *buffer_len = len;
268 return 0;
269
270 onError:
271 return -1;
272}
273
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000274/* Operations on numbers */
275
276int
Fred Drake79912472000-07-09 04:06:11 +0000277PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000278{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000279 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000280}
281
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000282/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000284#define BINOP(v, w, opname, ropname, thisfunc) \
285 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000286 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
287
288PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000289PyNumber_Or(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000290{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000291 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000292 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000293 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000294 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000295 if (PyNumber_Coerce(&v, &w) != 0)
296 return NULL;
297 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
298 x = (*f)(v, w);
299 Py_DECREF(v);
300 Py_DECREF(w);
301 if (f != NULL)
302 return x;
303 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000304 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000305}
306
307PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000308PyNumber_Xor(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000309{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000310 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000311 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000312 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000313 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000314 if (PyNumber_Coerce(&v, &w) != 0)
315 return NULL;
316 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
317 x = (*f)(v, w);
318 Py_DECREF(v);
319 Py_DECREF(w);
320 if (f != NULL)
321 return x;
322 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000323 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000324}
325
326PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000327PyNumber_And(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000328{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000329 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000330 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000331 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000332 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000333 if (PyNumber_Coerce(&v, &w) != 0)
334 return NULL;
335 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
336 x = (*f)(v, w);
337 Py_DECREF(v);
338 Py_DECREF(w);
339 if (f != NULL)
340 return x;
341 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000342 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000343}
344
345PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000346PyNumber_Lshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000347{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000348 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000349 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000350 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000351 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000352 if (PyNumber_Coerce(&v, &w) != 0)
353 return NULL;
354 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
355 x = (*f)(v, w);
356 Py_DECREF(v);
357 Py_DECREF(w);
358 if (f != NULL)
359 return x;
360 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000361 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000362}
363
364PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000365PyNumber_Rshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000366{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000367 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000368 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000369 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000370 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000371 if (PyNumber_Coerce(&v, &w) != 0)
372 return NULL;
373 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
374 x = (*f)(v, w);
375 Py_DECREF(v);
376 Py_DECREF(w);
377 if (f != NULL)
378 return x;
379 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000380 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000381}
382
383PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000384PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000385{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000386 PySequenceMethods *m;
387
388 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
389 m = v->ob_type->tp_as_sequence;
390 if (m && m->sq_concat)
391 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000392 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000393 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000394 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000395 if (PyNumber_Coerce(&v, &w) != 0)
396 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000397 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
398 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000399 Py_DECREF(v);
400 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000401 if (f != NULL)
402 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000403 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000404 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000405}
406
407PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000408PyNumber_Subtract(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000409{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000410 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000411 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000412 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000413 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000414 if (PyNumber_Coerce(&v, &w) != 0)
415 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000416 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
417 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000418 Py_DECREF(v);
419 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000420 if (f != NULL)
421 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000422 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000423 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000424}
425
426PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000427PyNumber_Multiply(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000428{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000429 PyTypeObject *tp = v->ob_type;
430 PySequenceMethods *m;
431
432 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000433 if (tp->tp_as_number != NULL &&
434 w->ob_type->tp_as_sequence != NULL &&
435 !PyInstance_Check(v)) {
436 /* number*sequence -- swap v and w */
437 PyObject *tmp = v;
438 v = w;
439 w = tmp;
440 tp = v->ob_type;
441 }
442 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000443 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000444 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000445 if (PyInstance_Check(v)) {
446 /* Instances of user-defined classes get their
447 other argument uncoerced, so they may
448 implement sequence*number as well as
449 number*number. */
450 Py_INCREF(v);
451 Py_INCREF(w);
452 }
453 else if (PyNumber_Coerce(&v, &w) != 0)
454 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000455 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
456 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000457 Py_DECREF(v);
458 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000459 if (f != NULL)
460 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000461 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000462 m = tp->tp_as_sequence;
463 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000464 long mul_value;
465
466 if (PyInt_Check(w)) {
467 mul_value = PyInt_AsLong(w);
468 }
469 else if (PyLong_Check(w)) {
470 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000471 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000472 return NULL;
473 }
474 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000475 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000476 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000477 }
478 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000479 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000480 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000481}
482
483PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000484PyNumber_Divide(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000485{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000486 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000487 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000488 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000489 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000490 if (PyNumber_Coerce(&v, &w) != 0)
491 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000492 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
493 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000494 Py_DECREF(v);
495 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000496 if (f != NULL)
497 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000498 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000499 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000500}
501
502PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000503PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000504{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000505 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000506 return PyString_Format(v, w);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000507 else if (PyUnicode_Check(v))
508 return PyUnicode_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000509 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000510 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000511 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000512 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000513 if (PyNumber_Coerce(&v, &w) != 0)
514 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000515 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
516 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000517 Py_DECREF(v);
518 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000519 if (f != NULL)
520 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000521 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000522 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000523}
524
525PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000526PyNumber_Divmod(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000527{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000528 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
529 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000530 PyObject *x = NULL;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000531 PyObject * (*f)(PyObject *, PyObject *);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000532 if (PyNumber_Coerce(&v, &w) != 0)
533 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000534 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
535 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000536 Py_DECREF(v);
537 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000538 if (f != NULL)
539 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000540 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000541 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000542}
543
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000544/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000545
546static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000547do_pow(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000548{
549 PyObject *res;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000550 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000551 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000552 if (v->ob_type->tp_as_number == NULL ||
553 w->ob_type->tp_as_number == NULL) {
554 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000555 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000556 return NULL;
557 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000558 if (PyNumber_Coerce(&v, &w) != 0)
559 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000560 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
561 res = (*f)(v, w, Py_None);
562 else
563 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000564 Py_DECREF(v);
565 Py_DECREF(w);
566 return res;
567}
568
569PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000570PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000571{
572 PyObject *res;
573 PyObject *v1, *z1, *w2, *z2;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000574 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000575
576 if (z == Py_None)
577 return do_pow(v, w);
578 /* XXX The ternary version doesn't do class instance coercions */
579 if (PyInstance_Check(v))
580 return v->ob_type->tp_as_number->nb_power(v, w, z);
581 if (v->ob_type->tp_as_number == NULL ||
582 z->ob_type->tp_as_number == NULL ||
583 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000584 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000585 }
586 if (PyNumber_Coerce(&v, &w) != 0)
587 return NULL;
588 res = NULL;
589 v1 = v;
590 z1 = z;
591 if (PyNumber_Coerce(&v1, &z1) != 0)
592 goto error2;
593 w2 = w;
594 z2 = z1;
595 if (PyNumber_Coerce(&w2, &z2) != 0)
596 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000597 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
598 res = (*f)(v1, w2, z2);
599 else
600 res = type_error(
601 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000602 Py_DECREF(w2);
603 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000604 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000605 Py_DECREF(v1);
606 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000607 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000608 Py_DECREF(v);
609 Py_DECREF(w);
610 return res;
611}
612
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000613/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000614
615PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000616PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000617{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000618 PyNumberMethods *m;
619
620 if (o == NULL)
621 return null_error();
622 m = o->ob_type->tp_as_number;
623 if (m && m->nb_negative)
624 return (*m->nb_negative)(o);
625
626 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000627}
628
629PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000630PyNumber_Positive(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_positive)
638 return (*m->nb_positive)(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_Invert(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_invert)
652 return (*m->nb_invert)(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_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000659{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000660 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000661
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000662 if (o == NULL)
663 return null_error();
664 m = o->ob_type->tp_as_number;
665 if (m && m->nb_absolute)
666 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000667
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000668 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000669}
670
Guido van Rossum9e896b32000-04-05 20:11:21 +0000671/* Add a check for embedded NULL-bytes in the argument. */
672static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000673int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000674{
675 char *end;
676 PyObject *x;
677
678 x = PyInt_FromString((char*)s, &end, 10);
679 if (x == NULL)
680 return NULL;
681 if (end != s + len) {
682 PyErr_SetString(PyExc_ValueError,
683 "null byte in argument for int()");
684 Py_DECREF(x);
685 return NULL;
686 }
687 return x;
688}
689
Guido van Rossume15dee51995-07-18 14:12:02 +0000690PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000691PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000692{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000693 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000694 const char *buffer;
695 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000696
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000697 if (o == NULL)
698 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000699 if (PyInt_Check(o)) {
700 Py_INCREF(o);
701 return o;
702 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000703 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000704 return int_from_string(PyString_AS_STRING(o),
705 PyString_GET_SIZE(o));
706 if (PyUnicode_Check(o))
707 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
708 PyUnicode_GET_SIZE(o),
709 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000710 m = o->ob_type->tp_as_number;
711 if (m && m->nb_int)
712 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000713 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000714 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000715
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000716 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000717}
718
Guido van Rossum9e896b32000-04-05 20:11:21 +0000719/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000720static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000721long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000722{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000723 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000724 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000725
Guido van Rossum4c08d552000-03-10 22:55:18 +0000726 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000727 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000728 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000729 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000730 PyErr_SetString(PyExc_ValueError,
731 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000732 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000733 return NULL;
734 }
735 return x;
736}
737
Guido van Rossume15dee51995-07-18 14:12:02 +0000738PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000739PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000740{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000741 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000742 const char *buffer;
743 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000744
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000745 if (o == NULL)
746 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000747 if (PyLong_Check(o)) {
748 Py_INCREF(o);
749 return o;
750 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000751 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000752 /* need to do extra error checking that PyLong_FromString()
753 * doesn't do. In particular long('9.5') must raise an
754 * exception, not truncate the float.
755 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000756 return long_from_string(PyString_AS_STRING(o),
757 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000758 if (PyUnicode_Check(o))
759 /* The above check is done in PyLong_FromUnicode(). */
760 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
761 PyUnicode_GET_SIZE(o),
762 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000763 m = o->ob_type->tp_as_number;
764 if (m && m->nb_long)
765 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000766 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
767 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000769 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000770}
771
772PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000773PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000774{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000775 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000776
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000777 if (o == NULL)
778 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000779 if (PyFloat_Check(o)) {
780 Py_INCREF(o);
781 return o;
782 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000783 if (!PyString_Check(o)) {
784 m = o->ob_type->tp_as_number;
785 if (m && m->nb_float)
786 return m->nb_float(o);
787 }
788 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000789}
790
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000791/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000792
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000793int
Fred Drake79912472000-07-09 04:06:11 +0000794PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000795{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000796 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000797}
798
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000799int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000800PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000801{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000802 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000803
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000804 if (s == NULL) {
805 null_error();
806 return -1;
807 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000808
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000809 m = s->ob_type->tp_as_sequence;
810 if (m && m->sq_length)
811 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000812
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000813 type_error("len() of unsized object");
814 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000815}
816
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000817#undef PySequence_Length
818int
819PySequence_Length(PyObject *s)
820{
821 return PySequence_Size(s);
822}
823#define PySequence_Length PySequence_Size
824
Guido van Rossume15dee51995-07-18 14:12:02 +0000825PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000826PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000827{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000828 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000830 if (s == NULL || o == NULL)
831 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000832
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000833 m = s->ob_type->tp_as_sequence;
834 if (m && m->sq_concat)
835 return m->sq_concat(s, o);
836
837 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000838}
839
840PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000841PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000842{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000843 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000844
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000845 if (o == NULL)
846 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000847
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 m = o->ob_type->tp_as_sequence;
849 if (m && m->sq_repeat)
850 return m->sq_repeat(o, count);
851
852 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000853}
854
855PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000856PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +0000857{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000859
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000860 if (s == NULL)
861 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000862
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863 m = s->ob_type->tp_as_sequence;
864 if (m && m->sq_item) {
865 if (i < 0) {
866 if (m->sq_length) {
867 int l = (*m->sq_length)(s);
868 if (l < 0)
869 return NULL;
870 i += l;
871 }
872 }
873 return m->sq_item(s, i);
874 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000875
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000876 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000877}
878
879PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000880PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +0000881{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000882 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000883
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000884 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000885
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000886 m = s->ob_type->tp_as_sequence;
887 if (m && m->sq_slice) {
888 if (i1 < 0 || i2 < 0) {
889 if (m->sq_length) {
890 int l = (*m->sq_length)(s);
891 if (l < 0)
892 return NULL;
893 if (i1 < 0)
894 i1 += l;
895 if (i2 < 0)
896 i2 += l;
897 }
898 }
899 return m->sq_slice(s, i1, i2);
900 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000901
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000902 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000903}
904
905int
Fred Drake79912472000-07-09 04:06:11 +0000906PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000907{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000909
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000910 if (s == NULL) {
911 null_error();
912 return -1;
913 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000914
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000915 m = s->ob_type->tp_as_sequence;
916 if (m && m->sq_ass_item) {
917 if (i < 0) {
918 if (m->sq_length) {
919 int l = (*m->sq_length)(s);
920 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000921 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000922 i += l;
923 }
924 }
925 return m->sq_ass_item(s, i, o);
926 }
927
928 type_error("object doesn't support item assignment");
929 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000930}
931
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000932int
Fred Drake79912472000-07-09 04:06:11 +0000933PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000934{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000936
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000937 if (s == NULL) {
938 null_error();
939 return -1;
940 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000941
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000942 m = s->ob_type->tp_as_sequence;
943 if (m && m->sq_ass_item) {
944 if (i < 0) {
945 if (m->sq_length) {
946 int l = (*m->sq_length)(s);
947 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000948 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000949 i += l;
950 }
951 }
952 return m->sq_ass_item(s, i, (PyObject *)NULL);
953 }
954
955 type_error("object doesn't support item deletion");
956 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000957}
958
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000959int
Fred Drake79912472000-07-09 04:06:11 +0000960PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000961{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000962 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000963
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000964 if (s == NULL) {
965 null_error();
966 return -1;
967 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000968
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000969 m = s->ob_type->tp_as_sequence;
970 if (m && m->sq_ass_slice) {
971 if (i1 < 0 || i2 < 0) {
972 if (m->sq_length) {
973 int l = (*m->sq_length)(s);
974 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000975 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000976 if (i1 < 0)
977 i1 += l;
978 if (i2 < 0)
979 i2 += l;
980 }
981 }
982 return m->sq_ass_slice(s, i1, i2, o);
983 }
984 type_error("object doesn't support slice assignment");
985 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000986}
987
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000988int
Fred Drake79912472000-07-09 04:06:11 +0000989PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000990{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000991 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000992
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000993 if (s == NULL) {
994 null_error();
995 return -1;
996 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000997
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998 m = s->ob_type->tp_as_sequence;
999 if (m && m->sq_ass_slice) {
1000 if (i1 < 0 || i2 < 0) {
1001 if (m->sq_length) {
1002 int l = (*m->sq_length)(s);
1003 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001004 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001005 if (i1 < 0)
1006 i1 += l;
1007 if (i2 < 0)
1008 i2 += l;
1009 }
1010 }
1011 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1012 }
1013 type_error("object doesn't support slice deletion");
1014 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001015}
1016
Guido van Rossume15dee51995-07-18 14:12:02 +00001017PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001018PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001019{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001020 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001021
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 if (v == NULL)
1023 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001024
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025 if (PyTuple_Check(v)) {
1026 Py_INCREF(v);
1027 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001028 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001029
1030 if (PyList_Check(v))
1031 return PyList_AsTuple(v);
1032
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001033 /* There used to be code for strings here, but tuplifying strings is
1034 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001035
1036 /* Generic sequence object */
1037 m = v->ob_type->tp_as_sequence;
1038 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 int i;
1040 PyObject *t;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001041 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001042 if (n < 0)
1043 return NULL;
1044 t = PyTuple_New(n);
1045 if (t == NULL)
1046 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001047 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001048 PyObject *item = (*m->sq_item)(v, i);
1049 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001050 if (PyErr_ExceptionMatches(PyExc_IndexError))
1051 PyErr_Clear();
1052 else {
1053 Py_DECREF(t);
1054 t = NULL;
1055 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056 break;
1057 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001058 if (i >= n) {
1059 if (n < 500)
1060 n += 10;
1061 else
1062 n += 100;
1063 if (_PyTuple_Resize(&t, n, 0) != 0)
1064 break;
1065 }
1066 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001068 if (i < n && t != NULL)
1069 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001070 return t;
1071 }
1072
1073 /* None of the above */
1074 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001075}
1076
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001077PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001078PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001079{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001080 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001081
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001082 if (v == NULL)
1083 return null_error();
1084
1085 if (PyList_Check(v))
1086 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1087
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001088 m = v->ob_type->tp_as_sequence;
1089 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001090 int i;
1091 PyObject *l;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001092 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001093 if (n < 0)
1094 return NULL;
1095 l = PyList_New(n);
1096 if (l == NULL)
1097 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001098 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 PyObject *item = (*m->sq_item)(v, i);
1100 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001101 if (PyErr_ExceptionMatches(PyExc_IndexError))
1102 PyErr_Clear();
1103 else {
1104 Py_DECREF(l);
1105 l = NULL;
1106 }
1107 break;
1108 }
1109 if (i < n)
1110 PyList_SET_ITEM(l, i, item);
1111 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001112 Py_DECREF(l);
1113 l = NULL;
1114 break;
1115 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001116 }
1117 if (i < n && l != NULL) {
1118 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1119 Py_DECREF(l);
1120 l = NULL;
1121 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001122 }
1123 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001124 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001125 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001126}
1127
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001128PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001129PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001130{
1131 if (v == NULL)
1132 return null_error();
1133
1134 if (PyList_Check(v) || PyTuple_Check(v)) {
1135 Py_INCREF(v);
1136 return v;
1137 }
1138
1139 v = PySequence_Tuple(v);
1140 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1141 return type_error(m);
1142
1143 return v;
1144}
1145
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001146int
Fred Drake79912472000-07-09 04:06:11 +00001147PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001148{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 int l, i, n, cmp, err;
1150 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001151
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152 if (s == NULL || o == NULL) {
1153 null_error();
1154 return -1;
1155 }
1156
Jeremy Hylton6253f832000-07-12 12:56:19 +00001157 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 if (l < 0)
1159 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001161 n = 0;
1162 for (i = 0; i < l; i++) {
1163 item = PySequence_GetItem(s, i);
1164 if (item == NULL)
1165 return -1;
1166 err = PyObject_Cmp(item, o, &cmp);
1167 Py_DECREF(item);
1168 if (err < 0)
1169 return err;
1170 if (cmp == 0)
1171 n++;
1172 }
1173 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001174}
1175
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001176int
Fred Drake79912472000-07-09 04:06:11 +00001177PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001178{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001179 int i, cmp;
1180 PyObject *x;
1181 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001182
Guido van Rossum46c6b202000-02-28 15:01:46 +00001183 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1184 sq = w->ob_type->tp_as_sequence;
1185 if(sq != NULL && sq->sq_contains != NULL)
1186 return (*sq->sq_contains)(w, v);
1187 }
1188
1189 /* If there is no better way to check whether an item is is contained,
1190 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001191 sq = w->ob_type->tp_as_sequence;
1192 if (sq == NULL || sq->sq_item == NULL) {
1193 PyErr_SetString(PyExc_TypeError,
1194 "'in' or 'not in' needs sequence right argument");
1195 return -1;
1196 }
1197
1198 for (i = 0; ; i++) {
1199 x = (*sq->sq_item)(w, i);
1200 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001201 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 PyErr_Clear();
1203 break;
1204 }
1205 return -1;
1206 }
1207 cmp = PyObject_Compare(v, x);
1208 Py_XDECREF(x);
1209 if (cmp == 0)
1210 return 1;
1211 if (PyErr_Occurred())
1212 return -1;
1213 }
1214
1215 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001216}
1217
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218/* Backwards compatibility */
1219#undef PySequence_In
1220int
Fred Drake79912472000-07-09 04:06:11 +00001221PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222{
1223 return PySequence_Contains(w, v);
1224}
1225
1226int
Fred Drake79912472000-07-09 04:06:11 +00001227PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001228{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001229 int l, i, cmp, err;
1230 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 if (s == NULL || o == NULL) {
1233 null_error();
1234 return -1;
1235 }
1236
Jeremy Hylton6253f832000-07-12 12:56:19 +00001237 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 if (l < 0)
1239 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001240
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241 for (i = 0; i < l; i++) {
1242 item = PySequence_GetItem(s, i);
1243 if (item == NULL)
1244 return -1;
1245 err = PyObject_Cmp(item, o, &cmp);
1246 Py_DECREF(item);
1247 if (err < 0)
1248 return err;
1249 if (cmp == 0)
1250 return i;
1251 }
1252
1253 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1254 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001255}
1256
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257/* Operations on mappings */
1258
1259int
Fred Drake79912472000-07-09 04:06:11 +00001260PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001261{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001263}
1264
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001266PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001267{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001268 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001269
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001270 if (o == NULL) {
1271 null_error();
1272 return -1;
1273 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001274
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275 m = o->ob_type->tp_as_mapping;
1276 if (m && m->mp_length)
1277 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001278
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279 type_error("len() of unsized object");
1280 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001281}
1282
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001283#undef PyMapping_Length
1284int
1285PyMapping_Length(PyObject *o)
1286{
1287 return PyMapping_Size(o);
1288}
1289#define PyMapping_Length PyMapping_Size
1290
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001292PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001293{
1294 PyObject *okey, *r;
1295
1296 if (key == NULL)
1297 return null_error();
1298
1299 okey = PyString_FromString(key);
1300 if (okey == NULL)
1301 return NULL;
1302 r = PyObject_GetItem(o, okey);
1303 Py_DECREF(okey);
1304 return r;
1305}
1306
1307int
Fred Drake79912472000-07-09 04:06:11 +00001308PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309{
1310 PyObject *okey;
1311 int r;
1312
1313 if (key == NULL) {
1314 null_error();
1315 return -1;
1316 }
1317
1318 okey = PyString_FromString(key);
1319 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001320 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321 r = PyObject_SetItem(o, okey, value);
1322 Py_DECREF(okey);
1323 return r;
1324}
1325
1326int
Fred Drake79912472000-07-09 04:06:11 +00001327PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001328{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001329 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 v = PyMapping_GetItemString(o, key);
1332 if (v) {
1333 Py_DECREF(v);
1334 return 1;
1335 }
1336 PyErr_Clear();
1337 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001338}
1339
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001340int
Fred Drake79912472000-07-09 04:06:11 +00001341PyMapping_HasKey(PyObject *o, PyObject *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 = PyObject_GetItem(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 +00001354/* Operations on callable objects */
1355
1356/* XXX PyCallable_Check() is in object.c */
1357
Guido van Rossume15dee51995-07-18 14:12:02 +00001358PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001359PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001360{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001361 PyObject *r;
1362 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001363
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001364 if (args == NULL) {
1365 args = PyTuple_New(0);
1366 if (args == NULL)
1367 return NULL;
1368 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001369
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001370 r = PyEval_CallObject(o, args);
1371
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001372 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001374 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375
1376 return r;
1377}
Guido van Rossume15dee51995-07-18 14:12:02 +00001378
1379PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001381{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001382 va_list va;
1383 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001385
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001386 if (callable == NULL) {
1387 va_end(va);
1388 return null_error();
1389 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001390
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391 if (format)
1392 args = Py_VaBuildValue(format, va);
1393 else
1394 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001395
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 va_end(va);
1397
1398 if (args == NULL)
1399 return NULL;
1400
1401 if (!PyTuple_Check(args)) {
1402 PyObject *a;
1403
1404 a = PyTuple_New(1);
1405 if (a == NULL)
1406 return NULL;
1407 if (PyTuple_SetItem(a, 0, args) < 0)
1408 return NULL;
1409 args = a;
1410 }
1411 retval = PyObject_CallObject(callable, args);
1412
1413 Py_DECREF(args);
1414
1415 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001416}
1417
1418PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001419PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001420{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001421 va_list va;
1422 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001424
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 if (o == NULL || name == NULL) {
1426 va_end(va);
1427 return null_error();
1428 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001429
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001430 func = PyObject_GetAttrString(o, name);
1431 if (func == NULL) {
1432 va_end(va);
1433 PyErr_SetString(PyExc_AttributeError, name);
1434 return 0;
1435 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001436
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 if (!PyCallable_Check(func)) {
1438 va_end(va);
1439 return type_error("call of non-callable attribute");
1440 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001441
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 if (format && *format)
1443 args = Py_VaBuildValue(format, va);
1444 else
1445 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001446
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001447 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001448
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001449 if (!args)
1450 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001451
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001452 if (!PyTuple_Check(args)) {
1453 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001454
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 a = PyTuple_New(1);
1456 if (a == NULL)
1457 return NULL;
1458 if (PyTuple_SetItem(a, 0, args) < 0)
1459 return NULL;
1460 args = a;
1461 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001462
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001463 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001464
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001465 Py_DECREF(args);
1466 Py_DECREF(func);
1467
1468 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001469}