blob: 48604f3fdfa4dfb4cf766a7292b09ba2281ce15e [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;
Thomas Wouterse266e422000-08-23 23:31:34 +0000294 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000295 if (PyNumber_Coerce(&v, &w) != 0)
296 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000297 if (v->ob_type->tp_as_number != NULL &&
298 (f = v->ob_type->tp_as_number->nb_or) != NULL)
Guido van Rossume15dee51995-07-18 14:12:02 +0000299 x = (*f)(v, w);
300 Py_DECREF(v);
301 Py_DECREF(w);
302 if (f != NULL)
303 return x;
304 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000305 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000306}
307
308PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000309PyNumber_Xor(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000310{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000311 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000312 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000313 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000314 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000315 if (PyNumber_Coerce(&v, &w) != 0)
316 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000317 if (v->ob_type->tp_as_number != NULL &&
318 (f = v->ob_type->tp_as_number->nb_xor) != NULL)
Guido van Rossume15dee51995-07-18 14:12:02 +0000319 x = (*f)(v, w);
320 Py_DECREF(v);
321 Py_DECREF(w);
322 if (f != NULL)
323 return x;
324 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000325 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000326}
327
328PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000329PyNumber_And(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000330{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000331 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000332 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000333 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000334 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000335 if (PyNumber_Coerce(&v, &w) != 0)
336 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000337 if (v->ob_type->tp_as_number != NULL &&
338 (f = v->ob_type->tp_as_number->nb_and) != NULL)
Guido van Rossume15dee51995-07-18 14:12:02 +0000339 x = (*f)(v, w);
340 Py_DECREF(v);
341 Py_DECREF(w);
342 if (f != NULL)
343 return x;
344 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000345 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000346}
347
348PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000349PyNumber_Lshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000350{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000351 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000352 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000353 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000354 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000355 if (PyNumber_Coerce(&v, &w) != 0)
356 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000357 if (v->ob_type->tp_as_number != NULL &&
358 (f = v->ob_type->tp_as_number->nb_lshift) != NULL)
Guido van Rossume15dee51995-07-18 14:12:02 +0000359 x = (*f)(v, w);
360 Py_DECREF(v);
361 Py_DECREF(w);
362 if (f != NULL)
363 return x;
364 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000365 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000366}
367
368PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000369PyNumber_Rshift(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000370{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000371 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000372 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000373 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000374 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000375 if (PyNumber_Coerce(&v, &w) != 0)
376 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000377 if (v->ob_type->tp_as_number != NULL &&
378 (f = v->ob_type->tp_as_number->nb_rshift) != NULL)
Guido van Rossume15dee51995-07-18 14:12:02 +0000379 x = (*f)(v, w);
380 Py_DECREF(v);
381 Py_DECREF(w);
382 if (f != NULL)
383 return x;
384 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000385 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000386}
387
388PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000389PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000390{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000391 PySequenceMethods *m;
392
393 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
394 m = v->ob_type->tp_as_sequence;
395 if (m && m->sq_concat)
396 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000397 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000398 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000399 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000400 if (PyNumber_Coerce(&v, &w) != 0)
401 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000402 if (v->ob_type->tp_as_number != NULL &&
403 (f = v->ob_type->tp_as_number->nb_add) != NULL)
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000404 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000405 Py_DECREF(v);
406 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000407 if (f != NULL)
408 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000409 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000410 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000411}
412
413PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000414PyNumber_Subtract(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000415{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000416 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000417 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000418 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000419 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000420 if (PyNumber_Coerce(&v, &w) != 0)
421 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000422 if (v->ob_type->tp_as_number != NULL &&
423 (f = v->ob_type->tp_as_number->nb_subtract) != NULL)
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000424 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000425 Py_DECREF(v);
426 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000427 if (f != NULL)
428 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000429 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000430 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000431}
432
433PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000434PyNumber_Multiply(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000435{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000436 PyTypeObject *tp = v->ob_type;
437 PySequenceMethods *m;
438
439 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000440 if (tp->tp_as_number != NULL &&
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000441 w->ob_type->tp_as_sequence != NULL) {
Guido van Rossume15dee51995-07-18 14:12:02 +0000442 /* number*sequence -- swap v and w */
443 PyObject *tmp = v;
444 v = w;
445 w = tmp;
446 tp = v->ob_type;
447 }
448 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000449 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000450 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000451 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000452 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000453 if (v->ob_type->tp_as_number != NULL &&
454 (f = v->ob_type->tp_as_number->nb_multiply) != NULL)
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000455 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000456 Py_DECREF(v);
457 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000458 if (f != NULL)
459 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000460 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000461 m = tp->tp_as_sequence;
462 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000463 long mul_value;
464
465 if (PyInt_Check(w)) {
466 mul_value = PyInt_AsLong(w);
467 }
468 else if (PyLong_Check(w)) {
469 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000470 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000471 return NULL;
472 }
473 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000474 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000475 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000476 }
477 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000478 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000479 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000480}
481
482PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000483PyNumber_Divide(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000484{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000485 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000486 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000487 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000488 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000489 if (PyNumber_Coerce(&v, &w) != 0)
490 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000491 if (v->ob_type->tp_as_number != NULL &&
492 (f = v->ob_type->tp_as_number->nb_divide) != NULL)
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000493 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;
Thomas Wouterse266e422000-08-23 23:31:34 +0000512 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000513 if (PyNumber_Coerce(&v, &w) != 0)
514 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000515 if (v->ob_type->tp_as_number != NULL &&
516 (f = v->ob_type->tp_as_number->nb_remainder) != NULL)
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000517 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000518 Py_DECREF(v);
519 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000520 if (f != NULL)
521 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000522 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000523 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000524}
525
526PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000527PyNumber_Divmod(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000528{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000529 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
530 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000531 PyObject *x = NULL;
Thomas Wouterse266e422000-08-23 23:31:34 +0000532 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000533 if (PyNumber_Coerce(&v, &w) != 0)
534 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000535 if (v->ob_type->tp_as_number != NULL &&
536 (f = v->ob_type->tp_as_number->nb_divmod) != NULL)
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000537 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000538 Py_DECREF(v);
539 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000540 if (f != NULL)
541 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000542 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000543 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000544}
545
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000546/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000547
548static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000549do_pow(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000550{
551 PyObject *res;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000552 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000553 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000554 if (v->ob_type->tp_as_number == NULL ||
555 w->ob_type->tp_as_number == NULL) {
556 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000557 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000558 return NULL;
559 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000560 if (PyNumber_Coerce(&v, &w) != 0)
561 return NULL;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000562 if (v->ob_type->tp_as_number != NULL &&
563 (f = v->ob_type->tp_as_number->nb_power) != NULL)
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000564 res = (*f)(v, w, Py_None);
565 else
566 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000567 Py_DECREF(v);
568 Py_DECREF(w);
569 return res;
570}
571
572PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000573PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000574{
575 PyObject *res;
576 PyObject *v1, *z1, *w2, *z2;
Tim Petersdbd9ba62000-07-09 03:09:57 +0000577 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000578
579 if (z == Py_None)
580 return do_pow(v, w);
581 /* XXX The ternary version doesn't do class instance coercions */
582 if (PyInstance_Check(v))
583 return v->ob_type->tp_as_number->nb_power(v, w, z);
584 if (v->ob_type->tp_as_number == NULL ||
585 z->ob_type->tp_as_number == NULL ||
586 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000587 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000588 }
589 if (PyNumber_Coerce(&v, &w) != 0)
590 return NULL;
591 res = NULL;
592 v1 = v;
593 z1 = z;
594 if (PyNumber_Coerce(&v1, &z1) != 0)
595 goto error2;
596 w2 = w;
597 z2 = z1;
598 if (PyNumber_Coerce(&w2, &z2) != 0)
599 goto error1;
Thomas Woutersbf6cfa52000-08-23 23:16:10 +0000600 if (v->ob_type->tp_as_number != NULL &&
601 (f = v1->ob_type->tp_as_number->nb_power) != NULL)
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000602 res = (*f)(v1, w2, z2);
603 else
604 res = type_error(
605 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000606 Py_DECREF(w2);
607 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000608 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000609 Py_DECREF(v1);
610 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000611 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000612 Py_DECREF(v);
613 Py_DECREF(w);
614 return res;
615}
616
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000617/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000618
619PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000620PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000621{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000622 PyNumberMethods *m;
623
624 if (o == NULL)
625 return null_error();
626 m = o->ob_type->tp_as_number;
627 if (m && m->nb_negative)
628 return (*m->nb_negative)(o);
629
630 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000631}
632
633PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000634PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000635{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000636 PyNumberMethods *m;
637
638 if (o == NULL)
639 return null_error();
640 m = o->ob_type->tp_as_number;
641 if (m && m->nb_positive)
642 return (*m->nb_positive)(o);
643
644 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000645}
646
647PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000648PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000649{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000650 PyNumberMethods *m;
651
652 if (o == NULL)
653 return null_error();
654 m = o->ob_type->tp_as_number;
655 if (m && m->nb_invert)
656 return (*m->nb_invert)(o);
657
658 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000659}
660
661PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000662PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000663{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000664 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000665
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000666 if (o == NULL)
667 return null_error();
668 m = o->ob_type->tp_as_number;
669 if (m && m->nb_absolute)
670 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000671
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000672 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000673}
674
Guido van Rossum9e896b32000-04-05 20:11:21 +0000675/* Add a check for embedded NULL-bytes in the argument. */
676static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000677int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000678{
679 char *end;
680 PyObject *x;
681
682 x = PyInt_FromString((char*)s, &end, 10);
683 if (x == NULL)
684 return NULL;
685 if (end != s + len) {
686 PyErr_SetString(PyExc_ValueError,
687 "null byte in argument for int()");
688 Py_DECREF(x);
689 return NULL;
690 }
691 return x;
692}
693
Guido van Rossume15dee51995-07-18 14:12:02 +0000694PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000695PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000696{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000697 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000698 const char *buffer;
699 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000700
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000701 if (o == NULL)
702 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000703 if (PyInt_Check(o)) {
704 Py_INCREF(o);
705 return o;
706 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000707 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000708 return int_from_string(PyString_AS_STRING(o),
709 PyString_GET_SIZE(o));
710 if (PyUnicode_Check(o))
711 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
712 PyUnicode_GET_SIZE(o),
713 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000714 m = o->ob_type->tp_as_number;
715 if (m && m->nb_int)
716 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000717 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000718 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000720 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000721}
722
Guido van Rossum9e896b32000-04-05 20:11:21 +0000723/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000724static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000725long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000726{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000727 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000728 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000729
Guido van Rossum4c08d552000-03-10 22:55:18 +0000730 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000731 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000732 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000733 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000734 PyErr_SetString(PyExc_ValueError,
735 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000736 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000737 return NULL;
738 }
739 return x;
740}
741
Guido van Rossume15dee51995-07-18 14:12:02 +0000742PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000743PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000744{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000745 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000746 const char *buffer;
747 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000748
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000749 if (o == NULL)
750 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000751 if (PyLong_Check(o)) {
752 Py_INCREF(o);
753 return o;
754 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000756 /* need to do extra error checking that PyLong_FromString()
757 * doesn't do. In particular long('9.5') must raise an
758 * exception, not truncate the float.
759 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000760 return long_from_string(PyString_AS_STRING(o),
761 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000762 if (PyUnicode_Check(o))
763 /* The above check is done in PyLong_FromUnicode(). */
764 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
765 PyUnicode_GET_SIZE(o),
766 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000767 m = o->ob_type->tp_as_number;
768 if (m && m->nb_long)
769 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000770 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
771 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000772
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000773 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000774}
775
776PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000777PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000778{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000779 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000780
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000781 if (o == NULL)
782 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000783 if (PyFloat_Check(o)) {
784 Py_INCREF(o);
785 return o;
786 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000787 if (!PyString_Check(o)) {
788 m = o->ob_type->tp_as_number;
789 if (m && m->nb_float)
790 return m->nb_float(o);
791 }
792 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000793}
794
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000795/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000796
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000797int
Fred Drake79912472000-07-09 04:06:11 +0000798PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000799{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000800 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000801}
802
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803int
Jeremy Hylton6253f832000-07-12 12:56:19 +0000804PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000805{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000806 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000807
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000808 if (s == NULL) {
809 null_error();
810 return -1;
811 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000812
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000813 m = s->ob_type->tp_as_sequence;
814 if (m && m->sq_length)
815 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000816
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000817 type_error("len() of unsized object");
818 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000819}
820
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +0000821#undef PySequence_Length
822int
823PySequence_Length(PyObject *s)
824{
825 return PySequence_Size(s);
826}
827#define PySequence_Length PySequence_Size
828
Guido van Rossume15dee51995-07-18 14:12:02 +0000829PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000830PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000831{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000832 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000833
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000834 if (s == NULL || o == NULL)
835 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000836
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000837 m = s->ob_type->tp_as_sequence;
838 if (m && m->sq_concat)
839 return m->sq_concat(s, o);
840
841 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000842}
843
844PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000845PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +0000846{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000847 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000848
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000849 if (o == NULL)
850 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000851
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000852 m = o->ob_type->tp_as_sequence;
853 if (m && m->sq_repeat)
854 return m->sq_repeat(o, count);
855
856 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000857}
858
859PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000860PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +0000861{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000863
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864 if (s == NULL)
865 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000866
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 m = s->ob_type->tp_as_sequence;
868 if (m && m->sq_item) {
869 if (i < 0) {
870 if (m->sq_length) {
871 int l = (*m->sq_length)(s);
872 if (l < 0)
873 return NULL;
874 i += l;
875 }
876 }
877 return m->sq_item(s, i);
878 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000879
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000880 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000881}
882
Thomas Wouters1d75a792000-08-17 22:37:32 +0000883static PyObject *
884sliceobj_from_intint(int i, int j)
885{
886 PyObject *start, *end, *slice;
887 start = PyInt_FromLong((long)i);
888 if (!start)
889 return NULL;
890 end = PyInt_FromLong((long)j);
891 if (!end) {
892 Py_DECREF(start);
893 return NULL;
894 }
895 slice = PySlice_New(start, end, NULL);
896 Py_DECREF(start);
897 Py_DECREF(end);
898 return slice;
899}
900
Guido van Rossume15dee51995-07-18 14:12:02 +0000901PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000902PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +0000903{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000904 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +0000905 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +0000906
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000908
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000909 m = s->ob_type->tp_as_sequence;
910 if (m && m->sq_slice) {
911 if (i1 < 0 || i2 < 0) {
912 if (m->sq_length) {
913 int l = (*m->sq_length)(s);
914 if (l < 0)
915 return NULL;
916 if (i1 < 0)
917 i1 += l;
918 if (i2 < 0)
919 i2 += l;
920 }
921 }
922 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +0000923 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
924 PyObject *res;
925 PyObject *slice = sliceobj_from_intint(i1, i2);
926 if (!slice)
927 return NULL;
928 res = mp->mp_subscript(s, slice);
929 Py_DECREF(slice);
930 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000931 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000932
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000933 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000934}
935
936int
Fred Drake79912472000-07-09 04:06:11 +0000937PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000938{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000939 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000940
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000941 if (s == NULL) {
942 null_error();
943 return -1;
944 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000945
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 m = s->ob_type->tp_as_sequence;
947 if (m && m->sq_ass_item) {
948 if (i < 0) {
949 if (m->sq_length) {
950 int l = (*m->sq_length)(s);
951 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000952 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000953 i += l;
954 }
955 }
956 return m->sq_ass_item(s, i, o);
957 }
958
959 type_error("object doesn't support item assignment");
960 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000961}
962
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000963int
Fred Drake79912472000-07-09 04:06:11 +0000964PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000965{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000966 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000967
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000968 if (s == NULL) {
969 null_error();
970 return -1;
971 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000972
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000973 m = s->ob_type->tp_as_sequence;
974 if (m && m->sq_ass_item) {
975 if (i < 0) {
976 if (m->sq_length) {
977 int l = (*m->sq_length)(s);
978 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000979 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000980 i += l;
981 }
982 }
983 return m->sq_ass_item(s, i, (PyObject *)NULL);
984 }
985
986 type_error("object doesn't support item deletion");
987 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000988}
989
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000990int
Fred Drake79912472000-07-09 04:06:11 +0000991PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000992{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000993 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +0000994 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +0000995
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000996 if (s == NULL) {
997 null_error();
998 return -1;
999 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001000
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 m = s->ob_type->tp_as_sequence;
1002 if (m && m->sq_ass_slice) {
1003 if (i1 < 0 || i2 < 0) {
1004 if (m->sq_length) {
1005 int l = (*m->sq_length)(s);
1006 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001007 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 if (i1 < 0)
1009 i1 += l;
1010 if (i2 < 0)
1011 i2 += l;
1012 }
1013 }
1014 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001015 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1016 int res;
1017 PyObject *slice = sliceobj_from_intint(i1, i2);
1018 if (!slice)
1019 return -1;
1020 res = mp->mp_ass_subscript(s, slice, o);
1021 Py_DECREF(slice);
1022 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001023 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001024
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025 type_error("object doesn't support slice assignment");
1026 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001027}
1028
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001029int
Fred Drake79912472000-07-09 04:06:11 +00001030PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001031{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001033
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 if (s == NULL) {
1035 null_error();
1036 return -1;
1037 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001038
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 m = s->ob_type->tp_as_sequence;
1040 if (m && m->sq_ass_slice) {
1041 if (i1 < 0 || i2 < 0) {
1042 if (m->sq_length) {
1043 int l = (*m->sq_length)(s);
1044 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001045 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001046 if (i1 < 0)
1047 i1 += l;
1048 if (i2 < 0)
1049 i2 += l;
1050 }
1051 }
1052 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1053 }
1054 type_error("object doesn't support slice deletion");
1055 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001056}
1057
Guido van Rossume15dee51995-07-18 14:12:02 +00001058PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001059PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001060{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001061 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001062
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001063 if (v == NULL)
1064 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001065
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066 if (PyTuple_Check(v)) {
1067 Py_INCREF(v);
1068 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001069 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001070
1071 if (PyList_Check(v))
1072 return PyList_AsTuple(v);
1073
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001074 /* There used to be code for strings here, but tuplifying strings is
1075 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001076
1077 /* Generic sequence object */
1078 m = v->ob_type->tp_as_sequence;
1079 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001080 int i;
1081 PyObject *t;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001082 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001083 if (n < 0)
1084 return NULL;
1085 t = PyTuple_New(n);
1086 if (t == NULL)
1087 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001088 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001089 PyObject *item = (*m->sq_item)(v, i);
1090 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001091 if (PyErr_ExceptionMatches(PyExc_IndexError))
1092 PyErr_Clear();
1093 else {
1094 Py_DECREF(t);
1095 t = NULL;
1096 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 break;
1098 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001099 if (i >= n) {
1100 if (n < 500)
1101 n += 10;
1102 else
1103 n += 100;
1104 if (_PyTuple_Resize(&t, n, 0) != 0)
1105 break;
1106 }
1107 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001109 if (i < n && t != NULL)
1110 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001111 return t;
1112 }
1113
1114 /* None of the above */
1115 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001116}
1117
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001118PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001119PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001120{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001121 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001122
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001123 if (v == NULL)
1124 return null_error();
1125
1126 if (PyList_Check(v))
1127 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1128
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001129 m = v->ob_type->tp_as_sequence;
1130 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001131 int i;
1132 PyObject *l;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001133 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001134 if (n < 0)
1135 return NULL;
1136 l = PyList_New(n);
1137 if (l == NULL)
1138 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001139 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001140 PyObject *item = (*m->sq_item)(v, i);
1141 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001142 if (PyErr_ExceptionMatches(PyExc_IndexError))
1143 PyErr_Clear();
1144 else {
1145 Py_DECREF(l);
1146 l = NULL;
1147 }
1148 break;
1149 }
1150 if (i < n)
1151 PyList_SET_ITEM(l, i, item);
1152 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001153 Py_DECREF(l);
1154 l = NULL;
1155 break;
1156 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001157 }
1158 if (i < n && l != NULL) {
1159 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1160 Py_DECREF(l);
1161 l = NULL;
1162 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001163 }
1164 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001165 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001166 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001167}
1168
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001169PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001170PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001171{
1172 if (v == NULL)
1173 return null_error();
1174
1175 if (PyList_Check(v) || PyTuple_Check(v)) {
1176 Py_INCREF(v);
1177 return v;
1178 }
1179
1180 v = PySequence_Tuple(v);
1181 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1182 return type_error(m);
1183
1184 return v;
1185}
1186
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001187int
Fred Drake79912472000-07-09 04:06:11 +00001188PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001189{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190 int l, i, n, cmp, err;
1191 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193 if (s == NULL || o == NULL) {
1194 null_error();
1195 return -1;
1196 }
1197
Jeremy Hylton6253f832000-07-12 12:56:19 +00001198 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001199 if (l < 0)
1200 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001201
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 n = 0;
1203 for (i = 0; i < l; i++) {
1204 item = PySequence_GetItem(s, i);
1205 if (item == NULL)
1206 return -1;
1207 err = PyObject_Cmp(item, o, &cmp);
1208 Py_DECREF(item);
1209 if (err < 0)
1210 return err;
1211 if (cmp == 0)
1212 n++;
1213 }
1214 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001215}
1216
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217int
Fred Drake79912472000-07-09 04:06:11 +00001218PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001219{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001220 int i, cmp;
1221 PyObject *x;
1222 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001223
Guido van Rossum46c6b202000-02-28 15:01:46 +00001224 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1225 sq = w->ob_type->tp_as_sequence;
1226 if(sq != NULL && sq->sq_contains != NULL)
1227 return (*sq->sq_contains)(w, v);
1228 }
1229
1230 /* If there is no better way to check whether an item is is contained,
1231 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 sq = w->ob_type->tp_as_sequence;
1233 if (sq == NULL || sq->sq_item == NULL) {
1234 PyErr_SetString(PyExc_TypeError,
1235 "'in' or 'not in' needs sequence right argument");
1236 return -1;
1237 }
1238
1239 for (i = 0; ; i++) {
1240 x = (*sq->sq_item)(w, i);
1241 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001242 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 PyErr_Clear();
1244 break;
1245 }
1246 return -1;
1247 }
1248 cmp = PyObject_Compare(v, x);
1249 Py_XDECREF(x);
1250 if (cmp == 0)
1251 return 1;
1252 if (PyErr_Occurred())
1253 return -1;
1254 }
1255
1256 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001257}
1258
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259/* Backwards compatibility */
1260#undef PySequence_In
1261int
Fred Drake79912472000-07-09 04:06:11 +00001262PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263{
1264 return PySequence_Contains(w, v);
1265}
1266
1267int
Fred Drake79912472000-07-09 04:06:11 +00001268PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001269{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001270 int l, i, cmp, err;
1271 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001272
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001273 if (s == NULL || o == NULL) {
1274 null_error();
1275 return -1;
1276 }
1277
Jeremy Hylton6253f832000-07-12 12:56:19 +00001278 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279 if (l < 0)
1280 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001281
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001282 for (i = 0; i < l; i++) {
1283 item = PySequence_GetItem(s, i);
1284 if (item == NULL)
1285 return -1;
1286 err = PyObject_Cmp(item, o, &cmp);
1287 Py_DECREF(item);
1288 if (err < 0)
1289 return err;
1290 if (cmp == 0)
1291 return i;
1292 }
1293
1294 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1295 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001296}
1297
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001298/* Operations on mappings */
1299
1300int
Fred Drake79912472000-07-09 04:06:11 +00001301PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001302{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001304}
1305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001307PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001308{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001310
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 if (o == NULL) {
1312 null_error();
1313 return -1;
1314 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001315
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 m = o->ob_type->tp_as_mapping;
1317 if (m && m->mp_length)
1318 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001319
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001320 type_error("len() of unsized object");
1321 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001322}
1323
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001324#undef PyMapping_Length
1325int
1326PyMapping_Length(PyObject *o)
1327{
1328 return PyMapping_Size(o);
1329}
1330#define PyMapping_Length PyMapping_Size
1331
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001332PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001333PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001334{
1335 PyObject *okey, *r;
1336
1337 if (key == NULL)
1338 return null_error();
1339
1340 okey = PyString_FromString(key);
1341 if (okey == NULL)
1342 return NULL;
1343 r = PyObject_GetItem(o, okey);
1344 Py_DECREF(okey);
1345 return r;
1346}
1347
1348int
Fred Drake79912472000-07-09 04:06:11 +00001349PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350{
1351 PyObject *okey;
1352 int r;
1353
1354 if (key == NULL) {
1355 null_error();
1356 return -1;
1357 }
1358
1359 okey = PyString_FromString(key);
1360 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001361 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001362 r = PyObject_SetItem(o, okey, value);
1363 Py_DECREF(okey);
1364 return r;
1365}
1366
1367int
Fred Drake79912472000-07-09 04:06:11 +00001368PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001369{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001370 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001371
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 v = PyMapping_GetItemString(o, key);
1373 if (v) {
1374 Py_DECREF(v);
1375 return 1;
1376 }
1377 PyErr_Clear();
1378 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001379}
1380
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381int
Fred Drake79912472000-07-09 04:06:11 +00001382PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001383{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001385
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001386 v = PyObject_GetItem(o, key);
1387 if (v) {
1388 Py_DECREF(v);
1389 return 1;
1390 }
1391 PyErr_Clear();
1392 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001393}
1394
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001395/* Operations on callable objects */
1396
1397/* XXX PyCallable_Check() is in object.c */
1398
Guido van Rossume15dee51995-07-18 14:12:02 +00001399PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001400PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001401{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 PyObject *r;
1403 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001404
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001405 if (args == NULL) {
1406 args = PyTuple_New(0);
1407 if (args == NULL)
1408 return NULL;
1409 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001410
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 r = PyEval_CallObject(o, args);
1412
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001413 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001414 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001415 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001416
1417 return r;
1418}
Guido van Rossume15dee51995-07-18 14:12:02 +00001419
1420PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001421PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001422{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 va_list va;
1424 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001426
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 if (callable == NULL) {
1428 va_end(va);
1429 return null_error();
1430 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001431
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001432 if (format)
1433 args = Py_VaBuildValue(format, va);
1434 else
1435 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001436
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 va_end(va);
1438
1439 if (args == NULL)
1440 return NULL;
1441
1442 if (!PyTuple_Check(args)) {
1443 PyObject *a;
1444
1445 a = PyTuple_New(1);
1446 if (a == NULL)
1447 return NULL;
1448 if (PyTuple_SetItem(a, 0, args) < 0)
1449 return NULL;
1450 args = a;
1451 }
1452 retval = PyObject_CallObject(callable, args);
1453
1454 Py_DECREF(args);
1455
1456 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001457}
1458
1459PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001460PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001461{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462 va_list va;
1463 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001464 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001465
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001466 if (o == NULL || name == NULL) {
1467 va_end(va);
1468 return null_error();
1469 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001470
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001471 func = PyObject_GetAttrString(o, name);
1472 if (func == NULL) {
1473 va_end(va);
1474 PyErr_SetString(PyExc_AttributeError, name);
1475 return 0;
1476 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001477
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001478 if (!PyCallable_Check(func)) {
1479 va_end(va);
1480 return type_error("call of non-callable attribute");
1481 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001482
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001483 if (format && *format)
1484 args = Py_VaBuildValue(format, va);
1485 else
1486 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001487
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001488 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001489
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001490 if (!args)
1491 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001492
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001493 if (!PyTuple_Check(args)) {
1494 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001495
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001496 a = PyTuple_New(1);
1497 if (a == NULL)
1498 return NULL;
1499 if (PyTuple_SetItem(a, 0, args) < 0)
1500 return NULL;
1501 args = a;
1502 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001503
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001504 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001505
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001506 Py_DECREF(args);
1507 Py_DECREF(func);
1508
1509 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001510}