blob: 03049152aac72e51ebdf92a8db8973f4278b01dc [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;
815 } else if (HASINPLACE(v) && (v->ob_type->tp_as_sequence != NULL &&
816 (f = v->ob_type->tp_as_sequence->sq_inplace_concat) != NULL) ||
817 (v->ob_type->tp_as_number != NULL &&
818 (f = v->ob_type->tp_as_number->nb_inplace_add) != NULL))
819 return (*f)(v, w);
820
821 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
822
823 if (v->ob_type->tp_as_sequence != NULL &&
824 (f = v->ob_type->tp_as_sequence->sq_concat) != NULL)
825 return (*f)(v, w);
826 else if (v->ob_type->tp_as_number != NULL) {
827 if (PyNumber_Coerce(&v, &w) != 0)
828 return NULL;
829 if (v->ob_type->tp_as_number != NULL &&
830 (f = v->ob_type->tp_as_number->nb_add) != NULL)
831 x = (*f)(v, w);
832 Py_DECREF(v);
833 Py_DECREF(w);
834 if (f != NULL)
835 return x;
836 }
837
838 return type_error("bad operand type(s) for +=");
839}
840
841PyObject *
842PyNumber_InPlaceSubtract(PyObject *v, PyObject *w)
843{
844 PyObject * (*f)(PyObject *, PyObject *) = NULL;
845 PyObject *x;
846
847 if (PyInstance_Check(v)) {
848 if (PyInstance_HalfBinOp(v, w, "__isub__", &x,
849 PyNumber_Subtract, 0) <= 0)
850 return x;
851 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
852 (f = v->ob_type->tp_as_number->nb_inplace_subtract) != NULL)
853 return (*f)(v, w);
854
855 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
856
857 if (v->ob_type->tp_as_number != NULL) {
858 if (PyNumber_Coerce(&v, &w) != 0)
859 return NULL;
860 if (v->ob_type->tp_as_number != NULL &&
861 (f = v->ob_type->tp_as_number->nb_subtract) != NULL)
862 x = (*f)(v, w);
863 Py_DECREF(v);
864 Py_DECREF(w);
865 if (f != NULL)
866 return x;
867 }
868
869 return type_error("bad operand type(s) for -=");
870}
871
872PyObject *
873PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
874{
875 PyObject * (*f)(PyObject *, PyObject *) = NULL;
876 PyObject * (*f2)(PyObject *, int) = NULL;
877 PyObject *x;
878
879 if (PyInstance_Check(v)) {
880 if (PyInstance_HalfBinOp(v, w, "__imul__", &x,
881 PyNumber_Multiply, 0) <= 0)
882 return x;
883 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
884 (f = v->ob_type->tp_as_number->nb_inplace_multiply) != NULL)
885 return (*f)(v, w);
886 else if (v->ob_type->tp_as_sequence != NULL && HASINPLACE(v) &&
887 (f2 = v->ob_type->tp_as_sequence->sq_inplace_repeat) != NULL) {
888 long mul_value;
889
890 if (PyInt_Check(w)) {
891 mul_value = PyInt_AsLong(w);
892 }
893 else if (PyLong_Check(w)) {
894 mul_value = PyLong_AsLong(w);
895 if (mul_value == -1 && PyErr_Occurred())
896 return NULL;
897 }
898 else {
899 return type_error(
900 "can't multiply sequence with non-int");
901 }
902 return (*f2)(v, (int)mul_value);
903 }
904 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
905
906/* if (tp->tp_as_number != NULL &&
907 w->ob_type->tp_as_sequence != NULL) { */
908 /* number*sequence -- swap v and w */
909/* PyObject *tmp = v;
910 v = w;
911 w = tmp;
912 tp = v->ob_type;
913 } */
914 if (v->ob_type->tp_as_number != NULL) {
915 if (PyNumber_Coerce(&v, &w) != 0)
916 return NULL;
917 if (v->ob_type->tp_as_number != NULL &&
918 (f = v->ob_type->tp_as_number->nb_multiply) != NULL)
919 x = (*f)(v, w);
920 Py_DECREF(v);
921 Py_DECREF(w);
922 if (f != NULL)
923 return x;
924 } else if (v->ob_type->tp_as_sequence != NULL &&
925 (f2 = v->ob_type->tp_as_sequence->sq_repeat) != NULL) {
926 long mul_value;
927
928 if (PyInt_Check(w)) {
929 mul_value = PyInt_AsLong(w);
930 }
931 else if (PyLong_Check(w)) {
932 mul_value = PyLong_AsLong(w);
933 if (mul_value == -1 && PyErr_Occurred())
934 return NULL;
935 }
936 else {
937 return type_error(
938 "can't multiply sequence with non-int");
939 }
940 return (*f2)(v, (int)mul_value);
941 }
942 return type_error("bad operand type(s) for *=");
943}
944
945PyObject *
946PyNumber_InPlaceDivide(PyObject *v, PyObject *w)
947{
948 PyObject * (*f)(PyObject *, PyObject *) = NULL;
949 PyObject *x;
950
951 if (PyInstance_Check(v)) {
952 if (PyInstance_HalfBinOp(v, w, "__idiv__", &x,
953 PyNumber_Divide, 0) <= 0)
954 return x;
955 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
956 (f = v->ob_type->tp_as_number->nb_inplace_divide) != NULL)
957 return (*f)(v, w);
958
959 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
960
961 if (v->ob_type->tp_as_number != NULL) {
962 if (PyNumber_Coerce(&v, &w) != 0)
963 return NULL;
964 if (v->ob_type->tp_as_number != NULL &&
965 (f = v->ob_type->tp_as_number->nb_divide) != NULL)
966 x = (*f)(v, w);
967 Py_DECREF(v);
968 Py_DECREF(w);
969 if (f != NULL)
970 return x;
971 }
972
973 return type_error("bad operand type(s) for /=");
974}
975
976PyObject *
977PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
978{
979 PyObject * (*f)(PyObject *, PyObject *) = NULL;
980 PyObject *x;
981
982 if (PyInstance_Check(v)) {
983 if (PyInstance_HalfBinOp(v, w, "__imod__", &x,
984 PyNumber_Remainder, 0) <= 0)
985 return x;
986 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
987 (f = v->ob_type->tp_as_number->nb_inplace_remainder) != NULL)
988 return (*f)(v, w);
989
990 if (PyString_Check(v))
991 return PyString_Format(v, w);
992 else if (PyUnicode_Check(v))
993 return PyUnicode_Format(v, w);
994
995 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
996
997 if (v->ob_type->tp_as_number != NULL) {
998 if (PyNumber_Coerce(&v, &w) != 0)
999 return NULL;
1000 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
1001 x = (*f)(v, w);
1002 Py_DECREF(v);
1003 Py_DECREF(w);
1004 if (f != NULL)
1005 return x;
1006 }
1007
1008 return type_error("bad operand type(s) for %=");
1009}
1010
1011
1012/* In-place Power (binary or ternary, for API consistency) */
1013
1014static PyObject *
1015do_inplace_pow(PyObject *v, PyObject *w)
1016{
1017 PyObject * (*f)(PyObject *, PyObject *, PyObject *) = NULL;
1018 PyObject *x;
1019
1020 if (PyInstance_Check(v)) {
1021 if (PyInstance_HalfBinOp(v, w, "__ipow__", &x, do_pow, 0) <= 0)
1022 return x;
1023 } else if (v->ob_type->tp_as_number != NULL && HASINPLACE(v) &&
1024 (f = v->ob_type->tp_as_number->nb_inplace_power) != NULL)
1025 return (*f)(v, w, Py_None);
1026
1027 BINOP(v, w, "__pow__", "__rpow__", do_pow);
1028
1029 if (v->ob_type->tp_as_number == NULL ||
1030 w->ob_type->tp_as_number == NULL) {
1031 return type_error("bad operand type(s) for **=");
1032 }
1033 if (PyNumber_Coerce(&v, &w) != 0)
1034 return NULL;
1035 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
1036 x = (*f)(v, w, Py_None);
1037 else
1038 x = type_error("bad operand type(s) for **=");
1039 Py_DECREF(v);
1040 Py_DECREF(w);
1041 return x;
1042}
1043
1044PyObject *
1045PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1046{
1047 PyObject *res;
1048 PyObject *v1, *z1, *w2, *z2, *oldv;
1049 PyObject * (*f)(PyObject *, PyObject *, PyObject *);
1050
1051 if (z == Py_None)
1052 return do_inplace_pow(v, w);
1053 /* XXX The ternary version doesn't do class instance coercions */
1054 if (PyInstance_Check(v))
1055 return v->ob_type->tp_as_number->nb_inplace_power(v, w, z);
1056 if (v->ob_type->tp_as_number == NULL ||
1057 z->ob_type->tp_as_number == NULL ||
1058 w->ob_type->tp_as_number == NULL) {
1059 return type_error("(inplace) pow(x, y, z) requires numeric arguments");
1060 }
1061 oldv = v;
1062 Py_INCREF(oldv);
1063 res = NULL;
1064 if (PyNumber_Coerce(&v, &w) != 0)
1065 goto error3;
1066 v1 = v;
1067 z1 = z;
1068 if (PyNumber_Coerce(&v1, &z1) != 0)
1069 goto error2;
1070 w2 = w;
1071 z2 = z1;
1072 if (PyNumber_Coerce(&w2, &z2) != 0)
1073 goto error1;
1074 if (oldv == v1 && HASINPLACE(v1) && v->ob_type->tp_as_number != NULL &&
1075 (f = v1->ob_type->tp_as_number->nb_inplace_power) != NULL)
1076 res = (*f)(v1, w2, z2);
1077 else if (v1->ob_type->tp_as_number != NULL &&
1078 (f = v1->ob_type->tp_as_number->nb_power) != NULL)
1079 res = (*f)(v1, w2, z2);
1080 else
1081 res = type_error(
1082 "(inplace) pow(x, y, z) not defined for these operands");
1083 Py_DECREF(w2);
1084 Py_DECREF(z2);
1085 error1:
1086 Py_DECREF(v1);
1087 Py_DECREF(z1);
1088 error2:
1089 Py_DECREF(v);
1090 Py_DECREF(w);
1091 error3:
1092 Py_DECREF(oldv);
1093 return res;
1094}
1095
1096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001098
1099PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001100PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001101{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001102 PyNumberMethods *m;
1103
1104 if (o == NULL)
1105 return null_error();
1106 m = o->ob_type->tp_as_number;
1107 if (m && m->nb_negative)
1108 return (*m->nb_negative)(o);
1109
1110 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +00001111}
1112
1113PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001114PyNumber_Positive(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_positive)
1122 return (*m->nb_positive)(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_Invert(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_invert)
1136 return (*m->nb_invert)(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_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001143{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001145
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001146 if (o == NULL)
1147 return null_error();
1148 m = o->ob_type->tp_as_number;
1149 if (m && m->nb_absolute)
1150 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001151
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001153}
1154
Guido van Rossum9e896b32000-04-05 20:11:21 +00001155/* Add a check for embedded NULL-bytes in the argument. */
1156static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001157int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +00001158{
1159 char *end;
1160 PyObject *x;
1161
1162 x = PyInt_FromString((char*)s, &end, 10);
1163 if (x == NULL)
1164 return NULL;
1165 if (end != s + len) {
1166 PyErr_SetString(PyExc_ValueError,
1167 "null byte in argument for int()");
1168 Py_DECREF(x);
1169 return NULL;
1170 }
1171 return x;
1172}
1173
Guido van Rossume15dee51995-07-18 14:12:02 +00001174PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001175PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001176{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001177 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001178 const char *buffer;
1179 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001180
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 if (o == NULL)
1182 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001183 if (PyInt_Check(o)) {
1184 Py_INCREF(o);
1185 return o;
1186 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001187 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001188 return int_from_string(PyString_AS_STRING(o),
1189 PyString_GET_SIZE(o));
1190 if (PyUnicode_Check(o))
1191 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1192 PyUnicode_GET_SIZE(o),
1193 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194 m = o->ob_type->tp_as_number;
1195 if (m && m->nb_int)
1196 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001197 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001198 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001199
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001200 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +00001201}
1202
Guido van Rossum9e896b32000-04-05 20:11:21 +00001203/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001204static PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001205long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001206{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001207 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001208 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001209
Guido van Rossum4c08d552000-03-10 22:55:18 +00001210 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001211 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001212 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001213 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001214 PyErr_SetString(PyExc_ValueError,
1215 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001216 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001217 return NULL;
1218 }
1219 return x;
1220}
1221
Guido van Rossume15dee51995-07-18 14:12:02 +00001222PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001223PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001224{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001225 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001226 const char *buffer;
1227 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001228
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001229 if (o == NULL)
1230 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001231 if (PyLong_Check(o)) {
1232 Py_INCREF(o);
1233 return o;
1234 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001236 /* need to do extra error checking that PyLong_FromString()
1237 * doesn't do. In particular long('9.5') must raise an
1238 * exception, not truncate the float.
1239 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001240 return long_from_string(PyString_AS_STRING(o),
1241 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +00001242 if (PyUnicode_Check(o))
1243 /* The above check is done in PyLong_FromUnicode(). */
1244 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1245 PyUnicode_GET_SIZE(o),
1246 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 m = o->ob_type->tp_as_number;
1248 if (m && m->nb_long)
1249 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001250 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1251 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001252
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001253 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +00001254}
1255
1256PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001257PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001258{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001260
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001261 if (o == NULL)
1262 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +00001263 if (PyFloat_Check(o)) {
1264 Py_INCREF(o);
1265 return o;
1266 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001267 if (!PyString_Check(o)) {
1268 m = o->ob_type->tp_as_number;
1269 if (m && m->nb_float)
1270 return m->nb_float(o);
1271 }
1272 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001273}
1274
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001275/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001276
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001277int
Fred Drake79912472000-07-09 04:06:11 +00001278PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001279{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001280 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +00001281}
1282
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001284PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001285{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001286 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001287
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001288 if (s == NULL) {
1289 null_error();
1290 return -1;
1291 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001292
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001293 m = s->ob_type->tp_as_sequence;
1294 if (m && m->sq_length)
1295 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 type_error("len() of unsized object");
1298 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001299}
1300
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001301#undef PySequence_Length
1302int
1303PySequence_Length(PyObject *s)
1304{
1305 return PySequence_Size(s);
1306}
1307#define PySequence_Length PySequence_Size
1308
Guido van Rossume15dee51995-07-18 14:12:02 +00001309PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001310PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001311{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001313
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001314 if (s == NULL || o == NULL)
1315 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001316
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001317 m = s->ob_type->tp_as_sequence;
1318 if (m && m->sq_concat)
1319 return m->sq_concat(s, o);
1320
1321 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001322}
1323
1324PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001325PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001326{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001327 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001328
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001329 if (o == NULL)
1330 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001331
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001332 m = o->ob_type->tp_as_sequence;
1333 if (m && m->sq_repeat)
1334 return m->sq_repeat(o, count);
1335
1336 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001337}
1338
1339PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001340PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1341{
1342 PySequenceMethods *m;
1343
1344 if (s == NULL || o == NULL)
1345 return null_error();
1346
1347 m = s->ob_type->tp_as_sequence;
1348 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1349 return m->sq_inplace_concat(s, o);
1350 if (m && m->sq_concat)
1351 return m->sq_concat(s, o);
1352
1353 return type_error("object can't be concatenated");
1354}
1355
1356PyObject *
1357PySequence_InPlaceRepeat(PyObject *o, int count)
1358{
1359 PySequenceMethods *m;
1360
1361 if (o == NULL)
1362 return null_error();
1363
1364 m = o->ob_type->tp_as_sequence;
1365 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1366 return m->sq_inplace_repeat(o, count);
1367 if (m && m->sq_repeat)
1368 return m->sq_repeat(o, count);
1369
1370 return type_error("object can't be repeated");
1371}
1372
1373PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001374PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001375{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001376 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001377
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001378 if (s == NULL)
1379 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001380
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001381 m = s->ob_type->tp_as_sequence;
1382 if (m && m->sq_item) {
1383 if (i < 0) {
1384 if (m->sq_length) {
1385 int l = (*m->sq_length)(s);
1386 if (l < 0)
1387 return NULL;
1388 i += l;
1389 }
1390 }
1391 return m->sq_item(s, i);
1392 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001393
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001394 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001395}
1396
Thomas Wouters1d75a792000-08-17 22:37:32 +00001397static PyObject *
1398sliceobj_from_intint(int i, int j)
1399{
1400 PyObject *start, *end, *slice;
1401 start = PyInt_FromLong((long)i);
1402 if (!start)
1403 return NULL;
1404 end = PyInt_FromLong((long)j);
1405 if (!end) {
1406 Py_DECREF(start);
1407 return NULL;
1408 }
1409 slice = PySlice_New(start, end, NULL);
1410 Py_DECREF(start);
1411 Py_DECREF(end);
1412 return slice;
1413}
1414
Guido van Rossume15dee51995-07-18 14:12:02 +00001415PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001416PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001417{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001418 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001419 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001420
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001421 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001422
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 m = s->ob_type->tp_as_sequence;
1424 if (m && m->sq_slice) {
1425 if (i1 < 0 || i2 < 0) {
1426 if (m->sq_length) {
1427 int l = (*m->sq_length)(s);
1428 if (l < 0)
1429 return NULL;
1430 if (i1 < 0)
1431 i1 += l;
1432 if (i2 < 0)
1433 i2 += l;
1434 }
1435 }
1436 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001437 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1438 PyObject *res;
1439 PyObject *slice = sliceobj_from_intint(i1, i2);
1440 if (!slice)
1441 return NULL;
1442 res = mp->mp_subscript(s, slice);
1443 Py_DECREF(slice);
1444 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001446
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001447 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001448}
1449
1450int
Fred Drake79912472000-07-09 04:06:11 +00001451PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001452{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001454
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 if (s == NULL) {
1456 null_error();
1457 return -1;
1458 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001459
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 m = s->ob_type->tp_as_sequence;
1461 if (m && m->sq_ass_item) {
1462 if (i < 0) {
1463 if (m->sq_length) {
1464 int l = (*m->sq_length)(s);
1465 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001466 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 i += l;
1468 }
1469 }
1470 return m->sq_ass_item(s, i, o);
1471 }
1472
1473 type_error("object doesn't support item assignment");
1474 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001475}
1476
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001477int
Fred Drake79912472000-07-09 04:06:11 +00001478PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001479{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001480 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001481
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001482 if (s == NULL) {
1483 null_error();
1484 return -1;
1485 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001486
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001487 m = s->ob_type->tp_as_sequence;
1488 if (m && m->sq_ass_item) {
1489 if (i < 0) {
1490 if (m->sq_length) {
1491 int l = (*m->sq_length)(s);
1492 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001493 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 i += l;
1495 }
1496 }
1497 return m->sq_ass_item(s, i, (PyObject *)NULL);
1498 }
1499
1500 type_error("object doesn't support item deletion");
1501 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001502}
1503
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001504int
Fred Drake79912472000-07-09 04:06:11 +00001505PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001506{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001507 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001508 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001509
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001510 if (s == NULL) {
1511 null_error();
1512 return -1;
1513 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001514
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001515 m = s->ob_type->tp_as_sequence;
1516 if (m && m->sq_ass_slice) {
1517 if (i1 < 0 || i2 < 0) {
1518 if (m->sq_length) {
1519 int l = (*m->sq_length)(s);
1520 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001521 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001522 if (i1 < 0)
1523 i1 += l;
1524 if (i2 < 0)
1525 i2 += l;
1526 }
1527 }
1528 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001529 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1530 int res;
1531 PyObject *slice = sliceobj_from_intint(i1, i2);
1532 if (!slice)
1533 return -1;
1534 res = mp->mp_ass_subscript(s, slice, o);
1535 Py_DECREF(slice);
1536 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001537 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001538
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001539 type_error("object doesn't support slice assignment");
1540 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001541}
1542
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001543int
Fred Drake79912472000-07-09 04:06:11 +00001544PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001545{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001546 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001547
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001548 if (s == NULL) {
1549 null_error();
1550 return -1;
1551 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001552
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001553 m = s->ob_type->tp_as_sequence;
1554 if (m && m->sq_ass_slice) {
1555 if (i1 < 0 || i2 < 0) {
1556 if (m->sq_length) {
1557 int l = (*m->sq_length)(s);
1558 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001559 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001560 if (i1 < 0)
1561 i1 += l;
1562 if (i2 < 0)
1563 i2 += l;
1564 }
1565 }
1566 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1567 }
1568 type_error("object doesn't support slice deletion");
1569 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001570}
1571
Guido van Rossume15dee51995-07-18 14:12:02 +00001572PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001573PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001574{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001575 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001576
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001577 if (v == NULL)
1578 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001579
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001580 if (PyTuple_Check(v)) {
1581 Py_INCREF(v);
1582 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001583 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001584
1585 if (PyList_Check(v))
1586 return PyList_AsTuple(v);
1587
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001588 /* There used to be code for strings here, but tuplifying strings is
1589 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001590
1591 /* Generic sequence object */
1592 m = v->ob_type->tp_as_sequence;
1593 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001594 int i;
1595 PyObject *t;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001596 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001597 if (n < 0)
1598 return NULL;
1599 t = PyTuple_New(n);
1600 if (t == NULL)
1601 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001602 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001603 PyObject *item = (*m->sq_item)(v, i);
1604 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001605 if (PyErr_ExceptionMatches(PyExc_IndexError))
1606 PyErr_Clear();
1607 else {
1608 Py_DECREF(t);
1609 t = NULL;
1610 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611 break;
1612 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001613 if (i >= n) {
1614 if (n < 500)
1615 n += 10;
1616 else
1617 n += 100;
1618 if (_PyTuple_Resize(&t, n, 0) != 0)
1619 break;
1620 }
1621 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001622 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001623 if (i < n && t != NULL)
1624 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001625 return t;
1626 }
1627
1628 /* None of the above */
1629 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001630}
1631
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001632PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001633PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001634{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001636
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001637 if (v == NULL)
1638 return null_error();
1639
1640 if (PyList_Check(v))
1641 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1642
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001643 m = v->ob_type->tp_as_sequence;
1644 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001645 int i;
1646 PyObject *l;
Jeremy Hylton6253f832000-07-12 12:56:19 +00001647 int n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648 if (n < 0)
1649 return NULL;
1650 l = PyList_New(n);
1651 if (l == NULL)
1652 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001653 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001654 PyObject *item = (*m->sq_item)(v, i);
1655 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001656 if (PyErr_ExceptionMatches(PyExc_IndexError))
1657 PyErr_Clear();
1658 else {
1659 Py_DECREF(l);
1660 l = NULL;
1661 }
1662 break;
1663 }
1664 if (i < n)
1665 PyList_SET_ITEM(l, i, item);
1666 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001667 Py_DECREF(l);
1668 l = NULL;
1669 break;
1670 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001671 }
1672 if (i < n && l != NULL) {
1673 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1674 Py_DECREF(l);
1675 l = NULL;
1676 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001677 }
1678 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001679 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001680 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001681}
1682
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001683PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001684PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001685{
1686 if (v == NULL)
1687 return null_error();
1688
1689 if (PyList_Check(v) || PyTuple_Check(v)) {
1690 Py_INCREF(v);
1691 return v;
1692 }
1693
1694 v = PySequence_Tuple(v);
1695 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1696 return type_error(m);
1697
1698 return v;
1699}
1700
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001701int
Fred Drake79912472000-07-09 04:06:11 +00001702PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001703{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704 int l, i, n, cmp, err;
1705 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001706
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001707 if (s == NULL || o == NULL) {
1708 null_error();
1709 return -1;
1710 }
1711
Jeremy Hylton6253f832000-07-12 12:56:19 +00001712 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001713 if (l < 0)
1714 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001715
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001716 n = 0;
1717 for (i = 0; i < l; i++) {
1718 item = PySequence_GetItem(s, i);
1719 if (item == NULL)
1720 return -1;
1721 err = PyObject_Cmp(item, o, &cmp);
1722 Py_DECREF(item);
1723 if (err < 0)
1724 return err;
1725 if (cmp == 0)
1726 n++;
1727 }
1728 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001729}
1730
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001731int
Fred Drake79912472000-07-09 04:06:11 +00001732PySequence_Contains(PyObject *w, PyObject *v) /* v in w */
Guido van Rossume15dee51995-07-18 14:12:02 +00001733{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001734 int i, cmp;
1735 PyObject *x;
1736 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001737
Guido van Rossum46c6b202000-02-28 15:01:46 +00001738 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1739 sq = w->ob_type->tp_as_sequence;
1740 if(sq != NULL && sq->sq_contains != NULL)
1741 return (*sq->sq_contains)(w, v);
1742 }
1743
1744 /* If there is no better way to check whether an item is is contained,
1745 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001746 sq = w->ob_type->tp_as_sequence;
1747 if (sq == NULL || sq->sq_item == NULL) {
1748 PyErr_SetString(PyExc_TypeError,
1749 "'in' or 'not in' needs sequence right argument");
1750 return -1;
1751 }
1752
1753 for (i = 0; ; i++) {
1754 x = (*sq->sq_item)(w, i);
1755 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001756 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001757 PyErr_Clear();
1758 break;
1759 }
1760 return -1;
1761 }
1762 cmp = PyObject_Compare(v, x);
1763 Py_XDECREF(x);
1764 if (cmp == 0)
1765 return 1;
1766 if (PyErr_Occurred())
1767 return -1;
1768 }
1769
1770 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001771}
1772
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001773/* Backwards compatibility */
1774#undef PySequence_In
1775int
Fred Drake79912472000-07-09 04:06:11 +00001776PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001777{
1778 return PySequence_Contains(w, v);
1779}
1780
1781int
Fred Drake79912472000-07-09 04:06:11 +00001782PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001783{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001784 int l, i, cmp, err;
1785 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001786
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001787 if (s == NULL || o == NULL) {
1788 null_error();
1789 return -1;
1790 }
1791
Jeremy Hylton6253f832000-07-12 12:56:19 +00001792 l = PySequence_Size(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001793 if (l < 0)
1794 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001795
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001796 for (i = 0; i < l; i++) {
1797 item = PySequence_GetItem(s, i);
1798 if (item == NULL)
1799 return -1;
1800 err = PyObject_Cmp(item, o, &cmp);
1801 Py_DECREF(item);
1802 if (err < 0)
1803 return err;
1804 if (cmp == 0)
1805 return i;
1806 }
1807
1808 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1809 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001810}
1811
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001812/* Operations on mappings */
1813
1814int
Fred Drake79912472000-07-09 04:06:11 +00001815PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001816{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001817 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001818}
1819
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001820int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001821PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001822{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001823 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001824
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001825 if (o == NULL) {
1826 null_error();
1827 return -1;
1828 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001830 m = o->ob_type->tp_as_mapping;
1831 if (m && m->mp_length)
1832 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001833
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834 type_error("len() of unsized object");
1835 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001836}
1837
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001838#undef PyMapping_Length
1839int
1840PyMapping_Length(PyObject *o)
1841{
1842 return PyMapping_Size(o);
1843}
1844#define PyMapping_Length PyMapping_Size
1845
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001846PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001847PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001848{
1849 PyObject *okey, *r;
1850
1851 if (key == NULL)
1852 return null_error();
1853
1854 okey = PyString_FromString(key);
1855 if (okey == NULL)
1856 return NULL;
1857 r = PyObject_GetItem(o, okey);
1858 Py_DECREF(okey);
1859 return r;
1860}
1861
1862int
Fred Drake79912472000-07-09 04:06:11 +00001863PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001864{
1865 PyObject *okey;
1866 int r;
1867
1868 if (key == NULL) {
1869 null_error();
1870 return -1;
1871 }
1872
1873 okey = PyString_FromString(key);
1874 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001875 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001876 r = PyObject_SetItem(o, okey, value);
1877 Py_DECREF(okey);
1878 return r;
1879}
1880
1881int
Fred Drake79912472000-07-09 04:06:11 +00001882PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001883{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001884 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001885
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001886 v = PyMapping_GetItemString(o, key);
1887 if (v) {
1888 Py_DECREF(v);
1889 return 1;
1890 }
1891 PyErr_Clear();
1892 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001893}
1894
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001895int
Fred Drake79912472000-07-09 04:06:11 +00001896PyMapping_HasKey(PyObject *o, PyObject *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 = PyObject_GetItem(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 +00001909/* Operations on callable objects */
1910
1911/* XXX PyCallable_Check() is in object.c */
1912
Guido van Rossume15dee51995-07-18 14:12:02 +00001913PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001914PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001915{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001916 PyObject *r;
1917 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001918
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001919 if (args == NULL) {
1920 args = PyTuple_New(0);
1921 if (args == NULL)
1922 return NULL;
1923 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001924
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001925 r = PyEval_CallObject(o, args);
1926
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001927 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001928 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001929 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001930
1931 return r;
1932}
Guido van Rossume15dee51995-07-18 14:12:02 +00001933
1934PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001935PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001936{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001937 va_list va;
1938 PyObject *args, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001939 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001940
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001941 if (callable == NULL) {
1942 va_end(va);
1943 return null_error();
1944 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001945
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001946 if (format)
1947 args = Py_VaBuildValue(format, va);
1948 else
1949 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001950
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001951 va_end(va);
1952
1953 if (args == NULL)
1954 return NULL;
1955
1956 if (!PyTuple_Check(args)) {
1957 PyObject *a;
1958
1959 a = PyTuple_New(1);
1960 if (a == NULL)
1961 return NULL;
1962 if (PyTuple_SetItem(a, 0, args) < 0)
1963 return NULL;
1964 args = a;
1965 }
1966 retval = PyObject_CallObject(callable, args);
1967
1968 Py_DECREF(args);
1969
1970 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001971}
1972
1973PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001974PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001975{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001976 va_list va;
1977 PyObject *args, *func = 0, *retval;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001978 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001979
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001980 if (o == NULL || name == NULL) {
1981 va_end(va);
1982 return null_error();
1983 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001984
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001985 func = PyObject_GetAttrString(o, name);
1986 if (func == NULL) {
1987 va_end(va);
1988 PyErr_SetString(PyExc_AttributeError, name);
1989 return 0;
1990 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001991
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001992 if (!PyCallable_Check(func)) {
1993 va_end(va);
1994 return type_error("call of non-callable attribute");
1995 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001996
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001997 if (format && *format)
1998 args = Py_VaBuildValue(format, va);
1999 else
2000 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002001
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002002 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00002003
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002004 if (!args)
2005 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002006
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002007 if (!PyTuple_Check(args)) {
2008 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00002009
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002010 a = PyTuple_New(1);
2011 if (a == NULL)
2012 return NULL;
2013 if (PyTuple_SetItem(a, 0, args) < 0)
2014 return NULL;
2015 args = a;
2016 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002017
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002018 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002019
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002020 Py_DECREF(args);
2021 Py_DECREF(func);
2022
2023 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002024}