blob: dfdfc43f71281edeb8d1a17746a354d58a2d05f7 [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
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000617/* Binary in-place operators */
618
619/* The in-place operators are defined to fall back to the 'normal',
620 non in-place operations, if the in-place methods are not in place, and to
621 take class instances into account. This is how it is supposed to work:
622
623 - If the left-hand-side object (the first argument) is an
624 instance object, try to let PyInstance_HalfBinOp() handle it. Pass the
625 non in-place variant of the function as callback, because it will only
626 be used if the left-hand object is changed by coercion.
627
628 - Otherwise, if the left hand object is not an instance object, it has
629 the appropriate struct members, and they are filled, call the
630 appropriate function and return the result. No coercion is done on the
631 arguments; the left-hand object is the one the operation is performed
632 on, and it's up to the function to deal with the right-hand object.
633
634 - Otherwise, in-place modification is not supported. Handle it exactly as
635 a non in-place operation of the same kind:
636
637 - If either object is an instance, let PyInstance_DoBinOp() handle it.
638
639 - Otherwise, both arguments are C types. If the left-hand object has
640 the appropriate struct members filled, coerce, call the
641 appropriate function, and return the result.
642
643 - Otherwise, we are out of options: raise a type error specific to
644 augmented assignment.
645
646 */
647
648#define HASINPLACE(t) PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
649
650PyObject *
651PyNumber_InPlaceOr(PyObject *v, PyObject *w)
652{
653 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000654 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000655
656 if (PyInstance_Check(v)) {
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000657 if (PyInstance_HalfBinOp(v, w, "__ior__", &x,
658 PyNumber_Or, 0) <= 0)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000659 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000660 }
661 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
662 (f = v->ob_type->tp_as_number->nb_inplace_or) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000663 return (*f)(v, w);
664
665 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
666
667 if (v->ob_type->tp_as_number != NULL) {
668 if (PyNumber_Coerce(&v, &w) != 0)
669 return NULL;
670 if (v->ob_type->tp_as_number != NULL &&
671 (f = v->ob_type->tp_as_number->nb_or) != NULL)
672 x = (*f)(v, w);
673 Py_DECREF(v);
674 Py_DECREF(w);
675 if (f != NULL)
676 return x;
677 }
678
679 return type_error("bad operand type(s) for |=");
680}
681
682PyObject *
683PyNumber_InPlaceXor(PyObject *v, PyObject *w)
684{
685 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000686 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000687
688 if (PyInstance_Check(v)) {
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000689 if (PyInstance_HalfBinOp(v, w, "__ixor__", &x,
690 PyNumber_Xor, 0) <= 0)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000691 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000692 }
693 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
694 (f = v->ob_type->tp_as_number->nb_inplace_xor) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000695 return (*f)(v, w);
696
697 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
698
699 if (v->ob_type->tp_as_number != NULL) {
700 if (PyNumber_Coerce(&v, &w) != 0)
701 return NULL;
702 if (v->ob_type->tp_as_number != NULL &&
703 (f = v->ob_type->tp_as_number->nb_xor) != NULL)
704 x = (*f)(v, w);
705 Py_DECREF(v);
706 Py_DECREF(w);
707 if (f != NULL)
708 return x;
709 }
710
711 return type_error("bad operand type(s) for ^=");
712}
713
714PyObject *
715PyNumber_InPlaceAnd(PyObject *v, PyObject *w)
716{
717 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000718 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000719
720 if (PyInstance_Check(v)) {
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000721 if (PyInstance_HalfBinOp(v, w, "__iand__", &x,
722 PyNumber_And, 0) <= 0)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000723 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000724 }
725 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
726 (f = v->ob_type->tp_as_number->nb_inplace_and) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000727 return (*f)(v, w);
728
729 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
730
731 if (v->ob_type->tp_as_number != NULL) {
732 if (PyNumber_Coerce(&v, &w) != 0)
733 return NULL;
734 if (v->ob_type->tp_as_number != NULL &&
735 (f = v->ob_type->tp_as_number->nb_and) != NULL)
736 x = (*f)(v, w);
737 Py_DECREF(v);
738 Py_DECREF(w);
739 if (f != NULL)
740 return x;
741 }
742
743 return type_error("bad operand type(s) for &=");
744}
745
746PyObject *
747PyNumber_InPlaceLshift(PyObject *v, PyObject *w)
748{
749 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000750 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000751
752 if (PyInstance_Check(v)) {
753 if (PyInstance_HalfBinOp(v, w, "__ilshift__", &x,
754 PyNumber_Lshift, 0) <= 0)
755 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000756 }
757 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
758 (f = v->ob_type->tp_as_number->nb_inplace_lshift) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759 return (*f)(v, w);
760
761 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
762
763 if (v->ob_type->tp_as_number != NULL) {
764 if (PyNumber_Coerce(&v, &w) != 0)
765 return NULL;
766 if (v->ob_type->tp_as_number != NULL &&
767 (f = v->ob_type->tp_as_number->nb_lshift) != NULL)
768 x = (*f)(v, w);
769 Py_DECREF(v);
770 Py_DECREF(w);
771 if (f != NULL)
772 return x;
773 }
774
775 return type_error("bad operand type(s) for <<=");
776}
777
778PyObject *
779PyNumber_InPlaceRshift(PyObject *v, PyObject *w)
780{
781 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000782 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000783
784 if (PyInstance_Check(v)) {
785 if (PyInstance_HalfBinOp(v, w, "__irshift__", &x,
786 PyNumber_Rshift, 0) <= 0)
787 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000788 }
789 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
790 (f = v->ob_type->tp_as_number->nb_inplace_rshift) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000791 return (*f)(v, w);
792
793 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
794
795 if (v->ob_type->tp_as_number != NULL) {
796 if (PyNumber_Coerce(&v, &w) != 0)
797 return NULL;
798 if (v->ob_type->tp_as_number != NULL &&
799 (f = v->ob_type->tp_as_number->nb_rshift) != NULL)
800 x = (*f)(v, w);
801 Py_DECREF(v);
802 Py_DECREF(w);
803 if (f != NULL)
804 return x;
805 }
806
807 return type_error("bad operand type(s) for >>=");
808}
809
810PyObject *
811PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
812{
813 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000814 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000815
816 if (PyInstance_Check(v)) {
817 if (PyInstance_HalfBinOp(v, w, "__iadd__", &x,
Guido van Rossumbb8be932000-09-01 23:27:32 +0000818 PyNumber_Add, 0) <= 0)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000819 return x;
Fred Drake562f62a2000-08-31 05:15:44 +0000820 }
Guido van Rossumbb8be932000-09-01 23:27:32 +0000821 else if (HASINPLACE(v)) {
822 if (v->ob_type->tp_as_sequence != NULL)
823 f = v->ob_type->tp_as_sequence->sq_inplace_concat;
824 if (f == NULL && v->ob_type->tp_as_number != NULL)
825 f = v->ob_type->tp_as_number->nb_inplace_add;
826 if (f != NULL)
827 return (*f)(v, w);
828 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000829
830 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
831
Guido van Rossumbb8be932000-09-01 23:27:32 +0000832 if (v->ob_type->tp_as_sequence != NULL) {
833 f = v->ob_type->tp_as_sequence->sq_concat;
834 if (f != NULL)
835 return (*f)(v, w);
836 }
837 if (v->ob_type->tp_as_number != NULL) {
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838 if (PyNumber_Coerce(&v, &w) != 0)
839 return NULL;
Guido van Rossumbb8be932000-09-01 23:27:32 +0000840 if (v->ob_type->tp_as_number != NULL) {
841 f = v->ob_type->tp_as_number->nb_add;
842 if (f != NULL)
843 x = (*f)(v, w);
844 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000845 Py_DECREF(v);
846 Py_DECREF(w);
847 if (f != NULL)
848 return x;
849 }
850
851 return type_error("bad operand type(s) for +=");
852}
853
854PyObject *
855PyNumber_InPlaceSubtract(PyObject *v, PyObject *w)
856{
857 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000858 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000859
860 if (PyInstance_Check(v)) {
861 if (PyInstance_HalfBinOp(v, w, "__isub__", &x,
862 PyNumber_Subtract, 0) <= 0)
863 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000864 }
865 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
866 (f = v->ob_type->tp_as_number->nb_inplace_subtract) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000867 return (*f)(v, w);
868
869 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
870
871 if (v->ob_type->tp_as_number != NULL) {
872 if (PyNumber_Coerce(&v, &w) != 0)
873 return NULL;
874 if (v->ob_type->tp_as_number != NULL &&
875 (f = v->ob_type->tp_as_number->nb_subtract) != NULL)
876 x = (*f)(v, w);
877 Py_DECREF(v);
878 Py_DECREF(w);
879 if (f != NULL)
880 return x;
881 }
882
883 return type_error("bad operand type(s) for -=");
884}
885
886PyObject *
887PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
888{
889 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000890 PyObject * (*g)(PyObject *, int) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000891 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000892
893 if (PyInstance_Check(v)) {
894 if (PyInstance_HalfBinOp(v, w, "__imul__", &x,
895 PyNumber_Multiply, 0) <= 0)
896 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000897 }
898 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
899 (f = v->ob_type->tp_as_number->nb_inplace_multiply) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000900 return (*f)(v, w);
901 else if (v->ob_type->tp_as_sequence != NULL && HASINPLACE(v) &&
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000902 (g = v->ob_type->tp_as_sequence->sq_inplace_repeat) != NULL) {
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000903 long mul_value;
904
905 if (PyInt_Check(w)) {
906 mul_value = PyInt_AsLong(w);
907 }
908 else if (PyLong_Check(w)) {
909 mul_value = PyLong_AsLong(w);
910 if (mul_value == -1 && PyErr_Occurred())
911 return NULL;
912 }
913 else {
914 return type_error(
915 "can't multiply sequence with non-int");
916 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000917 return (*g)(v, (int)mul_value);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000918 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000919
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000920 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
921
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000922 if (v->ob_type->tp_as_number != NULL) {
923 if (PyNumber_Coerce(&v, &w) != 0)
924 return NULL;
925 if (v->ob_type->tp_as_number != NULL &&
926 (f = v->ob_type->tp_as_number->nb_multiply) != NULL)
927 x = (*f)(v, w);
928 Py_DECREF(v);
929 Py_DECREF(w);
930 if (f != NULL)
931 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000932 }
933 else if (v->ob_type->tp_as_sequence != NULL &&
934 (g = v->ob_type->tp_as_sequence->sq_repeat) != NULL) {
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000935 long mul_value;
936
937 if (PyInt_Check(w)) {
938 mul_value = PyInt_AsLong(w);
939 }
940 else if (PyLong_Check(w)) {
941 mul_value = PyLong_AsLong(w);
942 if (mul_value == -1 && PyErr_Occurred())
943 return NULL;
944 }
945 else {
946 return type_error(
947 "can't multiply sequence with non-int");
948 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000949 return (*g)(v, (int)mul_value);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000950 }
951 return type_error("bad operand type(s) for *=");
952}
953
954PyObject *
955PyNumber_InPlaceDivide(PyObject *v, PyObject *w)
956{
957 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000958 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000959
960 if (PyInstance_Check(v)) {
961 if (PyInstance_HalfBinOp(v, w, "__idiv__", &x,
962 PyNumber_Divide, 0) <= 0)
963 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000964 }
965 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
966 (f = v->ob_type->tp_as_number->nb_inplace_divide) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000967 return (*f)(v, w);
968
969 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
970
971 if (v->ob_type->tp_as_number != NULL) {
972 if (PyNumber_Coerce(&v, &w) != 0)
973 return NULL;
974 if (v->ob_type->tp_as_number != NULL &&
975 (f = v->ob_type->tp_as_number->nb_divide) != NULL)
976 x = (*f)(v, w);
977 Py_DECREF(v);
978 Py_DECREF(w);
979 if (f != NULL)
980 return x;
981 }
982
983 return type_error("bad operand type(s) for /=");
984}
985
986PyObject *
987PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
988{
989 PyObject * (*f)(PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +0000990 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000991
992 if (PyInstance_Check(v)) {
993 if (PyInstance_HalfBinOp(v, w, "__imod__", &x,
994 PyNumber_Remainder, 0) <= 0)
995 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000996 }
997 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
998 (f = v->ob_type->tp_as_number->nb_inplace_remainder) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000999 return (*f)(v, w);
1000
1001 if (PyString_Check(v))
1002 return PyString_Format(v, w);
1003 else if (PyUnicode_Check(v))
1004 return PyUnicode_Format(v, w);
1005
1006 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
1007
1008 if (v->ob_type->tp_as_number != NULL) {
1009 if (PyNumber_Coerce(&v, &w) != 0)
1010 return NULL;
1011 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
1012 x = (*f)(v, w);
1013 Py_DECREF(v);
1014 Py_DECREF(w);
1015 if (f != NULL)
1016 return x;
1017 }
1018
1019 return type_error("bad operand type(s) for %=");
1020}
1021
1022
1023/* In-place Power (binary or ternary, for API consistency) */
1024
1025static PyObject *
1026do_inplace_pow(PyObject *v, PyObject *w)
1027{
1028 PyObject * (*f)(PyObject *, PyObject *, PyObject *) = NULL;
Thomas Woutersdc9100f2000-10-05 12:43:25 +00001029 PyObject *x = NULL;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001030
1031 if (PyInstance_Check(v)) {
1032 if (PyInstance_HalfBinOp(v, w, "__ipow__", &x, do_pow, 0) <= 0)
1033 return x;
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001034 }
1035 else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
1036 (f = v->ob_type->tp_as_number->nb_inplace_power) != NULL)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001037 return (*f)(v, w, Py_None);
1038
1039 BINOP(v, w, "__pow__", "__rpow__", do_pow);
1040
1041 if (v->ob_type->tp_as_number == NULL ||
1042 w->ob_type->tp_as_number == NULL) {
1043 return type_error("bad operand type(s) for **=");
1044 }
1045 if (PyNumber_Coerce(&v, &w) != 0)
1046 return NULL;
1047 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
1048 x = (*f)(v, w, Py_None);
1049 else
1050 x = type_error("bad operand type(s) for **=");
1051 Py_DECREF(v);
1052 Py_DECREF(w);
1053 return x;
1054}
1055
1056PyObject *
1057PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1058{
1059 PyObject *res;
1060 PyObject *v1, *z1, *w2, *z2, *oldv;
1061 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
1062
1063 if (z == Py_None)
1064 return do_inplace_pow(v, w);
1065 /* XXX The ternary version doesn't do class instance coercions */
1066 if (PyInstance_Check(v))
1067 return v->ob_type->tp_as_number->nb_inplace_power(v, w, z);
1068 if (v->ob_type->tp_as_number == NULL ||
1069 z->ob_type->tp_as_number == NULL ||
1070 w->ob_type->tp_as_number == NULL) {
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001071 return type_error(
1072 "(inplace) pow(x, y, z) requires numeric arguments");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001073 }
1074 oldv = v;
1075 Py_INCREF(oldv);
1076 res = NULL;
1077 if (PyNumber_Coerce(&v, &w) != 0)
1078 goto error3;
1079 v1 = v;
1080 z1 = z;
1081 if (PyNumber_Coerce(&v1, &z1) != 0)
1082 goto error2;
1083 w2 = w;
1084 z2 = z1;
1085 if (PyNumber_Coerce(&w2, &z2) != 0)
1086 goto error1;
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001087 if (oldv == v1 && HASINPLACE(v1) &&
1088 v->ob_type->tp_as_number != NULL &&
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001089 (f = v1->ob_type->tp_as_number->nb_inplace_power) != NULL)
1090 res = (*f)(v1, w2, z2);
1091 else if (v1->ob_type->tp_as_number != NULL &&
1092 (f = v1->ob_type->tp_as_number->nb_power) != NULL)
1093 res = (*f)(v1, w2, z2);
1094 else
1095 res = type_error(
Thomas Woutersf2b332d2000-09-02 08:34:40 +00001096 "(inplace) pow(x, y, z) not defined for these operands");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001097 Py_DECREF(w2);
1098 Py_DECREF(z2);
1099 error1:
1100 Py_DECREF(v1);
1101 Py_DECREF(z1);
1102 error2:
1103 Py_DECREF(v);
1104 Py_DECREF(w);
1105 error3:
1106 Py_DECREF(oldv);
1107 return res;
1108}
1109
1110
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001111/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001112
1113PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001114PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001115{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001116 PyNumberMethods *m;
1117
1118 if (o == NULL)
1119 return null_error();
1120 m = o->ob_type->tp_as_number;
1121 if (m && m->nb_negative)
1122 return (*m->nb_negative)(o);
1123
1124 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +00001125}
1126
1127PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001128PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001129{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 PyNumberMethods *m;
1131
1132 if (o == NULL)
1133 return null_error();
1134 m = o->ob_type->tp_as_number;
1135 if (m && m->nb_positive)
1136 return (*m->nb_positive)(o);
1137
1138 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +00001139}
1140
1141PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001142PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001143{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144 PyNumberMethods *m;
1145
1146 if (o == NULL)
1147 return null_error();
1148 m = o->ob_type->tp_as_number;
1149 if (m && m->nb_invert)
1150 return (*m->nb_invert)(o);
1151
1152 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +00001153}
1154
1155PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001156PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001157{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001159
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001160 if (o == NULL)
1161 return null_error();
1162 m = o->ob_type->tp_as_number;
1163 if (m && m->nb_absolute)
1164 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001165
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001166 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001167}
1168
Guido van Rossum9e896b32000-04-05 20:11:21 +00001169/* Add a check for embedded NULL-bytes in the argument. */
1170static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001171int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001172{
1173 char *end;
1174 PyObject *x;
1175
1176 x = PyInt_FromString((char*)s, &end, 10);
1177 if (x == NULL)
1178 return NULL;
1179 if (end != s + len) {
1180 PyErr_SetString(PyExc_ValueError,
1181 "null byte in argument for int()");
1182 Py_DECREF(x);
1183 return NULL;
1184 }
1185 return x;
1186}
1187
Guido van Rossume15dee51995-07-18 14:12:02 +00001188PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001189PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001190{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001191 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001192 const char *buffer;
1193 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001194
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195 if (o == NULL)
1196 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001197 if (PyInt_Check(o)) {
1198 Py_INCREF(o);
1199 return o;
1200 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001201 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001202 return int_from_string(PyString_AS_STRING(o),
1203 PyString_GET_SIZE(o));
1204 if (PyUnicode_Check(o))
1205 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1206 PyUnicode_GET_SIZE(o),
1207 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001208 m = o->ob_type->tp_as_number;
1209 if (m && m->nb_int)
1210 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001211 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001212 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001213
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001214 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +00001215}
1216
Guido van Rossum9e896b32000-04-05 20:11:21 +00001217/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001218static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001219long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001220{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001221 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001222 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001223
Guido van Rossum4c08d552000-03-10 22:55:18 +00001224 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001225 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001226 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001227 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001228 PyErr_SetString(PyExc_ValueError,
1229 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001230 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001231 return NULL;
1232 }
1233 return x;
1234}
1235
Guido van Rossume15dee51995-07-18 14:12:02 +00001236PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001237PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001238{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001239 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001240 const char *buffer;
1241 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001242
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001243 if (o == NULL)
1244 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001245 if (PyLong_Check(o)) {
1246 Py_INCREF(o);
1247 return o;
1248 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001249 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001250 /* need to do extra error checking that PyLong_FromString()
1251 * doesn't do. In particular long('9.5') must raise an
1252 * exception, not truncate the float.
1253 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001254 return long_from_string(PyString_AS_STRING(o),
1255 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +00001256 if (PyUnicode_Check(o))
1257 /* The above check is done in PyLong_FromUnicode(). */
1258 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1259 PyUnicode_GET_SIZE(o),
1260 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261 m = o->ob_type->tp_as_number;
1262 if (m && m->nb_long)
1263 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001264 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1265 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +00001268}
1269
1270PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001271PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001272{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001273 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001274
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275 if (o == NULL)
1276 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001277 if (PyFloat_Check(o)) {
1278 Py_INCREF(o);
1279 return o;
1280 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001281 if (!PyString_Check(o)) {
1282 m = o->ob_type->tp_as_number;
1283 if (m && m->nb_float)
1284 return m->nb_float(o);
1285 }
1286 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001287}
1288
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001289/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001290
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291int
Fred Drake79912472000-07-09 04:06:11 +00001292PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001293{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001294 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +00001295}
1296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001298PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001299{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001300 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001301
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302 if (s == NULL) {
1303 null_error();
1304 return -1;
1305 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001306
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 m = s->ob_type->tp_as_sequence;
1308 if (m && m->sq_length)
1309 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001310
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001311 type_error("len() of unsized object");
1312 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001313}
1314
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001315#undef PySequence_Length
1316int
1317PySequence_Length(PyObject *s)
1318{
1319 return PySequence_Size(s);
1320}
1321#define PySequence_Length PySequence_Size
1322
Guido van Rossume15dee51995-07-18 14:12:02 +00001323PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001324PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001325{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 if (s == NULL || o == NULL)
1329 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 m = s->ob_type->tp_as_sequence;
1332 if (m && m->sq_concat)
1333 return m->sq_concat(s, o);
1334
1335 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001336}
1337
1338PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001339PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001340{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001341 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001342
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343 if (o == NULL)
1344 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001345
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001346 m = o->ob_type->tp_as_sequence;
1347 if (m && m->sq_repeat)
1348 return m->sq_repeat(o, count);
1349
1350 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001351}
1352
1353PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001354PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1355{
1356 PySequenceMethods *m;
1357
1358 if (s == NULL || o == NULL)
1359 return null_error();
1360
1361 m = s->ob_type->tp_as_sequence;
1362 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1363 return m->sq_inplace_concat(s, o);
1364 if (m && m->sq_concat)
1365 return m->sq_concat(s, o);
1366
1367 return type_error("object can't be concatenated");
1368}
1369
1370PyObject *
1371PySequence_InPlaceRepeat(PyObject *o, int count)
1372{
1373 PySequenceMethods *m;
1374
1375 if (o == NULL)
1376 return null_error();
1377
1378 m = o->ob_type->tp_as_sequence;
1379 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1380 return m->sq_inplace_repeat(o, count);
1381 if (m && m->sq_repeat)
1382 return m->sq_repeat(o, count);
1383
1384 return type_error("object can't be repeated");
1385}
1386
1387PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001388PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001389{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 if (s == NULL)
1393 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001394
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001395 m = s->ob_type->tp_as_sequence;
1396 if (m && m->sq_item) {
1397 if (i < 0) {
1398 if (m->sq_length) {
1399 int l = (*m->sq_length)(s);
1400 if (l < 0)
1401 return NULL;
1402 i += l;
1403 }
1404 }
1405 return m->sq_item(s, i);
1406 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001407
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001408 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001409}
1410
Thomas Wouters1d75a792000-08-17 22:37:32 +00001411static PyObject *
1412sliceobj_from_intint(int i, int j)
1413{
1414 PyObject *start, *end, *slice;
1415 start = PyInt_FromLong((long)i);
1416 if (!start)
1417 return NULL;
1418 end = PyInt_FromLong((long)j);
1419 if (!end) {
1420 Py_DECREF(start);
1421 return NULL;
1422 }
1423 slice = PySlice_New(start, end, NULL);
1424 Py_DECREF(start);
1425 Py_DECREF(end);
1426 return slice;
1427}
1428
Guido van Rossume15dee51995-07-18 14:12:02 +00001429PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001430PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001431{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001432 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001433 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001434
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001436
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 m = s->ob_type->tp_as_sequence;
1438 if (m && m->sq_slice) {
1439 if (i1 < 0 || i2 < 0) {
1440 if (m->sq_length) {
1441 int l = (*m->sq_length)(s);
1442 if (l < 0)
1443 return NULL;
1444 if (i1 < 0)
1445 i1 += l;
1446 if (i2 < 0)
1447 i2 += l;
1448 }
1449 }
1450 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001451 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1452 PyObject *res;
1453 PyObject *slice = sliceobj_from_intint(i1, i2);
1454 if (!slice)
1455 return NULL;
1456 res = mp->mp_subscript(s, slice);
1457 Py_DECREF(slice);
1458 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001459 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001460
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001461 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001462}
1463
1464int
Fred Drake79912472000-07-09 04:06:11 +00001465PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001466{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001468
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001469 if (s == NULL) {
1470 null_error();
1471 return -1;
1472 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001473
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 m = s->ob_type->tp_as_sequence;
1475 if (m && m->sq_ass_item) {
1476 if (i < 0) {
1477 if (m->sq_length) {
1478 int l = (*m->sq_length)(s);
1479 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001480 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001481 i += l;
1482 }
1483 }
1484 return m->sq_ass_item(s, i, o);
1485 }
1486
1487 type_error("object doesn't support item assignment");
1488 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001489}
1490
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001491int
Fred Drake79912472000-07-09 04:06:11 +00001492PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001493{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001495
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001496 if (s == NULL) {
1497 null_error();
1498 return -1;
1499 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001500
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001501 m = s->ob_type->tp_as_sequence;
1502 if (m && m->sq_ass_item) {
1503 if (i < 0) {
1504 if (m->sq_length) {
1505 int l = (*m->sq_length)(s);
1506 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001507 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001508 i += l;
1509 }
1510 }
1511 return m->sq_ass_item(s, i, (PyObject *)NULL);
1512 }
1513
1514 type_error("object doesn't support item deletion");
1515 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001516}
1517
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001518int
Fred Drake79912472000-07-09 04:06:11 +00001519PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001520{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001521 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001522 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001523
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001524 if (s == NULL) {
1525 null_error();
1526 return -1;
1527 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001528
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001529 m = s->ob_type->tp_as_sequence;
1530 if (m && m->sq_ass_slice) {
1531 if (i1 < 0 || i2 < 0) {
1532 if (m->sq_length) {
1533 int l = (*m->sq_length)(s);
1534 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001535 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536 if (i1 < 0)
1537 i1 += l;
1538 if (i2 < 0)
1539 i2 += l;
1540 }
1541 }
1542 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001543 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1544 int res;
1545 PyObject *slice = sliceobj_from_intint(i1, i2);
1546 if (!slice)
1547 return -1;
1548 res = mp->mp_ass_subscript(s, slice, o);
1549 Py_DECREF(slice);
1550 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001552
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001553 type_error("object doesn't support slice assignment");
1554 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001555}
1556
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001557int
Fred Drake79912472000-07-09 04:06:11 +00001558PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001559{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001561
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001562 if (s == NULL) {
1563 null_error();
1564 return -1;
1565 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001566
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001567 m = s->ob_type->tp_as_sequence;
1568 if (m && m->sq_ass_slice) {
1569 if (i1 < 0 || i2 < 0) {
1570 if (m->sq_length) {
1571 int l = (*m->sq_length)(s);
1572 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001573 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001574 if (i1 < 0)
1575 i1 += l;
1576 if (i2 < 0)
1577 i2 += l;
1578 }
1579 }
1580 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1581 }
1582 type_error("object doesn't support slice deletion");
1583 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001584}
1585
Guido van Rossume15dee51995-07-18 14:12:02 +00001586PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001587PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001588{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001589 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001590
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001591 if (v == NULL)
1592 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001593
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001594 if (PyTuple_Check(v)) {
1595 Py_INCREF(v);
1596 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001597 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001598
1599 if (PyList_Check(v))
1600 return PyList_AsTuple(v);
1601
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001602 /* There used to be code for strings here, but tuplifying strings is
1603 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001604
1605 /* Generic sequence object */
1606 m = v->ob_type->tp_as_sequence;
1607 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001608 int i;
1609 PyObject *t;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001610 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611 if (n < 0)
1612 return NULL;
1613 t = PyTuple_New(n);
1614 if (t == NULL)
1615 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001616 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001617 PyObject *item = (*m->sq_item)(v, i);
1618 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001619 if (PyErr_ExceptionMatches(PyExc_IndexError))
1620 PyErr_Clear();
1621 else {
1622 Py_DECREF(t);
1623 t = NULL;
1624 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001625 break;
1626 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001627 if (i >= n) {
1628 if (n < 500)
1629 n += 10;
1630 else
1631 n += 100;
1632 if (_PyTuple_Resize(&t, n, 0) != 0)
1633 break;
1634 }
1635 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001636 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001637 if (i < n && t != NULL)
1638 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639 return t;
1640 }
1641
1642 /* None of the above */
1643 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001644}
1645
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001646PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001647PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001648{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001649 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001650
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001651 if (v == NULL)
1652 return null_error();
1653
1654 if (PyList_Check(v))
1655 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1656
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657 m = v->ob_type->tp_as_sequence;
1658 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001659 int i;
1660 PyObject *l;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001661 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001662 if (n < 0)
1663 return NULL;
1664 l = PyList_New(n);
1665 if (l == NULL)
1666 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001667 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001668 PyObject *item = (*m->sq_item)(v, i);
1669 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001670 if (PyErr_ExceptionMatches(PyExc_IndexError))
1671 PyErr_Clear();
1672 else {
1673 Py_DECREF(l);
1674 l = NULL;
1675 }
1676 break;
1677 }
1678 if (i < n)
1679 PyList_SET_ITEM(l, i, item);
1680 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001681 Py_DECREF(l);
1682 l = NULL;
1683 break;
1684 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001685 }
1686 if (i < n && l != NULL) {
1687 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1688 Py_DECREF(l);
1689 l = NULL;
1690 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691 }
1692 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001693 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001694 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001695}
1696
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001697PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001698PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001699{
1700 if (v == NULL)
1701 return null_error();
1702
1703 if (PyList_Check(v) || PyTuple_Check(v)) {
1704 Py_INCREF(v);
1705 return v;
1706 }
1707
1708 v = PySequence_Tuple(v);
1709 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1710 return type_error(m);
1711
1712 return v;
1713}
1714
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001715int
Fred Drake79912472000-07-09 04:06:11 +00001716PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001717{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001718 int l, i, n, cmp, err;
1719 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001720
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001721 if (s == NULL || o == NULL) {
1722 null_error();
1723 return -1;
1724 }
1725
Jeremy Hylton6253f832000-07-12 12:56:19 +00001726 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001727 if (l < 0)
1728 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001729
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001730 n = 0;
1731 for (i = 0; i < l; i++) {
1732 item = PySequence_GetItem(s, i);
1733 if (item == NULL)
1734 return -1;
1735 err = PyObject_Cmp(item, o, &cmp);
1736 Py_DECREF(item);
1737 if (err < 0)
1738 return err;
1739 if (cmp == 0)
1740 n++;
1741 }
1742 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001743}
1744
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001745int
Fred Drake79912472000-07-09 04:06:11 +00001746PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001747{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001748 int i, cmp;
1749 PyObject *x;
1750 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001751
Guido van Rossum46c6b202000-02-28 15:01:46 +00001752 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1753 sq = w->ob_type->tp_as_sequence;
1754 if(sq != NULL && sq->sq_contains != NULL)
1755 return (*sq->sq_contains)(w, v);
1756 }
1757
1758 /* If there is no better way to check whether an item is is contained,
1759 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760 sq = w->ob_type->tp_as_sequence;
1761 if (sq == NULL || sq->sq_item == NULL) {
1762 PyErr_SetString(PyExc_TypeError,
1763 "'in' or 'not in' needs sequence right argument");
1764 return -1;
1765 }
1766
1767 for (i = 0; ; i++) {
1768 x = (*sq->sq_item)(w, i);
1769 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001770 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001771 PyErr_Clear();
1772 break;
1773 }
1774 return -1;
1775 }
1776 cmp = PyObject_Compare(v, x);
1777 Py_XDECREF(x);
1778 if (cmp == 0)
1779 return 1;
1780 if (PyErr_Occurred())
1781 return -1;
1782 }
1783
1784 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001785}
1786
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001787/* Backwards compatibility */
1788#undef PySequence_In
1789int
Fred Drake79912472000-07-09 04:06:11 +00001790PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001791{
1792 return PySequence_Contains(w, v);
1793}
1794
1795int
Fred Drake79912472000-07-09 04:06:11 +00001796PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001797{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001798 int l, i, cmp, err;
1799 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001800
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001801 if (s == NULL || o == NULL) {
1802 null_error();
1803 return -1;
1804 }
1805
Jeremy Hylton6253f832000-07-12 12:56:19 +00001806 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001807 if (l < 0)
1808 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001809
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001810 for (i = 0; i < l; i++) {
1811 item = PySequence_GetItem(s, i);
1812 if (item == NULL)
1813 return -1;
1814 err = PyObject_Cmp(item, o, &cmp);
1815 Py_DECREF(item);
1816 if (err < 0)
1817 return err;
1818 if (cmp == 0)
1819 return i;
1820 }
1821
1822 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1823 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001824}
1825
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001826/* Operations on mappings */
1827
1828int
Fred Drake79912472000-07-09 04:06:11 +00001829PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001830{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001832}
1833
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001835PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001836{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001837 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001838
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001839 if (o == NULL) {
1840 null_error();
1841 return -1;
1842 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 m = o->ob_type->tp_as_mapping;
1845 if (m && m->mp_length)
1846 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001847
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001848 type_error("len() of unsized object");
1849 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001850}
1851
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001852#undef PyMapping_Length
1853int
1854PyMapping_Length(PyObject *o)
1855{
1856 return PyMapping_Size(o);
1857}
1858#define PyMapping_Length PyMapping_Size
1859
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001860PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001861PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001862{
1863 PyObject *okey, *r;
1864
1865 if (key == NULL)
1866 return null_error();
1867
1868 okey = PyString_FromString(key);
1869 if (okey == NULL)
1870 return NULL;
1871 r = PyObject_GetItem(o, okey);
1872 Py_DECREF(okey);
1873 return r;
1874}
1875
1876int
Fred Drake79912472000-07-09 04:06:11 +00001877PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001878{
1879 PyObject *okey;
1880 int r;
1881
1882 if (key == NULL) {
1883 null_error();
1884 return -1;
1885 }
1886
1887 okey = PyString_FromString(key);
1888 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001889 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001890 r = PyObject_SetItem(o, okey, value);
1891 Py_DECREF(okey);
1892 return r;
1893}
1894
1895int
Fred Drake79912472000-07-09 04:06:11 +00001896PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001897{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001898 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001899
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001900 v = PyMapping_GetItemString(o, key);
1901 if (v) {
1902 Py_DECREF(v);
1903 return 1;
1904 }
1905 PyErr_Clear();
1906 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001907}
1908
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001909int
Fred Drake79912472000-07-09 04:06:11 +00001910PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001911{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001912 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001913
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001914 v = PyObject_GetItem(o, key);
1915 if (v) {
1916 Py_DECREF(v);
1917 return 1;
1918 }
1919 PyErr_Clear();
1920 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001921}
1922
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001923/* Operations on callable objects */
1924
1925/* XXX PyCallable_Check() is in object.c */
1926
Guido van Rossume15dee51995-07-18 14:12:02 +00001927PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001928PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001929{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001930 PyObject *r;
1931 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001932
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001933 if (args == NULL) {
1934 args = PyTuple_New(0);
1935 if (args == NULL)
1936 return NULL;
1937 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001938
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001939 r = PyEval_CallObject(o, args);
1940
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001941 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001942 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001943 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001944
1945 return r;
1946}
Guido van Rossume15dee51995-07-18 14:12:02 +00001947
1948PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001949PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001950{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001951 va_list va;
1952 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001953 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001954
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001955 if (callable == NULL) {
1956 va_end(va);
1957 return null_error();
1958 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001959
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001960 if (format)
1961 args = Py_VaBuildValue(format, va);
1962 else
1963 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001964
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001965 va_end(va);
1966
1967 if (args == NULL)
1968 return NULL;
1969
1970 if (!PyTuple_Check(args)) {
1971 PyObject *a;
1972
1973 a = PyTuple_New(1);
1974 if (a == NULL)
1975 return NULL;
1976 if (PyTuple_SetItem(a, 0, args) < 0)
1977 return NULL;
1978 args = a;
1979 }
1980 retval = PyObject_CallObject(callable, args);
1981
1982 Py_DECREF(args);
1983
1984 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001985}
1986
1987PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001988PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001989{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001990 va_list va;
1991 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001992 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001993
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001994 if (o == NULL || name == NULL) {
1995 va_end(va);
1996 return null_error();
1997 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001998
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001999 func = PyObject_GetAttrString(o, name);
2000 if (func == NULL) {
2001 va_end(va);
2002 PyErr_SetString(PyExc_AttributeError, name);
2003 return 0;
2004 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002005
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002006 if (!PyCallable_Check(func)) {
2007 va_end(va);
2008 return type_error("call of non-callable attribute");
2009 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002010
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002011 if (format && *format)
2012 args = Py_VaBuildValue(format, va);
2013 else
2014 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002015
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002016 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00002017
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002018 if (!args)
2019 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002020
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002021 if (!PyTuple_Check(args)) {
2022 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00002023
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002024 a = PyTuple_New(1);
2025 if (a == NULL)
2026 return NULL;
2027 if (PyTuple_SetItem(a, 0, args) < 0)
2028 return NULL;
2029 args = a;
2030 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002031
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002032 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002033
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002034 Py_DECREF(args);
2035 Py_DECREF(func);
2036
2037 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002038}