blob: 5ee53ee9f261c6bfaae2a01027a0d73634c8b06c [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 Rossumcea1c8c1998-05-22 00:47:05 +0000202/* Operations on numbers */
203
204int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000205PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000206 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000207{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000208 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000209}
210
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000211/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000212
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000213#define BINOP(v, w, opname, ropname, thisfunc) \
214 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000215 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
216
217PyObject *
218PyNumber_Or(v, w)
219 PyObject *v, *w;
220{
221 extern int PyNumber_Coerce();
222
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000223 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000224 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000225 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000226 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
227 if (PyNumber_Coerce(&v, &w) != 0)
228 return NULL;
229 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
230 x = (*f)(v, w);
231 Py_DECREF(v);
232 Py_DECREF(w);
233 if (f != NULL)
234 return x;
235 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000236 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000237}
238
239PyObject *
240PyNumber_Xor(v, w)
241 PyObject *v, *w;
242{
243 extern int PyNumber_Coerce();
244
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000245 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000246 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000247 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000248 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
249 if (PyNumber_Coerce(&v, &w) != 0)
250 return NULL;
251 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
252 x = (*f)(v, w);
253 Py_DECREF(v);
254 Py_DECREF(w);
255 if (f != NULL)
256 return x;
257 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000258 return type_error("bad operand type(s) for ^");
Guido van Rossume15dee51995-07-18 14:12:02 +0000259}
260
261PyObject *
262PyNumber_And(v, w)
263 PyObject *v, *w;
264{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000265 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000266 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000267 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000268 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
269 if (PyNumber_Coerce(&v, &w) != 0)
270 return NULL;
271 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
272 x = (*f)(v, w);
273 Py_DECREF(v);
274 Py_DECREF(w);
275 if (f != NULL)
276 return x;
277 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000278 return type_error("bad operand type(s) for &");
Guido van Rossume15dee51995-07-18 14:12:02 +0000279}
280
281PyObject *
282PyNumber_Lshift(v, w)
283 PyObject *v, *w;
284{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000285 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000286 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000287 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000288 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
289 if (PyNumber_Coerce(&v, &w) != 0)
290 return NULL;
291 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
292 x = (*f)(v, w);
293 Py_DECREF(v);
294 Py_DECREF(w);
295 if (f != NULL)
296 return x;
297 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000298 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000299}
300
301PyObject *
302PyNumber_Rshift(v, w)
303 PyObject *v, *w;
304{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000305 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000306 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000307 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000308 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
309 if (PyNumber_Coerce(&v, &w) != 0)
310 return NULL;
311 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
312 x = (*f)(v, w);
313 Py_DECREF(v);
314 Py_DECREF(w);
315 if (f != NULL)
316 return x;
317 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000318 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000319}
320
321PyObject *
322PyNumber_Add(v, w)
323 PyObject *v, *w;
324{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000325 PySequenceMethods *m;
326
327 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
328 m = v->ob_type->tp_as_sequence;
329 if (m && m->sq_concat)
330 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000331 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000332 PyObject *x = NULL;
333 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000334 if (PyNumber_Coerce(&v, &w) != 0)
335 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000336 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
337 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000338 Py_DECREF(v);
339 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000340 if (f != NULL)
341 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000342 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000343 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000344}
345
346PyObject *
347PyNumber_Subtract(v, w)
348 PyObject *v, *w;
349{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000350 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000351 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000352 PyObject *x = NULL;
353 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000354 if (PyNumber_Coerce(&v, &w) != 0)
355 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000356 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
357 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000358 Py_DECREF(v);
359 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000360 if (f != NULL)
361 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000362 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000363 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000364}
365
366PyObject *
367PyNumber_Multiply(v, w)
368 PyObject *v, *w;
369{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000370 PyTypeObject *tp = v->ob_type;
371 PySequenceMethods *m;
372
373 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000374 if (tp->tp_as_number != NULL &&
375 w->ob_type->tp_as_sequence != NULL &&
376 !PyInstance_Check(v)) {
377 /* number*sequence -- swap v and w */
378 PyObject *tmp = v;
379 v = w;
380 w = tmp;
381 tp = v->ob_type;
382 }
383 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000384 PyObject *x = NULL;
385 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000386 if (PyInstance_Check(v)) {
387 /* Instances of user-defined classes get their
388 other argument uncoerced, so they may
389 implement sequence*number as well as
390 number*number. */
391 Py_INCREF(v);
392 Py_INCREF(w);
393 }
394 else if (PyNumber_Coerce(&v, &w) != 0)
395 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000396 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
397 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000398 Py_DECREF(v);
399 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000400 if (f != NULL)
401 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000402 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000403 m = tp->tp_as_sequence;
404 if (m && m->sq_repeat) {
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000405 long mul_value;
406
407 if (PyInt_Check(w)) {
408 mul_value = PyInt_AsLong(w);
409 }
410 else if (PyLong_Check(w)) {
411 mul_value = PyLong_AsLong(w);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000412 if (mul_value == -1 && PyErr_Occurred())
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000413 return NULL;
414 }
415 else {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000416 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000417 "can't multiply sequence with non-int");
Andrew M. Kuchling1991ddc2000-02-14 22:22:04 +0000418 }
419 return (*m->sq_repeat)(v, (int)mul_value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000420 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000421 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000422}
423
424PyObject *
425PyNumber_Divide(v, w)
426 PyObject *v, *w;
427{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000428 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000429 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000430 PyObject *x = NULL;
431 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000432 if (PyNumber_Coerce(&v, &w) != 0)
433 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000434 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
435 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000436 Py_DECREF(v);
437 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000438 if (f != NULL)
439 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000440 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000441 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000442}
443
444PyObject *
445PyNumber_Remainder(v, w)
446 PyObject *v, *w;
447{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000448 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000449 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000450 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000451 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000452 PyObject *x = NULL;
453 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000454 if (PyNumber_Coerce(&v, &w) != 0)
455 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000456 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
457 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000458 Py_DECREF(v);
459 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000460 if (f != NULL)
461 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000462 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000463 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000464}
465
466PyObject *
467PyNumber_Divmod(v, w)
468 PyObject *v, *w;
469{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000470 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
471 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000472 PyObject *x = NULL;
473 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000474 if (PyNumber_Coerce(&v, &w) != 0)
475 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000476 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
477 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000478 Py_DECREF(v);
479 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000480 if (f != NULL)
481 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000482 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000483 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000484}
485
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000486/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000487
488static PyObject *
489do_pow(v, w)
490 PyObject *v, *w;
491{
492 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000493 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
494 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000495 if (v->ob_type->tp_as_number == NULL ||
496 w->ob_type->tp_as_number == NULL) {
497 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000498 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000499 return NULL;
500 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000501 if (PyNumber_Coerce(&v, &w) != 0)
502 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000503 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
504 res = (*f)(v, w, Py_None);
505 else
506 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000507 Py_DECREF(v);
508 Py_DECREF(w);
509 return res;
510}
511
512PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000513PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000514 PyObject *v, *w, *z;
515{
516 PyObject *res;
517 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000518 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000519
520 if (z == Py_None)
521 return do_pow(v, w);
522 /* XXX The ternary version doesn't do class instance coercions */
523 if (PyInstance_Check(v))
524 return v->ob_type->tp_as_number->nb_power(v, w, z);
525 if (v->ob_type->tp_as_number == NULL ||
526 z->ob_type->tp_as_number == NULL ||
527 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000528 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000529 }
530 if (PyNumber_Coerce(&v, &w) != 0)
531 return NULL;
532 res = NULL;
533 v1 = v;
534 z1 = z;
535 if (PyNumber_Coerce(&v1, &z1) != 0)
536 goto error2;
537 w2 = w;
538 z2 = z1;
539 if (PyNumber_Coerce(&w2, &z2) != 0)
540 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000541 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
542 res = (*f)(v1, w2, z2);
543 else
544 res = type_error(
545 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000546 Py_DECREF(w2);
547 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000548 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000549 Py_DECREF(v1);
550 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000551 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000552 Py_DECREF(v);
553 Py_DECREF(w);
554 return res;
555}
556
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000557/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000558
559PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000560PyNumber_Negative(o)
561 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000562{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000563 PyNumberMethods *m;
564
565 if (o == NULL)
566 return null_error();
567 m = o->ob_type->tp_as_number;
568 if (m && m->nb_negative)
569 return (*m->nb_negative)(o);
570
571 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000572}
573
574PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000575PyNumber_Positive(o)
576 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000577{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000578 PyNumberMethods *m;
579
580 if (o == NULL)
581 return null_error();
582 m = o->ob_type->tp_as_number;
583 if (m && m->nb_positive)
584 return (*m->nb_positive)(o);
585
586 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000587}
588
589PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000590PyNumber_Invert(o)
591 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000592{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000593 PyNumberMethods *m;
594
595 if (o == NULL)
596 return null_error();
597 m = o->ob_type->tp_as_number;
598 if (m && m->nb_invert)
599 return (*m->nb_invert)(o);
600
601 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000602}
603
604PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000605PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000606 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000607{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000608 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000609
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000610 if (o == NULL)
611 return null_error();
612 m = o->ob_type->tp_as_number;
613 if (m && m->nb_absolute)
614 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000615
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000616 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000617}
618
619PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000620PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000621 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000622{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000623 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000624
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000625 if (o == NULL)
626 return null_error();
627 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000628 return PyInt_FromString(PyString_AS_STRING(o), NULL, 10);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000629 m = o->ob_type->tp_as_number;
630 if (m && m->nb_int)
631 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000632
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000633 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000634}
635
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000636/* There are two C API functions for converting a string to a long,
637 * PyNumber_Long() and PyLong_FromString(). Both are used in builtin_long,
638 * reachable from Python with the built-in function long().
639 *
640 * The difference is this: PyNumber_Long will raise an exception when the
641 * string cannot be converted to a long. The most common situation is
642 * where a float string is passed in; this raises a ValueError.
643 * PyLong_FromString does not raise an exception; it silently truncates the
644 * float to an integer.
645 *
646 * You can see the different behavior from Python with the following:
647 *
648 * long('9.5')
649 * => ValueError: invalid literal for long(): 9.5
650 *
651 * long('9.5', 10)
652 * => 9L
653 *
654 * The first example ends up calling PyNumber_Long(), while the second one
655 * calls PyLong_FromString().
656 */
657static PyObject *
658long_from_string(v)
659 PyObject *v;
660{
661 char *s, *end;
662 PyObject *x;
663 char buffer[256]; /* For errors */
664
665 s = PyString_AS_STRING(v);
666 while (*s && isspace(Py_CHARMASK(*s)))
667 s++;
668 x = PyLong_FromString(s, &end, 10);
669 if (x == NULL) {
670 if (PyErr_ExceptionMatches(PyExc_ValueError))
671 goto bad;
672 return NULL;
673 }
674 while (*end && isspace(Py_CHARMASK(*end)))
675 end++;
676 if (*end != '\0') {
677 bad:
678 sprintf(buffer, "invalid literal for long(): %.200s", s);
679 PyErr_SetString(PyExc_ValueError, buffer);
680 Py_XDECREF(x);
681 return NULL;
682 }
683 else if (end != PyString_AS_STRING(v) + PyString_GET_SIZE(v)) {
684 PyErr_SetString(PyExc_ValueError,
685 "null byte in argument for long()");
686 return NULL;
687 }
688 return x;
689}
690
Guido van Rossume15dee51995-07-18 14:12:02 +0000691PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000692PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000693 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000694{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000695 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000696
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000697 if (o == NULL)
698 return null_error();
699 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000700 /* need to do extra error checking that PyLong_FromString()
701 * doesn't do. In particular long('9.5') must raise an
702 * exception, not truncate the float.
703 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000704 return long_from_string(o);
705 m = o->ob_type->tp_as_number;
706 if (m && m->nb_long)
707 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000708
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000709 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000710}
711
712PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000713PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000714 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000715{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000716 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000717
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000718 if (o == NULL)
719 return null_error();
720 if (PyString_Check(o))
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000721 return PyFloat_FromString(o, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000722 m = o->ob_type->tp_as_number;
723 if (m && m->nb_float)
724 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000725
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000726 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000727}
728
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000729/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000730
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000731int
732PySequence_Check(s)
733 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000734{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000735 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000736}
737
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000738int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000739PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000740 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000741{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000742 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000743
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000744 if (s == NULL) {
745 null_error();
746 return -1;
747 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000748
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000749 m = s->ob_type->tp_as_sequence;
750 if (m && m->sq_length)
751 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000752
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000753 type_error("len() of unsized object");
754 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000755}
756
757PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000758PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000759 PyObject *s;
760 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000761{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000762 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000763
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000764 if (s == NULL || o == NULL)
765 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000766
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000767 m = s->ob_type->tp_as_sequence;
768 if (m && m->sq_concat)
769 return m->sq_concat(s, o);
770
771 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000772}
773
774PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000775PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000776 PyObject *o;
777 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000778{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000779 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000780
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000781 if (o == NULL)
782 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000783
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000784 m = o->ob_type->tp_as_sequence;
785 if (m && m->sq_repeat)
786 return m->sq_repeat(o, count);
787
788 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000789}
790
791PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000792PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000793 PyObject *s;
794 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000795{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000796 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000797
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000798 if (s == NULL)
799 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000800
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000801 m = s->ob_type->tp_as_sequence;
802 if (m && m->sq_item) {
803 if (i < 0) {
804 if (m->sq_length) {
805 int l = (*m->sq_length)(s);
806 if (l < 0)
807 return NULL;
808 i += l;
809 }
810 }
811 return m->sq_item(s, i);
812 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000813
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000814 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000815}
816
817PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000818PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 PyObject *s;
820 int i1;
821 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000822{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000823 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000824
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000825 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000826
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000827 m = s->ob_type->tp_as_sequence;
828 if (m && m->sq_slice) {
829 if (i1 < 0 || i2 < 0) {
830 if (m->sq_length) {
831 int l = (*m->sq_length)(s);
832 if (l < 0)
833 return NULL;
834 if (i1 < 0)
835 i1 += l;
836 if (i2 < 0)
837 i2 += l;
838 }
839 }
840 return m->sq_slice(s, i1, i2);
841 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000842
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000843 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000844}
845
846int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000847PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 PyObject *s;
849 int i;
850 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000851{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000852 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000853
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000854 if (s == NULL) {
855 null_error();
856 return -1;
857 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000858
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000859 m = s->ob_type->tp_as_sequence;
860 if (m && m->sq_ass_item) {
861 if (i < 0) {
862 if (m->sq_length) {
863 int l = (*m->sq_length)(s);
864 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000865 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000866 i += l;
867 }
868 }
869 return m->sq_ass_item(s, i, o);
870 }
871
872 type_error("object doesn't support item assignment");
873 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000874}
875
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000876int
877PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000878 PyObject *s;
879 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000880{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000881 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000882
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000883 if (s == NULL) {
884 null_error();
885 return -1;
886 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000887
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000888 m = s->ob_type->tp_as_sequence;
889 if (m && m->sq_ass_item) {
890 if (i < 0) {
891 if (m->sq_length) {
892 int l = (*m->sq_length)(s);
893 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000894 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000895 i += l;
896 }
897 }
898 return m->sq_ass_item(s, i, (PyObject *)NULL);
899 }
900
901 type_error("object doesn't support item deletion");
902 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000903}
904
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000905int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000906PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000907 PyObject *s;
908 int i1;
909 int i2;
910 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000911{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000913
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000914 if (s == NULL) {
915 null_error();
916 return -1;
917 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000918
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000919 m = s->ob_type->tp_as_sequence;
920 if (m && m->sq_ass_slice) {
921 if (i1 < 0 || i2 < 0) {
922 if (m->sq_length) {
923 int l = (*m->sq_length)(s);
924 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000925 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926 if (i1 < 0)
927 i1 += l;
928 if (i2 < 0)
929 i2 += l;
930 }
931 }
932 return m->sq_ass_slice(s, i1, i2, o);
933 }
934 type_error("object doesn't support slice assignment");
935 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000936}
937
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000938int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000939PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000940 PyObject *s;
941 int i1;
942 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000943{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000944 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000945
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 if (s == NULL) {
947 null_error();
948 return -1;
949 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000950
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000951 m = s->ob_type->tp_as_sequence;
952 if (m && m->sq_ass_slice) {
953 if (i1 < 0 || i2 < 0) {
954 if (m->sq_length) {
955 int l = (*m->sq_length)(s);
956 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +0000957 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000958 if (i1 < 0)
959 i1 += l;
960 if (i2 < 0)
961 i2 += l;
962 }
963 }
964 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
965 }
966 type_error("object doesn't support slice deletion");
967 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000968}
969
Guido van Rossume15dee51995-07-18 14:12:02 +0000970PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000971PySequence_Tuple(v)
972 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000973{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000974 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000975
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000976 if (v == NULL)
977 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000978
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000979 if (PyTuple_Check(v)) {
980 Py_INCREF(v);
981 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000982 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000983
984 if (PyList_Check(v))
985 return PyList_AsTuple(v);
986
Guido van Rossumbfc725b1998-07-10 16:22:44 +0000987 /* There used to be code for strings here, but tuplifying strings is
988 not a common activity, so I nuked it. Down with code bloat! */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000989
990 /* Generic sequence object */
991 m = v->ob_type->tp_as_sequence;
992 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000993 int i;
994 PyObject *t;
995 int n = PySequence_Length(v);
996 if (n < 0)
997 return NULL;
998 t = PyTuple_New(n);
999 if (t == NULL)
1000 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001001 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001002 PyObject *item = (*m->sq_item)(v, i);
1003 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001004 if (PyErr_ExceptionMatches(PyExc_IndexError))
1005 PyErr_Clear();
1006 else {
1007 Py_DECREF(t);
1008 t = NULL;
1009 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001010 break;
1011 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001012 if (i >= n) {
1013 if (n < 500)
1014 n += 10;
1015 else
1016 n += 100;
1017 if (_PyTuple_Resize(&t, n, 0) != 0)
1018 break;
1019 }
1020 PyTuple_SET_ITEM(t, i, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001021 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001022 if (i < n && t != NULL)
1023 _PyTuple_Resize(&t, i, 0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001024 return t;
1025 }
1026
1027 /* None of the above */
1028 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001029}
1030
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001031PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032PySequence_List(v)
1033 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001034{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001035 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001036
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001037 if (v == NULL)
1038 return null_error();
1039
1040 if (PyList_Check(v))
1041 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1042
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001043 m = v->ob_type->tp_as_sequence;
1044 if (m && m->sq_item) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001045 int i;
1046 PyObject *l;
1047 int n = PySequence_Length(v);
1048 if (n < 0)
1049 return NULL;
1050 l = PyList_New(n);
1051 if (l == NULL)
1052 return NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001053 for (i = 0; ; i++) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001054 PyObject *item = (*m->sq_item)(v, i);
1055 if (item == NULL) {
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001056 if (PyErr_ExceptionMatches(PyExc_IndexError))
1057 PyErr_Clear();
1058 else {
1059 Py_DECREF(l);
1060 l = NULL;
1061 }
1062 break;
1063 }
1064 if (i < n)
1065 PyList_SET_ITEM(l, i, item);
1066 else if (PyList_Append(l, item) < 0) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067 Py_DECREF(l);
1068 l = NULL;
1069 break;
1070 }
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001071 }
1072 if (i < n && l != NULL) {
1073 if (PyList_SetSlice(l, i, n, (PyObject *)NULL) != 0) {
1074 Py_DECREF(l);
1075 l = NULL;
1076 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001077 }
1078 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001079 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001080 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001081}
1082
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001083int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001084PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001085 PyObject *s;
1086 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001087{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001088 int l, i, n, cmp, err;
1089 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001090
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001091 if (s == NULL || o == NULL) {
1092 null_error();
1093 return -1;
1094 }
1095
1096 l = PySequence_Length(s);
1097 if (l < 0)
1098 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001099
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001100 n = 0;
1101 for (i = 0; i < l; i++) {
1102 item = PySequence_GetItem(s, i);
1103 if (item == NULL)
1104 return -1;
1105 err = PyObject_Cmp(item, o, &cmp);
1106 Py_DECREF(item);
1107 if (err < 0)
1108 return err;
1109 if (cmp == 0)
1110 n++;
1111 }
1112 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001113}
1114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001115int
1116PySequence_Contains(w, v) /* v in w */
1117 PyObject *w;
1118 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001119{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001120 int i, cmp;
1121 PyObject *x;
1122 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001123
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124 /* Special case for char in string */
1125 if (PyString_Check(w)) {
1126 register char *s, *end;
1127 register char c;
1128 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1129 PyErr_SetString(PyExc_TypeError,
1130 "string member test needs char left operand");
1131 return -1;
1132 }
1133 c = PyString_AsString(v)[0];
1134 s = PyString_AsString(w);
1135 end = s + PyString_Size(w);
1136 while (s < end) {
1137 if (c == *s++)
1138 return 1;
1139 }
1140 return 0;
1141 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001142
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001143 sq = w->ob_type->tp_as_sequence;
1144 if (sq == NULL || sq->sq_item == NULL) {
1145 PyErr_SetString(PyExc_TypeError,
1146 "'in' or 'not in' needs sequence right argument");
1147 return -1;
1148 }
1149
1150 for (i = 0; ; i++) {
1151 x = (*sq->sq_item)(w, i);
1152 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001153 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154 PyErr_Clear();
1155 break;
1156 }
1157 return -1;
1158 }
1159 cmp = PyObject_Compare(v, x);
1160 Py_XDECREF(x);
1161 if (cmp == 0)
1162 return 1;
1163 if (PyErr_Occurred())
1164 return -1;
1165 }
1166
1167 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001168}
1169
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170/* Backwards compatibility */
1171#undef PySequence_In
1172int
1173PySequence_In(w, v)
1174 PyObject *w;
1175 PyObject *v;
1176{
1177 return PySequence_Contains(w, v);
1178}
1179
1180int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001181PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001182 PyObject *s;
1183 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001184{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001185 int l, i, cmp, err;
1186 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001187
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001188 if (s == NULL || o == NULL) {
1189 null_error();
1190 return -1;
1191 }
1192
1193 l = PySequence_Length(s);
1194 if (l < 0)
1195 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001196
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197 for (i = 0; i < l; i++) {
1198 item = PySequence_GetItem(s, i);
1199 if (item == NULL)
1200 return -1;
1201 err = PyObject_Cmp(item, o, &cmp);
1202 Py_DECREF(item);
1203 if (err < 0)
1204 return err;
1205 if (cmp == 0)
1206 return i;
1207 }
1208
1209 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1210 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001211}
1212
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001213/* Operations on mappings */
1214
1215int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001216PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001218{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001219 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001220}
1221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001222int
1223PyMapping_Length(o)
1224 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001225{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001227
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001228 if (o == NULL) {
1229 null_error();
1230 return -1;
1231 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001232
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001233 m = o->ob_type->tp_as_mapping;
1234 if (m && m->mp_length)
1235 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001236
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 type_error("len() of unsized object");
1238 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001239}
1240
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241PyObject *
1242PyMapping_GetItemString(o, key)
1243 PyObject *o;
1244 char *key;
1245{
1246 PyObject *okey, *r;
1247
1248 if (key == NULL)
1249 return null_error();
1250
1251 okey = PyString_FromString(key);
1252 if (okey == NULL)
1253 return NULL;
1254 r = PyObject_GetItem(o, okey);
1255 Py_DECREF(okey);
1256 return r;
1257}
1258
1259int
1260PyMapping_SetItemString(o, key, value)
1261 PyObject *o;
1262 char *key;
1263 PyObject *value;
1264{
1265 PyObject *okey;
1266 int r;
1267
1268 if (key == NULL) {
1269 null_error();
1270 return -1;
1271 }
1272
1273 okey = PyString_FromString(key);
1274 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001275 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001276 r = PyObject_SetItem(o, okey, value);
1277 Py_DECREF(okey);
1278 return r;
1279}
1280
1281int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001282PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283 PyObject *o;
1284 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001285{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001286 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001287
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001288 v = PyMapping_GetItemString(o, key);
1289 if (v) {
1290 Py_DECREF(v);
1291 return 1;
1292 }
1293 PyErr_Clear();
1294 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001295}
1296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001298PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299 PyObject *o;
1300 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001301{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001303
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 v = PyObject_GetItem(o, key);
1305 if (v) {
1306 Py_DECREF(v);
1307 return 1;
1308 }
1309 PyErr_Clear();
1310 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001311}
1312
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001313/* Operations on callable objects */
1314
1315/* XXX PyCallable_Check() is in object.c */
1316
Guido van Rossume15dee51995-07-18 14:12:02 +00001317PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001318PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001320{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321 PyObject *r;
1322 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001323
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324 if (args == NULL) {
1325 args = PyTuple_New(0);
1326 if (args == NULL)
1327 return NULL;
1328 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001329
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330 r = PyEval_CallObject(o, args);
1331
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001332 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001334 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335
1336 return r;
1337}
Guido van Rossume15dee51995-07-18 14:12:02 +00001338
1339PyObject *
1340#ifdef HAVE_STDARG_PROTOTYPES
1341/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001343#else
1344/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001345 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001346#endif
1347{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001348 va_list va;
1349 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001350#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001351 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001352#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353 PyObject *callable;
1354 char *format;
1355 va_start(va);
1356 callable = va_arg(va, PyObject *);
1357 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001358#endif
1359
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 if (callable == NULL) {
1361 va_end(va);
1362 return null_error();
1363 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001364
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001365 if (format)
1366 args = Py_VaBuildValue(format, va);
1367 else
1368 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001369
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001370 va_end(va);
1371
1372 if (args == NULL)
1373 return NULL;
1374
1375 if (!PyTuple_Check(args)) {
1376 PyObject *a;
1377
1378 a = PyTuple_New(1);
1379 if (a == NULL)
1380 return NULL;
1381 if (PyTuple_SetItem(a, 0, args) < 0)
1382 return NULL;
1383 args = a;
1384 }
1385 retval = PyObject_CallObject(callable, args);
1386
1387 Py_DECREF(args);
1388
1389 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001390}
1391
1392PyObject *
1393#ifdef HAVE_STDARG_PROTOTYPES
1394/* VARARGS 2 */
1395PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1396#else
1397/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001398 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001399#endif
1400{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001401 va_list va;
1402 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001403#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001404 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001405#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001406 PyObject *o;
1407 char *name;
1408 char *format;
1409 va_start(va);
1410 o = va_arg(va, PyObject *);
1411 name = va_arg(va, char *);
1412 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001413#endif
1414
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001415 if (o == NULL || name == NULL) {
1416 va_end(va);
1417 return null_error();
1418 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001419
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001420 func = PyObject_GetAttrString(o, name);
1421 if (func == NULL) {
1422 va_end(va);
1423 PyErr_SetString(PyExc_AttributeError, name);
1424 return 0;
1425 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001426
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001427 if (!PyCallable_Check(func)) {
1428 va_end(va);
1429 return type_error("call of non-callable attribute");
1430 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001431
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001432 if (format && *format)
1433 args = Py_VaBuildValue(format, va);
1434 else
1435 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001436
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001438
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001439 if (!args)
1440 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001441
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 if (!PyTuple_Check(args)) {
1443 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001444
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 a = PyTuple_New(1);
1446 if (a == NULL)
1447 return NULL;
1448 if (PyTuple_SetItem(a, 0, args) < 0)
1449 return NULL;
1450 args = a;
1451 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001452
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001454
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001455 Py_DECREF(args);
1456 Py_DECREF(func);
1457
1458 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001459}