blob: 410b80b59755fbd591cb68d9155feda7e3a8de33 [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
Guido van Rossum9e896b32000-04-05 20:11:21 +0000729/* Add a check for embedded NULL-bytes in the argument. */
730static PyObject *
731int_from_string(s, len)
732 const char *s;
733 int len;
734{
735 char *end;
736 PyObject *x;
737
738 x = PyInt_FromString((char*)s, &end, 10);
739 if (x == NULL)
740 return NULL;
741 if (end != s + len) {
742 PyErr_SetString(PyExc_ValueError,
743 "null byte in argument for int()");
744 Py_DECREF(x);
745 return NULL;
746 }
747 return x;
748}
749
Guido van Rossume15dee51995-07-18 14:12:02 +0000750PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000751PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000752 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000753{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000754 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000755 const char *buffer;
756 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000757
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000758 if (o == NULL)
759 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000760 if (PyInt_Check(o)) {
761 Py_INCREF(o);
762 return o;
763 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000764 if (PyString_Check(o))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000765 return int_from_string(PyString_AS_STRING(o),
766 PyString_GET_SIZE(o));
767 if (PyUnicode_Check(o))
768 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
769 PyUnicode_GET_SIZE(o),
770 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000771 m = o->ob_type->tp_as_number;
772 if (m && m->nb_int)
773 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000774 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000775 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000776
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000777 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000778}
779
Guido van Rossum9e896b32000-04-05 20:11:21 +0000780/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000781static PyObject *
Guido van Rossum4c08d552000-03-10 22:55:18 +0000782long_from_string(s, len)
783 const char *s;
784 int len;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000785{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000786 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000787 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000788
Guido van Rossum4c08d552000-03-10 22:55:18 +0000789 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000790 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000791 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000792 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000793 PyErr_SetString(PyExc_ValueError,
794 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000795 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000796 return NULL;
797 }
798 return x;
799}
800
Guido van Rossume15dee51995-07-18 14:12:02 +0000801PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000802PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000804{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000805 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000806 const char *buffer;
807 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000808
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000809 if (o == NULL)
810 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000811 if (PyLong_Check(o)) {
812 Py_INCREF(o);
813 return o;
814 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000815 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000816 /* need to do extra error checking that PyLong_FromString()
817 * doesn't do. In particular long('9.5') must raise an
818 * exception, not truncate the float.
819 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000820 return long_from_string(PyString_AS_STRING(o),
821 PyString_GET_SIZE(o));
Guido van Rossum9e896b32000-04-05 20:11:21 +0000822 if (PyUnicode_Check(o))
823 /* The above check is done in PyLong_FromUnicode(). */
824 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
825 PyUnicode_GET_SIZE(o),
826 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000827 m = o->ob_type->tp_as_number;
828 if (m && m->nb_long)
829 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000830 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
831 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000832
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000833 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000834}
835
836PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000837PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000838 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000839{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000840 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000841
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000842 if (o == NULL)
843 return null_error();
Guido van Rossum9e896b32000-04-05 20:11:21 +0000844 if (PyFloat_Check(o)) {
845 Py_INCREF(o);
846 return o;
847 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000848 if (!PyString_Check(o)) {
849 m = o->ob_type->tp_as_number;
850 if (m && m->nb_float)
851 return m->nb_float(o);
852 }
853 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000854}
855
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000856/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000857
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000858int
859PySequence_Check(s)
860 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000861{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000863}
864
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000865int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000866PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000868{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000869 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000870
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000871 if (s == NULL) {
872 null_error();
873 return -1;
874 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000875
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000876 m = s->ob_type->tp_as_sequence;
877 if (m && m->sq_length)
878 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000879
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000880 type_error("len() of unsized object");
881 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000882}
883
884PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000885PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000886 PyObject *s;
887 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000888{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000889 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000890
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000891 if (s == NULL || o == NULL)
892 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000893
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000894 m = s->ob_type->tp_as_sequence;
895 if (m && m->sq_concat)
896 return m->sq_concat(s, o);
897
898 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000899}
900
901PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000902PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000903 PyObject *o;
904 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000905{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000906 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000907
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 if (o == NULL)
909 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000910
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 m = o->ob_type->tp_as_sequence;
912 if (m && m->sq_repeat)
913 return m->sq_repeat(o, count);
914
915 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000916}
917
918PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000919PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000920 PyObject *s;
921 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000922{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000923 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000924
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000925 if (s == NULL)
926 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000927
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 m = s->ob_type->tp_as_sequence;
929 if (m && m->sq_item) {
930 if (i < 0) {
931 if (m->sq_length) {
932 int l = (*m->sq_length)(s);
933 if (l < 0)
934 return NULL;
935 i += l;
936 }
937 }
938 return m->sq_item(s, i);
939 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000940
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000941 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000942}
943
944PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000945PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 PyObject *s;
947 int i1;
948 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000949{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000950 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000951
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000952 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000953
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000954 m = s->ob_type->tp_as_sequence;
955 if (m && m->sq_slice) {
956 if (i1 < 0 || i2 < 0) {
957 if (m->sq_length) {
958 int l = (*m->sq_length)(s);
959 if (l < 0)
960 return NULL;
961 if (i1 < 0)
962 i1 += l;
963 if (i2 < 0)
964 i2 += l;
965 }
966 }
967 return m->sq_slice(s, i1, i2);
968 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000969
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000970 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000971}
972
973int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000974PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 PyObject *s;
976 int i;
977 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000978{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000980
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000981 if (s == NULL) {
982 null_error();
983 return -1;
984 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000986 m = s->ob_type->tp_as_sequence;
987 if (m && m->sq_ass_item) {
988 if (i < 0) {
989 if (m->sq_length) {
990 int l = (*m->sq_length)(s);
991 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000992 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000993 i += l;
994 }
995 }
996 return m->sq_ass_item(s, i, o);
997 }
998
999 type_error("object doesn't support item assignment");
1000 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001001}
1002
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001003int
1004PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001005 PyObject *s;
1006 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001007{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001009
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001010 if (s == NULL) {
1011 null_error();
1012 return -1;
1013 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001014
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001015 m = s->ob_type->tp_as_sequence;
1016 if (m && m->sq_ass_item) {
1017 if (i < 0) {
1018 if (m->sq_length) {
1019 int l = (*m->sq_length)(s);
1020 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001021 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 i += l;
1023 }
1024 }
1025 return m->sq_ass_item(s, i, (PyObject *)NULL);
1026 }
1027
1028 type_error("object doesn't support item deletion");
1029 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001030}
1031
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001033PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 PyObject *s;
1035 int i1;
1036 int i2;
1037 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001038{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001039 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001040
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001041 if (s == NULL) {
1042 null_error();
1043 return -1;
1044 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001045
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001046 m = s->ob_type->tp_as_sequence;
1047 if (m && m->sq_ass_slice) {
1048 if (i1 < 0 || i2 < 0) {
1049 if (m->sq_length) {
1050 int l = (*m->sq_length)(s);
1051 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001052 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001053 if (i1 < 0)
1054 i1 += l;
1055 if (i2 < 0)
1056 i2 += l;
1057 }
1058 }
1059 return m->sq_ass_slice(s, i1, i2, o);
1060 }
1061 type_error("object doesn't support slice assignment");
1062 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001063}
1064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001065int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001066PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067 PyObject *s;
1068 int i1;
1069 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001070{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001071 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001072
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001073 if (s == NULL) {
1074 null_error();
1075 return -1;
1076 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001077
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001078 m = s->ob_type->tp_as_sequence;
1079 if (m && m->sq_ass_slice) {
1080 if (i1 < 0 || i2 < 0) {
1081 if (m->sq_length) {
1082 int l = (*m->sq_length)(s);
1083 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001084 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085 if (i1 < 0)
1086 i1 += l;
1087 if (i2 < 0)
1088 i2 += l;
1089 }
1090 }
1091 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1092 }
1093 type_error("object doesn't support slice deletion");
1094 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001095}
1096
Guido van Rossume15dee51995-07-18 14:12:02 +00001097PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001098PySequence_Tuple(v)
1099 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001100{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001101 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001102
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001103 if (v == NULL)
1104 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001105
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001106 if (PyTuple_Check(v)) {
1107 Py_INCREF(v);
1108 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001109 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001110
1111 if (PyList_Check(v))
1112 return PyList_AsTuple(v);
1113
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001114 /* There used to be code for strings here, but tuplifying strings is
1115 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001116
1117 /* Generic sequence object */
1118 m = v->ob_type->tp_as_sequence;
1119 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 int i;
1121 PyObject *t;
1122 int n = PySequence_Length(v);
1123 if (n < 0)
1124 return NULL;
1125 t = PyTuple_New(n);
1126 if (t == NULL)
1127 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001128 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001129 PyObject *item = (*m->sq_item)(v, i);
1130 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001131 if (PyErr_ExceptionMatches(PyExc_IndexError))
1132 PyErr_Clear();
1133 else {
1134 Py_DECREF(t);
1135 t = NULL;
1136 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001137 break;
1138 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001139 if (i >= n) {
1140 if (n < 500)
1141 n += 10;
1142 else
1143 n += 100;
1144 if (_PyTuple_Resize(&t, n, 0) != 0)
1145 break;
1146 }
1147 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001148 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001149 if (i < n && t != NULL)
1150 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001151 return t;
1152 }
1153
1154 /* None of the above */
1155 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001156}
1157
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001158PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001159PySequence_List(v)
1160 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001161{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001163
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001164 if (v == NULL)
1165 return null_error();
1166
1167 if (PyList_Check(v))
1168 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1169
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170 m = v->ob_type->tp_as_sequence;
1171 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172 int i;
1173 PyObject *l;
1174 int n = PySequence_Length(v);
1175 if (n < 0)
1176 return NULL;
1177 l = PyList_New(n);
1178 if (l == NULL)
1179 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001180 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 PyObject *item = (*m->sq_item)(v, i);
1182 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001183 if (PyErr_ExceptionMatches(PyExc_IndexError))
1184 PyErr_Clear();
1185 else {
1186 Py_DECREF(l);
1187 l = NULL;
1188 }
1189 break;
1190 }
1191 if (i < n)
1192 PyList_SET_ITEM(l, i, item);
1193 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194 Py_DECREF(l);
1195 l = NULL;
1196 break;
1197 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001198 }
1199 if (i < n && l != NULL) {
1200 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1201 Py_DECREF(l);
1202 l = NULL;
1203 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001204 }
1205 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001206 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001207 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001208}
1209
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001210int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001211PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001212 PyObject *s;
1213 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001214{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001215 int l, i, n, cmp, err;
1216 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001217
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218 if (s == NULL || o == NULL) {
1219 null_error();
1220 return -1;
1221 }
1222
1223 l = PySequence_Length(s);
1224 if (l < 0)
1225 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001226
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 n = 0;
1228 for (i = 0; i < l; i++) {
1229 item = PySequence_GetItem(s, i);
1230 if (item == NULL)
1231 return -1;
1232 err = PyObject_Cmp(item, o, &cmp);
1233 Py_DECREF(item);
1234 if (err < 0)
1235 return err;
1236 if (cmp == 0)
1237 n++;
1238 }
1239 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001240}
1241
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242int
1243PySequence_Contains(w, v) /* v in w */
1244 PyObject *w;
1245 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001246{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 int i, cmp;
1248 PyObject *x;
1249 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001250
Guido van Rossum46c6b202000-02-28 15:01:46 +00001251 if(PyType_HasFeature(w->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1252 sq = w->ob_type->tp_as_sequence;
1253 if(sq != NULL && sq->sq_contains != NULL)
1254 return (*sq->sq_contains)(w, v);
1255 }
1256
1257 /* If there is no better way to check whether an item is is contained,
1258 do it the hard way */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 sq = w->ob_type->tp_as_sequence;
1260 if (sq == NULL || sq->sq_item == NULL) {
1261 PyErr_SetString(PyExc_TypeError,
1262 "'in' or 'not in' needs sequence right argument");
1263 return -1;
1264 }
1265
1266 for (i = 0; ; i++) {
1267 x = (*sq->sq_item)(w, i);
1268 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001269 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001270 PyErr_Clear();
1271 break;
1272 }
1273 return -1;
1274 }
1275 cmp = PyObject_Compare(v, x);
1276 Py_XDECREF(x);
1277 if (cmp == 0)
1278 return 1;
1279 if (PyErr_Occurred())
1280 return -1;
1281 }
1282
1283 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001284}
1285
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001286/* Backwards compatibility */
1287#undef PySequence_In
1288int
1289PySequence_In(w, v)
1290 PyObject *w;
1291 PyObject *v;
1292{
1293 return PySequence_Contains(w, v);
1294}
1295
1296int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001297PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001298 PyObject *s;
1299 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001300{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001301 int l, i, cmp, err;
1302 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001303
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 if (s == NULL || o == NULL) {
1305 null_error();
1306 return -1;
1307 }
1308
1309 l = PySequence_Length(s);
1310 if (l < 0)
1311 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001312
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001313 for (i = 0; i < l; i++) {
1314 item = PySequence_GetItem(s, i);
1315 if (item == NULL)
1316 return -1;
1317 err = PyObject_Cmp(item, o, &cmp);
1318 Py_DECREF(item);
1319 if (err < 0)
1320 return err;
1321 if (cmp == 0)
1322 return i;
1323 }
1324
1325 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1326 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001327}
1328
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001329/* Operations on mappings */
1330
1331int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001332PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001334{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001336}
1337
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001338int
1339PyMapping_Length(o)
1340 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001341{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001343
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001344 if (o == NULL) {
1345 null_error();
1346 return -1;
1347 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001348
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001349 m = o->ob_type->tp_as_mapping;
1350 if (m && m->mp_length)
1351 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001352
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353 type_error("len() of unsized object");
1354 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001355}
1356
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001357PyObject *
1358PyMapping_GetItemString(o, key)
1359 PyObject *o;
1360 char *key;
1361{
1362 PyObject *okey, *r;
1363
1364 if (key == NULL)
1365 return null_error();
1366
1367 okey = PyString_FromString(key);
1368 if (okey == NULL)
1369 return NULL;
1370 r = PyObject_GetItem(o, okey);
1371 Py_DECREF(okey);
1372 return r;
1373}
1374
1375int
1376PyMapping_SetItemString(o, key, value)
1377 PyObject *o;
1378 char *key;
1379 PyObject *value;
1380{
1381 PyObject *okey;
1382 int r;
1383
1384 if (key == NULL) {
1385 null_error();
1386 return -1;
1387 }
1388
1389 okey = PyString_FromString(key);
1390 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001391 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392 r = PyObject_SetItem(o, okey, value);
1393 Py_DECREF(okey);
1394 return r;
1395}
1396
1397int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001398PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001399 PyObject *o;
1400 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001401{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001402 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001403
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001404 v = PyMapping_GetItemString(o, key);
1405 if (v) {
1406 Py_DECREF(v);
1407 return 1;
1408 }
1409 PyErr_Clear();
1410 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001411}
1412
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001414PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001415 PyObject *o;
1416 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001417{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001418 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001419
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001420 v = PyObject_GetItem(o, key);
1421 if (v) {
1422 Py_DECREF(v);
1423 return 1;
1424 }
1425 PyErr_Clear();
1426 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001427}
1428
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001429/* Operations on callable objects */
1430
1431/* XXX PyCallable_Check() is in object.c */
1432
Guido van Rossume15dee51995-07-18 14:12:02 +00001433PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001434PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001436{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 PyObject *r;
1438 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001439
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 if (args == NULL) {
1441 args = PyTuple_New(0);
1442 if (args == NULL)
1443 return NULL;
1444 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001445
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001446 r = PyEval_CallObject(o, args);
1447
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001448 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001449 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001450 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001451
1452 return r;
1453}
Guido van Rossume15dee51995-07-18 14:12:02 +00001454
1455PyObject *
1456#ifdef HAVE_STDARG_PROTOTYPES
1457/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001458PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001459#else
1460/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001461 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001462#endif
1463{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001464 va_list va;
1465 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001466#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001468#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001469 PyObject *callable;
1470 char *format;
1471 va_start(va);
1472 callable = va_arg(va, PyObject *);
1473 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001474#endif
1475
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001476 if (callable == NULL) {
1477 va_end(va);
1478 return null_error();
1479 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001480
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001481 if (format)
1482 args = Py_VaBuildValue(format, va);
1483 else
1484 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001485
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001486 va_end(va);
1487
1488 if (args == NULL)
1489 return NULL;
1490
1491 if (!PyTuple_Check(args)) {
1492 PyObject *a;
1493
1494 a = PyTuple_New(1);
1495 if (a == NULL)
1496 return NULL;
1497 if (PyTuple_SetItem(a, 0, args) < 0)
1498 return NULL;
1499 args = a;
1500 }
1501 retval = PyObject_CallObject(callable, args);
1502
1503 Py_DECREF(args);
1504
1505 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001506}
1507
1508PyObject *
1509#ifdef HAVE_STDARG_PROTOTYPES
1510/* VARARGS 2 */
1511PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1512#else
1513/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001514 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001515#endif
1516{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001517 va_list va;
1518 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001519#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001520 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001521#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001522 PyObject *o;
1523 char *name;
1524 char *format;
1525 va_start(va);
1526 o = va_arg(va, PyObject *);
1527 name = va_arg(va, char *);
1528 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001529#endif
1530
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001531 if (o == NULL || name == NULL) {
1532 va_end(va);
1533 return null_error();
1534 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001535
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536 func = PyObject_GetAttrString(o, name);
1537 if (func == NULL) {
1538 va_end(va);
1539 PyErr_SetString(PyExc_AttributeError, name);
1540 return 0;
1541 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001542
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001543 if (!PyCallable_Check(func)) {
1544 va_end(va);
1545 return type_error("call of non-callable attribute");
1546 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001547
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001548 if (format && *format)
1549 args = Py_VaBuildValue(format, va);
1550 else
1551 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001552
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001553 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001554
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001555 if (!args)
1556 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001557
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001558 if (!PyTuple_Check(args)) {
1559 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001560
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001561 a = PyTuple_New(1);
1562 if (a == NULL)
1563 return NULL;
1564 if (PyTuple_SetItem(a, 0, args) < 0)
1565 return NULL;
1566 args = a;
1567 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001568
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001569 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001570
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001571 Py_DECREF(args);
1572 Py_DECREF(func);
1573
1574 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001575}