blob: 7202b437d750fc6b3e8ef3396402482e3a37fe22 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossume15dee51995-07-18 14:12:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossume15dee51995-07-18 14:12:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossume15dee51995-07-18 14:12:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossume15dee51995-07-18 14:12:02 +000029
30******************************************************************/
31
32/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033
Guido van Rossume15dee51995-07-18 14:12:02 +000034#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +000035#include <ctype.h>
Guido van Rossume15dee51995-07-18 14:12:02 +000036
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000037/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000038
39static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000040type_error(msg)
41 char *msg;
Guido van Rossume15dee51995-07-18 14:12:02 +000042{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000043 PyErr_SetString(PyExc_TypeError, msg);
44 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000045}
46
Guido van Rossum052b7e11996-11-11 15:08:19 +000047static PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000048null_error()
Guido van Rossume15dee51995-07-18 14:12:02 +000049{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000050 if (!PyErr_Occurred())
51 PyErr_SetString(PyExc_SystemError,
52 "null argument to internal routine");
53 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000054}
55
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000056/* Operations on any object */
57
58int
59PyObject_Cmp(o1, o2, result)
60 PyObject *o1;
61 PyObject *o2;
62 int *result;
63{
64 int r;
65
66 if (o1 == NULL || o2 == NULL) {
67 null_error();
68 return -1;
69 }
70 r = PyObject_Compare(o1, o2);
71 if (PyErr_Occurred())
72 return -1;
73 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000074 return 0;
75}
Guido van Rossume15dee51995-07-18 14:12:02 +000076
77PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000078PyObject_Type(o)
79 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000080{
81 PyObject *v;
82
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000083 if (o == NULL)
84 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000085 v = (PyObject *)o->ob_type;
86 Py_INCREF(v);
87 return v;
88}
89
90int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000091PyObject_Length(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000092 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000093{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000094 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000096 if (o == NULL) {
97 null_error();
98 return -1;
99 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000100
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000101 m = o->ob_type->tp_as_sequence;
102 if (m && m->sq_length)
103 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000104
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000105 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000106}
107
108PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000109PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000110 PyObject *o;
111 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000112{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000113 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 if (o == NULL || key == NULL)
116 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000118 m = o->ob_type->tp_as_mapping;
119 if (m && m->mp_subscript)
120 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000121
Guido van Rossum21308241998-08-13 16:44:44 +0000122 if (o->ob_type->tp_as_sequence) {
123 if (PyInt_Check(key))
124 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000125 else if (PyLong_Check(key)) {
126 long key_value = PyLong_AsLong(key);
127 if (key_value == -1 && PyErr_Occurred())
128 return NULL;
129 return PySequence_GetItem(o, key_value);
130 }
Guido van Rossum21308241998-08-13 16:44:44 +0000131 return type_error("sequence index must be integer");
132 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133
134 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000135}
136
137int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000138PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139 PyObject *o;
140 PyObject *key;
141 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000142{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000143 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000144
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000145 if (o == NULL || key == NULL || value == NULL) {
146 null_error();
147 return -1;
148 }
149 m = o->ob_type->tp_as_mapping;
150 if (m && m->mp_ass_subscript)
151 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000152
Guido van Rossum21308241998-08-13 16:44:44 +0000153 if (o->ob_type->tp_as_sequence) {
154 if (PyInt_Check(key))
155 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000156 else if (PyLong_Check(key)) {
157 long key_value = PyLong_AsLong(key);
158 if (key_value == -1 && PyErr_Occurred())
159 return -1;
160 return PySequence_SetItem(o, key_value, value);
161 }
Guido van Rossum21308241998-08-13 16:44:44 +0000162 type_error("sequence index must be integer");
163 return -1;
164 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000165
166 type_error("object does not support item assignment");
167 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000168}
169
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000170int
171PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000172 PyObject *o;
173 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000175 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000176
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000177 if (o == NULL || key == NULL) {
178 null_error();
179 return -1;
180 }
181 m = o->ob_type->tp_as_mapping;
182 if (m && m->mp_ass_subscript)
183 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000184
Guido van Rossum21308241998-08-13 16:44:44 +0000185 if (o->ob_type->tp_as_sequence) {
186 if (PyInt_Check(key))
187 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000188 else if (PyLong_Check(key)) {
189 long key_value = PyLong_AsLong(key);
190 if (key_value == -1 && PyErr_Occurred())
191 return -1;
192 return PySequence_DelItem(o, key_value);
193 }
Guido van Rossum21308241998-08-13 16:44:44 +0000194 type_error("sequence index must be integer");
195 return -1;
196 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000197
198 type_error("object does not support item deletion");
199 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000200}
201
Guido van Rossum4c08d552000-03-10 22:55:18 +0000202int PyObject_AsCharBuffer(PyObject *obj,
203 const char **buffer,
204 int *buffer_len)
205{
206 PyBufferProcs *pb;
207 const char *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_getcharbuffer == NULL ||
217 pb->bf_getsegcount == NULL ) {
218 PyErr_SetString(PyExc_TypeError,
219 "expected a character 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_getcharbuffer)(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_AsReadBuffer(PyObject *obj,
239 const 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_getreadbuffer == NULL ||
253 pb->bf_getsegcount == NULL ) {
254 PyErr_SetString(PyExc_TypeError,
255 "expected a readable 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_getreadbuffer)(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
274int PyObject_AsWriteBuffer(PyObject *obj,
275 void **buffer,
276 int *buffer_len)
277{
278 PyBufferProcs *pb;
279 void*pp;
280 int len;
281
282 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
283 null_error();
284 return -1;
285 }
286 pb = obj->ob_type->tp_as_buffer;
287 if ( pb == NULL ||
288 pb->bf_getwritebuffer == NULL ||
289 pb->bf_getsegcount == NULL ) {
290 PyErr_SetString(PyExc_TypeError,
291 "expected a writeable buffer object");
292 goto onError;
293 }
294 if ( (*pb->bf_getsegcount)(obj,NULL) != 1 ) {
295 PyErr_SetString(PyExc_TypeError,
296 "expected a single-segment buffer object");
297 goto onError;
298 }
299 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
300 if (len < 0)
301 goto onError;
302 *buffer = pp;
303 *buffer_len = len;
304 return 0;
305
306 onError:
307 return -1;
308}
309
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000310/* Operations on numbers */
311
312int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000313PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000314 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000315{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000316 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000317}
318
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000319/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000320
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000321#define BINOP(v, w, opname, ropname, thisfunc) \
322 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000323 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
324
325PyObject *
326PyNumber_Or(v, w)
327 PyObject *v, *w;
328{
329 extern int PyNumber_Coerce();
330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000331 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
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;
Guido van Rossume15dee51995-07-18 14:12:02 +0000334 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
335 if (PyNumber_Coerce(&v, &w) != 0)
336 return NULL;
337 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
338 x = (*f)(v, w);
339 Py_DECREF(v);
340 Py_DECREF(w);
341 if (f != NULL)
342 return x;
343 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000344 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000345}
346
347PyObject *
348PyNumber_Xor(v, w)
349 PyObject *v, *w;
350{
351 extern int PyNumber_Coerce();
352
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000353 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000354 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000355 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000356 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
357 if (PyNumber_Coerce(&v, &w) != 0)
358 return NULL;
359 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
360 x = (*f)(v, w);
361 Py_DECREF(v);
362 Py_DECREF(w);
363 if (f != NULL)
364 return x;
365 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000366 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000367}
368
369PyObject *
370PyNumber_And(v, w)
371 PyObject *v, *w;
372{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000373 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000374 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000375 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000376 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
377 if (PyNumber_Coerce(&v, &w) != 0)
378 return NULL;
379 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
380 x = (*f)(v, w);
381 Py_DECREF(v);
382 Py_DECREF(w);
383 if (f != NULL)
384 return x;
385 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000386 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000387}
388
389PyObject *
390PyNumber_Lshift(v, w)
391 PyObject *v, *w;
392{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000393 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000394 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000395 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000396 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
397 if (PyNumber_Coerce(&v, &w) != 0)
398 return NULL;
399 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
400 x = (*f)(v, w);
401 Py_DECREF(v);
402 Py_DECREF(w);
403 if (f != NULL)
404 return x;
405 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000406 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000407}
408
409PyObject *
410PyNumber_Rshift(v, w)
411 PyObject *v, *w;
412{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000413 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000414 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000415 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000416 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
417 if (PyNumber_Coerce(&v, &w) != 0)
418 return NULL;
419 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
420 x = (*f)(v, w);
421 Py_DECREF(v);
422 Py_DECREF(w);
423 if (f != NULL)
424 return x;
425 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000426 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000427}
428
429PyObject *
430PyNumber_Add(v, w)
431 PyObject *v, *w;
432{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000433 PySequenceMethods *m;
434
435 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
436 m = v->ob_type->tp_as_sequence;
437 if (m && m->sq_concat)
438 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000439 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000440 PyObject *x = NULL;
441 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000442 if (PyNumber_Coerce(&v, &w) != 0)
443 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000444 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
445 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000446 Py_DECREF(v);
447 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000448 if (f != NULL)
449 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000450 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000451 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000452}
453
454PyObject *
455PyNumber_Subtract(v, w)
456 PyObject *v, *w;
457{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000458 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000459 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000460 PyObject *x = NULL;
461 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000462 if (PyNumber_Coerce(&v, &w) != 0)
463 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000464 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
465 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000466 Py_DECREF(v);
467 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000468 if (f != NULL)
469 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000470 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000471 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000472}
473
474PyObject *
475PyNumber_Multiply(v, w)
476 PyObject *v, *w;
477{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000478 PyTypeObject *tp = v->ob_type;
479 PySequenceMethods *m;
480
481 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000482 if (tp->tp_as_number != NULL &&
483 w->ob_type->tp_as_sequence != NULL &&
484 !PyInstance_Check(v)) {
485 /* number*sequence -- swap v and w */
486 PyObject *tmp = v;
487 v = w;
488 w = tmp;
489 tp = v->ob_type;
490 }
491 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000492 PyObject *x = NULL;
493 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000494 if (PyInstance_Check(v)) {
495 /* Instances of user-defined classes get their
496 other argument uncoerced, so they may
497 implement sequence*number as well as
498 number*number. */
499 Py_INCREF(v);
500 Py_INCREF(w);
501 }
502 else if (PyNumber_Coerce(&v, &w) != 0)
503 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000504 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
505 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000506 Py_DECREF(v);
507 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000508 if (f != NULL)
509 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000510 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000511 m = tp->tp_as_sequence;
512 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000513 long mul_value;
514
515 if (PyInt_Check(w)) {
516 mul_value = PyInt_AsLong(w);
517 }
518 else if (PyLong_Check(w)) {
519 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000520 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000521 return NULL;
522 }
523 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000524 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000525 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000526 }
527 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000528 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000529 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000530}
531
532PyObject *
533PyNumber_Divide(v, w)
534 PyObject *v, *w;
535{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000536 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000537 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000538 PyObject *x = NULL;
539 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000540 if (PyNumber_Coerce(&v, &w) != 0)
541 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000542 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
543 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000544 Py_DECREF(v);
545 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000546 if (f != NULL)
547 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000548 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000549 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000550}
551
552PyObject *
553PyNumber_Remainder(v, w)
554 PyObject *v, *w;
555{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000556 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000557 return PyString_Format(v, w);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000558 else if (PyUnicode_Check(v))
559 return PyUnicode_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000560 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000561 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000562 PyObject *x = NULL;
563 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000564 if (PyNumber_Coerce(&v, &w) != 0)
565 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000566 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
567 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000568 Py_DECREF(v);
569 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000570 if (f != NULL)
571 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000572 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000573 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000574}
575
576PyObject *
577PyNumber_Divmod(v, w)
578 PyObject *v, *w;
579{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000580 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
581 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000582 PyObject *x = NULL;
583 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000584 if (PyNumber_Coerce(&v, &w) != 0)
585 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000586 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
587 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000588 Py_DECREF(v);
589 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000590 if (f != NULL)
591 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000592 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000593 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000594}
595
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000596/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000597
598static PyObject *
599do_pow(v, w)
600 PyObject *v, *w;
601{
602 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000603 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
604 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000605 if (v->ob_type->tp_as_number == NULL ||
606 w->ob_type->tp_as_number == NULL) {
607 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000608 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000609 return NULL;
610 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000611 if (PyNumber_Coerce(&v, &w) != 0)
612 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000613 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
614 res = (*f)(v, w, Py_None);
615 else
616 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000617 Py_DECREF(v);
618 Py_DECREF(w);
619 return res;
620}
621
622PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000623PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000624 PyObject *v, *w, *z;
625{
626 PyObject *res;
627 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000628 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000629
630 if (z == Py_None)
631 return do_pow(v, w);
632 /* XXX The ternary version doesn't do class instance coercions */
633 if (PyInstance_Check(v))
634 return v->ob_type->tp_as_number->nb_power(v, w, z);
635 if (v->ob_type->tp_as_number == NULL ||
636 z->ob_type->tp_as_number == NULL ||
637 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000638 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000639 }
640 if (PyNumber_Coerce(&v, &w) != 0)
641 return NULL;
642 res = NULL;
643 v1 = v;
644 z1 = z;
645 if (PyNumber_Coerce(&v1, &z1) != 0)
646 goto error2;
647 w2 = w;
648 z2 = z1;
649 if (PyNumber_Coerce(&w2, &z2) != 0)
650 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000651 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
652 res = (*f)(v1, w2, z2);
653 else
654 res = type_error(
655 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000656 Py_DECREF(w2);
657 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000658 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000659 Py_DECREF(v1);
660 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000661 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000662 Py_DECREF(v);
663 Py_DECREF(w);
664 return res;
665}
666
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000667/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000668
669PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000670PyNumber_Negative(o)
671 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000672{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000673 PyNumberMethods *m;
674
675 if (o == NULL)
676 return null_error();
677 m = o->ob_type->tp_as_number;
678 if (m && m->nb_negative)
679 return (*m->nb_negative)(o);
680
681 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000682}
683
684PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000685PyNumber_Positive(o)
686 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000687{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000688 PyNumberMethods *m;
689
690 if (o == NULL)
691 return null_error();
692 m = o->ob_type->tp_as_number;
693 if (m && m->nb_positive)
694 return (*m->nb_positive)(o);
695
696 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000697}
698
699PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000700PyNumber_Invert(o)
701 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000702{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000703 PyNumberMethods *m;
704
705 if (o == NULL)
706 return null_error();
707 m = o->ob_type->tp_as_number;
708 if (m && m->nb_invert)
709 return (*m->nb_invert)(o);
710
711 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000712}
713
714PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000715PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000716 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000717{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000718 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000720 if (o == NULL)
721 return null_error();
722 m = o->ob_type->tp_as_number;
723 if (m && m->nb_absolute)
724 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000725
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000726 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000727}
728
729PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000730PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000731 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000732{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000733 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000734 const char *buffer;
735 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000736
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000737 if (o == NULL)
738 return null_error();
739 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000740 return PyInt_FromString(PyString_AS_STRING(o), NULL, 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000741 m = o->ob_type->tp_as_number;
742 if (m && m->nb_int)
743 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000744 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
745 return PyInt_FromString((char*)buffer, NULL, 10);
Guido van Rossume15dee51995-07-18 14:12:02 +0000746
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000747 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000748}
749
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000750/* There are two C API functions for converting a string to a long,
751 * PyNumber_Long() and PyLong_FromString(). Both are used in builtin_long,
752 * reachable from Python with the built-in function long().
753 *
754 * The difference is this: PyNumber_Long will raise an exception when the
755 * string cannot be converted to a long. The most common situation is
756 * where a float string is passed in; this raises a ValueError.
757 * PyLong_FromString does not raise an exception; it silently truncates the
758 * float to an integer.
759 *
760 * You can see the different behavior from Python with the following:
761 *
762 * long('9.5')
763 * => ValueError: invalid literal for long(): 9.5
764 *
765 * long('9.5', 10)
766 * => 9L
767 *
768 * The first example ends up calling PyNumber_Long(), while the second one
769 * calls PyLong_FromString().
770 */
771static PyObject *
Guido van Rossum4c08d552000-03-10 22:55:18 +0000772long_from_string(s, len)
773 const char *s;
774 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000775{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000776 const char *start;
777 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000778 PyObject *x;
779 char buffer[256]; /* For errors */
780
Guido van Rossum4c08d552000-03-10 22:55:18 +0000781 start = s;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000782 while (*s && isspace(Py_CHARMASK(*s)))
783 s++;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000784 x = PyLong_FromString((char*)s, &end, 10);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000785 if (x == NULL) {
786 if (PyErr_ExceptionMatches(PyExc_ValueError))
787 goto bad;
788 return NULL;
789 }
790 while (*end && isspace(Py_CHARMASK(*end)))
791 end++;
792 if (*end != '\0') {
793 bad:
794 sprintf(buffer, "invalid literal for long(): %.200s", s);
795 PyErr_SetString(PyExc_ValueError, buffer);
796 Py_XDECREF(x);
797 return NULL;
798 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000799 else if (end != start + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000800 PyErr_SetString(PyExc_ValueError,
801 "null byte in argument for long()");
802 return NULL;
803 }
804 return x;
805}
806
Guido van Rossume15dee51995-07-18 14:12:02 +0000807PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000808PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000809 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000810{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000811 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000812 const char *buffer;
813 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000814
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000815 if (o == NULL)
816 return null_error();
817 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000818 /* need to do extra error checking that PyLong_FromString()
819 * doesn't do. In particular long('9.5') must raise an
820 * exception, not truncate the float.
821 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000822 return long_from_string(PyString_AS_STRING(o),
823 PyString_GET_SIZE(o));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000824 m = o->ob_type->tp_as_number;
825 if (m && m->nb_long)
826 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000827 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
828 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000830 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000831}
832
833PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000834PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000835 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000836{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000837 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000838
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000839 if (o == NULL)
840 return null_error();
Guido van Rossum4c08d552000-03-10 22:55:18 +0000841 if (!PyString_Check(o)) {
842 m = o->ob_type->tp_as_number;
843 if (m && m->nb_float)
844 return m->nb_float(o);
845 }
846 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000847}
848
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000849/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000850
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000851int
852PySequence_Check(s)
853 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000854{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000855 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000856}
857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000859PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000860 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000861{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000863
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000864 if (s == NULL) {
865 null_error();
866 return -1;
867 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000868
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000869 m = s->ob_type->tp_as_sequence;
870 if (m && m->sq_length)
871 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000872
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000873 type_error("len() of unsized object");
874 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000875}
876
877PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000878PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000879 PyObject *s;
880 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000881{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000882 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000883
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000884 if (s == NULL || o == NULL)
885 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000886
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000887 m = s->ob_type->tp_as_sequence;
888 if (m && m->sq_concat)
889 return m->sq_concat(s, o);
890
891 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000892}
893
894PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000895PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000896 PyObject *o;
897 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000898{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000899 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000900
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000901 if (o == NULL)
902 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000903
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000904 m = o->ob_type->tp_as_sequence;
905 if (m && m->sq_repeat)
906 return m->sq_repeat(o, count);
907
908 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000909}
910
911PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000912PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 PyObject *s;
914 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000915{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000916 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000917
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000918 if (s == NULL)
919 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000920
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000921 m = s->ob_type->tp_as_sequence;
922 if (m && m->sq_item) {
923 if (i < 0) {
924 if (m->sq_length) {
925 int l = (*m->sq_length)(s);
926 if (l < 0)
927 return NULL;
928 i += l;
929 }
930 }
931 return m->sq_item(s, i);
932 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000933
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000934 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000935}
936
937PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000938PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000939 PyObject *s;
940 int i1;
941 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000942{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000943 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000944
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000945 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000946
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000947 m = s->ob_type->tp_as_sequence;
948 if (m && m->sq_slice) {
949 if (i1 < 0 || i2 < 0) {
950 if (m->sq_length) {
951 int l = (*m->sq_length)(s);
952 if (l < 0)
953 return NULL;
954 if (i1 < 0)
955 i1 += l;
956 if (i2 < 0)
957 i2 += l;
958 }
959 }
960 return m->sq_slice(s, i1, i2);
961 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000962
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000963 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000964}
965
966int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000967PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000968 PyObject *s;
969 int i;
970 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000971{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000972 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000973
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000974 if (s == NULL) {
975 null_error();
976 return -1;
977 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000978
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 m = s->ob_type->tp_as_sequence;
980 if (m && m->sq_ass_item) {
981 if (i < 0) {
982 if (m->sq_length) {
983 int l = (*m->sq_length)(s);
984 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000985 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986 i += l;
987 }
988 }
989 return m->sq_ass_item(s, i, o);
990 }
991
992 type_error("object doesn't support item assignment");
993 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000994}
995
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000996int
997PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998 PyObject *s;
999 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001000{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001002
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001003 if (s == NULL) {
1004 null_error();
1005 return -1;
1006 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001007
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 m = s->ob_type->tp_as_sequence;
1009 if (m && m->sq_ass_item) {
1010 if (i < 0) {
1011 if (m->sq_length) {
1012 int l = (*m->sq_length)(s);
1013 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001014 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001015 i += l;
1016 }
1017 }
1018 return m->sq_ass_item(s, i, (PyObject *)NULL);
1019 }
1020
1021 type_error("object doesn't support item deletion");
1022 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001023}
1024
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001025int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001026PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001027 PyObject *s;
1028 int i1;
1029 int i2;
1030 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001031{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001033
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 if (s == NULL) {
1035 null_error();
1036 return -1;
1037 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001038
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 m = s->ob_type->tp_as_sequence;
1040 if (m && m->sq_ass_slice) {
1041 if (i1 < 0 || i2 < 0) {
1042 if (m->sq_length) {
1043 int l = (*m->sq_length)(s);
1044 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001045 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001046 if (i1 < 0)
1047 i1 += l;
1048 if (i2 < 0)
1049 i2 += l;
1050 }
1051 }
1052 return m->sq_ass_slice(s, i1, i2, o);
1053 }
1054 type_error("object doesn't support slice assignment");
1055 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001056}
1057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001058int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001059PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001060 PyObject *s;
1061 int i1;
1062 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001063{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001065
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066 if (s == NULL) {
1067 null_error();
1068 return -1;
1069 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001070
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001071 m = s->ob_type->tp_as_sequence;
1072 if (m && m->sq_ass_slice) {
1073 if (i1 < 0 || i2 < 0) {
1074 if (m->sq_length) {
1075 int l = (*m->sq_length)(s);
1076 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001077 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001078 if (i1 < 0)
1079 i1 += l;
1080 if (i2 < 0)
1081 i2 += l;
1082 }
1083 }
1084 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1085 }
1086 type_error("object doesn't support slice deletion");
1087 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001088}
1089
Guido van Rossume15dee51995-07-18 14:12:02 +00001090PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001091PySequence_Tuple(v)
1092 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001093{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 if (v == NULL)
1097 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001098
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 if (PyTuple_Check(v)) {
1100 Py_INCREF(v);
1101 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001102 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001103
1104 if (PyList_Check(v))
1105 return PyList_AsTuple(v);
1106
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001107 /* There used to be code for strings here, but tuplifying strings is
1108 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109
1110 /* Generic sequence object */
1111 m = v->ob_type->tp_as_sequence;
1112 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001113 int i;
1114 PyObject *t;
1115 int n = PySequence_Length(v);
1116 if (n < 0)
1117 return NULL;
1118 t = PyTuple_New(n);
1119 if (t == NULL)
1120 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001121 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001122 PyObject *item = (*m->sq_item)(v, i);
1123 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001124 if (PyErr_ExceptionMatches(PyExc_IndexError))
1125 PyErr_Clear();
1126 else {
1127 Py_DECREF(t);
1128 t = NULL;
1129 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130 break;
1131 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001132 if (i >= n) {
1133 if (n < 500)
1134 n += 10;
1135 else
1136 n += 100;
1137 if (_PyTuple_Resize(&t, n, 0) != 0)
1138 break;
1139 }
1140 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001141 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001142 if (i < n && t != NULL)
1143 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144 return t;
1145 }
1146
1147 /* None of the above */
1148 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001149}
1150
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001151PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152PySequence_List(v)
1153 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001154{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001155 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001156
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001157 if (v == NULL)
1158 return null_error();
1159
1160 if (PyList_Check(v))
1161 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1162
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001163 m = v->ob_type->tp_as_sequence;
1164 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001165 int i;
1166 PyObject *l;
1167 int n = PySequence_Length(v);
1168 if (n < 0)
1169 return NULL;
1170 l = PyList_New(n);
1171 if (l == NULL)
1172 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001173 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174 PyObject *item = (*m->sq_item)(v, i);
1175 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001176 if (PyErr_ExceptionMatches(PyExc_IndexError))
1177 PyErr_Clear();
1178 else {
1179 Py_DECREF(l);
1180 l = NULL;
1181 }
1182 break;
1183 }
1184 if (i < n)
1185 PyList_SET_ITEM(l, i, item);
1186 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001187 Py_DECREF(l);
1188 l = NULL;
1189 break;
1190 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001191 }
1192 if (i < n && l != NULL) {
1193 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1194 Py_DECREF(l);
1195 l = NULL;
1196 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197 }
1198 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001199 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001200 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001201}
1202
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001203int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001204PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205 PyObject *s;
1206 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001207{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001208 int l, i, n, cmp, err;
1209 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001210
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001211 if (s == NULL || o == NULL) {
1212 null_error();
1213 return -1;
1214 }
1215
1216 l = PySequence_Length(s);
1217 if (l < 0)
1218 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001219
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001220 n = 0;
1221 for (i = 0; i < l; i++) {
1222 item = PySequence_GetItem(s, i);
1223 if (item == NULL)
1224 return -1;
1225 err = PyObject_Cmp(item, o, &cmp);
1226 Py_DECREF(item);
1227 if (err < 0)
1228 return err;
1229 if (cmp == 0)
1230 n++;
1231 }
1232 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001233}
1234
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235int
1236PySequence_Contains(w, v) /* v in w */
1237 PyObject *w;
1238 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001239{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 int i, cmp;
1241 PyObject *x;
1242 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001243
Guido van Rossum46c6b202000-02-28 15:01:46 +00001244 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1245 sq = w->ob_type->tp_as_sequence;
1246 if(sq != NULL && sq->sq_contains != NULL)
1247 return (*sq->sq_contains)(w, v);
1248 }
1249
1250 /* If there is no better way to check whether an item is is contained,
1251 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001252 sq = w->ob_type->tp_as_sequence;
1253 if (sq == NULL || sq->sq_item == NULL) {
1254 PyErr_SetString(PyExc_TypeError,
1255 "'in' or 'not in' needs sequence right argument");
1256 return -1;
1257 }
1258
1259 for (i = 0; ; i++) {
1260 x = (*sq->sq_item)(w, i);
1261 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001262 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001263 PyErr_Clear();
1264 break;
1265 }
1266 return -1;
1267 }
1268 cmp = PyObject_Compare(v, x);
1269 Py_XDECREF(x);
1270 if (cmp == 0)
1271 return 1;
1272 if (PyErr_Occurred())
1273 return -1;
1274 }
1275
1276 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001277}
1278
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001279/* Backwards compatibility */
1280#undef PySequence_In
1281int
1282PySequence_In(w, v)
1283 PyObject *w;
1284 PyObject *v;
1285{
1286 return PySequence_Contains(w, v);
1287}
1288
1289int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001290PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 PyObject *s;
1292 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001293{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001294 int l, i, cmp, err;
1295 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 if (s == NULL || o == NULL) {
1298 null_error();
1299 return -1;
1300 }
1301
1302 l = PySequence_Length(s);
1303 if (l < 0)
1304 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001306 for (i = 0; i < l; i++) {
1307 item = PySequence_GetItem(s, i);
1308 if (item == NULL)
1309 return -1;
1310 err = PyObject_Cmp(item, o, &cmp);
1311 Py_DECREF(item);
1312 if (err < 0)
1313 return err;
1314 if (cmp == 0)
1315 return i;
1316 }
1317
1318 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1319 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001320}
1321
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001322/* Operations on mappings */
1323
1324int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001325PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001327{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001329}
1330
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331int
1332PyMapping_Length(o)
1333 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001334{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001336
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001337 if (o == NULL) {
1338 null_error();
1339 return -1;
1340 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001341
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342 m = o->ob_type->tp_as_mapping;
1343 if (m && m->mp_length)
1344 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001345
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001346 type_error("len() of unsized object");
1347 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001348}
1349
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350PyObject *
1351PyMapping_GetItemString(o, key)
1352 PyObject *o;
1353 char *key;
1354{
1355 PyObject *okey, *r;
1356
1357 if (key == NULL)
1358 return null_error();
1359
1360 okey = PyString_FromString(key);
1361 if (okey == NULL)
1362 return NULL;
1363 r = PyObject_GetItem(o, okey);
1364 Py_DECREF(okey);
1365 return r;
1366}
1367
1368int
1369PyMapping_SetItemString(o, key, value)
1370 PyObject *o;
1371 char *key;
1372 PyObject *value;
1373{
1374 PyObject *okey;
1375 int r;
1376
1377 if (key == NULL) {
1378 null_error();
1379 return -1;
1380 }
1381
1382 okey = PyString_FromString(key);
1383 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001384 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001385 r = PyObject_SetItem(o, okey, value);
1386 Py_DECREF(okey);
1387 return r;
1388}
1389
1390int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001391PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 PyObject *o;
1393 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001394{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001395 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001396
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 v = PyMapping_GetItemString(o, key);
1398 if (v) {
1399 Py_DECREF(v);
1400 return 1;
1401 }
1402 PyErr_Clear();
1403 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001404}
1405
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001406int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001407PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001408 PyObject *o;
1409 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001410{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001411 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001412
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 v = PyObject_GetItem(o, key);
1414 if (v) {
1415 Py_DECREF(v);
1416 return 1;
1417 }
1418 PyErr_Clear();
1419 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001420}
1421
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001422/* Operations on callable objects */
1423
1424/* XXX PyCallable_Check() is in object.c */
1425
Guido van Rossume15dee51995-07-18 14:12:02 +00001426PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001427PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001429{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001430 PyObject *r;
1431 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001432
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001433 if (args == NULL) {
1434 args = PyTuple_New(0);
1435 if (args == NULL)
1436 return NULL;
1437 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001438
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001439 r = PyEval_CallObject(o, args);
1440
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001441 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001443 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001444
1445 return r;
1446}
Guido van Rossume15dee51995-07-18 14:12:02 +00001447
1448PyObject *
1449#ifdef HAVE_STDARG_PROTOTYPES
1450/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001451PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001452#else
1453/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001454 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001455#endif
1456{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001457 va_list va;
1458 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001459#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001460 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001461#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462 PyObject *callable;
1463 char *format;
1464 va_start(va);
1465 callable = va_arg(va, PyObject *);
1466 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001467#endif
1468
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001469 if (callable == NULL) {
1470 va_end(va);
1471 return null_error();
1472 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001473
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 if (format)
1475 args = Py_VaBuildValue(format, va);
1476 else
1477 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001478
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001479 va_end(va);
1480
1481 if (args == NULL)
1482 return NULL;
1483
1484 if (!PyTuple_Check(args)) {
1485 PyObject *a;
1486
1487 a = PyTuple_New(1);
1488 if (a == NULL)
1489 return NULL;
1490 if (PyTuple_SetItem(a, 0, args) < 0)
1491 return NULL;
1492 args = a;
1493 }
1494 retval = PyObject_CallObject(callable, args);
1495
1496 Py_DECREF(args);
1497
1498 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001499}
1500
1501PyObject *
1502#ifdef HAVE_STDARG_PROTOTYPES
1503/* VARARGS 2 */
1504PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1505#else
1506/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001507 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001508#endif
1509{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001510 va_list va;
1511 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001512#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001513 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001514#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001515 PyObject *o;
1516 char *name;
1517 char *format;
1518 va_start(va);
1519 o = va_arg(va, PyObject *);
1520 name = va_arg(va, char *);
1521 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001522#endif
1523
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001524 if (o == NULL || name == NULL) {
1525 va_end(va);
1526 return null_error();
1527 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001528
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001529 func = PyObject_GetAttrString(o, name);
1530 if (func == NULL) {
1531 va_end(va);
1532 PyErr_SetString(PyExc_AttributeError, name);
1533 return 0;
1534 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001535
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536 if (!PyCallable_Check(func)) {
1537 va_end(va);
1538 return type_error("call of non-callable attribute");
1539 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001540
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001541 if (format && *format)
1542 args = Py_VaBuildValue(format, va);
1543 else
1544 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001545
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001546 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001547
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001548 if (!args)
1549 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001550
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551 if (!PyTuple_Check(args)) {
1552 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001553
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001554 a = PyTuple_New(1);
1555 if (a == NULL)
1556 return NULL;
1557 if (PyTuple_SetItem(a, 0, args) < 0)
1558 return NULL;
1559 args = a;
1560 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001561
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001562 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001563
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001564 Py_DECREF(args);
1565 Py_DECREF(func);
1566
1567 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001568}