blob: 8044d86218eb45e092665ca236713ddaa2a40f7b [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
Thomas Wouters1d75a792000-08-17 22:37:32 +0000879static PyObject *
880sliceobj_from_intint(int i, int j)
881{
882 PyObject *start, *end, *slice;
883 start = PyInt_FromLong((long)i);
884 if (!start)
885 return NULL;
886 end = PyInt_FromLong((long)j);
887 if (!end) {
888 Py_DECREF(start);
889 return NULL;
890 }
891 slice = PySlice_New(start, end, NULL);
892 Py_DECREF(start);
893 Py_DECREF(end);
894 return slice;
895}
896
Guido van Rossume15dee51995-07-18 14:12:02 +0000897PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000898PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +0000899{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000900 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +0000901 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +0000902
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000903 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000904
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905 m = s->ob_type->tp_as_sequence;
906 if (m && m->sq_slice) {
907 if (i1 < 0 || i2 < 0) {
908 if (m->sq_length) {
909 int l = (*m->sq_length)(s);
910 if (l < 0)
911 return NULL;
912 if (i1 < 0)
913 i1 += l;
914 if (i2 < 0)
915 i2 += l;
916 }
917 }
918 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +0000919 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
920 PyObject *res;
921 PyObject *slice = sliceobj_from_intint(i1, i2);
922 if (!slice)
923 return NULL;
924 res = mp->mp_subscript(s, slice);
925 Py_DECREF(slice);
926 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000927 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000928
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000929 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000930}
931
932int
Fred Drake79912472000-07-09 04:06:11 +0000933PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000934{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000936
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000937 if (s == NULL) {
938 null_error();
939 return -1;
940 }
Guido van Rossume15dee51995-07-18 14:12:02 +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, o);
953 }
954
955 type_error("object doesn't support item assignment");
956 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000957}
958
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000959int
Fred Drake79912472000-07-09 04:06:11 +0000960PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000961{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000962 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000963
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000964 if (s == NULL) {
965 null_error();
966 return -1;
967 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000968
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000969 m = s->ob_type->tp_as_sequence;
970 if (m && m->sq_ass_item) {
971 if (i < 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 i += l;
977 }
978 }
979 return m->sq_ass_item(s, i, (PyObject *)NULL);
980 }
981
982 type_error("object doesn't support item deletion");
983 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000984}
985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986int
Fred Drake79912472000-07-09 04:06:11 +0000987PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000988{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000989 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +0000990 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +0000991
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992 if (s == NULL) {
993 null_error();
994 return -1;
995 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000996
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000997 m = s->ob_type->tp_as_sequence;
998 if (m && m->sq_ass_slice) {
999 if (i1 < 0 || i2 < 0) {
1000 if (m->sq_length) {
1001 int l = (*m->sq_length)(s);
1002 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001003 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001004 if (i1 < 0)
1005 i1 += l;
1006 if (i2 < 0)
1007 i2 += l;
1008 }
1009 }
1010 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001011 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1012 int res;
1013 PyObject *slice = sliceobj_from_intint(i1, i2);
1014 if (!slice)
1015 return -1;
1016 res = mp->mp_ass_subscript(s, slice, o);
1017 Py_DECREF(slice);
1018 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001020
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001021 type_error("object doesn't support slice assignment");
1022 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001023}
1024
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025int
Fred Drake79912472000-07-09 04:06:11 +00001026PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001027{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001028 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001029
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001030 if (s == NULL) {
1031 null_error();
1032 return -1;
1033 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001034
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001035 m = s->ob_type->tp_as_sequence;
1036 if (m && m->sq_ass_slice) {
1037 if (i1 < 0 || i2 < 0) {
1038 if (m->sq_length) {
1039 int l = (*m->sq_length)(s);
1040 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001041 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001042 if (i1 < 0)
1043 i1 += l;
1044 if (i2 < 0)
1045 i2 += l;
1046 }
1047 }
1048 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1049 }
1050 type_error("object doesn't support slice deletion");
1051 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001052}
1053
Guido van Rossume15dee51995-07-18 14:12:02 +00001054PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001055PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001056{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001057 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001058
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001059 if (v == NULL)
1060 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001061
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001062 if (PyTuple_Check(v)) {
1063 Py_INCREF(v);
1064 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001065 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066
1067 if (PyList_Check(v))
1068 return PyList_AsTuple(v);
1069
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001070 /* There used to be code for strings here, but tuplifying strings is
1071 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001072
1073 /* Generic sequence object */
1074 m = v->ob_type->tp_as_sequence;
1075 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001076 int i;
1077 PyObject *t;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001078 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001079 if (n < 0)
1080 return NULL;
1081 t = PyTuple_New(n);
1082 if (t == NULL)
1083 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001084 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085 PyObject *item = (*m->sq_item)(v, i);
1086 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001087 if (PyErr_ExceptionMatches(PyExc_IndexError))
1088 PyErr_Clear();
1089 else {
1090 Py_DECREF(t);
1091 t = NULL;
1092 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001093 break;
1094 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001095 if (i >= n) {
1096 if (n < 500)
1097 n += 10;
1098 else
1099 n += 100;
1100 if (_PyTuple_Resize(&t, n, 0) != 0)
1101 break;
1102 }
1103 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001105 if (i < n && t != NULL)
1106 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001107 return t;
1108 }
1109
1110 /* None of the above */
1111 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001112}
1113
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001114PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001115PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001116{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001117 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001118
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001119 if (v == NULL)
1120 return null_error();
1121
1122 if (PyList_Check(v))
1123 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1124
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001125 m = v->ob_type->tp_as_sequence;
1126 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001127 int i;
1128 PyObject *l;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001129 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 if (n < 0)
1131 return NULL;
1132 l = PyList_New(n);
1133 if (l == NULL)
1134 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001135 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001136 PyObject *item = (*m->sq_item)(v, i);
1137 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001138 if (PyErr_ExceptionMatches(PyExc_IndexError))
1139 PyErr_Clear();
1140 else {
1141 Py_DECREF(l);
1142 l = NULL;
1143 }
1144 break;
1145 }
1146 if (i < n)
1147 PyList_SET_ITEM(l, i, item);
1148 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 Py_DECREF(l);
1150 l = NULL;
1151 break;
1152 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001153 }
1154 if (i < n && l != NULL) {
1155 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1156 Py_DECREF(l);
1157 l = NULL;
1158 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159 }
1160 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001161 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001163}
1164
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001165PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001166PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001167{
1168 if (v == NULL)
1169 return null_error();
1170
1171 if (PyList_Check(v) || PyTuple_Check(v)) {
1172 Py_INCREF(v);
1173 return v;
1174 }
1175
1176 v = PySequence_Tuple(v);
1177 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1178 return type_error(m);
1179
1180 return v;
1181}
1182
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001183int
Fred Drake79912472000-07-09 04:06:11 +00001184PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001185{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001186 int l, i, n, cmp, err;
1187 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001188
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 if (s == NULL || o == NULL) {
1190 null_error();
1191 return -1;
1192 }
1193
Jeremy Hylton6253f832000-07-12 12:56:19 +00001194 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195 if (l < 0)
1196 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001197
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198 n = 0;
1199 for (i = 0; i < l; i++) {
1200 item = PySequence_GetItem(s, i);
1201 if (item == NULL)
1202 return -1;
1203 err = PyObject_Cmp(item, o, &cmp);
1204 Py_DECREF(item);
1205 if (err < 0)
1206 return err;
1207 if (cmp == 0)
1208 n++;
1209 }
1210 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001211}
1212
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001213int
Fred Drake79912472000-07-09 04:06:11 +00001214PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001215{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001216 int i, cmp;
1217 PyObject *x;
1218 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001219
Guido van Rossum46c6b202000-02-28 15:01:46 +00001220 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1221 sq = w->ob_type->tp_as_sequence;
1222 if(sq != NULL && sq->sq_contains != NULL)
1223 return (*sq->sq_contains)(w, v);
1224 }
1225
1226 /* If there is no better way to check whether an item is is contained,
1227 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001228 sq = w->ob_type->tp_as_sequence;
1229 if (sq == NULL || sq->sq_item == NULL) {
1230 PyErr_SetString(PyExc_TypeError,
1231 "'in' or 'not in' needs sequence right argument");
1232 return -1;
1233 }
1234
1235 for (i = 0; ; i++) {
1236 x = (*sq->sq_item)(w, i);
1237 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001238 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001239 PyErr_Clear();
1240 break;
1241 }
1242 return -1;
1243 }
1244 cmp = PyObject_Compare(v, x);
1245 Py_XDECREF(x);
1246 if (cmp == 0)
1247 return 1;
1248 if (PyErr_Occurred())
1249 return -1;
1250 }
1251
1252 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001253}
1254
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255/* Backwards compatibility */
1256#undef PySequence_In
1257int
Fred Drake79912472000-07-09 04:06:11 +00001258PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259{
1260 return PySequence_Contains(w, v);
1261}
1262
1263int
Fred Drake79912472000-07-09 04:06:11 +00001264PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001265{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001266 int l, i, cmp, err;
1267 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001268
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001269 if (s == NULL || o == NULL) {
1270 null_error();
1271 return -1;
1272 }
1273
Jeremy Hylton6253f832000-07-12 12:56:19 +00001274 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275 if (l < 0)
1276 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001277
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001278 for (i = 0; i < l; i++) {
1279 item = PySequence_GetItem(s, i);
1280 if (item == NULL)
1281 return -1;
1282 err = PyObject_Cmp(item, o, &cmp);
1283 Py_DECREF(item);
1284 if (err < 0)
1285 return err;
1286 if (cmp == 0)
1287 return i;
1288 }
1289
1290 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1291 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001292}
1293
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001294/* Operations on mappings */
1295
1296int
Fred Drake79912472000-07-09 04:06:11 +00001297PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001298{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001300}
1301
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001303PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001304{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001305 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001306
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 if (o == NULL) {
1308 null_error();
1309 return -1;
1310 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001311
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 m = o->ob_type->tp_as_mapping;
1313 if (m && m->mp_length)
1314 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001315
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 type_error("len() of unsized object");
1317 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001318}
1319
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001320#undef PyMapping_Length
1321int
1322PyMapping_Length(PyObject *o)
1323{
1324 return PyMapping_Size(o);
1325}
1326#define PyMapping_Length PyMapping_Size
1327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001329PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330{
1331 PyObject *okey, *r;
1332
1333 if (key == NULL)
1334 return null_error();
1335
1336 okey = PyString_FromString(key);
1337 if (okey == NULL)
1338 return NULL;
1339 r = PyObject_GetItem(o, okey);
1340 Py_DECREF(okey);
1341 return r;
1342}
1343
1344int
Fred Drake79912472000-07-09 04:06:11 +00001345PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001346{
1347 PyObject *okey;
1348 int r;
1349
1350 if (key == NULL) {
1351 null_error();
1352 return -1;
1353 }
1354
1355 okey = PyString_FromString(key);
1356 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001357 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001358 r = PyObject_SetItem(o, okey, value);
1359 Py_DECREF(okey);
1360 return r;
1361}
1362
1363int
Fred Drake79912472000-07-09 04:06:11 +00001364PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001365{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001366 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001367
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001368 v = PyMapping_GetItemString(o, key);
1369 if (v) {
1370 Py_DECREF(v);
1371 return 1;
1372 }
1373 PyErr_Clear();
1374 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001375}
1376
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001377int
Fred Drake79912472000-07-09 04:06:11 +00001378PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001379{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001381
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001382 v = PyObject_GetItem(o, key);
1383 if (v) {
1384 Py_DECREF(v);
1385 return 1;
1386 }
1387 PyErr_Clear();
1388 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001389}
1390
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001391/* Operations on callable objects */
1392
1393/* XXX PyCallable_Check() is in object.c */
1394
Guido van Rossume15dee51995-07-18 14:12:02 +00001395PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001396PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001397{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001398 PyObject *r;
1399 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001400
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001401 if (args == NULL) {
1402 args = PyTuple_New(0);
1403 if (args == NULL)
1404 return NULL;
1405 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001406
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001407 r = PyEval_CallObject(o, args);
1408
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001409 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001410 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001411 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001412
1413 return r;
1414}
Guido van Rossume15dee51995-07-18 14:12:02 +00001415
1416PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001417PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001418{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001419 va_list va;
1420 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001421 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001422
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 if (callable == NULL) {
1424 va_end(va);
1425 return null_error();
1426 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001427
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428 if (format)
1429 args = Py_VaBuildValue(format, va);
1430 else
1431 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001432
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 va_end(va);
1434
1435 if (args == NULL)
1436 return NULL;
1437
1438 if (!PyTuple_Check(args)) {
1439 PyObject *a;
1440
1441 a = PyTuple_New(1);
1442 if (a == NULL)
1443 return NULL;
1444 if (PyTuple_SetItem(a, 0, args) < 0)
1445 return NULL;
1446 args = a;
1447 }
1448 retval = PyObject_CallObject(callable, args);
1449
1450 Py_DECREF(args);
1451
1452 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001453}
1454
1455PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001456PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001457{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001458 va_list va;
1459 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001461
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462 if (o == NULL || name == NULL) {
1463 va_end(va);
1464 return null_error();
1465 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001466
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 func = PyObject_GetAttrString(o, name);
1468 if (func == NULL) {
1469 va_end(va);
1470 PyErr_SetString(PyExc_AttributeError, name);
1471 return 0;
1472 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001473
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 if (!PyCallable_Check(func)) {
1475 va_end(va);
1476 return type_error("call of non-callable attribute");
1477 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001478
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001479 if (format && *format)
1480 args = Py_VaBuildValue(format, va);
1481 else
1482 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001483
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001485
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001486 if (!args)
1487 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001488
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001489 if (!PyTuple_Check(args)) {
1490 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001491
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001492 a = PyTuple_New(1);
1493 if (a == NULL)
1494 return NULL;
1495 if (PyTuple_SetItem(a, 0, args) < 0)
1496 return NULL;
1497 args = a;
1498 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001499
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001500 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001501
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001502 Py_DECREF(args);
1503 Py_DECREF(func);
1504
1505 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001506}