blob: 502bd82dee55e7a0863afa26e26b9da2d81a114c [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/* Copied with modifications from stropmodule.c: atoi, atof, atol */
Guido van Rossume15dee51995-07-18 14:12:02 +000057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000058static PyObject *
59int_from_string(v)
60 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
63 char *s, *end;
64 long x;
65 char buffer[256]; /* For errors */
66
67 s = PyString_AS_STRING(v);
68 while (*s && isspace(Py_CHARMASK(*s)))
69 s++;
70 if (s[0] == '\0') {
71 PyErr_SetString(PyExc_ValueError, "empty string for int()");
72 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000073 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000074 errno = 0;
75 x = PyOS_strtol(s, &end, 10);
76 while (*end && isspace(Py_CHARMASK(*end)))
77 end++;
78 if (*end != '\0') {
79 sprintf(buffer, "invalid literal for int(): %.200s", s);
80 PyErr_SetString(PyExc_ValueError, buffer);
81 return NULL;
82 }
83 else if (end-s != PyString_GET_SIZE(v)) {
84 PyErr_SetString(PyExc_ValueError,
85 "null byte in argument for int()");
86 return NULL;
87 }
88 else if (errno != 0) {
89 sprintf(buffer, "int() literal too large: %.200s", s);
90 PyErr_SetString(PyExc_ValueError, buffer);
91 return NULL;
92 }
93 return PyInt_FromLong(x);
94}
95
96static PyObject *
97long_from_string(v)
98 PyObject *v;
99{
100 char *s, *end;
101 PyObject *x;
102 char buffer[256]; /* For errors */
103
104 s = PyString_AS_STRING(v);
105 while (*s && isspace(Py_CHARMASK(*s)))
106 s++;
107 if (s[0] == '\0') {
108 PyErr_SetString(PyExc_ValueError, "empty string for long()");
109 return NULL;
110 }
111 x = PyLong_FromString(s, &end, 10);
112 if (x == NULL)
113 return NULL;
114 while (*end && isspace(Py_CHARMASK(*end)))
115 end++;
116 if (*end != '\0') {
117 sprintf(buffer, "invalid literal for long(): %.200s", s);
118 PyErr_SetString(PyExc_ValueError, buffer);
119 Py_DECREF(x);
120 return NULL;
121 }
122 else if (end-s != PyString_GET_SIZE(v)) {
123 PyErr_SetString(PyExc_ValueError,
124 "null byte in argument for float()");
125 return NULL;
126 }
127 return x;
128}
129
130static PyObject *
131float_from_string(v)
132 PyObject *v;
133{
134 extern double strtod Py_PROTO((const char *, char **));
135 char *s, *end;
136 double x;
137 char buffer[256]; /* For errors */
138
139 s = PyString_AS_STRING(v);
140 while (*s && isspace(Py_CHARMASK(*s)))
141 s++;
142 if (s[0] == '\0') {
143 PyErr_SetString(PyExc_ValueError, "empty string for float()");
144 return NULL;
145 }
146 errno = 0;
147 PyFPE_START_PROTECT("float_from_string", return 0)
148 x = strtod(s, &end);
149 PyFPE_END_PROTECT(x)
150 while (*end && isspace(Py_CHARMASK(*end)))
151 end++;
152 if (*end != '\0') {
153 sprintf(buffer, "invalid literal for float(): %.200s", s);
154 PyErr_SetString(PyExc_ValueError, buffer);
155 return NULL;
156 }
157 else if (end-s != PyString_GET_SIZE(v)) {
158 PyErr_SetString(PyExc_ValueError,
159 "null byte in argument for float()");
160 return NULL;
161 }
162 else if (errno != 0) {
163 sprintf(buffer, "float() literal too large: %.200s", s);
164 PyErr_SetString(PyExc_ValueError, buffer);
165 return NULL;
166 }
167 return PyFloat_FromDouble(x);
168}
169
170/* Operations on any object */
171
172int
173PyObject_Cmp(o1, o2, result)
174 PyObject *o1;
175 PyObject *o2;
176 int *result;
177{
178 int r;
179
180 if (o1 == NULL || o2 == NULL) {
181 null_error();
182 return -1;
183 }
184 r = PyObject_Compare(o1, o2);
185 if (PyErr_Occurred())
186 return -1;
187 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +0000188 return 0;
189}
Guido van Rossume15dee51995-07-18 14:12:02 +0000190
191PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000192PyObject_Type(o)
193 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000194{
195 PyObject *v;
196
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000197 if (o == NULL)
198 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000199 v = (PyObject *)o->ob_type;
200 Py_INCREF(v);
201 return v;
202}
203
204int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000205PyObject_Length(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 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000209
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000210 if (o == NULL) {
211 null_error();
212 return -1;
213 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000214
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000215 m = o->ob_type->tp_as_sequence;
216 if (m && m->sq_length)
217 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000218
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000219 return PyMapping_Length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000220}
221
222PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000223PyObject_GetItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000224 PyObject *o;
225 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000226{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000227 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000228
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000229 if (o == NULL || key == NULL)
230 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000232 m = o->ob_type->tp_as_mapping;
233 if (m && m->mp_subscript)
234 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000235
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000236 if (PyInt_Check(key))
237 return PySequence_GetItem(o, PyInt_AsLong(key));
238
239 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000240}
241
242int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000243PyObject_SetItem(o, key, value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000244 PyObject *o;
245 PyObject *key;
246 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000247{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000248 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000249
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000250 if (o == NULL || key == NULL || value == NULL) {
251 null_error();
252 return -1;
253 }
254 m = o->ob_type->tp_as_mapping;
255 if (m && m->mp_ass_subscript)
256 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000257
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000258 if (PyInt_Check(key))
259 return PySequence_SetItem(o, PyInt_AsLong(key), value);
260
261 type_error("object does not support item assignment");
262 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000263}
264
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000265int
266PyObject_DelItem(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000267 PyObject *o;
268 PyObject *key;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000269{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000270 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000271
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000272 if (o == NULL || key == NULL) {
273 null_error();
274 return -1;
275 }
276 m = o->ob_type->tp_as_mapping;
277 if (m && m->mp_ass_subscript)
278 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000279
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000280 if (PyInt_Check(key))
281 return PySequence_DelItem(o, PyInt_AsLong(key));
282
283 type_error("object does not support item deletion");
284 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000285}
286
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000287/* Operations on numbers */
288
289int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000290PyNumber_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000291 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000292{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000293 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000294}
295
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000296/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000297
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000298#define BINOP(v, w, opname, ropname, thisfunc) \
299 if (PyInstance_Check(v) || PyInstance_Check(w)) \
Guido van Rossume15dee51995-07-18 14:12:02 +0000300 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
301
302PyObject *
303PyNumber_Or(v, w)
304 PyObject *v, *w;
305{
306 extern int PyNumber_Coerce();
307
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000308 BINOP(v, w, "__or__", "__ror__", PyNumber_Or);
Guido van Rossume15dee51995-07-18 14:12:02 +0000309 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000310 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000311 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
312 if (PyNumber_Coerce(&v, &w) != 0)
313 return NULL;
314 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
315 x = (*f)(v, w);
316 Py_DECREF(v);
317 Py_DECREF(w);
318 if (f != NULL)
319 return x;
320 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000321 return type_error("bad operand type(s) for |");
Guido van Rossume15dee51995-07-18 14:12:02 +0000322}
323
324PyObject *
325PyNumber_Xor(v, w)
326 PyObject *v, *w;
327{
328 extern int PyNumber_Coerce();
329
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000330 BINOP(v, w, "__xor__", "__rxor__", PyNumber_Xor);
Guido van Rossume15dee51995-07-18 14:12:02 +0000331 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000332 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000333 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
334 if (PyNumber_Coerce(&v, &w) != 0)
335 return NULL;
336 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
337 x = (*f)(v, w);
338 Py_DECREF(v);
339 Py_DECREF(w);
340 if (f != NULL)
341 return x;
342 }
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_And(v, w)
348 PyObject *v, *w;
349{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000350 BINOP(v, w, "__and__", "__rand__", PyNumber_And);
Guido van Rossume15dee51995-07-18 14:12:02 +0000351 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000352 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000353 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
354 if (PyNumber_Coerce(&v, &w) != 0)
355 return NULL;
356 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
357 x = (*f)(v, w);
358 Py_DECREF(v);
359 Py_DECREF(w);
360 if (f != NULL)
361 return x;
362 }
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_Lshift(v, w)
368 PyObject *v, *w;
369{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000370 BINOP(v, w, "__lshift__", "__rlshift__", PyNumber_Lshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000371 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000372 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000373 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
374 if (PyNumber_Coerce(&v, &w) != 0)
375 return NULL;
376 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
377 x = (*f)(v, w);
378 Py_DECREF(v);
379 Py_DECREF(w);
380 if (f != NULL)
381 return x;
382 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000383 return type_error("bad operand type(s) for <<");
Guido van Rossume15dee51995-07-18 14:12:02 +0000384}
385
386PyObject *
387PyNumber_Rshift(v, w)
388 PyObject *v, *w;
389{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000390 BINOP(v, w, "__rshift__", "__rrshift__", PyNumber_Rshift);
Guido van Rossume15dee51995-07-18 14:12:02 +0000391 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000392 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000393 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
394 if (PyNumber_Coerce(&v, &w) != 0)
395 return NULL;
396 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
397 x = (*f)(v, w);
398 Py_DECREF(v);
399 Py_DECREF(w);
400 if (f != NULL)
401 return x;
402 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000403 return type_error("bad operand type(s) for >>");
Guido van Rossume15dee51995-07-18 14:12:02 +0000404}
405
406PyObject *
407PyNumber_Add(v, w)
408 PyObject *v, *w;
409{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000410 PySequenceMethods *m;
411
412 BINOP(v, w, "__add__", "__radd__", PyNumber_Add);
413 m = v->ob_type->tp_as_sequence;
414 if (m && m->sq_concat)
415 return (*m->sq_concat)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000416 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000417 PyObject *x = NULL;
418 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000419 if (PyNumber_Coerce(&v, &w) != 0)
420 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000421 if ((f = v->ob_type->tp_as_number->nb_add) != NULL)
422 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000423 Py_DECREF(v);
424 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000425 if (f != NULL)
426 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000427 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000428 return type_error("bad operand type(s) for +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000429}
430
431PyObject *
432PyNumber_Subtract(v, w)
433 PyObject *v, *w;
434{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000435 BINOP(v, w, "__sub__", "__rsub__", PyNumber_Subtract);
Guido van Rossume15dee51995-07-18 14:12:02 +0000436 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000437 PyObject *x = NULL;
438 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000439 if (PyNumber_Coerce(&v, &w) != 0)
440 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000441 if ((f = v->ob_type->tp_as_number->nb_subtract) != NULL)
442 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000443 Py_DECREF(v);
444 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000445 if (f != NULL)
446 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000447 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000448 return type_error("bad operand type(s) for -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000449}
450
451PyObject *
452PyNumber_Multiply(v, w)
453 PyObject *v, *w;
454{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000455 PyTypeObject *tp = v->ob_type;
456 PySequenceMethods *m;
457
458 BINOP(v, w, "__mul__", "__rmul__", PyNumber_Multiply);
Guido van Rossume15dee51995-07-18 14:12:02 +0000459 if (tp->tp_as_number != NULL &&
460 w->ob_type->tp_as_sequence != NULL &&
461 !PyInstance_Check(v)) {
462 /* number*sequence -- swap v and w */
463 PyObject *tmp = v;
464 v = w;
465 w = tmp;
466 tp = v->ob_type;
467 }
468 if (tp->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000469 PyObject *x = NULL;
470 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000471 if (PyInstance_Check(v)) {
472 /* Instances of user-defined classes get their
473 other argument uncoerced, so they may
474 implement sequence*number as well as
475 number*number. */
476 Py_INCREF(v);
477 Py_INCREF(w);
478 }
479 else if (PyNumber_Coerce(&v, &w) != 0)
480 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000481 if ((f = v->ob_type->tp_as_number->nb_multiply) != NULL)
482 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000483 Py_DECREF(v);
484 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000485 if (f != NULL)
486 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000487 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000488 m = tp->tp_as_sequence;
489 if (m && m->sq_repeat) {
490 if (!PyInt_Check(w))
491 return type_error(
Guido van Rossume15dee51995-07-18 14:12:02 +0000492 "can't multiply sequence with non-int");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000493 return (*m->sq_repeat)(v, (int)PyInt_AsLong(w));
Guido van Rossume15dee51995-07-18 14:12:02 +0000494 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000495 return type_error("bad operand type(s) for *");
Guido van Rossume15dee51995-07-18 14:12:02 +0000496}
497
498PyObject *
499PyNumber_Divide(v, w)
500 PyObject *v, *w;
501{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000502 BINOP(v, w, "__div__", "__rdiv__", PyNumber_Divide);
Guido van Rossume15dee51995-07-18 14:12:02 +0000503 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000504 PyObject *x = NULL;
505 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000506 if (PyNumber_Coerce(&v, &w) != 0)
507 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000508 if ((f = v->ob_type->tp_as_number->nb_divide) != NULL)
509 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000510 Py_DECREF(v);
511 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000512 if (f != NULL)
513 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000514 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000515 return type_error("bad operand type(s) for /");
Guido van Rossume15dee51995-07-18 14:12:02 +0000516}
517
518PyObject *
519PyNumber_Remainder(v, w)
520 PyObject *v, *w;
521{
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000522 if (PyString_Check(v))
Guido van Rossume15dee51995-07-18 14:12:02 +0000523 return PyString_Format(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000524 BINOP(v, w, "__mod__", "__rmod__", PyNumber_Remainder);
Guido van Rossume15dee51995-07-18 14:12:02 +0000525 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000526 PyObject *x = NULL;
527 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000528 if (PyNumber_Coerce(&v, &w) != 0)
529 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000530 if ((f = v->ob_type->tp_as_number->nb_remainder) != NULL)
531 x = (*f)(v, w);
Guido van Rossume15dee51995-07-18 14:12:02 +0000532 Py_DECREF(v);
533 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000534 if (f != NULL)
535 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000536 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000537 return type_error("bad operand type(s) for %");
Guido van Rossume15dee51995-07-18 14:12:02 +0000538}
539
540PyObject *
541PyNumber_Divmod(v, w)
542 PyObject *v, *w;
543{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000544 BINOP(v, w, "__divmod__", "__rdivmod__", PyNumber_Divmod);
545 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000546 PyObject *x = NULL;
547 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000548 if (PyNumber_Coerce(&v, &w) != 0)
549 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000550 if ((f = v->ob_type->tp_as_number->nb_divmod) != NULL)
551 x = (*f)(v, w);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000552 Py_DECREF(v);
553 Py_DECREF(w);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000554 if (f != NULL)
555 return x;
Guido van Rossume15dee51995-07-18 14:12:02 +0000556 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000557 return type_error("bad operand type(s) for divmod()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000558}
559
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000560/* Power (binary or ternary) */
Guido van Rossume15dee51995-07-18 14:12:02 +0000561
562static PyObject *
563do_pow(v, w)
564 PyObject *v, *w;
565{
566 PyObject *res;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000567 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
568 BINOP(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossume15dee51995-07-18 14:12:02 +0000569 if (v->ob_type->tp_as_number == NULL ||
570 w->ob_type->tp_as_number == NULL) {
571 PyErr_SetString(PyExc_TypeError,
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000572 "pow(x, y) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000573 return NULL;
574 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000575 if (
576#ifndef WITHOUT_COMPLEX
577 !PyComplex_Check(v) &&
578#endif
579 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
Guido van Rossume15dee51995-07-18 14:12:02 +0000580 if (!PyErr_Occurred())
581 PyErr_SetString(PyExc_ValueError,
582 "negative number to float power");
583 return NULL;
584 }
585 if (PyNumber_Coerce(&v, &w) != 0)
586 return NULL;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000587 if ((f = v->ob_type->tp_as_number->nb_power) != NULL)
588 res = (*f)(v, w, Py_None);
589 else
590 res = type_error("pow(x, y) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000591 Py_DECREF(v);
592 Py_DECREF(w);
593 return res;
594}
595
596PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000597PyNumber_Power(v, w, z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000598 PyObject *v, *w, *z;
599{
600 PyObject *res;
601 PyObject *v1, *z1, *w2, *z2;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000602 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossume15dee51995-07-18 14:12:02 +0000603
604 if (z == Py_None)
605 return do_pow(v, w);
606 /* XXX The ternary version doesn't do class instance coercions */
607 if (PyInstance_Check(v))
608 return v->ob_type->tp_as_number->nb_power(v, w, z);
609 if (v->ob_type->tp_as_number == NULL ||
610 z->ob_type->tp_as_number == NULL ||
611 w->ob_type->tp_as_number == NULL) {
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000612 return type_error("pow(x, y, z) requires numeric arguments");
Guido van Rossume15dee51995-07-18 14:12:02 +0000613 }
614 if (PyNumber_Coerce(&v, &w) != 0)
615 return NULL;
616 res = NULL;
617 v1 = v;
618 z1 = z;
619 if (PyNumber_Coerce(&v1, &z1) != 0)
620 goto error2;
621 w2 = w;
622 z2 = z1;
623 if (PyNumber_Coerce(&w2, &z2) != 0)
624 goto error1;
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +0000625 if ((f = v1->ob_type->tp_as_number->nb_power) != NULL)
626 res = (*f)(v1, w2, z2);
627 else
628 res = type_error(
629 "pow(x, y, z) not defined for these operands");
Guido van Rossume15dee51995-07-18 14:12:02 +0000630 Py_DECREF(w2);
631 Py_DECREF(z2);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000632 error1:
Guido van Rossume15dee51995-07-18 14:12:02 +0000633 Py_DECREF(v1);
634 Py_DECREF(z1);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000635 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000636 Py_DECREF(v);
637 Py_DECREF(w);
638 return res;
639}
640
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000641/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000642
643PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000644PyNumber_Negative(o)
645 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000646{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000647 PyNumberMethods *m;
648
649 if (o == NULL)
650 return null_error();
651 m = o->ob_type->tp_as_number;
652 if (m && m->nb_negative)
653 return (*m->nb_negative)(o);
654
655 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000656}
657
658PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000659PyNumber_Positive(o)
660 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000661{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000662 PyNumberMethods *m;
663
664 if (o == NULL)
665 return null_error();
666 m = o->ob_type->tp_as_number;
667 if (m && m->nb_positive)
668 return (*m->nb_positive)(o);
669
670 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000671}
672
673PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000674PyNumber_Invert(o)
675 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000676{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000677 PyNumberMethods *m;
678
679 if (o == NULL)
680 return null_error();
681 m = o->ob_type->tp_as_number;
682 if (m && m->nb_invert)
683 return (*m->nb_invert)(o);
684
685 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000686}
687
688PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000689PyNumber_Absolute(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000690 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000691{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000692 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000693
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000694 if (o == NULL)
695 return null_error();
696 m = o->ob_type->tp_as_number;
697 if (m && m->nb_absolute)
698 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000699
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000700 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000701}
702
703PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000704PyNumber_Int(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000705 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000706{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000707 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000708
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000709 if (o == NULL)
710 return null_error();
711 if (PyString_Check(o))
712 return int_from_string(o);
713 m = o->ob_type->tp_as_number;
714 if (m && m->nb_int)
715 return m->nb_int(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000716
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000717 return type_error("object can't be converted to int");
Guido van Rossume15dee51995-07-18 14:12:02 +0000718}
719
720PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000721PyNumber_Long(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000722 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000723{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000724 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000725
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000726 if (o == NULL)
727 return null_error();
728 if (PyString_Check(o))
729 return long_from_string(o);
730 m = o->ob_type->tp_as_number;
731 if (m && m->nb_long)
732 return m->nb_long(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000733
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000734 return type_error("object can't be converted to long");
Guido van Rossume15dee51995-07-18 14:12:02 +0000735}
736
737PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000738PyNumber_Float(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000739 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000740{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000741 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000742
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000743 if (o == NULL)
744 return null_error();
745 if (PyString_Check(o))
746 return float_from_string(o);
747 m = o->ob_type->tp_as_number;
748 if (m && m->nb_float)
749 return m->nb_float(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000750
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000751 return type_error("object can't be converted to float");
Guido van Rossume15dee51995-07-18 14:12:02 +0000752}
753
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000754/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000755
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000756int
757PySequence_Check(s)
758 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000759{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000760 return s != NULL && s->ob_type->tp_as_sequence;
Guido van Rossume15dee51995-07-18 14:12:02 +0000761}
762
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000763int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000764PySequence_Length(s)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000765 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000766{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000767 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000768
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000769 if (s == NULL) {
770 null_error();
771 return -1;
772 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000773
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000774 m = s->ob_type->tp_as_sequence;
775 if (m && m->sq_length)
776 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +0000777
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000778 type_error("len() of unsized object");
779 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000780}
781
782PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000783PySequence_Concat(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000784 PyObject *s;
785 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000786{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000787 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000788
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000789 if (s == NULL || o == NULL)
790 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000791
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000792 m = s->ob_type->tp_as_sequence;
793 if (m && m->sq_concat)
794 return m->sq_concat(s, o);
795
796 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000797}
798
799PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000800PySequence_Repeat(o, count)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000801 PyObject *o;
802 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000803{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000804 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000805
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000806 if (o == NULL)
807 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000808
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000809 m = o->ob_type->tp_as_sequence;
810 if (m && m->sq_repeat)
811 return m->sq_repeat(o, count);
812
813 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +0000814}
815
816PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000817PySequence_GetItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000818 PyObject *s;
819 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000820{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000821 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000822
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000823 if (s == NULL)
824 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000825
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000826 m = s->ob_type->tp_as_sequence;
827 if (m && m->sq_item) {
828 if (i < 0) {
829 if (m->sq_length) {
830 int l = (*m->sq_length)(s);
831 if (l < 0)
832 return NULL;
833 i += l;
834 }
835 }
836 return m->sq_item(s, i);
837 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000838
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000839 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000840}
841
842PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000843PySequence_GetSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000844 PyObject *s;
845 int i1;
846 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000847{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000848 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000849
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000850 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000851
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000852 m = s->ob_type->tp_as_sequence;
853 if (m && m->sq_slice) {
854 if (i1 < 0 || i2 < 0) {
855 if (m->sq_length) {
856 int l = (*m->sq_length)(s);
857 if (l < 0)
858 return NULL;
859 if (i1 < 0)
860 i1 += l;
861 if (i2 < 0)
862 i2 += l;
863 }
864 }
865 return m->sq_slice(s, i1, i2);
866 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000867
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000868 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000869}
870
871int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000872PySequence_SetItem(s, i, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000873 PyObject *s;
874 int i;
875 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000876{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000877 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000878
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000879 if (s == NULL) {
880 null_error();
881 return -1;
882 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000883
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000884 m = s->ob_type->tp_as_sequence;
885 if (m && m->sq_ass_item) {
886 if (i < 0) {
887 if (m->sq_length) {
888 int l = (*m->sq_length)(s);
889 if (l < 0)
890 return NULL;
891 i += l;
892 }
893 }
894 return m->sq_ass_item(s, i, o);
895 }
896
897 type_error("object doesn't support item assignment");
898 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000899}
900
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000901int
902PySequence_DelItem(s, i)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000903 PyObject *s;
904 int i;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000905{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000906 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000907
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000908 if (s == NULL) {
909 null_error();
910 return -1;
911 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000912
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000913 m = s->ob_type->tp_as_sequence;
914 if (m && m->sq_ass_item) {
915 if (i < 0) {
916 if (m->sq_length) {
917 int l = (*m->sq_length)(s);
918 if (l < 0)
919 return NULL;
920 i += l;
921 }
922 }
923 return m->sq_ass_item(s, i, (PyObject *)NULL);
924 }
925
926 type_error("object doesn't support item deletion");
927 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000928}
929
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000930int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000931PySequence_SetSlice(s, i1, i2, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000932 PyObject *s;
933 int i1;
934 int i2;
935 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000936{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000937 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000938
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000939 if (s == NULL) {
940 null_error();
941 return -1;
942 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000943
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000944 m = s->ob_type->tp_as_sequence;
945 if (m && m->sq_ass_slice) {
946 if (i1 < 0 || i2 < 0) {
947 if (m->sq_length) {
948 int l = (*m->sq_length)(s);
949 if (l < 0)
950 return NULL;
951 if (i1 < 0)
952 i1 += l;
953 if (i2 < 0)
954 i2 += l;
955 }
956 }
957 return m->sq_ass_slice(s, i1, i2, o);
958 }
959 type_error("object doesn't support slice assignment");
960 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000961}
962
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000963int
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000964PySequence_DelSlice(s, i1, i2)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 PyObject *s;
966 int i1;
967 int i2;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000968{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000969 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000970
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000971 if (s == NULL) {
972 null_error();
973 return -1;
974 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000975
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000976 m = s->ob_type->tp_as_sequence;
977 if (m && m->sq_ass_slice) {
978 if (i1 < 0 || i2 < 0) {
979 if (m->sq_length) {
980 int l = (*m->sq_length)(s);
981 if (l < 0)
982 return NULL;
983 if (i1 < 0)
984 i1 += l;
985 if (i2 < 0)
986 i2 += l;
987 }
988 }
989 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
990 }
991 type_error("object doesn't support slice deletion");
992 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000993}
994
Guido van Rossume15dee51995-07-18 14:12:02 +0000995PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000996PySequence_Tuple(v)
997 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +0000998{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000999 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001000
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001001 if (v == NULL)
1002 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001003
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001004 if (PyTuple_Check(v)) {
1005 Py_INCREF(v);
1006 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001007 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008
1009 if (PyList_Check(v))
1010 return PyList_AsTuple(v);
1011
1012 if (PyString_Check(v)) {
1013 int n = PyString_Size(v);
1014 PyObject *t = PyTuple_New(n);
1015 if (t != NULL) {
1016 int i;
1017 char *p = PyString_AsString(v);
1018 for (i = 0; i < n; i++) {
1019 PyObject *item =
1020 PyString_FromStringAndSize(p+i, 1);
1021 if (item == NULL) {
1022 Py_DECREF(t);
1023 t = NULL;
1024 break;
1025 }
1026 PyTuple_SetItem(t, i, item);
1027 }
1028 }
1029 return t;
1030 }
1031
1032 /* Generic sequence object */
1033 m = v->ob_type->tp_as_sequence;
1034 if (m && m->sq_item) {
1035 /* XXX Should support indefinite-length sequences */
1036 int i;
1037 PyObject *t;
1038 int n = PySequence_Length(v);
1039 if (n < 0)
1040 return NULL;
1041 t = PyTuple_New(n);
1042 if (t == NULL)
1043 return NULL;
1044 for (i = 0; i < n; i++) {
1045 PyObject *item = (*m->sq_item)(v, i);
1046 if (item == NULL) {
1047 Py_DECREF(t);
1048 t = NULL;
1049 break;
1050 }
1051 PyTuple_SetItem(t, i, item);
1052 }
1053 return t;
1054 }
1055
1056 /* None of the above */
1057 return type_error("tuple() argument must be a sequence");
Guido van Rossume15dee51995-07-18 14:12:02 +00001058}
1059
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001060PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001061PySequence_List(v)
1062 PyObject *v;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001063{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 PySequenceMethods *m;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001065
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066 m = v->ob_type->tp_as_sequence;
1067 if (m && m->sq_item) {
1068 /* XXX Should support indefinite-length sequences */
1069 int i;
1070 PyObject *l;
1071 int n = PySequence_Length(v);
1072 if (n < 0)
1073 return NULL;
1074 l = PyList_New(n);
1075 if (l == NULL)
1076 return NULL;
1077 for (i = 0; i < n; i++) {
1078 PyObject *item = (*m->sq_item)(v, i);
1079 if (item == NULL) {
1080 Py_DECREF(l);
1081 l = NULL;
1082 break;
1083 }
1084 PyList_SetItem(l, i, item);
1085 }
1086 return l;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001087 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001088 return type_error("list() argument must be a sequence");
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001089}
1090
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001091int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001092PySequence_Count(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001093 PyObject *s;
1094 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001095{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 int l, i, n, cmp, err;
1097 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001098
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001099 if (s == NULL || o == NULL) {
1100 null_error();
1101 return -1;
1102 }
1103
1104 l = PySequence_Length(s);
1105 if (l < 0)
1106 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001107
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001108 n = 0;
1109 for (i = 0; i < l; i++) {
1110 item = PySequence_GetItem(s, i);
1111 if (item == NULL)
1112 return -1;
1113 err = PyObject_Cmp(item, o, &cmp);
1114 Py_DECREF(item);
1115 if (err < 0)
1116 return err;
1117 if (cmp == 0)
1118 n++;
1119 }
1120 return n;
Guido van Rossume15dee51995-07-18 14:12:02 +00001121}
1122
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123int
1124PySequence_Contains(w, v) /* v in w */
1125 PyObject *w;
1126 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001127{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001128 int i, cmp;
1129 PyObject *x;
1130 PySequenceMethods *sq;
Guido van Rossume15dee51995-07-18 14:12:02 +00001131
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001132 /* Special case for char in string */
1133 if (PyString_Check(w)) {
1134 register char *s, *end;
1135 register char c;
1136 if (!PyString_Check(v) || PyString_Size(v) != 1) {
1137 PyErr_SetString(PyExc_TypeError,
1138 "string member test needs char left operand");
1139 return -1;
1140 }
1141 c = PyString_AsString(v)[0];
1142 s = PyString_AsString(w);
1143 end = s + PyString_Size(w);
1144 while (s < end) {
1145 if (c == *s++)
1146 return 1;
1147 }
1148 return 0;
1149 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001150
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001151 sq = w->ob_type->tp_as_sequence;
1152 if (sq == NULL || sq->sq_item == NULL) {
1153 PyErr_SetString(PyExc_TypeError,
1154 "'in' or 'not in' needs sequence right argument");
1155 return -1;
1156 }
1157
1158 for (i = 0; ; i++) {
1159 x = (*sq->sq_item)(w, i);
1160 if (x == NULL) {
Guido van Rossum08570de1998-05-28 19:24:35 +00001161 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 PyErr_Clear();
1163 break;
1164 }
1165 return -1;
1166 }
1167 cmp = PyObject_Compare(v, x);
1168 Py_XDECREF(x);
1169 if (cmp == 0)
1170 return 1;
1171 if (PyErr_Occurred())
1172 return -1;
1173 }
1174
1175 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001176}
1177
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178/* Backwards compatibility */
1179#undef PySequence_In
1180int
1181PySequence_In(w, v)
1182 PyObject *w;
1183 PyObject *v;
1184{
1185 return PySequence_Contains(w, v);
1186}
1187
1188int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001189PySequence_Index(s, o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190 PyObject *s;
1191 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001192{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001193 int l, i, cmp, err;
1194 PyObject *item;
Guido van Rossume15dee51995-07-18 14:12:02 +00001195
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001196 if (s == NULL || o == NULL) {
1197 null_error();
1198 return -1;
1199 }
1200
1201 l = PySequence_Length(s);
1202 if (l < 0)
1203 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001204
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205 for (i = 0; i < l; i++) {
1206 item = PySequence_GetItem(s, i);
1207 if (item == NULL)
1208 return -1;
1209 err = PyObject_Cmp(item, o, &cmp);
1210 Py_DECREF(item);
1211 if (err < 0)
1212 return err;
1213 if (cmp == 0)
1214 return i;
1215 }
1216
1217 PyErr_SetString(PyExc_ValueError, "sequence.index(x): x not in list");
1218 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001219}
1220
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001221/* Operations on mappings */
1222
1223int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001224PyMapping_Check(o)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001225 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001226{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 return o && o->ob_type->tp_as_mapping;
Guido van Rossume15dee51995-07-18 14:12:02 +00001228}
1229
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230int
1231PyMapping_Length(o)
1232 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +00001233{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001234 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001235
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001236 if (o == NULL) {
1237 null_error();
1238 return -1;
1239 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001240
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001241 m = o->ob_type->tp_as_mapping;
1242 if (m && m->mp_length)
1243 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001244
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001245 type_error("len() of unsized object");
1246 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001247}
1248
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001249PyObject *
1250PyMapping_GetItemString(o, key)
1251 PyObject *o;
1252 char *key;
1253{
1254 PyObject *okey, *r;
1255
1256 if (key == NULL)
1257 return null_error();
1258
1259 okey = PyString_FromString(key);
1260 if (okey == NULL)
1261 return NULL;
1262 r = PyObject_GetItem(o, okey);
1263 Py_DECREF(okey);
1264 return r;
1265}
1266
1267int
1268PyMapping_SetItemString(o, key, value)
1269 PyObject *o;
1270 char *key;
1271 PyObject *value;
1272{
1273 PyObject *okey;
1274 int r;
1275
1276 if (key == NULL) {
1277 null_error();
1278 return -1;
1279 }
1280
1281 okey = PyString_FromString(key);
1282 if (okey == NULL)
1283 return NULL;
1284 r = PyObject_SetItem(o, okey, value);
1285 Py_DECREF(okey);
1286 return r;
1287}
1288
1289int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001290PyMapping_HasKeyString(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001291 PyObject *o;
1292 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001293{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001294 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001295
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001296 v = PyMapping_GetItemString(o, key);
1297 if (v) {
1298 Py_DECREF(v);
1299 return 1;
1300 }
1301 PyErr_Clear();
1302 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001303}
1304
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001305int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001306PyMapping_HasKey(o, key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 PyObject *o;
1308 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001309{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001310 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001311
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 v = PyObject_GetItem(o, key);
1313 if (v) {
1314 Py_DECREF(v);
1315 return 1;
1316 }
1317 PyErr_Clear();
1318 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001319}
1320
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001321/* Operations on callable objects */
1322
1323/* XXX PyCallable_Check() is in object.c */
1324
Guido van Rossume15dee51995-07-18 14:12:02 +00001325PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001326PyObject_CallObject(o, a)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001327 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001328{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001329 PyObject *r;
1330 PyObject *args = a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001331
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001332 if (args == NULL) {
1333 args = PyTuple_New(0);
1334 if (args == NULL)
1335 return NULL;
1336 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001337
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001338 r = PyEval_CallObject(o, args);
1339
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001340 if (args != a) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001341 Py_DECREF(args);
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00001342 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343
1344 return r;
1345}
Guido van Rossume15dee51995-07-18 14:12:02 +00001346
1347PyObject *
1348#ifdef HAVE_STDARG_PROTOTYPES
1349/* VARARGS 2 */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001351#else
1352/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001353 PyObject_CallFunction(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001354#endif
1355{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001356 va_list va;
1357 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001358#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001359 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001360#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001361 PyObject *callable;
1362 char *format;
1363 va_start(va);
1364 callable = va_arg(va, PyObject *);
1365 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001366#endif
1367
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001368 if (callable == NULL) {
1369 va_end(va);
1370 return null_error();
1371 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001372
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373 if (format)
1374 args = Py_VaBuildValue(format, va);
1375 else
1376 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001377
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001378 va_end(va);
1379
1380 if (args == NULL)
1381 return NULL;
1382
1383 if (!PyTuple_Check(args)) {
1384 PyObject *a;
1385
1386 a = PyTuple_New(1);
1387 if (a == NULL)
1388 return NULL;
1389 if (PyTuple_SetItem(a, 0, args) < 0)
1390 return NULL;
1391 args = a;
1392 }
1393 retval = PyObject_CallObject(callable, args);
1394
1395 Py_DECREF(args);
1396
1397 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001398}
1399
1400PyObject *
1401#ifdef HAVE_STDARG_PROTOTYPES
1402/* VARARGS 2 */
1403PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1404#else
1405/* VARARGS */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001406 PyObject_CallMethod(va_alist) va_dcl
Guido van Rossume15dee51995-07-18 14:12:02 +00001407#endif
1408{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409 va_list va;
1410 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001411#ifdef HAVE_STDARG_PROTOTYPES
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001412 va_start(va, format);
Guido van Rossume15dee51995-07-18 14:12:02 +00001413#else
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001414 PyObject *o;
1415 char *name;
1416 char *format;
1417 va_start(va);
1418 o = va_arg(va, PyObject *);
1419 name = va_arg(va, char *);
1420 format = va_arg(va, char *);
Guido van Rossume15dee51995-07-18 14:12:02 +00001421#endif
1422
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 if (o == NULL || name == NULL) {
1424 va_end(va);
1425 return null_error();
1426 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001427
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001428 func = PyObject_GetAttrString(o, name);
1429 if (func == NULL) {
1430 va_end(va);
1431 PyErr_SetString(PyExc_AttributeError, name);
1432 return 0;
1433 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001434
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001435 if (!PyCallable_Check(func)) {
1436 va_end(va);
1437 return type_error("call of non-callable attribute");
1438 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001439
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 if (format && *format)
1441 args = Py_VaBuildValue(format, va);
1442 else
1443 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001444
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445 va_end(va);
Guido van Rossume15dee51995-07-18 14:12:02 +00001446
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001447 if (!args)
1448 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001449
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001450 if (!PyTuple_Check(args)) {
1451 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001452
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 a = PyTuple_New(1);
1454 if (a == NULL)
1455 return NULL;
1456 if (PyTuple_SetItem(a, 0, args) < 0)
1457 return NULL;
1458 args = a;
1459 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001460
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001461 retval = PyObject_CallObject(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001462
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001463 Py_DECREF(args);
1464 Py_DECREF(func);
1465
1466 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001467}