blob: 91ba8c2847175d7796c2d420362d26e13d88ae9c [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00005#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00006#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00007
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00008
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00009/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000010
11static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000012type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000013{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000014 PyErr_SetString(PyExc_TypeError, msg);
15 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000016}
17
Guido van Rossum052b7e11996-11-11 15:08:19 +000018static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000019null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000020{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000021 if (!PyErr_Occurred())
22 PyErr_SetString(PyExc_SystemError,
23 "null argument to internal routine");
24 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000025}
26
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000027/* Operations on any object */
28
29int
Fred Drake79912472000-07-09 04:06:11 +000030PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000031{
32 int r;
33
34 if (o1 == NULL || o2 == NULL) {
35 null_error();
36 return -1;
37 }
38 r = PyObject_Compare(o1, o2);
39 if (PyErr_Occurred())
40 return -1;
41 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000042 return 0;
43}
Guido van Rossume15dee51995-07-18 14:12:02 +000044
45PyObject *
Fred Drake79912472000-07-09 04:06:11 +000046PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000047{
48 PyObject *v;
49
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000050 if (o == NULL)
51 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000052 v = (PyObject *)o->ob_type;
53 Py_INCREF(v);
54 return v;
55}
56
Martin v. Löwis18e16552006-02-15 17:27:45 +000057Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000058PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000059{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000060 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000061
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 if (o == NULL) {
63 null_error();
64 return -1;
65 }
Guido van Rossume15dee51995-07-18 14:12:02 +000066
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000067 m = o->ob_type->tp_as_sequence;
68 if (m && m->sq_length)
69 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000070
Jeremy Hylton6253f832000-07-12 12:56:19 +000071 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000072}
73
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000074#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000075Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000076PyObject_Length(PyObject *o)
77{
78 return PyObject_Size(o);
79}
80#define PyObject_Length PyObject_Size
81
Martin v. Löwis18e16552006-02-15 17:27:45 +000082Py_ssize_t
Armin Rigof5b3e362006-02-11 21:32:43 +000083_PyObject_LengthHint(PyObject *o)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000084{
Martin v. Löwis18e16552006-02-15 17:27:45 +000085 Py_ssize_t rv = PyObject_Size(o);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000086 if (rv != -1)
87 return rv;
88 if (PyErr_ExceptionMatches(PyExc_TypeError) ||
89 PyErr_ExceptionMatches(PyExc_AttributeError)) {
90 PyObject *err_type, *err_value, *err_tb, *ro;
91
92 PyErr_Fetch(&err_type, &err_value, &err_tb);
Armin Rigof5b3e362006-02-11 21:32:43 +000093 ro = PyObject_CallMethod(o, "__length_hint__", NULL);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000094 if (ro != NULL) {
Martin v. Löwis18e16552006-02-15 17:27:45 +000095 rv = PyInt_AsLong(ro);
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000096 Py_DECREF(ro);
97 Py_XDECREF(err_type);
98 Py_XDECREF(err_value);
99 Py_XDECREF(err_tb);
100 return rv;
101 }
102 PyErr_Restore(err_type, err_value, err_tb);
103 }
104 return -1;
105}
106
Guido van Rossume15dee51995-07-18 14:12:02 +0000107PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000108PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000109{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000110 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000111
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000112 if (o == NULL || key == NULL)
113 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000114
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 m = o->ob_type->tp_as_mapping;
116 if (m && m->mp_subscript)
117 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000118
Guido van Rossum21308241998-08-13 16:44:44 +0000119 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000120 PyNumberMethods *nb = key->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000121 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000122 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000123 if (key_value == -1 && PyErr_Occurred())
124 return NULL;
125 return PySequence_GetItem(o, key_value);
126 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000127 else if (o->ob_type->tp_as_sequence->sq_item)
128 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000129 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000130
131 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000132}
133
134int
Fred Drake79912472000-07-09 04:06:11 +0000135PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000136{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000137 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000138
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139 if (o == NULL || key == NULL || value == NULL) {
140 null_error();
141 return -1;
142 }
143 m = o->ob_type->tp_as_mapping;
144 if (m && m->mp_ass_subscript)
145 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000146
Guido van Rossum21308241998-08-13 16:44:44 +0000147 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000148 PyNumberMethods *nb = key->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000149 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000150 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000151 if (key_value == -1 && PyErr_Occurred())
152 return -1;
153 return PySequence_SetItem(o, key_value, value);
154 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000155 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
156 type_error("sequence index must be integer");
157 return -1;
158 }
Guido van Rossum21308241998-08-13 16:44:44 +0000159 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000160
161 type_error("object does not support item assignment");
162 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000163}
164
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000165int
Fred Drake79912472000-07-09 04:06:11 +0000166PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000167{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000168 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000169
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000170 if (o == NULL || key == NULL) {
171 null_error();
172 return -1;
173 }
174 m = o->ob_type->tp_as_mapping;
175 if (m && m->mp_ass_subscript)
176 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000177
Guido van Rossum21308241998-08-13 16:44:44 +0000178 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000179 PyNumberMethods *nb = key->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000180 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000181 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000182 if (key_value == -1 && PyErr_Occurred())
183 return -1;
184 return PySequence_DelItem(o, key_value);
185 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000186 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
187 type_error("sequence index must be integer");
188 return -1;
189 }
Guido van Rossum21308241998-08-13 16:44:44 +0000190 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000191
192 type_error("object does not support item deletion");
193 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000194}
195
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000196int
197PyObject_DelItemString(PyObject *o, char *key)
198{
199 PyObject *okey;
200 int ret;
201
202 if (o == NULL || key == NULL) {
203 null_error();
204 return -1;
205 }
206 okey = PyString_FromString(key);
207 if (okey == NULL)
208 return -1;
209 ret = PyObject_DelItem(o, okey);
210 Py_DECREF(okey);
211 return ret;
212}
213
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000214int
215PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000216 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000217 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000218{
219 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000220 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000221 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000222
223 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
224 null_error();
225 return -1;
226 }
227 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000228 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000229 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000230 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000231 PyErr_SetString(PyExc_TypeError,
232 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000233 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000234 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000235 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000236 PyErr_SetString(PyExc_TypeError,
237 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000238 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000240 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000241 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000242 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000243 *buffer = pp;
244 *buffer_len = len;
245 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000246}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000247
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000248int
249PyObject_CheckReadBuffer(PyObject *obj)
250{
251 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
252
253 if (pb == NULL ||
254 pb->bf_getreadbuffer == NULL ||
255 pb->bf_getsegcount == NULL ||
256 (*pb->bf_getsegcount)(obj, NULL) != 1)
257 return 0;
258 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000259}
260
261int PyObject_AsReadBuffer(PyObject *obj,
262 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000263 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000264{
265 PyBufferProcs *pb;
266 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000267 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000268
269 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
270 null_error();
271 return -1;
272 }
273 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000274 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000275 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000276 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000277 PyErr_SetString(PyExc_TypeError,
278 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000279 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000280 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000281 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000282 PyErr_SetString(PyExc_TypeError,
283 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000284 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000285 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000286 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000287 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000288 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289 *buffer = pp;
290 *buffer_len = len;
291 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292}
293
294int PyObject_AsWriteBuffer(PyObject *obj,
295 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000296 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297{
298 PyBufferProcs *pb;
299 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000300 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301
302 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
303 null_error();
304 return -1;
305 }
306 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000307 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000308 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000309 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000310 PyErr_SetString(PyExc_TypeError,
311 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000314 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000315 PyErr_SetString(PyExc_TypeError,
316 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000317 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000318 }
319 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
320 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000321 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000322 *buffer = pp;
323 *buffer_len = len;
324 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325}
326
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000327/* Operations on numbers */
328
329int
Fred Drake79912472000-07-09 04:06:11 +0000330PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000331{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000332 return o && o->ob_type->tp_as_number &&
333 (o->ob_type->tp_as_number->nb_int ||
334 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000335}
336
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000337/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000338
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000339/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000340
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000341#define NB_SLOT(x) offsetof(PyNumberMethods, x)
342#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000343 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000344#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000345 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000346
347/*
348 Calling scheme used for binary operations:
349
350 v w Action
351 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000352 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000353 new old v.op(v,w), coerce(v,w), v.op(v,w)
354 old new w.op(v,w), coerce(v,w), v.op(v,w)
355 old old coerce(v,w), v.op(v,w)
356
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000357 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
358 v->ob_type
359
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000360 Legend:
361 -------
362 * new == new style number
363 * old == old style number
364 * Action indicates the order in which operations are tried until either
365 a valid result is produced or an error occurs.
366
367 */
368
369static PyObject *
370binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000371{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000372 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000373 binaryfunc slotv = NULL;
374 binaryfunc slotw = NULL;
375
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000376 if (v->ob_type->tp_as_number != NULL)
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000377 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000378 if (w->ob_type != v->ob_type &&
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000379 w->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000380 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000381 if (slotw == slotv)
382 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000383 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000384 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000385 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
386 x = slotw(v, w);
387 if (x != Py_NotImplemented)
388 return x;
389 Py_DECREF(x); /* can't do it */
390 slotw = NULL;
391 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000392 x = slotv(v, w);
393 if (x != Py_NotImplemented)
394 return x;
395 Py_DECREF(x); /* can't do it */
396 }
397 if (slotw) {
398 x = slotw(v, w);
399 if (x != Py_NotImplemented)
400 return x;
401 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000402 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000403 Py_INCREF(Py_NotImplemented);
404 return Py_NotImplemented;
405}
Guido van Rossum77660912002-04-16 16:32:50 +0000406
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000407static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000408binop_type_error(PyObject *v, PyObject *w, const char *op_name)
409{
410 PyErr_Format(PyExc_TypeError,
411 "unsupported operand type(s) for %s: '%s' and '%s'",
412 op_name,
413 v->ob_type->tp_name,
414 w->ob_type->tp_name);
415 return NULL;
416}
417
418static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000419binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
420{
421 PyObject *result = binary_op1(v, w, op_slot);
422 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000423 Py_DECREF(result);
424 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000425 }
426 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000427}
428
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000429
430/*
431 Calling scheme used for ternary operations:
432
Guido van Rossum84675ac2001-09-29 01:05:03 +0000433 *** In some cases, w.op is called before v.op; see binary_op1. ***
434
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000435 v w z Action
436 -------------------------------------------------------------------
437 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
438 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
439 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
440 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
441 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
442 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
443 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
444 old old old coerce(v,w,z), v.op(v,w,z)
445
446 Legend:
447 -------
448 * new == new style number
449 * old == old style number
450 * Action indicates the order in which operations are tried until either
451 a valid result is produced or an error occurs.
452 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
453 only if z != Py_None; if z == Py_None, then it is treated as absent
454 variable and only coerce(v,w) is tried.
455
456 */
457
458static PyObject *
459ternary_op(PyObject *v,
460 PyObject *w,
461 PyObject *z,
462 const int op_slot,
463 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000464{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000465 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000466 PyObject *x = NULL;
467 ternaryfunc slotv = NULL;
468 ternaryfunc slotw = NULL;
469 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000470
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000471 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000472 mw = w->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000473 if (mv != NULL)
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000474 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000475 if (w->ob_type != v->ob_type &&
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000476 mw != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000477 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000478 if (slotw == slotv)
479 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000480 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000481 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000482 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
483 x = slotw(v, w, z);
484 if (x != Py_NotImplemented)
485 return x;
486 Py_DECREF(x); /* can't do it */
487 slotw = NULL;
488 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000489 x = slotv(v, w, z);
490 if (x != Py_NotImplemented)
491 return x;
492 Py_DECREF(x); /* can't do it */
493 }
494 if (slotw) {
495 x = slotw(v, w, z);
496 if (x != Py_NotImplemented)
497 return x;
498 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000499 }
500 mz = z->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000501 if (mz != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000502 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000503 if (slotz == slotv || slotz == slotw)
504 slotz = NULL;
505 if (slotz) {
506 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000507 if (x != Py_NotImplemented)
508 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000509 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000510 }
511 }
512
Guido van Rossum5c66a262001-10-22 04:12:44 +0000513 if (z == Py_None)
514 PyErr_Format(
515 PyExc_TypeError,
516 "unsupported operand type(s) for ** or pow(): "
517 "'%s' and '%s'",
518 v->ob_type->tp_name,
519 w->ob_type->tp_name);
520 else
521 PyErr_Format(
522 PyExc_TypeError,
523 "unsupported operand type(s) for pow(): "
524 "'%s', '%s', '%s'",
525 v->ob_type->tp_name,
526 w->ob_type->tp_name,
527 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000528 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000529}
530
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000531#define BINARY_FUNC(func, op, op_name) \
532 PyObject * \
533 func(PyObject *v, PyObject *w) { \
534 return binary_op(v, w, NB_SLOT(op), op_name); \
535 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000536
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000537BINARY_FUNC(PyNumber_Or, nb_or, "|")
538BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
539BINARY_FUNC(PyNumber_And, nb_and, "&")
540BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
541BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
542BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000543BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000544
545PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000546PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000547{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000548 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
549 if (result == Py_NotImplemented) {
550 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000551 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000552 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000553 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000554 }
Armin Rigofd163f92005-12-29 15:59:19 +0000555 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000556 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000557 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000558}
559
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000560static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000561sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000562{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000563 Py_ssize_t count;
564 PyNumberMethods *nb = n->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000565 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000566 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000567 if (count == -1 && PyErr_Occurred())
568 return NULL;
569 }
570 else {
571 return type_error(
Raymond Hettinger10c66062004-05-12 21:35:06 +0000572 "can't multiply sequence by non-int");
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000573 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000574 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000575}
576
577PyObject *
578PyNumber_Multiply(PyObject *v, PyObject *w)
579{
580 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
581 if (result == Py_NotImplemented) {
582 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
583 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000584 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000585 if (mv && mv->sq_repeat) {
586 return sequence_repeat(mv->sq_repeat, v, w);
587 }
588 else if (mw && mw->sq_repeat) {
589 return sequence_repeat(mw->sq_repeat, w, v);
590 }
591 result = binop_type_error(v, w, "*");
592 }
593 return result;
594}
595
Guido van Rossume15dee51995-07-18 14:12:02 +0000596PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000597PyNumber_FloorDivide(PyObject *v, PyObject *w)
598{
599 /* XXX tp_flags test */
600 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
601}
602
603PyObject *
604PyNumber_TrueDivide(PyObject *v, PyObject *w)
605{
606 /* XXX tp_flags test */
607 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
608}
609
610PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000611PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000612{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000613 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000614}
615
616PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000617PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000618{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000619 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000620}
621
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000622/* Binary in-place operators */
623
624/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000625 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000626
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000627 - If the left hand object has the appropriate struct members, and
628 they are filled, call the appropriate function and return the
629 result. No coercion is done on the arguments; the left-hand object
630 is the one the operation is performed on, and it's up to the
631 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000632
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000633 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000634 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000635
636 */
637
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000638static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000639binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000640{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000641 PyNumberMethods *mv = v->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000642 if (mv != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000643 binaryfunc slot = NB_BINOP(mv, iop_slot);
644 if (slot) {
645 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000646 if (x != Py_NotImplemented) {
647 return x;
648 }
649 Py_DECREF(x);
650 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000651 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000652 return binary_op1(v, w, op_slot);
653}
654
655static PyObject *
656binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
657 const char *op_name)
658{
659 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
660 if (result == Py_NotImplemented) {
661 Py_DECREF(result);
662 return binop_type_error(v, w, op_name);
663 }
664 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000665}
666
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000667#define INPLACE_BINOP(func, iop, op, op_name) \
668 PyObject * \
669 func(PyObject *v, PyObject *w) { \
670 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000671 }
672
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000673INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
674INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
675INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
676INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
677INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
678INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000679
680PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000681PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
682{
683 /* XXX tp_flags test */
684 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
685 NB_SLOT(nb_floor_divide), "//=");
686}
687
688PyObject *
689PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
690{
691 /* XXX tp_flags test */
692 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
693 NB_SLOT(nb_true_divide), "/=");
694}
695
696PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000697PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
698{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000699 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
700 NB_SLOT(nb_add));
701 if (result == Py_NotImplemented) {
702 PySequenceMethods *m = v->ob_type->tp_as_sequence;
703 Py_DECREF(result);
704 if (m != NULL) {
705 binaryfunc f = NULL;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000706 f = m->sq_inplace_concat;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000707 if (f == NULL)
708 f = m->sq_concat;
709 if (f != NULL)
710 return (*f)(v, w);
711 }
712 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000713 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000714 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000715}
716
717PyObject *
718PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
719{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000720 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
721 NB_SLOT(nb_multiply));
722 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000723 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000724 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
725 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
726 Py_DECREF(result);
727 if (mv != NULL) {
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000728 f = mv->sq_inplace_repeat;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000729 if (f == NULL)
730 f = mv->sq_repeat;
731 if (f != NULL)
732 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000734 else if (mw != NULL) {
735 /* Note that the right hand operand should not be
736 * mutated in this case so sq_inplace_repeat is not
737 * used. */
738 if (mw->sq_repeat)
739 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000740 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000741 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000742 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000743 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000744}
745
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000746PyObject *
747PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
748{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000749 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
750 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000751}
752
753PyObject *
754PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
755{
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000756 if (v->ob_type->tp_as_number &&
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000757 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
758 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000759 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000760 else {
761 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
762 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000763}
764
765
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000766/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000767
768PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000769PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000770{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000771 PyNumberMethods *m;
772
773 if (o == NULL)
774 return null_error();
775 m = o->ob_type->tp_as_number;
776 if (m && m->nb_negative)
777 return (*m->nb_negative)(o);
778
779 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000780}
781
782PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000783PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000784{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000785 PyNumberMethods *m;
786
787 if (o == NULL)
788 return null_error();
789 m = o->ob_type->tp_as_number;
790 if (m && m->nb_positive)
791 return (*m->nb_positive)(o);
792
793 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000794}
795
796PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000797PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000798{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000799 PyNumberMethods *m;
800
801 if (o == NULL)
802 return null_error();
803 m = o->ob_type->tp_as_number;
804 if (m && m->nb_invert)
805 return (*m->nb_invert)(o);
806
807 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000808}
809
810PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000811PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000812{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000813 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000814
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000815 if (o == NULL)
816 return null_error();
817 m = o->ob_type->tp_as_number;
818 if (m && m->nb_absolute)
819 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000820
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000821 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000822}
823
Guido van Rossum9e896b32000-04-05 20:11:21 +0000824/* Add a check for embedded NULL-bytes in the argument. */
825static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000826int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000827{
828 char *end;
829 PyObject *x;
830
831 x = PyInt_FromString((char*)s, &end, 10);
832 if (x == NULL)
833 return NULL;
834 if (end != s + len) {
835 PyErr_SetString(PyExc_ValueError,
836 "null byte in argument for int()");
837 Py_DECREF(x);
838 return NULL;
839 }
840 return x;
841}
842
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000843/* Return a Py_ssize_t integer from the object item */
844Py_ssize_t
845PyNumber_Index(PyObject *item)
846{
847 Py_ssize_t value = -1;
848 PyNumberMethods *nb = item->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000849 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000850 value = nb->nb_index(item);
851 }
852 else {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000853 PyErr_Format(PyExc_TypeError,
854 "'%.200s' object cannot be interpreted "
855 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000856 }
857 return value;
858}
859
Guido van Rossume15dee51995-07-18 14:12:02 +0000860PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000861PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000862{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000863 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000864 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000865 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000866
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 if (o == NULL)
868 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000869 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000870 Py_INCREF(o);
871 return o;
872 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000873 m = o->ob_type->tp_as_number;
874 if (m && m->nb_int) { /* This should include subclasses of int */
875 PyObject *res = m->nb_int(o);
876 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
877 PyErr_Format(PyExc_TypeError,
878 "__int__ returned non-int (type %.200s)",
879 res->ob_type->tp_name);
880 Py_DECREF(res);
881 return NULL;
882 }
883 return res;
884 }
885 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000886 PyIntObject *io = (PyIntObject*)o;
887 return PyInt_FromLong(io->ob_ival);
888 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000889 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000890 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000891 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000892#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000893 if (PyUnicode_Check(o))
894 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
895 PyUnicode_GET_SIZE(o),
896 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000897#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000898 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000899 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000900
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000901 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000902}
903
Guido van Rossum9e896b32000-04-05 20:11:21 +0000904/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000905static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000906long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000907{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000908 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000909 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000910
Guido van Rossum4c08d552000-03-10 22:55:18 +0000911 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000912 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000913 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000914 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000915 PyErr_SetString(PyExc_ValueError,
916 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000917 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000918 return NULL;
919 }
920 return x;
921}
922
Guido van Rossume15dee51995-07-18 14:12:02 +0000923PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000924PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000925{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000927 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000928 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000929
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000930 if (o == NULL)
931 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +0000932 m = o->ob_type->tp_as_number;
933 if (m && m->nb_long) { /* This should include subclasses of long */
934 PyObject *res = m->nb_long(o);
935 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
936 PyErr_Format(PyExc_TypeError,
937 "__long__ returned non-long (type %.200s)",
938 res->ob_type->tp_name);
939 Py_DECREF(res);
940 return NULL;
941 }
942 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000943 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000944 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +0000945 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000947 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000948 * doesn't do. In particular long('9.5') must raise an
949 * exception, not truncate the float.
950 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000951 return long_from_string(PyString_AS_STRING(o),
952 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000953#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000954 if (PyUnicode_Check(o))
955 /* The above check is done in PyLong_FromUnicode(). */
956 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
957 PyUnicode_GET_SIZE(o),
958 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000959#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000960 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
961 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000962
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000963 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000964}
965
966PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000967PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000968{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000969 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000970
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000971 if (o == NULL)
972 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +0000973 m = o->ob_type->tp_as_number;
974 if (m && m->nb_float) { /* This should include subclasses of float */
975 PyObject *res = m->nb_float(o);
976 if (res && !PyFloat_Check(res)) {
977 PyErr_Format(PyExc_TypeError,
978 "__float__ returned non-float (type %.200s)",
979 res->ob_type->tp_name);
980 Py_DECREF(res);
981 return NULL;
982 }
983 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000984 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000985 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +0000986 PyFloatObject *po = (PyFloatObject *)o;
987 return PyFloat_FromDouble(po->ob_fval);
988 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000989 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000990}
991
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000992/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000993
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000994int
Fred Drake79912472000-07-09 04:06:11 +0000995PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +0000996{
Raymond Hettinger1be1a792004-09-19 06:00:15 +0000997 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +0000998 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +0000999 return s != NULL && s->ob_type->tp_as_sequence &&
1000 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001001}
1002
Martin v. Löwis18e16552006-02-15 17:27:45 +00001003Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001004PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001005{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001006 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001007
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 if (s == NULL) {
1009 null_error();
1010 return -1;
1011 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001012
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001013 m = s->ob_type->tp_as_sequence;
1014 if (m && m->sq_length)
1015 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001016
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001017 type_error("len() of unsized object");
1018 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001019}
1020
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001021#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001022Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001023PySequence_Length(PyObject *s)
1024{
1025 return PySequence_Size(s);
1026}
1027#define PySequence_Length PySequence_Size
1028
Guido van Rossume15dee51995-07-18 14:12:02 +00001029PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001030PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001031{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001032 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001033
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 if (s == NULL || o == NULL)
1035 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001036
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001037 m = s->ob_type->tp_as_sequence;
1038 if (m && m->sq_concat)
1039 return m->sq_concat(s, o);
1040
Armin Rigofd163f92005-12-29 15:59:19 +00001041 /* Instances of user classes defining an __add__() method only
1042 have an nb_add slot, not an sq_concat slot. So we fall back
1043 to nb_add if both arguments appear to be sequences. */
1044 if (PySequence_Check(s) && PySequence_Check(o)) {
1045 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1046 if (result != Py_NotImplemented)
1047 return result;
1048 Py_DECREF(result);
1049 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001050 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001051}
1052
1053PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001054PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001055{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001057
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001058 if (o == NULL)
1059 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001060
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001061 m = o->ob_type->tp_as_sequence;
1062 if (m && m->sq_repeat)
1063 return m->sq_repeat(o, count);
1064
Armin Rigofd163f92005-12-29 15:59:19 +00001065 /* Instances of user classes defining a __mul__() method only
1066 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1067 to nb_multiply if o appears to be a sequence. */
1068 if (PySequence_Check(o)) {
1069 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001070 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001071 if (n == NULL)
1072 return NULL;
1073 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1074 Py_DECREF(n);
1075 if (result != Py_NotImplemented)
1076 return result;
1077 Py_DECREF(result);
1078 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001079 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001080}
1081
1082PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001083PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1084{
1085 PySequenceMethods *m;
1086
1087 if (s == NULL || o == NULL)
1088 return null_error();
1089
1090 m = s->ob_type->tp_as_sequence;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001091 if (m && m->sq_inplace_concat)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001092 return m->sq_inplace_concat(s, o);
1093 if (m && m->sq_concat)
1094 return m->sq_concat(s, o);
1095
Armin Rigofd163f92005-12-29 15:59:19 +00001096 if (PySequence_Check(s) && PySequence_Check(o)) {
1097 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1098 NB_SLOT(nb_add));
1099 if (result != Py_NotImplemented)
1100 return result;
1101 Py_DECREF(result);
1102 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001103 return type_error("object can't be concatenated");
1104}
1105
1106PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001107PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001108{
1109 PySequenceMethods *m;
1110
1111 if (o == NULL)
1112 return null_error();
1113
1114 m = o->ob_type->tp_as_sequence;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001115 if (m && m->sq_inplace_repeat)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001116 return m->sq_inplace_repeat(o, count);
1117 if (m && m->sq_repeat)
1118 return m->sq_repeat(o, count);
1119
Armin Rigofd163f92005-12-29 15:59:19 +00001120 if (PySequence_Check(o)) {
1121 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001122 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001123 if (n == NULL)
1124 return NULL;
1125 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1126 NB_SLOT(nb_multiply));
1127 Py_DECREF(n);
1128 if (result != Py_NotImplemented)
1129 return result;
1130 Py_DECREF(result);
1131 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001132 return type_error("object can't be repeated");
1133}
1134
1135PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001136PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001137{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001138 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001139
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001140 if (s == NULL)
1141 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001142
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001143 m = s->ob_type->tp_as_sequence;
1144 if (m && m->sq_item) {
1145 if (i < 0) {
1146 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001147 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001148 if (l < 0)
1149 return NULL;
1150 i += l;
1151 }
1152 }
1153 return m->sq_item(s, i);
1154 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001155
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001157}
1158
1159PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001160PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001161{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001163 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001164
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001165 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001166
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001167 m = s->ob_type->tp_as_sequence;
1168 if (m && m->sq_slice) {
1169 if (i1 < 0 || i2 < 0) {
1170 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001171 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172 if (l < 0)
1173 return NULL;
1174 if (i1 < 0)
1175 i1 += l;
1176 if (i2 < 0)
1177 i2 += l;
1178 }
1179 }
1180 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001181 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1182 PyObject *res;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001183 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001184 if (!slice)
1185 return NULL;
1186 res = mp->mp_subscript(s, slice);
1187 Py_DECREF(slice);
1188 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001190
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001191 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001192}
1193
1194int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001195PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001196{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001198
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001199 if (s == NULL) {
1200 null_error();
1201 return -1;
1202 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001203
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001204 m = s->ob_type->tp_as_sequence;
1205 if (m && m->sq_ass_item) {
1206 if (i < 0) {
1207 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001208 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001209 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001210 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001211 i += l;
1212 }
1213 }
1214 return m->sq_ass_item(s, i, o);
1215 }
1216
Raymond Hettinger98779e02003-10-27 09:22:16 +00001217 type_error("object does not support item assignment");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001219}
1220
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001221int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001222PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001223{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001224 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001225
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001226 if (s == NULL) {
1227 null_error();
1228 return -1;
1229 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001230
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001231 m = s->ob_type->tp_as_sequence;
1232 if (m && m->sq_ass_item) {
1233 if (i < 0) {
1234 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001235 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001236 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001237 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001238 i += l;
1239 }
1240 }
1241 return m->sq_ass_item(s, i, (PyObject *)NULL);
1242 }
1243
1244 type_error("object doesn't support item deletion");
1245 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001246}
1247
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001248int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001249PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001250{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001251 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001252 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001253
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254 if (s == NULL) {
1255 null_error();
1256 return -1;
1257 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001258
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001259 m = s->ob_type->tp_as_sequence;
1260 if (m && m->sq_ass_slice) {
1261 if (i1 < 0 || i2 < 0) {
1262 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001263 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001264 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001265 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001266 if (i1 < 0)
1267 i1 += l;
1268 if (i2 < 0)
1269 i2 += l;
1270 }
1271 }
1272 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001273 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1274 int res;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001275 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001276 if (!slice)
1277 return -1;
1278 res = mp->mp_ass_subscript(s, slice, o);
1279 Py_DECREF(slice);
1280 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001282
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283 type_error("object doesn't support slice assignment");
1284 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001285}
1286
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001287int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001288PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001289{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001291
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001292 if (s == NULL) {
1293 null_error();
1294 return -1;
1295 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001296
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001297 m = s->ob_type->tp_as_sequence;
1298 if (m && m->sq_ass_slice) {
1299 if (i1 < 0 || i2 < 0) {
1300 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001301 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001303 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001304 if (i1 < 0)
1305 i1 += l;
1306 if (i2 < 0)
1307 i2 += l;
1308 }
1309 }
1310 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1311 }
1312 type_error("object doesn't support slice deletion");
1313 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001314}
1315
Guido van Rossume15dee51995-07-18 14:12:02 +00001316PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001317PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001318{
Tim Peters6912d4d2001-05-05 03:56:37 +00001319 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001320 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001321 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001322 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001323
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001324 if (v == NULL)
1325 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001326
Tim Peters6912d4d2001-05-05 03:56:37 +00001327 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001328 if (PyTuple_CheckExact(v)) {
1329 /* Note that we can't know whether it's safe to return
1330 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001331 to exact tuples here. In contrast, lists always make
1332 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 Py_INCREF(v);
1334 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001335 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001336 if (PyList_Check(v))
1337 return PyList_AsTuple(v);
1338
Tim Peters6912d4d2001-05-05 03:56:37 +00001339 /* Get iterator. */
1340 it = PyObject_GetIter(v);
1341 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001342 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001343
Tim Peters6912d4d2001-05-05 03:56:37 +00001344 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001345 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001346 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001347 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1348 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1349 Py_DECREF(it);
1350 return NULL;
1351 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001352 PyErr_Clear();
1353 n = 10; /* arbitrary */
1354 }
1355 result = PyTuple_New(n);
1356 if (result == NULL)
1357 goto Fail;
1358
1359 /* Fill the tuple. */
1360 for (j = 0; ; ++j) {
1361 PyObject *item = PyIter_Next(it);
1362 if (item == NULL) {
1363 if (PyErr_Occurred())
1364 goto Fail;
1365 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001366 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001367 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001368 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001369 /* The over-allocation strategy can grow a bit faster
1370 than for lists because unlike lists the
1371 over-allocation isn't permanent -- we reclaim
1372 the excess before the end of this routine.
1373 So, grow by ten and then add 25%.
1374 */
1375 n += 10;
1376 n += n >> 2;
1377 if (n < oldn) {
1378 /* Check for overflow */
1379 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001380 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001381 goto Fail;
1382 }
Tim Peters4324aa32001-05-28 22:30:08 +00001383 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001384 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001385 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001386 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001387 }
1388 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001389 }
1390
Tim Peters6912d4d2001-05-05 03:56:37 +00001391 /* Cut tuple back if guess was too large. */
1392 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001393 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001394 goto Fail;
1395
1396 Py_DECREF(it);
1397 return result;
1398
1399Fail:
1400 Py_XDECREF(result);
1401 Py_DECREF(it);
1402 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001403}
1404
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001405PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001406PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001407{
Tim Petersf553f892001-05-01 20:45:31 +00001408 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001409 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001410
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001411 if (v == NULL)
1412 return null_error();
1413
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001414 result = PyList_New(0);
1415 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001416 return NULL;
1417
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001418 rv = _PyList_Extend((PyListObject *)result, v);
1419 if (rv == NULL) {
1420 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001421 return NULL;
1422 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001423 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001424 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001425}
1426
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001427PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001428PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001429{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001430 PyObject *it;
1431
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001432 if (v == NULL)
1433 return null_error();
1434
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001435 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001436 Py_INCREF(v);
1437 return v;
1438 }
1439
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001440 it = PyObject_GetIter(v);
1441 if (it == NULL) {
1442 if (PyErr_ExceptionMatches(PyExc_TypeError))
1443 return type_error(m);
1444 return NULL;
1445 }
1446
Raymond Hettinger193814c2004-12-18 19:00:59 +00001447 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001448 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001449
1450 return v;
1451}
1452
Tim Peters16a77ad2001-09-08 04:00:12 +00001453/* Iterate over seq. Result depends on the operation:
1454 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1455 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1456 set ValueError and return -1 if none found; also return -1 on error.
1457 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1458*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001459Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001460_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001461{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001462 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001463 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1464 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001465
Tim Peters16a77ad2001-09-08 04:00:12 +00001466 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001467 null_error();
1468 return -1;
1469 }
Tim Peters75f8e352001-05-05 11:33:43 +00001470
Tim Peters16a77ad2001-09-08 04:00:12 +00001471 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001472 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001473 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001475 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001476
Tim Peters16a77ad2001-09-08 04:00:12 +00001477 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001478 for (;;) {
1479 int cmp;
1480 PyObject *item = PyIter_Next(it);
1481 if (item == NULL) {
1482 if (PyErr_Occurred())
1483 goto Fail;
1484 break;
1485 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001486
1487 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001488 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001489 if (cmp < 0)
1490 goto Fail;
1491 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001492 switch (operation) {
1493 case PY_ITERSEARCH_COUNT:
1494 ++n;
1495 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001496 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001497 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001498 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001499 goto Fail;
1500 }
1501 break;
1502
1503 case PY_ITERSEARCH_INDEX:
1504 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001505 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001506 PyErr_SetString(PyExc_OverflowError,
1507 "index exceeds C int size");
1508 goto Fail;
1509 }
1510 goto Done;
1511
1512 case PY_ITERSEARCH_CONTAINS:
1513 n = 1;
1514 goto Done;
1515
1516 default:
1517 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001518 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001519 }
1520
1521 if (operation == PY_ITERSEARCH_INDEX) {
1522 ++n;
1523 if (n <= 0)
1524 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001525 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001526 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001527
1528 if (operation != PY_ITERSEARCH_INDEX)
1529 goto Done;
1530
1531 PyErr_SetString(PyExc_ValueError,
1532 "sequence.index(x): x not in sequence");
1533 /* fall into failure code */
1534Fail:
1535 n = -1;
1536 /* fall through */
1537Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001538 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001539 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001540
Guido van Rossume15dee51995-07-18 14:12:02 +00001541}
1542
Tim Peters16a77ad2001-09-08 04:00:12 +00001543/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001544Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001545PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001546{
Tim Peters16a77ad2001-09-08 04:00:12 +00001547 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001548}
1549
Tim Peterscb8d3682001-05-05 21:05:01 +00001550/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001551 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001552 */
1553int
1554PySequence_Contains(PyObject *seq, PyObject *ob)
1555{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001556 Py_ssize_t result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001557 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1558 if (sqm != NULL && sqm->sq_contains != NULL)
1559 return (*sqm->sq_contains)(seq, ob);
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001560 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1561 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001562}
1563
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001564/* Backwards compatibility */
1565#undef PySequence_In
1566int
Fred Drake79912472000-07-09 04:06:11 +00001567PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001568{
1569 return PySequence_Contains(w, v);
1570}
1571
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001572Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001573PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001574{
Tim Peters16a77ad2001-09-08 04:00:12 +00001575 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001576}
1577
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001578/* Operations on mappings */
1579
1580int
Fred Drake79912472000-07-09 04:06:11 +00001581PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001582{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001583 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001584 return PyObject_HasAttrString(o, "__getitem__");
1585
1586 return o && o->ob_type->tp_as_mapping &&
1587 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001588 !(o->ob_type->tp_as_sequence &&
1589 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001590}
1591
Martin v. Löwis18e16552006-02-15 17:27:45 +00001592Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001593PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001594{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001595 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001596
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001597 if (o == NULL) {
1598 null_error();
1599 return -1;
1600 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001601
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001602 m = o->ob_type->tp_as_mapping;
1603 if (m && m->mp_length)
1604 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001605
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001606 type_error("len() of unsized object");
1607 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001608}
1609
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001610#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001611Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001612PyMapping_Length(PyObject *o)
1613{
1614 return PyMapping_Size(o);
1615}
1616#define PyMapping_Length PyMapping_Size
1617
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001618PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001619PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001620{
1621 PyObject *okey, *r;
1622
1623 if (key == NULL)
1624 return null_error();
1625
1626 okey = PyString_FromString(key);
1627 if (okey == NULL)
1628 return NULL;
1629 r = PyObject_GetItem(o, okey);
1630 Py_DECREF(okey);
1631 return r;
1632}
1633
1634int
Fred Drake79912472000-07-09 04:06:11 +00001635PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001636{
1637 PyObject *okey;
1638 int r;
1639
1640 if (key == NULL) {
1641 null_error();
1642 return -1;
1643 }
1644
1645 okey = PyString_FromString(key);
1646 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001647 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648 r = PyObject_SetItem(o, okey, value);
1649 Py_DECREF(okey);
1650 return r;
1651}
1652
1653int
Fred Drake79912472000-07-09 04:06:11 +00001654PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001655{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001656 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001658 v = PyMapping_GetItemString(o, key);
1659 if (v) {
1660 Py_DECREF(v);
1661 return 1;
1662 }
1663 PyErr_Clear();
1664 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001665}
1666
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001667int
Fred Drake79912472000-07-09 04:06:11 +00001668PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001669{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001670 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001671
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001672 v = PyObject_GetItem(o, key);
1673 if (v) {
1674 Py_DECREF(v);
1675 return 1;
1676 }
1677 PyErr_Clear();
1678 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001679}
1680
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001681/* Operations on callable objects */
1682
1683/* XXX PyCallable_Check() is in object.c */
1684
Guido van Rossume15dee51995-07-18 14:12:02 +00001685PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001686PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001687{
Guido van Rossum5560b742001-09-14 16:47:50 +00001688 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001689}
Guido van Rossume15dee51995-07-18 14:12:02 +00001690
1691PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001692PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1693{
1694 ternaryfunc call;
1695
1696 if ((call = func->ob_type->tp_call) != NULL) {
1697 PyObject *result = (*call)(func, arg, kw);
1698 if (result == NULL && !PyErr_Occurred())
1699 PyErr_SetString(
1700 PyExc_SystemError,
1701 "NULL result without error in PyObject_Call");
1702 return result;
1703 }
Fred Drake573395a2001-11-01 20:26:12 +00001704 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1705 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001706 return NULL;
1707}
1708
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001709static PyObject*
1710call_function_tail(PyObject *callable, PyObject *args)
1711{
1712 PyObject *retval;
1713
1714 if (args == NULL)
1715 return NULL;
1716
1717 if (!PyTuple_Check(args)) {
1718 PyObject *a;
1719
1720 a = PyTuple_New(1);
1721 if (a == NULL) {
1722 Py_DECREF(args);
1723 return NULL;
1724 }
1725 PyTuple_SET_ITEM(a, 0, args);
1726 args = a;
1727 }
1728 retval = PyObject_Call(callable, args, NULL);
1729
1730 Py_DECREF(args);
1731
1732 return retval;
1733}
1734
Tim Peters6d6c1a32001-08-02 04:15:00 +00001735PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001736PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001737{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001738 va_list va;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001739 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001740
Fred Drakeb92cf062001-10-27 06:16:31 +00001741 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001742 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001743
Fred Drakeb92cf062001-10-27 06:16:31 +00001744 if (format && *format) {
1745 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001746 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001747 va_end(va);
1748 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001749 else
1750 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001751
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001752 return call_function_tail(callable, args);
1753}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001754
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001755PyObject *
1756_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1757{
1758 va_list va;
1759 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001761 if (callable == NULL)
1762 return null_error();
1763
1764 if (format && *format) {
1765 va_start(va, format);
1766 args = _Py_VaBuildValue_SizeT(format, va);
1767 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001768 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001769 else
1770 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001771
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001772 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001773}
1774
1775PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001776PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001777{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001778 va_list va;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001780 PyObject *func = NULL;
1781 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001782
Fred Drakeb92cf062001-10-27 06:16:31 +00001783 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001784 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001785
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001786 func = PyObject_GetAttrString(o, name);
1787 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001788 PyErr_SetString(PyExc_AttributeError, name);
1789 return 0;
1790 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001791
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001792 if (!PyCallable_Check(func)) {
1793 type_error("call of non-callable attribute");
1794 goto exit;
1795 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001796
Fred Drakeb92cf062001-10-27 06:16:31 +00001797 if (format && *format) {
1798 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001799 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001800 va_end(va);
1801 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001802 else
1803 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001804
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001806
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001807 exit:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001808 /* args gets consumed in call_function_tail */
1809 Py_XDECREF(func);
1810
1811 return retval;
1812}
1813
1814PyObject *
1815_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1816{
1817 va_list va;
1818 PyObject *args;
1819 PyObject *func = NULL;
1820 PyObject *retval = NULL;
1821
1822 if (o == NULL || name == NULL)
1823 return null_error();
1824
1825 func = PyObject_GetAttrString(o, name);
1826 if (func == NULL) {
1827 PyErr_SetString(PyExc_AttributeError, name);
1828 return 0;
1829 }
1830
1831 if (!PyCallable_Check(func)) {
1832 type_error("call of non-callable attribute");
1833 goto exit;
1834 }
1835
1836 if (format && *format) {
1837 va_start(va, format);
1838 args = _Py_VaBuildValue_SizeT(format, va);
1839 va_end(va);
1840 }
1841 else
1842 args = PyTuple_New(0);
1843
1844 retval = call_function_tail(func, args);
1845
1846 exit:
1847 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001848 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001849
1850 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001851}
Guido van Rossum823649d2001-03-21 18:40:58 +00001852
1853
Fred Drakeb421b8c2001-10-26 16:21:32 +00001854static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001855objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001856{
1857 int i, n = 0;
1858 va_list countva;
1859 PyObject *result, *tmp;
1860
1861#ifdef VA_LIST_IS_ARRAY
1862 memcpy(countva, va, sizeof(va_list));
1863#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001864#ifdef __va_copy
1865 __va_copy(countva, va);
1866#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001867 countva = va;
1868#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001869#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001870
1871 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1872 ++n;
1873 result = PyTuple_New(n);
1874 if (result != NULL && n > 0) {
1875 for (i = 0; i < n; ++i) {
1876 tmp = (PyObject *)va_arg(va, PyObject *);
1877 PyTuple_SET_ITEM(result, i, tmp);
1878 Py_INCREF(tmp);
1879 }
1880 }
1881 return result;
1882}
1883
1884PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001885PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001886{
1887 PyObject *args, *tmp;
1888 va_list vargs;
1889
1890 if (callable == NULL || name == NULL)
1891 return null_error();
1892
1893 callable = PyObject_GetAttr(callable, name);
1894 if (callable == NULL)
1895 return NULL;
1896
1897 /* count the args */
1898 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001899 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001900 va_end(vargs);
1901 if (args == NULL) {
1902 Py_DECREF(callable);
1903 return NULL;
1904 }
1905 tmp = PyObject_Call(callable, args, NULL);
1906 Py_DECREF(args);
1907 Py_DECREF(callable);
1908
1909 return tmp;
1910}
1911
1912PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001913PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001914{
1915 PyObject *args, *tmp;
1916 va_list vargs;
1917
1918 if (callable == NULL)
1919 return null_error();
1920
1921 /* count the args */
1922 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001923 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001924 va_end(vargs);
1925 if (args == NULL)
1926 return NULL;
1927 tmp = PyObject_Call(callable, args, NULL);
1928 Py_DECREF(args);
1929
1930 return tmp;
1931}
1932
1933
Guido van Rossum823649d2001-03-21 18:40:58 +00001934/* isinstance(), issubclass() */
1935
Barry Warsawf16951c2002-04-23 22:45:44 +00001936/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1937 * state that will almost never happen.
1938 *
1939 * 0. creating the __bases__ static string could get a MemoryError
1940 * 1. getattr(cls, '__bases__') could raise an AttributeError
1941 * 2. getattr(cls, '__bases__') could raise some other exception
1942 * 3. getattr(cls, '__bases__') could return a tuple
1943 * 4. getattr(cls, '__bases__') could return something other than a tuple
1944 *
1945 * Only state #3 is a non-error state and only it returns a non-NULL object
1946 * (it returns the retrieved tuple).
1947 *
1948 * Any raised AttributeErrors are masked by clearing the exception and
1949 * returning NULL. If an object other than a tuple comes out of __bases__,
1950 * then again, the return value is NULL. So yes, these two situations
1951 * produce exactly the same results: NULL is returned and no error is set.
1952 *
1953 * If some exception other than AttributeError is raised, then NULL is also
1954 * returned, but the exception is not cleared. That's because we want the
1955 * exception to be propagated along.
1956 *
1957 * Callers are expected to test for PyErr_Occurred() when the return value
1958 * is NULL to decide whether a valid exception should be propagated or not.
1959 * When there's no exception to propagate, it's customary for the caller to
1960 * set a TypeError.
1961 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001962static PyObject *
1963abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001964{
1965 static PyObject *__bases__ = NULL;
1966 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001967
1968 if (__bases__ == NULL) {
1969 __bases__ = PyString_FromString("__bases__");
1970 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001971 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001972 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001973 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001974 if (bases == NULL) {
1975 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1976 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001977 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001978 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001979 if (!PyTuple_Check(bases)) {
1980 Py_DECREF(bases);
1981 return NULL;
1982 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001983 return bases;
1984}
1985
1986
1987static int
1988abstract_issubclass(PyObject *derived, PyObject *cls)
1989{
1990 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001991 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00001992 int r = 0;
1993
1994
Guido van Rossum823649d2001-03-21 18:40:58 +00001995 if (derived == cls)
1996 return 1;
1997
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00001998 if (PyTuple_Check(cls)) {
1999 /* Not a general sequence -- that opens up the road to
2000 recursion and stack overflow. */
2001 n = PyTuple_GET_SIZE(cls);
2002 for (i = 0; i < n; i++) {
2003 if (derived == PyTuple_GET_ITEM(cls, i))
2004 return 1;
2005 }
2006 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002007 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002008 if (bases == NULL) {
2009 if (PyErr_Occurred())
2010 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002011 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002012 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002013 n = PyTuple_GET_SIZE(bases);
2014 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002015 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002016 if (r != 0)
2017 break;
2018 }
2019
2020 Py_DECREF(bases);
2021
2022 return r;
2023}
2024
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002025static int
2026check_class(PyObject *cls, const char *error)
2027{
2028 PyObject *bases = abstract_get_bases(cls);
2029 if (bases == NULL) {
2030 /* Do not mask errors. */
2031 if (!PyErr_Occurred())
2032 PyErr_SetString(PyExc_TypeError, error);
2033 return 0;
2034 }
2035 Py_DECREF(bases);
2036 return -1;
2037}
2038
Brett Cannon4f653312004-03-20 22:52:14 +00002039static int
2040recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002041{
2042 PyObject *icls;
2043 static PyObject *__class__ = NULL;
2044 int retval = 0;
2045
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002046 if (__class__ == NULL) {
2047 __class__ = PyString_FromString("__class__");
2048 if (__class__ == NULL)
2049 return -1;
2050 }
2051
Guido van Rossum45aecf42006-03-15 04:58:47 +00002052 if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002053 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002054 if (retval == 0) {
2055 PyObject *c = PyObject_GetAttr(inst, __class__);
2056 if (c == NULL) {
2057 PyErr_Clear();
2058 }
2059 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002060 if (c != (PyObject *)(inst->ob_type) &&
2061 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002062 retval = PyType_IsSubtype(
2063 (PyTypeObject *)c,
2064 (PyTypeObject *)cls);
2065 Py_DECREF(c);
2066 }
2067 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002068 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002069 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002070 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002071
Brett Cannon4f653312004-03-20 22:52:14 +00002072 if (!recursion_depth) {
2073 PyErr_SetString(PyExc_RuntimeError,
2074 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002075 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002076 }
2077
Guido van Rossum03290ec2001-10-07 20:54:12 +00002078 n = PyTuple_GET_SIZE(cls);
2079 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002080 retval = recursive_isinstance(
2081 inst,
2082 PyTuple_GET_ITEM(cls, i),
2083 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002084 if (retval != 0)
2085 break;
2086 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002087 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002088 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002089 if (!check_class(cls,
2090 "isinstance() arg 2 must be a class, type,"
2091 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002092 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002093 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002094 if (icls == NULL) {
2095 PyErr_Clear();
2096 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002097 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002098 else {
2099 retval = abstract_issubclass(icls, cls);
2100 Py_DECREF(icls);
2101 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002102 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002103
Guido van Rossum823649d2001-03-21 18:40:58 +00002104 return retval;
2105}
2106
2107int
Brett Cannon4f653312004-03-20 22:52:14 +00002108PyObject_IsInstance(PyObject *inst, PyObject *cls)
2109{
2110 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2111}
2112
2113static int
2114recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002115{
2116 int retval;
2117
Guido van Rossum45aecf42006-03-15 04:58:47 +00002118 {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002119 if (!check_class(derived,
2120 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002121 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002122
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002123 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002124 Py_ssize_t i;
2125 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002126
2127 if (!recursion_depth) {
2128 PyErr_SetString(PyExc_RuntimeError,
2129 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002130 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002131 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002132 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002133 retval = recursive_issubclass(
2134 derived,
2135 PyTuple_GET_ITEM(cls, i),
2136 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002137 if (retval != 0) {
2138 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002139 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002140 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002141 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002142 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002143 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002144 else {
2145 if (!check_class(cls,
2146 "issubclass() arg 2 must be a class"
2147 " or tuple of classes"))
2148 return -1;
2149 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002150
2151 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002152 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002153
2154 return retval;
2155}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002156
Brett Cannon4f653312004-03-20 22:52:14 +00002157int
2158PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2159{
2160 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2161}
2162
2163
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002164PyObject *
2165PyObject_GetIter(PyObject *o)
2166{
2167 PyTypeObject *t = o->ob_type;
2168 getiterfunc f = NULL;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002169 f = t->tp_iter;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002170 if (f == NULL) {
2171 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002172 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002173 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002174 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002175 return NULL;
2176 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002177 else {
2178 PyObject *res = (*f)(o);
2179 if (res != NULL && !PyIter_Check(res)) {
2180 PyErr_Format(PyExc_TypeError,
2181 "iter() returned non-iterator "
2182 "of type '%.100s'",
2183 res->ob_type->tp_name);
2184 Py_DECREF(res);
2185 res = NULL;
2186 }
2187 return res;
2188 }
2189}
2190
Tim Petersf4848da2001-05-05 00:14:56 +00002191/* Return next item.
2192 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2193 * If the iteration terminates normally, return NULL and clear the
2194 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2195 * will be false.
2196 * Else return the next object. PyErr_Occurred() will be false.
2197 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002198PyObject *
2199PyIter_Next(PyObject *iter)
2200{
Tim Petersf4848da2001-05-05 00:14:56 +00002201 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002202 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002203 result = (*iter->ob_type->tp_iternext)(iter);
2204 if (result == NULL &&
2205 PyErr_Occurred() &&
2206 PyErr_ExceptionMatches(PyExc_StopIteration))
2207 PyErr_Clear();
2208 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002209}