blob: e3492ec06f6f618f406cfd30f16a8578808e6ec6 [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;
654 PyObject *x;
655
656 if (PyInstance_Check(v)) {
657 if (PyInstance_HalfBinOp(v, w, "__ior__", &x, PyNumber_Or,
658 0) <= 0)
659 return x;
660 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
661 (f = v->ob_type->tp_as_number->nb_inplace_or) != NULL)
662 return (*f)(v, w);
663
664 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
665
666 if (v->ob_type->tp_as_number != NULL) {
667 if (PyNumber_Coerce(&v, &w) != 0)
668 return NULL;
669 if (v->ob_type->tp_as_number != NULL &&
670 (f = v->ob_type->tp_as_number->nb_or) != NULL)
671 x = (*f)(v, w);
672 Py_DECREF(v);
673 Py_DECREF(w);
674 if (f != NULL)
675 return x;
676 }
677
678 return type_error("bad operand type(s) for |=");
679}
680
681PyObject *
682PyNumber_InPlaceXor(PyObject *v, PyObject *w)
683{
684 PyObject * (*f)(PyObject *, PyObject *) = NULL;
685 PyObject *x;
686
687 if (PyInstance_Check(v)) {
688 if (PyInstance_HalfBinOp(v, w, "__ixor__", &x, PyNumber_Xor,
689 0) <= 0)
690 return x;
691 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
692 (f = v->ob_type->tp_as_number->nb_inplace_xor) != NULL)
693 return (*f)(v, w);
694
695 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
696
697 if (v->ob_type->tp_as_number != NULL) {
698 if (PyNumber_Coerce(&v, &w) != 0)
699 return NULL;
700 if (v->ob_type->tp_as_number != NULL &&
701 (f = v->ob_type->tp_as_number->nb_xor) != NULL)
702 x = (*f)(v, w);
703 Py_DECREF(v);
704 Py_DECREF(w);
705 if (f != NULL)
706 return x;
707 }
708
709 return type_error("bad operand type(s) for ^=");
710}
711
712PyObject *
713PyNumber_InPlaceAnd(PyObject *v, PyObject *w)
714{
715 PyObject * (*f)(PyObject *, PyObject *) = NULL;
716 PyObject *x;
717
718 if (PyInstance_Check(v)) {
719 if (PyInstance_HalfBinOp(v, w, "__iand__", &x, PyNumber_And,
720 0) <= 0)
721 return x;
722 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
723 (f = v->ob_type->tp_as_number->nb_inplace_and) != NULL)
724 return (*f)(v, w);
725
726 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
727
728 if (v->ob_type->tp_as_number != NULL) {
729 if (PyNumber_Coerce(&v, &w) != 0)
730 return NULL;
731 if (v->ob_type->tp_as_number != NULL &&
732 (f = v->ob_type->tp_as_number->nb_and) != NULL)
733 x = (*f)(v, w);
734 Py_DECREF(v);
735 Py_DECREF(w);
736 if (f != NULL)
737 return x;
738 }
739
740 return type_error("bad operand type(s) for &=");
741}
742
743PyObject *
744PyNumber_InPlaceLshift(PyObject *v, PyObject *w)
745{
746 PyObject * (*f)(PyObject *, PyObject *) = NULL;
747 PyObject *x;
748
749 if (PyInstance_Check(v)) {
750 if (PyInstance_HalfBinOp(v, w, "__ilshift__", &x,
751 PyNumber_Lshift, 0) <= 0)
752 return x;
753 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
754 (f = v->ob_type->tp_as_number->nb_inplace_lshift) != NULL)
755 return (*f)(v, w);
756
757 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
758
759 if (v->ob_type->tp_as_number != NULL) {
760 if (PyNumber_Coerce(&v, &w) != 0)
761 return NULL;
762 if (v->ob_type->tp_as_number != NULL &&
763 (f = v->ob_type->tp_as_number->nb_lshift) != NULL)
764 x = (*f)(v, w);
765 Py_DECREF(v);
766 Py_DECREF(w);
767 if (f != NULL)
768 return x;
769 }
770
771 return type_error("bad operand type(s) for <<=");
772}
773
774PyObject *
775PyNumber_InPlaceRshift(PyObject *v, PyObject *w)
776{
777 PyObject * (*f)(PyObject *, PyObject *) = NULL;
778 PyObject *x;
779
780 if (PyInstance_Check(v)) {
781 if (PyInstance_HalfBinOp(v, w, "__irshift__", &x,
782 PyNumber_Rshift, 0) <= 0)
783 return x;
784 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
785 (f = v->ob_type->tp_as_number->nb_inplace_rshift) != NULL)
786 return (*f)(v, w);
787
788 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
789
790 if (v->ob_type->tp_as_number != NULL) {
791 if (PyNumber_Coerce(&v, &w) != 0)
792 return NULL;
793 if (v->ob_type->tp_as_number != NULL &&
794 (f = v->ob_type->tp_as_number->nb_rshift) != NULL)
795 x = (*f)(v, w);
796 Py_DECREF(v);
797 Py_DECREF(w);
798 if (f != NULL)
799 return x;
800 }
801
802 return type_error("bad operand type(s) for >>=");
803}
804
805PyObject *
806PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
807{
808 PyObject * (*f)(PyObject *, PyObject *) = NULL;
809 PyObject *x;
810
811 if (PyInstance_Check(v)) {
812 if (PyInstance_HalfBinOp(v, w, "__iadd__", &x,
813 PyNumber_Add, 0) <= 0)
814 return x;
Fred Drake562f62a2000-08-31 05:15:44 +0000815 }
816 else if ((HASINPLACE(v)
817 && (v->ob_type->tp_as_sequence != NULL &&
818 (f = v->ob_type->tp_as_sequence->sq_inplace_concat) != NULL))
819 || (v->ob_type->tp_as_number != NULL &&
820 (f = v->ob_type->tp_as_number->nb_inplace_add) != NULL))
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000821 return (*f)(v, w);
822
823 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
824
825 if (v->ob_type->tp_as_sequence != NULL &&
826 (f = v->ob_type->tp_as_sequence->sq_concat) != NULL)
827 return (*f)(v, w);
828 else if (v->ob_type->tp_as_number != NULL) {
829 if (PyNumber_Coerce(&v, &w) != 0)
830 return NULL;
831 if (v->ob_type->tp_as_number != NULL &&
832 (f = v->ob_type->tp_as_number->nb_add) != NULL)
833 x = (*f)(v, w);
834 Py_DECREF(v);
835 Py_DECREF(w);
836 if (f != NULL)
837 return x;
838 }
839
840 return type_error("bad operand type(s) for +=");
841}
842
843PyObject *
844PyNumber_InPlaceSubtract(PyObject *v, PyObject *w)
845{
846 PyObject * (*f)(PyObject *, PyObject *) = NULL;
847 PyObject *x;
848
849 if (PyInstance_Check(v)) {
850 if (PyInstance_HalfBinOp(v, w, "__isub__", &x,
851 PyNumber_Subtract, 0) <= 0)
852 return x;
853 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
854 (f = v->ob_type->tp_as_number->nb_inplace_subtract) != NULL)
855 return (*f)(v, w);
856
857 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
858
859 if (v->ob_type->tp_as_number != NULL) {
860 if (PyNumber_Coerce(&v, &w) != 0)
861 return NULL;
862 if (v->ob_type->tp_as_number != NULL &&
863 (f = v->ob_type->tp_as_number->nb_subtract) != NULL)
864 x = (*f)(v, w);
865 Py_DECREF(v);
866 Py_DECREF(w);
867 if (f != NULL)
868 return x;
869 }
870
871 return type_error("bad operand type(s) for -=");
872}
873
874PyObject *
875PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
876{
877 PyObject * (*f)(PyObject *, PyObject *) = NULL;
878 PyObject * (*f2)(PyObject *, int) = NULL;
879 PyObject *x;
880
881 if (PyInstance_Check(v)) {
882 if (PyInstance_HalfBinOp(v, w, "__imul__", &x,
883 PyNumber_Multiply, 0) <= 0)
884 return x;
885 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
886 (f = v->ob_type->tp_as_number->nb_inplace_multiply) != NULL)
887 return (*f)(v, w);
888 else if (v->ob_type->tp_as_sequence != NULL && HASINPLACE(v) &&
889 (f2 = v->ob_type->tp_as_sequence->sq_inplace_repeat) != NULL) {
890 long mul_value;
891
892 if (PyInt_Check(w)) {
893 mul_value = PyInt_AsLong(w);
894 }
895 else if (PyLong_Check(w)) {
896 mul_value = PyLong_AsLong(w);
897 if (mul_value == -1 && PyErr_Occurred())
898 return NULL;
899 }
900 else {
901 return type_error(
902 "can't multiply sequence with non-int");
903 }
904 return (*f2)(v, (int)mul_value);
905 }
906 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
907
908/* if (tp->tp_as_number != NULL &&
909 w->ob_type->tp_as_sequence != NULL) { */
910 /* number*sequence -- swap v and w */
911/* PyObject *tmp = v;
912 v = w;
913 w = tmp;
914 tp = v->ob_type;
915 } */
916 if (v->ob_type->tp_as_number != NULL) {
917 if (PyNumber_Coerce(&v, &w) != 0)
918 return NULL;
919 if (v->ob_type->tp_as_number != NULL &&
920 (f = v->ob_type->tp_as_number->nb_multiply) != NULL)
921 x = (*f)(v, w);
922 Py_DECREF(v);
923 Py_DECREF(w);
924 if (f != NULL)
925 return x;
926 } else if (v->ob_type->tp_as_sequence != NULL &&
927 (f2 = v->ob_type->tp_as_sequence->sq_repeat) != NULL) {
928 long mul_value;
929
930 if (PyInt_Check(w)) {
931 mul_value = PyInt_AsLong(w);
932 }
933 else if (PyLong_Check(w)) {
934 mul_value = PyLong_AsLong(w);
935 if (mul_value == -1 && PyErr_Occurred())
936 return NULL;
937 }
938 else {
939 return type_error(
940 "can't multiply sequence with non-int");
941 }
942 return (*f2)(v, (int)mul_value);
943 }
944 return type_error("bad operand type(s) for *=");
945}
946
947PyObject *
948PyNumber_InPlaceDivide(PyObject *v, PyObject *w)
949{
950 PyObject * (*f)(PyObject *, PyObject *) = NULL;
951 PyObject *x;
952
953 if (PyInstance_Check(v)) {
954 if (PyInstance_HalfBinOp(v, w, "__idiv__", &x,
955 PyNumber_Divide, 0) <= 0)
956 return x;
957 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
958 (f = v->ob_type->tp_as_number->nb_inplace_divide) != NULL)
959 return (*f)(v, w);
960
961 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
962
963 if (v->ob_type->tp_as_number != NULL) {
964 if (PyNumber_Coerce(&v, &w) != 0)
965 return NULL;
966 if (v->ob_type->tp_as_number != NULL &&
967 (f = v->ob_type->tp_as_number->nb_divide) != NULL)
968 x = (*f)(v, w);
969 Py_DECREF(v);
970 Py_DECREF(w);
971 if (f != NULL)
972 return x;
973 }
974
975 return type_error("bad operand type(s) for /=");
976}
977
978PyObject *
979PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
980{
981 PyObject * (*f)(PyObject *, PyObject *) = NULL;
982 PyObject *x;
983
984 if (PyInstance_Check(v)) {
985 if (PyInstance_HalfBinOp(v, w, "__imod__", &x,
986 PyNumber_Remainder, 0) <= 0)
987 return x;
988 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
989 (f = v->ob_type->tp_as_number->nb_inplace_remainder) != NULL)
990 return (*f)(v, w);
991
992 if (PyString_Check(v))
993 return PyString_Format(v, w);
994 else if (PyUnicode_Check(v))
995 return PyUnicode_Format(v, w);
996
997 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
998
999 if (v->ob_type->tp_as_number != NULL) {
1000 if (PyNumber_Coerce(&v, &w) != 0)
1001 return NULL;
1002 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
1003 x = (*f)(v, w);
1004 Py_DECREF(v);
1005 Py_DECREF(w);
1006 if (f != NULL)
1007 return x;
1008 }
1009
1010 return type_error("bad operand type(s) for %=");
1011}
1012
1013
1014/* In-place Power (binary or ternary, for API consistency) */
1015
1016static PyObject *
1017do_inplace_pow(PyObject *v, PyObject *w)
1018{
1019 PyObject * (*f)(PyObject *, PyObject *, PyObject *) = NULL;
1020 PyObject *x;
1021
1022 if (PyInstance_Check(v)) {
1023 if (PyInstance_HalfBinOp(v, w, "__ipow__", &x, do_pow, 0) <= 0)
1024 return x;
1025 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
1026 (f = v->ob_type->tp_as_number->nb_inplace_power) != NULL)
1027 return (*f)(v, w, Py_None);
1028
1029 BINOP(v, w, "__pow__", "__rpow__", do_pow);
1030
1031 if (v->ob_type->tp_as_number == NULL ||
1032 w->ob_type->tp_as_number == NULL) {
1033 return type_error("bad operand type(s) for **=");
1034 }
1035 if (PyNumber_Coerce(&v, &w) != 0)
1036 return NULL;
1037 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
1038 x = (*f)(v, w, Py_None);
1039 else
1040 x = type_error("bad operand type(s) for **=");
1041 Py_DECREF(v);
1042 Py_DECREF(w);
1043 return x;
1044}
1045
1046PyObject *
1047PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1048{
1049 PyObject *res;
1050 PyObject *v1, *z1, *w2, *z2, *oldv;
1051 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
1052
1053 if (z == Py_None)
1054 return do_inplace_pow(v, w);
1055 /* XXX The ternary version doesn't do class instance coercions */
1056 if (PyInstance_Check(v))
1057 return v->ob_type->tp_as_number->nb_inplace_power(v, w, z);
1058 if (v->ob_type->tp_as_number == NULL ||
1059 z->ob_type->tp_as_number == NULL ||
1060 w->ob_type->tp_as_number == NULL) {
1061 return type_error("(inplace) pow(x, y, z) requires numeric arguments");
1062 }
1063 oldv = v;
1064 Py_INCREF(oldv);
1065 res = NULL;
1066 if (PyNumber_Coerce(&v, &w) != 0)
1067 goto error3;
1068 v1 = v;
1069 z1 = z;
1070 if (PyNumber_Coerce(&v1, &z1) != 0)
1071 goto error2;
1072 w2 = w;
1073 z2 = z1;
1074 if (PyNumber_Coerce(&w2, &z2) != 0)
1075 goto error1;
1076 if (oldv == v1 && HASINPLACE(v1) && v->ob_type->tp_as_number != NULL &&
1077 (f = v1->ob_type->tp_as_number->nb_inplace_power) != NULL)
1078 res = (*f)(v1, w2, z2);
1079 else if (v1->ob_type->tp_as_number != NULL &&
1080 (f = v1->ob_type->tp_as_number->nb_power) != NULL)
1081 res = (*f)(v1, w2, z2);
1082 else
1083 res = type_error(
1084 "(inplace) pow(x, y, z) not defined for these operands");
1085 Py_DECREF(w2);
1086 Py_DECREF(z2);
1087 error1:
1088 Py_DECREF(v1);
1089 Py_DECREF(z1);
1090 error2:
1091 Py_DECREF(v);
1092 Py_DECREF(w);
1093 error3:
1094 Py_DECREF(oldv);
1095 return res;
1096}
1097
1098
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001100
1101PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001102PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001103{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001104 PyNumberMethods *m;
1105
1106 if (o == NULL)
1107 return null_error();
1108 m = o->ob_type->tp_as_number;
1109 if (m && m->nb_negative)
1110 return (*m->nb_negative)(o);
1111
1112 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +00001113}
1114
1115PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001116PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001117{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001118 PyNumberMethods *m;
1119
1120 if (o == NULL)
1121 return null_error();
1122 m = o->ob_type->tp_as_number;
1123 if (m && m->nb_positive)
1124 return (*m->nb_positive)(o);
1125
1126 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +00001127}
1128
1129PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001130PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001131{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 PyNumberMethods *m;
1133
1134 if (o == NULL)
1135 return null_error();
1136 m = o->ob_type->tp_as_number;
1137 if (m && m->nb_invert)
1138 return (*m->nb_invert)(o);
1139
1140 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +00001141}
1142
1143PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001144PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001145{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001146 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001147
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001148 if (o == NULL)
1149 return null_error();
1150 m = o->ob_type->tp_as_number;
1151 if (m && m->nb_absolute)
1152 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001153
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001155}
1156
Guido van Rossum9e896b32000-04-05 20:11:21 +00001157/* Add a check for embedded NULL-bytes in the argument. */
1158static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001159int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001160{
1161 char *end;
1162 PyObject *x;
1163
1164 x = PyInt_FromString((char*)s, &end, 10);
1165 if (x == NULL)
1166 return NULL;
1167 if (end != s + len) {
1168 PyErr_SetString(PyExc_ValueError,
1169 "null byte in argument for int()");
1170 Py_DECREF(x);
1171 return NULL;
1172 }
1173 return x;
1174}
1175
Guido van Rossume15dee51995-07-18 14:12:02 +00001176PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001177PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001178{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001179 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001180 const char *buffer;
1181 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001182
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001183 if (o == NULL)
1184 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001185 if (PyInt_Check(o)) {
1186 Py_INCREF(o);
1187 return o;
1188 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001190 return int_from_string(PyString_AS_STRING(o),
1191 PyString_GET_SIZE(o));
1192 if (PyUnicode_Check(o))
1193 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1194 PyUnicode_GET_SIZE(o),
1195 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001196 m = o->ob_type->tp_as_number;
1197 if (m && m->nb_int)
1198 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001199 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001200 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001201
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +00001203}
1204
Guido van Rossum9e896b32000-04-05 20:11:21 +00001205/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001206static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001207long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001208{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001209 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001210 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001211
Guido van Rossum4c08d552000-03-10 22:55:18 +00001212 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001213 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001214 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001215 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001216 PyErr_SetString(PyExc_ValueError,
1217 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001218 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001219 return NULL;
1220 }
1221 return x;
1222}
1223
Guido van Rossume15dee51995-07-18 14:12:02 +00001224PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001225PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001226{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001228 const char *buffer;
1229 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001230
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001231 if (o == NULL)
1232 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001233 if (PyLong_Check(o)) {
1234 Py_INCREF(o);
1235 return o;
1236 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001238 /* need to do extra error checking that PyLong_FromString()
1239 * doesn't do. In particular long('9.5') must raise an
1240 * exception, not truncate the float.
1241 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001242 return long_from_string(PyString_AS_STRING(o),
1243 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +00001244 if (PyUnicode_Check(o))
1245 /* The above check is done in PyLong_FromUnicode(). */
1246 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1247 PyUnicode_GET_SIZE(o),
1248 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001249 m = o->ob_type->tp_as_number;
1250 if (m && m->nb_long)
1251 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001252 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1253 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001254
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001255 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +00001256}
1257
1258PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001259PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001260{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001262
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263 if (o == NULL)
1264 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001265 if (PyFloat_Check(o)) {
1266 Py_INCREF(o);
1267 return o;
1268 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001269 if (!PyString_Check(o)) {
1270 m = o->ob_type->tp_as_number;
1271 if (m && m->nb_float)
1272 return m->nb_float(o);
1273 }
1274 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001275}
1276
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001277/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001278
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279int
Fred Drake79912472000-07-09 04:06:11 +00001280PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001281{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001282 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +00001283}
1284
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001285int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001286PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001287{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001288 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001289
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 if (s == NULL) {
1291 null_error();
1292 return -1;
1293 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001294
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001295 m = s->ob_type->tp_as_sequence;
1296 if (m && m->sq_length)
1297 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001298
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299 type_error("len() of unsized object");
1300 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001301}
1302
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001303#undef PySequence_Length
1304int
1305PySequence_Length(PyObject *s)
1306{
1307 return PySequence_Size(s);
1308}
1309#define PySequence_Length PySequence_Size
1310
Guido van Rossume15dee51995-07-18 14:12:02 +00001311PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001312PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001313{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001314 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001315
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001316 if (s == NULL || o == NULL)
1317 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001318
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 m = s->ob_type->tp_as_sequence;
1320 if (m && m->sq_concat)
1321 return m->sq_concat(s, o);
1322
1323 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001324}
1325
1326PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001327PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001328{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001329 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 if (o == NULL)
1332 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001333
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001334 m = o->ob_type->tp_as_sequence;
1335 if (m && m->sq_repeat)
1336 return m->sq_repeat(o, count);
1337
1338 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001339}
1340
1341PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001342PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1343{
1344 PySequenceMethods *m;
1345
1346 if (s == NULL || o == NULL)
1347 return null_error();
1348
1349 m = s->ob_type->tp_as_sequence;
1350 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1351 return m->sq_inplace_concat(s, o);
1352 if (m && m->sq_concat)
1353 return m->sq_concat(s, o);
1354
1355 return type_error("object can't be concatenated");
1356}
1357
1358PyObject *
1359PySequence_InPlaceRepeat(PyObject *o, int count)
1360{
1361 PySequenceMethods *m;
1362
1363 if (o == NULL)
1364 return null_error();
1365
1366 m = o->ob_type->tp_as_sequence;
1367 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1368 return m->sq_inplace_repeat(o, count);
1369 if (m && m->sq_repeat)
1370 return m->sq_repeat(o, count);
1371
1372 return type_error("object can't be repeated");
1373}
1374
1375PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001376PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001377{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001378 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001379
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001380 if (s == NULL)
1381 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001382
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001383 m = s->ob_type->tp_as_sequence;
1384 if (m && m->sq_item) {
1385 if (i < 0) {
1386 if (m->sq_length) {
1387 int l = (*m->sq_length)(s);
1388 if (l < 0)
1389 return NULL;
1390 i += l;
1391 }
1392 }
1393 return m->sq_item(s, i);
1394 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001395
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001396 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001397}
1398
Thomas Wouters1d75a792000-08-17 22:37:32 +00001399static PyObject *
1400sliceobj_from_intint(int i, int j)
1401{
1402 PyObject *start, *end, *slice;
1403 start = PyInt_FromLong((long)i);
1404 if (!start)
1405 return NULL;
1406 end = PyInt_FromLong((long)j);
1407 if (!end) {
1408 Py_DECREF(start);
1409 return NULL;
1410 }
1411 slice = PySlice_New(start, end, NULL);
1412 Py_DECREF(start);
1413 Py_DECREF(end);
1414 return slice;
1415}
1416
Guido van Rossume15dee51995-07-18 14:12:02 +00001417PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001418PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001419{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001420 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001421 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001422
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001424
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001425 m = s->ob_type->tp_as_sequence;
1426 if (m && m->sq_slice) {
1427 if (i1 < 0 || i2 < 0) {
1428 if (m->sq_length) {
1429 int l = (*m->sq_length)(s);
1430 if (l < 0)
1431 return NULL;
1432 if (i1 < 0)
1433 i1 += l;
1434 if (i2 < 0)
1435 i2 += l;
1436 }
1437 }
1438 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001439 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1440 PyObject *res;
1441 PyObject *slice = sliceobj_from_intint(i1, i2);
1442 if (!slice)
1443 return NULL;
1444 res = mp->mp_subscript(s, slice);
1445 Py_DECREF(slice);
1446 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001447 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001448
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001449 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001450}
1451
1452int
Fred Drake79912472000-07-09 04:06:11 +00001453PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001454{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001456
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457 if (s == NULL) {
1458 null_error();
1459 return -1;
1460 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001461
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462 m = s->ob_type->tp_as_sequence;
1463 if (m && m->sq_ass_item) {
1464 if (i < 0) {
1465 if (m->sq_length) {
1466 int l = (*m->sq_length)(s);
1467 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001468 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001469 i += l;
1470 }
1471 }
1472 return m->sq_ass_item(s, i, o);
1473 }
1474
1475 type_error("object doesn't support item assignment");
1476 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001477}
1478
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001479int
Fred Drake79912472000-07-09 04:06:11 +00001480PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001481{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001482 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001483
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484 if (s == NULL) {
1485 null_error();
1486 return -1;
1487 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001488
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001489 m = s->ob_type->tp_as_sequence;
1490 if (m && m->sq_ass_item) {
1491 if (i < 0) {
1492 if (m->sq_length) {
1493 int l = (*m->sq_length)(s);
1494 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001495 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001496 i += l;
1497 }
1498 }
1499 return m->sq_ass_item(s, i, (PyObject *)NULL);
1500 }
1501
1502 type_error("object doesn't support item deletion");
1503 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001504}
1505
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001506int
Fred Drake79912472000-07-09 04:06:11 +00001507PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001508{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001509 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001510 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001511
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001512 if (s == NULL) {
1513 null_error();
1514 return -1;
1515 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001516
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001517 m = s->ob_type->tp_as_sequence;
1518 if (m && m->sq_ass_slice) {
1519 if (i1 < 0 || i2 < 0) {
1520 if (m->sq_length) {
1521 int l = (*m->sq_length)(s);
1522 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001523 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001524 if (i1 < 0)
1525 i1 += l;
1526 if (i2 < 0)
1527 i2 += l;
1528 }
1529 }
1530 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001531 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1532 int res;
1533 PyObject *slice = sliceobj_from_intint(i1, i2);
1534 if (!slice)
1535 return -1;
1536 res = mp->mp_ass_subscript(s, slice, o);
1537 Py_DECREF(slice);
1538 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001539 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001540
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001541 type_error("object doesn't support slice assignment");
1542 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001543}
1544
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001545int
Fred Drake79912472000-07-09 04:06:11 +00001546PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001547{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001548 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001549
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001550 if (s == NULL) {
1551 null_error();
1552 return -1;
1553 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001554
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001555 m = s->ob_type->tp_as_sequence;
1556 if (m && m->sq_ass_slice) {
1557 if (i1 < 0 || i2 < 0) {
1558 if (m->sq_length) {
1559 int l = (*m->sq_length)(s);
1560 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001561 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001562 if (i1 < 0)
1563 i1 += l;
1564 if (i2 < 0)
1565 i2 += l;
1566 }
1567 }
1568 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1569 }
1570 type_error("object doesn't support slice deletion");
1571 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001572}
1573
Guido van Rossume15dee51995-07-18 14:12:02 +00001574PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001575PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001576{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001577 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001578
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001579 if (v == NULL)
1580 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001581
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001582 if (PyTuple_Check(v)) {
1583 Py_INCREF(v);
1584 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001585 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001586
1587 if (PyList_Check(v))
1588 return PyList_AsTuple(v);
1589
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001590 /* There used to be code for strings here, but tuplifying strings is
1591 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001592
1593 /* Generic sequence object */
1594 m = v->ob_type->tp_as_sequence;
1595 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001596 int i;
1597 PyObject *t;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001598 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001599 if (n < 0)
1600 return NULL;
1601 t = PyTuple_New(n);
1602 if (t == NULL)
1603 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001604 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001605 PyObject *item = (*m->sq_item)(v, i);
1606 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001607 if (PyErr_ExceptionMatches(PyExc_IndexError))
1608 PyErr_Clear();
1609 else {
1610 Py_DECREF(t);
1611 t = NULL;
1612 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001613 break;
1614 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001615 if (i >= n) {
1616 if (n < 500)
1617 n += 10;
1618 else
1619 n += 100;
1620 if (_PyTuple_Resize(&t, n, 0) != 0)
1621 break;
1622 }
1623 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001624 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001625 if (i < n && t != NULL)
1626 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001627 return t;
1628 }
1629
1630 /* None of the above */
1631 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001632}
1633
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001634PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001635PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001636{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001637 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001638
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001639 if (v == NULL)
1640 return null_error();
1641
1642 if (PyList_Check(v))
1643 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1644
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001645 m = v->ob_type->tp_as_sequence;
1646 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001647 int i;
1648 PyObject *l;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001649 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001650 if (n < 0)
1651 return NULL;
1652 l = PyList_New(n);
1653 if (l == NULL)
1654 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001655 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001656 PyObject *item = (*m->sq_item)(v, i);
1657 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001658 if (PyErr_ExceptionMatches(PyExc_IndexError))
1659 PyErr_Clear();
1660 else {
1661 Py_DECREF(l);
1662 l = NULL;
1663 }
1664 break;
1665 }
1666 if (i < n)
1667 PyList_SET_ITEM(l, i, item);
1668 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001669 Py_DECREF(l);
1670 l = NULL;
1671 break;
1672 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001673 }
1674 if (i < n && l != NULL) {
1675 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1676 Py_DECREF(l);
1677 l = NULL;
1678 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001679 }
1680 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001681 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001682 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001683}
1684
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001685PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001686PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001687{
1688 if (v == NULL)
1689 return null_error();
1690
1691 if (PyList_Check(v) || PyTuple_Check(v)) {
1692 Py_INCREF(v);
1693 return v;
1694 }
1695
1696 v = PySequence_Tuple(v);
1697 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1698 return type_error(m);
1699
1700 return v;
1701}
1702
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001703int
Fred Drake79912472000-07-09 04:06:11 +00001704PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001705{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001706 int l, i, n, cmp, err;
1707 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001708
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001709 if (s == NULL || o == NULL) {
1710 null_error();
1711 return -1;
1712 }
1713
Jeremy Hylton6253f832000-07-12 12:56:19 +00001714 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001715 if (l < 0)
1716 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001717
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001718 n = 0;
1719 for (i = 0; i < l; i++) {
1720 item = PySequence_GetItem(s, i);
1721 if (item == NULL)
1722 return -1;
1723 err = PyObject_Cmp(item, o, &cmp);
1724 Py_DECREF(item);
1725 if (err < 0)
1726 return err;
1727 if (cmp == 0)
1728 n++;
1729 }
1730 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001731}
1732
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001733int
Fred Drake79912472000-07-09 04:06:11 +00001734PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001735{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001736 int i, cmp;
1737 PyObject *x;
1738 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001739
Guido van Rossum46c6b202000-02-28 15:01:46 +00001740 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1741 sq = w->ob_type->tp_as_sequence;
1742 if(sq != NULL && sq->sq_contains != NULL)
1743 return (*sq->sq_contains)(w, v);
1744 }
1745
1746 /* If there is no better way to check whether an item is is contained,
1747 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001748 sq = w->ob_type->tp_as_sequence;
1749 if (sq == NULL || sq->sq_item == NULL) {
1750 PyErr_SetString(PyExc_TypeError,
1751 "'in' or 'not in' needs sequence right argument");
1752 return -1;
1753 }
1754
1755 for (i = 0; ; i++) {
1756 x = (*sq->sq_item)(w, i);
1757 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001758 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001759 PyErr_Clear();
1760 break;
1761 }
1762 return -1;
1763 }
1764 cmp = PyObject_Compare(v, x);
1765 Py_XDECREF(x);
1766 if (cmp == 0)
1767 return 1;
1768 if (PyErr_Occurred())
1769 return -1;
1770 }
1771
1772 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001773}
1774
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001775/* Backwards compatibility */
1776#undef PySequence_In
1777int
Fred Drake79912472000-07-09 04:06:11 +00001778PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001779{
1780 return PySequence_Contains(w, v);
1781}
1782
1783int
Fred Drake79912472000-07-09 04:06:11 +00001784PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001785{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001786 int l, i, cmp, err;
1787 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001788
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001789 if (s == NULL || o == NULL) {
1790 null_error();
1791 return -1;
1792 }
1793
Jeremy Hylton6253f832000-07-12 12:56:19 +00001794 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001795 if (l < 0)
1796 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001797
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001798 for (i = 0; i < l; i++) {
1799 item = PySequence_GetItem(s, i);
1800 if (item == NULL)
1801 return -1;
1802 err = PyObject_Cmp(item, o, &cmp);
1803 Py_DECREF(item);
1804 if (err < 0)
1805 return err;
1806 if (cmp == 0)
1807 return i;
1808 }
1809
1810 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1811 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001812}
1813
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001814/* Operations on mappings */
1815
1816int
Fred Drake79912472000-07-09 04:06:11 +00001817PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001818{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001819 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001820}
1821
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001822int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001823PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001824{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001825 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001826
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001827 if (o == NULL) {
1828 null_error();
1829 return -1;
1830 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001831
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001832 m = o->ob_type->tp_as_mapping;
1833 if (m && m->mp_length)
1834 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001835
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001836 type_error("len() of unsized object");
1837 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001838}
1839
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001840#undef PyMapping_Length
1841int
1842PyMapping_Length(PyObject *o)
1843{
1844 return PyMapping_Size(o);
1845}
1846#define PyMapping_Length PyMapping_Size
1847
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001848PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001849PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001850{
1851 PyObject *okey, *r;
1852
1853 if (key == NULL)
1854 return null_error();
1855
1856 okey = PyString_FromString(key);
1857 if (okey == NULL)
1858 return NULL;
1859 r = PyObject_GetItem(o, okey);
1860 Py_DECREF(okey);
1861 return r;
1862}
1863
1864int
Fred Drake79912472000-07-09 04:06:11 +00001865PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001866{
1867 PyObject *okey;
1868 int r;
1869
1870 if (key == NULL) {
1871 null_error();
1872 return -1;
1873 }
1874
1875 okey = PyString_FromString(key);
1876 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001877 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001878 r = PyObject_SetItem(o, okey, value);
1879 Py_DECREF(okey);
1880 return r;
1881}
1882
1883int
Fred Drake79912472000-07-09 04:06:11 +00001884PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001885{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001886 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001887
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001888 v = PyMapping_GetItemString(o, key);
1889 if (v) {
1890 Py_DECREF(v);
1891 return 1;
1892 }
1893 PyErr_Clear();
1894 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001895}
1896
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001897int
Fred Drake79912472000-07-09 04:06:11 +00001898PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001899{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001900 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001901
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001902 v = PyObject_GetItem(o, key);
1903 if (v) {
1904 Py_DECREF(v);
1905 return 1;
1906 }
1907 PyErr_Clear();
1908 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001909}
1910
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001911/* Operations on callable objects */
1912
1913/* XXX PyCallable_Check() is in object.c */
1914
Guido van Rossume15dee51995-07-18 14:12:02 +00001915PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001916PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001917{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001918 PyObject *r;
1919 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001920
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001921 if (args == NULL) {
1922 args = PyTuple_New(0);
1923 if (args == NULL)
1924 return NULL;
1925 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001926
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001927 r = PyEval_CallObject(o, args);
1928
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001929 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001930 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001931 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001932
1933 return r;
1934}
Guido van Rossume15dee51995-07-18 14:12:02 +00001935
1936PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001937PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001938{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001939 va_list va;
1940 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001941 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001942
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001943 if (callable == NULL) {
1944 va_end(va);
1945 return null_error();
1946 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001947
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001948 if (format)
1949 args = Py_VaBuildValue(format, va);
1950 else
1951 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001952
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001953 va_end(va);
1954
1955 if (args == NULL)
1956 return NULL;
1957
1958 if (!PyTuple_Check(args)) {
1959 PyObject *a;
1960
1961 a = PyTuple_New(1);
1962 if (a == NULL)
1963 return NULL;
1964 if (PyTuple_SetItem(a, 0, args) < 0)
1965 return NULL;
1966 args = a;
1967 }
1968 retval = PyObject_CallObject(callable, args);
1969
1970 Py_DECREF(args);
1971
1972 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001973}
1974
1975PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001976PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001977{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001978 va_list va;
1979 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001980 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001981
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001982 if (o == NULL || name == NULL) {
1983 va_end(va);
1984 return null_error();
1985 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001986
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001987 func = PyObject_GetAttrString(o, name);
1988 if (func == NULL) {
1989 va_end(va);
1990 PyErr_SetString(PyExc_AttributeError, name);
1991 return 0;
1992 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001993
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001994 if (!PyCallable_Check(func)) {
1995 va_end(va);
1996 return type_error("call of non-callable attribute");
1997 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001998
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001999 if (format && *format)
2000 args = Py_VaBuildValue(format, va);
2001 else
2002 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002003
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002004 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00002005
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002006 if (!args)
2007 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002008
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002009 if (!PyTuple_Check(args)) {
2010 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00002011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002012 a = PyTuple_New(1);
2013 if (a == NULL)
2014 return NULL;
2015 if (PyTuple_SetItem(a, 0, args) < 0)
2016 return NULL;
2017 args = a;
2018 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002019
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002020 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002021
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002022 Py_DECREF(args);
2023 Py_DECREF(func);
2024
2025 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002026}