blob: de884576409b12c8af88731b373a432c46548688 [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 *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000012type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000013{
Thomas Wouters0e3f5912006-08-11 14:57:12 +000014 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000015 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)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000128 return type_error("sequence index must "
129 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000130 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000131
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000132 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000133}
134
135int
Fred Drake79912472000-07-09 04:06:11 +0000136PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000137{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000138 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000139
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000140 if (o == NULL || key == NULL || value == NULL) {
141 null_error();
142 return -1;
143 }
144 m = o->ob_type->tp_as_mapping;
145 if (m && m->mp_ass_subscript)
146 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000147
Guido van Rossum21308241998-08-13 16:44:44 +0000148 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000149 PyNumberMethods *nb = key->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000150 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000151 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000152 if (key_value == -1 && PyErr_Occurred())
153 return -1;
154 return PySequence_SetItem(o, key_value, value);
155 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000156 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000157 type_error("sequence index must be "
158 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000159 return -1;
160 }
Guido van Rossum21308241998-08-13 16:44:44 +0000161 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000162
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000163 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000164 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000165}
166
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000167int
Fred Drake79912472000-07-09 04:06:11 +0000168PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000169{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000170 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000171
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000172 if (o == NULL || key == NULL) {
173 null_error();
174 return -1;
175 }
176 m = o->ob_type->tp_as_mapping;
177 if (m && m->mp_ass_subscript)
178 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000179
Guido van Rossum21308241998-08-13 16:44:44 +0000180 if (o->ob_type->tp_as_sequence) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000181 PyNumberMethods *nb = key->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000182 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000183 Py_ssize_t key_value = nb->nb_index(key);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000184 if (key_value == -1 && PyErr_Occurred())
185 return -1;
186 return PySequence_DelItem(o, key_value);
187 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000188 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000189 type_error("sequence index must be "
190 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000191 return -1;
192 }
Guido van Rossum21308241998-08-13 16:44:44 +0000193 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000194
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000195 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000196 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000197}
198
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000199int
200PyObject_DelItemString(PyObject *o, char *key)
201{
202 PyObject *okey;
203 int ret;
204
205 if (o == NULL || key == NULL) {
206 null_error();
207 return -1;
208 }
209 okey = PyString_FromString(key);
210 if (okey == NULL)
211 return -1;
212 ret = PyObject_DelItem(o, okey);
213 Py_DECREF(okey);
214 return ret;
215}
216
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000217int
218PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000219 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000220 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000221{
222 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000223 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000224 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000225
226 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
227 null_error();
228 return -1;
229 }
230 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000231 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000232 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000233 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000234 PyErr_SetString(PyExc_TypeError,
235 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000236 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000237 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000238 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000239 PyErr_SetString(PyExc_TypeError,
240 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000241 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000243 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000244 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000245 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246 *buffer = pp;
247 *buffer_len = len;
248 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000249}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000250
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000251int
252PyObject_CheckReadBuffer(PyObject *obj)
253{
254 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
255
256 if (pb == NULL ||
257 pb->bf_getreadbuffer == NULL ||
258 pb->bf_getsegcount == NULL ||
259 (*pb->bf_getsegcount)(obj, NULL) != 1)
260 return 0;
261 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000262}
263
264int PyObject_AsReadBuffer(PyObject *obj,
265 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000266 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267{
268 PyBufferProcs *pb;
269 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000270 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271
272 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
273 null_error();
274 return -1;
275 }
276 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000277 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000278 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000279 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000280 PyErr_SetString(PyExc_TypeError,
281 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000282 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000284 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000285 PyErr_SetString(PyExc_TypeError,
286 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000287 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000289 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000291 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292 *buffer = pp;
293 *buffer_len = len;
294 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295}
296
297int PyObject_AsWriteBuffer(PyObject *obj,
298 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000299 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000300{
301 PyBufferProcs *pb;
302 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000303 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304
305 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
306 null_error();
307 return -1;
308 }
309 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000310 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 PyErr_SetString(PyExc_TypeError,
314 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000315 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000317 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000318 PyErr_SetString(PyExc_TypeError,
319 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000320 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321 }
322 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
323 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000324 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325 *buffer = pp;
326 *buffer_len = len;
327 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000328}
329
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000330/* Operations on numbers */
331
332int
Fred Drake79912472000-07-09 04:06:11 +0000333PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000334{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000335 return o && o->ob_type->tp_as_number &&
336 (o->ob_type->tp_as_number->nb_int ||
337 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000338}
339
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000340/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000341
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000342/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000343
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000344#define NB_SLOT(x) offsetof(PyNumberMethods, x)
345#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000346 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000347#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000348 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000349
350/*
351 Calling scheme used for binary operations:
352
353 v w Action
354 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000355 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000356 new old v.op(v,w), coerce(v,w), v.op(v,w)
357 old new w.op(v,w), coerce(v,w), v.op(v,w)
358 old old coerce(v,w), v.op(v,w)
359
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000360 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
361 v->ob_type
362
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000363 Legend:
364 -------
365 * new == new style number
366 * old == old style number
367 * Action indicates the order in which operations are tried until either
368 a valid result is produced or an error occurs.
369
370 */
371
372static PyObject *
373binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000374{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000375 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000376 binaryfunc slotv = NULL;
377 binaryfunc slotw = NULL;
378
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000379 if (v->ob_type->tp_as_number != NULL)
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000380 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000381 if (w->ob_type != v->ob_type &&
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000382 w->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000383 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000384 if (slotw == slotv)
385 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000386 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000387 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000388 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
389 x = slotw(v, w);
390 if (x != Py_NotImplemented)
391 return x;
392 Py_DECREF(x); /* can't do it */
393 slotw = NULL;
394 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000395 x = slotv(v, w);
396 if (x != Py_NotImplemented)
397 return x;
398 Py_DECREF(x); /* can't do it */
399 }
400 if (slotw) {
401 x = slotw(v, w);
402 if (x != Py_NotImplemented)
403 return x;
404 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000405 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000406 Py_INCREF(Py_NotImplemented);
407 return Py_NotImplemented;
408}
Guido van Rossum77660912002-04-16 16:32:50 +0000409
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000410static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000411binop_type_error(PyObject *v, PyObject *w, const char *op_name)
412{
413 PyErr_Format(PyExc_TypeError,
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000414 "unsupported operand type(s) for %.100s: "
415 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000416 op_name,
417 v->ob_type->tp_name,
418 w->ob_type->tp_name);
419 return NULL;
420}
421
422static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000423binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
424{
425 PyObject *result = binary_op1(v, w, op_slot);
426 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000427 Py_DECREF(result);
428 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000429 }
430 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000431}
432
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000433
434/*
435 Calling scheme used for ternary operations:
436
Guido van Rossum84675ac2001-09-29 01:05:03 +0000437 *** In some cases, w.op is called before v.op; see binary_op1. ***
438
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000439 v w z Action
440 -------------------------------------------------------------------
441 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
442 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
443 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
444 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
445 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
446 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
447 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
448 old old old coerce(v,w,z), v.op(v,w,z)
449
450 Legend:
451 -------
452 * new == new style number
453 * old == old style number
454 * Action indicates the order in which operations are tried until either
455 a valid result is produced or an error occurs.
456 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
457 only if z != Py_None; if z == Py_None, then it is treated as absent
458 variable and only coerce(v,w) is tried.
459
460 */
461
462static PyObject *
463ternary_op(PyObject *v,
464 PyObject *w,
465 PyObject *z,
466 const int op_slot,
467 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000468{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000469 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000470 PyObject *x = NULL;
471 ternaryfunc slotv = NULL;
472 ternaryfunc slotw = NULL;
473 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000474
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000475 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000476 mw = w->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000477 if (mv != NULL)
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000478 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000479 if (w->ob_type != v->ob_type &&
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000480 mw != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000481 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000482 if (slotw == slotv)
483 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000484 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000485 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000486 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
487 x = slotw(v, w, z);
488 if (x != Py_NotImplemented)
489 return x;
490 Py_DECREF(x); /* can't do it */
491 slotw = NULL;
492 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000493 x = slotv(v, w, z);
494 if (x != Py_NotImplemented)
495 return x;
496 Py_DECREF(x); /* can't do it */
497 }
498 if (slotw) {
499 x = slotw(v, w, z);
500 if (x != Py_NotImplemented)
501 return x;
502 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000503 }
504 mz = z->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000505 if (mz != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000506 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000507 if (slotz == slotv || slotz == slotw)
508 slotz = NULL;
509 if (slotz) {
510 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000511 if (x != Py_NotImplemented)
512 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000513 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000514 }
515 }
516
Guido van Rossum5c66a262001-10-22 04:12:44 +0000517 if (z == Py_None)
518 PyErr_Format(
519 PyExc_TypeError,
520 "unsupported operand type(s) for ** or pow(): "
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000521 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000522 v->ob_type->tp_name,
523 w->ob_type->tp_name);
524 else
525 PyErr_Format(
526 PyExc_TypeError,
527 "unsupported operand type(s) for pow(): "
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000528 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000529 v->ob_type->tp_name,
530 w->ob_type->tp_name,
531 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000532 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000533}
534
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000535#define BINARY_FUNC(func, op, op_name) \
536 PyObject * \
537 func(PyObject *v, PyObject *w) { \
538 return binary_op(v, w, NB_SLOT(op), op_name); \
539 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000540
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000541BINARY_FUNC(PyNumber_Or, nb_or, "|")
542BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
543BINARY_FUNC(PyNumber_And, nb_and, "&")
544BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
545BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
546BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000547BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000548
549PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000550PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000551{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000552 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
553 if (result == Py_NotImplemented) {
554 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000555 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000556 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000557 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000558 }
Armin Rigofd163f92005-12-29 15:59:19 +0000559 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000560 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000561 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000562}
563
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000564static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000565sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000566{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000567 Py_ssize_t count;
568 PyNumberMethods *nb = n->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000569 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000570 count = nb->nb_index(n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000571 if (count == -1 && PyErr_Occurred())
572 return NULL;
573 }
574 else {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000575 return type_error("can't multiply sequence by "
576 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000577 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000578 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000579}
580
581PyObject *
582PyNumber_Multiply(PyObject *v, PyObject *w)
583{
584 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
585 if (result == Py_NotImplemented) {
586 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
587 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000588 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000589 if (mv && mv->sq_repeat) {
590 return sequence_repeat(mv->sq_repeat, v, w);
591 }
592 else if (mw && mw->sq_repeat) {
593 return sequence_repeat(mw->sq_repeat, w, v);
594 }
595 result = binop_type_error(v, w, "*");
596 }
597 return result;
598}
599
Guido van Rossume15dee51995-07-18 14:12:02 +0000600PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000601PyNumber_FloorDivide(PyObject *v, PyObject *w)
602{
603 /* XXX tp_flags test */
604 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
605}
606
607PyObject *
608PyNumber_TrueDivide(PyObject *v, PyObject *w)
609{
610 /* XXX tp_flags test */
611 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
612}
613
614PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000615PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000616{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000617 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000618}
619
620PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000621PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000622{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000623 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000624}
625
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000626/* Binary in-place operators */
627
628/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000629 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000630
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000631 - If the left hand object has the appropriate struct members, and
632 they are filled, call the appropriate function and return the
633 result. No coercion is done on the arguments; the left-hand object
634 is the one the operation is performed on, and it's up to the
635 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000636
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000637 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000638 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000639
640 */
641
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000642static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000643binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000644{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000645 PyNumberMethods *mv = v->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000646 if (mv != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000647 binaryfunc slot = NB_BINOP(mv, iop_slot);
648 if (slot) {
649 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000650 if (x != Py_NotImplemented) {
651 return x;
652 }
653 Py_DECREF(x);
654 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000655 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000656 return binary_op1(v, w, op_slot);
657}
658
659static PyObject *
660binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
661 const char *op_name)
662{
663 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
664 if (result == Py_NotImplemented) {
665 Py_DECREF(result);
666 return binop_type_error(v, w, op_name);
667 }
668 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000669}
670
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000671#define INPLACE_BINOP(func, iop, op, op_name) \
672 PyObject * \
673 func(PyObject *v, PyObject *w) { \
674 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000675 }
676
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000677INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
678INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
679INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
680INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
681INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
682INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000683
684PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000685PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
686{
687 /* XXX tp_flags test */
688 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
689 NB_SLOT(nb_floor_divide), "//=");
690}
691
692PyObject *
693PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
694{
695 /* XXX tp_flags test */
696 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
697 NB_SLOT(nb_true_divide), "/=");
698}
699
700PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000701PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
702{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000703 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
704 NB_SLOT(nb_add));
705 if (result == Py_NotImplemented) {
706 PySequenceMethods *m = v->ob_type->tp_as_sequence;
707 Py_DECREF(result);
708 if (m != NULL) {
709 binaryfunc f = NULL;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000710 f = m->sq_inplace_concat;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000711 if (f == NULL)
712 f = m->sq_concat;
713 if (f != NULL)
714 return (*f)(v, w);
715 }
716 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000717 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000718 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000719}
720
721PyObject *
722PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
723{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000724 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
725 NB_SLOT(nb_multiply));
726 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000727 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000728 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
729 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
730 Py_DECREF(result);
731 if (mv != NULL) {
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000732 f = mv->sq_inplace_repeat;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000733 if (f == NULL)
734 f = mv->sq_repeat;
735 if (f != NULL)
736 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000737 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000738 else if (mw != NULL) {
739 /* Note that the right hand operand should not be
740 * mutated in this case so sq_inplace_repeat is not
741 * used. */
742 if (mw->sq_repeat)
743 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000744 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000745 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000746 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000747 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000748}
749
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000750PyObject *
751PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
752{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000753 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
754 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000755}
756
757PyObject *
758PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
759{
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000760 if (v->ob_type->tp_as_number &&
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000761 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
762 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000763 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000764 else {
765 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
766 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000767}
768
769
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000770/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000771
772PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000773PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000774{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000775 PyNumberMethods *m;
776
777 if (o == NULL)
778 return null_error();
779 m = o->ob_type->tp_as_number;
780 if (m && m->nb_negative)
781 return (*m->nb_negative)(o);
782
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000783 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000784}
785
786PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000787PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000788{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000789 PyNumberMethods *m;
790
791 if (o == NULL)
792 return null_error();
793 m = o->ob_type->tp_as_number;
794 if (m && m->nb_positive)
795 return (*m->nb_positive)(o);
796
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000797 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000798}
799
800PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000801PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000802{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000803 PyNumberMethods *m;
804
805 if (o == NULL)
806 return null_error();
807 m = o->ob_type->tp_as_number;
808 if (m && m->nb_invert)
809 return (*m->nb_invert)(o);
810
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000811 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000812}
813
814PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000815PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000816{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000817 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000818
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000819 if (o == NULL)
820 return null_error();
821 m = o->ob_type->tp_as_number;
822 if (m && m->nb_absolute)
823 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000824
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000825 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000826}
827
Guido van Rossum9e896b32000-04-05 20:11:21 +0000828/* Add a check for embedded NULL-bytes in the argument. */
829static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000830int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000831{
832 char *end;
833 PyObject *x;
834
835 x = PyInt_FromString((char*)s, &end, 10);
836 if (x == NULL)
837 return NULL;
838 if (end != s + len) {
839 PyErr_SetString(PyExc_ValueError,
840 "null byte in argument for int()");
841 Py_DECREF(x);
842 return NULL;
843 }
844 return x;
845}
846
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000847/* Return a Py_ssize_t integer from the object item */
848Py_ssize_t
849PyNumber_Index(PyObject *item)
850{
851 Py_ssize_t value = -1;
852 PyNumberMethods *nb = item->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000853 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000854 value = nb->nb_index(item);
855 }
856 else {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000857 PyErr_Format(PyExc_TypeError,
858 "'%.200s' object cannot be interpreted "
859 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000860 }
861 return value;
862}
863
Guido van Rossume15dee51995-07-18 14:12:02 +0000864PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000865PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000866{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000868 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000869 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000870
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000871 if (o == NULL)
872 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000873 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000874 Py_INCREF(o);
875 return o;
876 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000877 m = o->ob_type->tp_as_number;
878 if (m && m->nb_int) { /* This should include subclasses of int */
879 PyObject *res = m->nb_int(o);
880 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
881 PyErr_Format(PyExc_TypeError,
882 "__int__ returned non-int (type %.200s)",
883 res->ob_type->tp_name);
884 Py_DECREF(res);
885 return NULL;
886 }
887 return res;
888 }
889 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +0000890 PyIntObject *io = (PyIntObject*)o;
891 return PyInt_FromLong(io->ob_ival);
892 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000893 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000894 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000895 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000896#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000897 if (PyUnicode_Check(o))
898 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
899 PyUnicode_GET_SIZE(o),
900 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000901#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000902 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000903 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000904
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000905 return type_error("int() argument must be a string or a "
906 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000907}
908
Guido van Rossum9e896b32000-04-05 20:11:21 +0000909/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000910static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000911long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000912{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000913 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000914 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000915
Guido van Rossum4c08d552000-03-10 22:55:18 +0000916 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000917 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000918 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000919 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000920 PyErr_SetString(PyExc_ValueError,
921 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000922 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000923 return NULL;
924 }
925 return x;
926}
927
Guido van Rossume15dee51995-07-18 14:12:02 +0000928PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000929PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000930{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000931 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000932 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000933 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000934
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000935 if (o == NULL)
936 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +0000937 m = o->ob_type->tp_as_number;
938 if (m && m->nb_long) { /* This should include subclasses of long */
939 PyObject *res = m->nb_long(o);
940 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
941 PyErr_Format(PyExc_TypeError,
942 "__long__ returned non-long (type %.200s)",
943 res->ob_type->tp_name);
944 Py_DECREF(res);
945 return NULL;
946 }
947 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000948 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000949 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +0000950 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000951 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000952 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000953 * doesn't do. In particular long('9.5') must raise an
954 * exception, not truncate the float.
955 */
Guido van Rossum4c08d552000-03-10 22:55:18 +0000956 return long_from_string(PyString_AS_STRING(o),
957 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000958#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000959 if (PyUnicode_Check(o))
960 /* The above check is done in PyLong_FromUnicode(). */
961 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
962 PyUnicode_GET_SIZE(o),
963 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000964#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +0000965 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
966 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000967
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000968 return type_error("long() argument must be a string or a "
969 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000970}
971
972PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000973PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000974{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000975 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000976
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000977 if (o == NULL)
978 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +0000979 m = o->ob_type->tp_as_number;
980 if (m && m->nb_float) { /* This should include subclasses of float */
981 PyObject *res = m->nb_float(o);
982 if (res && !PyFloat_Check(res)) {
983 PyErr_Format(PyExc_TypeError,
984 "__float__ returned non-float (type %.200s)",
985 res->ob_type->tp_name);
986 Py_DECREF(res);
987 return NULL;
988 }
989 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000990 }
Brett Cannonc3647ac2005-04-26 03:45:26 +0000991 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +0000992 PyFloatObject *po = (PyFloatObject *)o;
993 return PyFloat_FromDouble(po->ob_fval);
994 }
Guido van Rossum4c08d552000-03-10 22:55:18 +0000995 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +0000996}
997
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000998/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +0000999
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001000int
Fred Drake79912472000-07-09 04:06:11 +00001001PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001002{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001003 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001004 return PyObject_HasAttrString(s, "__getitem__");
Guido van Rossum8700b422001-09-07 20:20:11 +00001005 return s != NULL && s->ob_type->tp_as_sequence &&
1006 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001007}
1008
Martin v. Löwis18e16552006-02-15 17:27:45 +00001009Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001010PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001011{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001012 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001013
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001014 if (s == NULL) {
1015 null_error();
1016 return -1;
1017 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001018
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001019 m = s->ob_type->tp_as_sequence;
1020 if (m && m->sq_length)
1021 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001022
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001023 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001024 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001025}
1026
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001027#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001028Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001029PySequence_Length(PyObject *s)
1030{
1031 return PySequence_Size(s);
1032}
1033#define PySequence_Length PySequence_Size
1034
Guido van Rossume15dee51995-07-18 14:12:02 +00001035PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001036PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001037{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001038 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001039
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001040 if (s == NULL || o == NULL)
1041 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001042
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001043 m = s->ob_type->tp_as_sequence;
1044 if (m && m->sq_concat)
1045 return m->sq_concat(s, o);
1046
Armin Rigofd163f92005-12-29 15:59:19 +00001047 /* Instances of user classes defining an __add__() method only
1048 have an nb_add slot, not an sq_concat slot. So we fall back
1049 to nb_add if both arguments appear to be sequences. */
1050 if (PySequence_Check(s) && PySequence_Check(o)) {
1051 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1052 if (result != Py_NotImplemented)
1053 return result;
1054 Py_DECREF(result);
1055 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001056 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001057}
1058
1059PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001060PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001062 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001064 if (o == NULL)
1065 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001066
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001067 m = o->ob_type->tp_as_sequence;
1068 if (m && m->sq_repeat)
1069 return m->sq_repeat(o, count);
1070
Armin Rigofd163f92005-12-29 15:59:19 +00001071 /* Instances of user classes defining a __mul__() method only
1072 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1073 to nb_multiply if o appears to be a sequence. */
1074 if (PySequence_Check(o)) {
1075 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001076 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001077 if (n == NULL)
1078 return NULL;
1079 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1080 Py_DECREF(n);
1081 if (result != Py_NotImplemented)
1082 return result;
1083 Py_DECREF(result);
1084 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001085 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001086}
1087
1088PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001089PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1090{
1091 PySequenceMethods *m;
1092
1093 if (s == NULL || o == NULL)
1094 return null_error();
1095
1096 m = s->ob_type->tp_as_sequence;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001097 if (m && m->sq_inplace_concat)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001098 return m->sq_inplace_concat(s, o);
1099 if (m && m->sq_concat)
1100 return m->sq_concat(s, o);
1101
Armin Rigofd163f92005-12-29 15:59:19 +00001102 if (PySequence_Check(s) && PySequence_Check(o)) {
1103 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1104 NB_SLOT(nb_add));
1105 if (result != Py_NotImplemented)
1106 return result;
1107 Py_DECREF(result);
1108 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001109 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001110}
1111
1112PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001113PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001114{
1115 PySequenceMethods *m;
1116
1117 if (o == NULL)
1118 return null_error();
1119
1120 m = o->ob_type->tp_as_sequence;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001121 if (m && m->sq_inplace_repeat)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001122 return m->sq_inplace_repeat(o, count);
1123 if (m && m->sq_repeat)
1124 return m->sq_repeat(o, count);
1125
Armin Rigofd163f92005-12-29 15:59:19 +00001126 if (PySequence_Check(o)) {
1127 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001128 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001129 if (n == NULL)
1130 return NULL;
1131 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1132 NB_SLOT(nb_multiply));
1133 Py_DECREF(n);
1134 if (result != Py_NotImplemented)
1135 return result;
1136 Py_DECREF(result);
1137 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001138 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001139}
1140
1141PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001142PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001143{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001145
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001146 if (s == NULL)
1147 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001148
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001149 m = s->ob_type->tp_as_sequence;
1150 if (m && m->sq_item) {
1151 if (i < 0) {
1152 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001153 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154 if (l < 0)
1155 return NULL;
1156 i += l;
1157 }
1158 }
1159 return m->sq_item(s, i);
1160 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001161
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001162 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001163}
1164
1165PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001166PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001167{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001168 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001169 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001170
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001171 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001172
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001173 m = s->ob_type->tp_as_sequence;
1174 if (m && m->sq_slice) {
1175 if (i1 < 0 || i2 < 0) {
1176 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001177 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178 if (l < 0)
1179 return NULL;
1180 if (i1 < 0)
1181 i1 += l;
1182 if (i2 < 0)
1183 i2 += l;
1184 }
1185 }
1186 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001187 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1188 PyObject *res;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001189 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001190 if (!slice)
1191 return NULL;
1192 res = mp->mp_subscript(s, slice);
1193 Py_DECREF(slice);
1194 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001195 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001196
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001197 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001198}
1199
1200int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001201PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001202{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001203 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001204
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205 if (s == NULL) {
1206 null_error();
1207 return -1;
1208 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001209
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001210 m = s->ob_type->tp_as_sequence;
1211 if (m && m->sq_ass_item) {
1212 if (i < 0) {
1213 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001214 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001215 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001216 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001217 i += l;
1218 }
1219 }
1220 return m->sq_ass_item(s, i, o);
1221 }
1222
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001223 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001224 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001225}
1226
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001227int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001228PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001229{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001230 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001231
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001232 if (s == NULL) {
1233 null_error();
1234 return -1;
1235 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001236
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001237 m = s->ob_type->tp_as_sequence;
1238 if (m && m->sq_ass_item) {
1239 if (i < 0) {
1240 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001241 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001243 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001244 i += l;
1245 }
1246 }
1247 return m->sq_ass_item(s, i, (PyObject *)NULL);
1248 }
1249
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001250 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001251 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001252}
1253
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001254int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001255PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001256{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001257 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001258 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001259
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001260 if (s == NULL) {
1261 null_error();
1262 return -1;
1263 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001264
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265 m = s->ob_type->tp_as_sequence;
1266 if (m && m->sq_ass_slice) {
1267 if (i1 < 0 || i2 < 0) {
1268 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001269 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001270 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001271 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001272 if (i1 < 0)
1273 i1 += l;
1274 if (i2 < 0)
1275 i2 += l;
1276 }
1277 }
1278 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001279 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1280 int res;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001281 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001282 if (!slice)
1283 return -1;
1284 res = mp->mp_ass_subscript(s, slice, o);
1285 Py_DECREF(slice);
1286 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001287 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001288
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001289 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001291}
1292
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001293int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001294PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001295{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001296 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001297
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001298 if (s == NULL) {
1299 null_error();
1300 return -1;
1301 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001302
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001303 m = s->ob_type->tp_as_sequence;
1304 if (m && m->sq_ass_slice) {
1305 if (i1 < 0 || i2 < 0) {
1306 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001307 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001308 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001309 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001310 if (i1 < 0)
1311 i1 += l;
1312 if (i2 < 0)
1313 i2 += l;
1314 }
1315 }
1316 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1317 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001318 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001320}
1321
Guido van Rossume15dee51995-07-18 14:12:02 +00001322PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001323PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001324{
Tim Peters6912d4d2001-05-05 03:56:37 +00001325 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001326 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001327 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001328 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001329
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001330 if (v == NULL)
1331 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001332
Tim Peters6912d4d2001-05-05 03:56:37 +00001333 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001334 if (PyTuple_CheckExact(v)) {
1335 /* Note that we can't know whether it's safe to return
1336 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001337 to exact tuples here. In contrast, lists always make
1338 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001339 Py_INCREF(v);
1340 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001341 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001342 if (PyList_Check(v))
1343 return PyList_AsTuple(v);
1344
Tim Peters6912d4d2001-05-05 03:56:37 +00001345 /* Get iterator. */
1346 it = PyObject_GetIter(v);
1347 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001348 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001349
Tim Peters6912d4d2001-05-05 03:56:37 +00001350 /* Guess result size and allocate space. */
Armin Rigof5b3e362006-02-11 21:32:43 +00001351 n = _PyObject_LengthHint(v);
Tim Peters6912d4d2001-05-05 03:56:37 +00001352 if (n < 0) {
Raymond Hettingera710b332005-08-21 11:03:59 +00001353 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
1354 !PyErr_ExceptionMatches(PyExc_AttributeError)) {
1355 Py_DECREF(it);
1356 return NULL;
1357 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001358 PyErr_Clear();
1359 n = 10; /* arbitrary */
1360 }
1361 result = PyTuple_New(n);
1362 if (result == NULL)
1363 goto Fail;
1364
1365 /* Fill the tuple. */
1366 for (j = 0; ; ++j) {
1367 PyObject *item = PyIter_Next(it);
1368 if (item == NULL) {
1369 if (PyErr_Occurred())
1370 goto Fail;
1371 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001373 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001374 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001375 /* The over-allocation strategy can grow a bit faster
1376 than for lists because unlike lists the
1377 over-allocation isn't permanent -- we reclaim
1378 the excess before the end of this routine.
1379 So, grow by ten and then add 25%.
1380 */
1381 n += 10;
1382 n += n >> 2;
1383 if (n < oldn) {
1384 /* Check for overflow */
1385 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001386 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001387 goto Fail;
1388 }
Tim Peters4324aa32001-05-28 22:30:08 +00001389 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001390 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001391 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001392 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001393 }
1394 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001395 }
1396
Tim Peters6912d4d2001-05-05 03:56:37 +00001397 /* Cut tuple back if guess was too large. */
1398 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001399 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001400 goto Fail;
1401
1402 Py_DECREF(it);
1403 return result;
1404
1405Fail:
1406 Py_XDECREF(result);
1407 Py_DECREF(it);
1408 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001409}
1410
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001411PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001412PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001413{
Tim Petersf553f892001-05-01 20:45:31 +00001414 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001415 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001416
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001417 if (v == NULL)
1418 return null_error();
1419
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001420 result = PyList_New(0);
1421 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001422 return NULL;
1423
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001424 rv = _PyList_Extend((PyListObject *)result, v);
1425 if (rv == NULL) {
1426 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001427 return NULL;
1428 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001429 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001430 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001431}
1432
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001433PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001434PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001435{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001436 PyObject *it;
1437
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001438 if (v == NULL)
1439 return null_error();
1440
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001441 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001442 Py_INCREF(v);
1443 return v;
1444 }
1445
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001446 it = PyObject_GetIter(v);
1447 if (it == NULL) {
1448 if (PyErr_ExceptionMatches(PyExc_TypeError))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001449 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001450 return NULL;
1451 }
1452
Raymond Hettinger193814c2004-12-18 19:00:59 +00001453 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001454 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001455
1456 return v;
1457}
1458
Tim Peters16a77ad2001-09-08 04:00:12 +00001459/* Iterate over seq. Result depends on the operation:
1460 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1461 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1462 set ValueError and return -1 if none found; also return -1 on error.
1463 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1464*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001465Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001466_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001467{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001468 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001469 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1470 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001471
Tim Peters16a77ad2001-09-08 04:00:12 +00001472 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001473 null_error();
1474 return -1;
1475 }
Tim Peters75f8e352001-05-05 11:33:43 +00001476
Tim Peters16a77ad2001-09-08 04:00:12 +00001477 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001478 if (it == NULL) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001479 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001480 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001481 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001482
Tim Peters16a77ad2001-09-08 04:00:12 +00001483 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001484 for (;;) {
1485 int cmp;
1486 PyObject *item = PyIter_Next(it);
1487 if (item == NULL) {
1488 if (PyErr_Occurred())
1489 goto Fail;
1490 break;
1491 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001492
1493 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001494 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001495 if (cmp < 0)
1496 goto Fail;
1497 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001498 switch (operation) {
1499 case PY_ITERSEARCH_COUNT:
1500 ++n;
1501 if (n <= 0) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001502 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001503 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001504 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001505 goto Fail;
1506 }
1507 break;
1508
1509 case PY_ITERSEARCH_INDEX:
1510 if (wrapped) {
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001511 /* XXX(nnorwitz): int means ssize_t */
Tim Peters16a77ad2001-09-08 04:00:12 +00001512 PyErr_SetString(PyExc_OverflowError,
1513 "index exceeds C int size");
1514 goto Fail;
1515 }
1516 goto Done;
1517
1518 case PY_ITERSEARCH_CONTAINS:
1519 n = 1;
1520 goto Done;
1521
1522 default:
1523 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001524 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001525 }
1526
1527 if (operation == PY_ITERSEARCH_INDEX) {
1528 ++n;
1529 if (n <= 0)
1530 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001531 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001532 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001533
1534 if (operation != PY_ITERSEARCH_INDEX)
1535 goto Done;
1536
1537 PyErr_SetString(PyExc_ValueError,
1538 "sequence.index(x): x not in sequence");
1539 /* fall into failure code */
1540Fail:
1541 n = -1;
1542 /* fall through */
1543Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001544 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001545 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001546
Guido van Rossume15dee51995-07-18 14:12:02 +00001547}
1548
Tim Peters16a77ad2001-09-08 04:00:12 +00001549/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001550Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001551PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001552{
Tim Peters16a77ad2001-09-08 04:00:12 +00001553 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001554}
1555
Tim Peterscb8d3682001-05-05 21:05:01 +00001556/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001557 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001558 */
1559int
1560PySequence_Contains(PyObject *seq, PyObject *ob)
1561{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001562 Py_ssize_t result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001563 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1564 if (sqm != NULL && sqm->sq_contains != NULL)
1565 return (*sqm->sq_contains)(seq, ob);
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001566 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1567 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001568}
1569
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001570/* Backwards compatibility */
1571#undef PySequence_In
1572int
Fred Drake79912472000-07-09 04:06:11 +00001573PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001574{
1575 return PySequence_Contains(w, v);
1576}
1577
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001578Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001579PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001580{
Tim Peters16a77ad2001-09-08 04:00:12 +00001581 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001582}
1583
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001584/* Operations on mappings */
1585
1586int
Fred Drake79912472000-07-09 04:06:11 +00001587PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001588{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001589 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001590 return PyObject_HasAttrString(o, "__getitem__");
1591
1592 return o && o->ob_type->tp_as_mapping &&
1593 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001594 !(o->ob_type->tp_as_sequence &&
1595 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001596}
1597
Martin v. Löwis18e16552006-02-15 17:27:45 +00001598Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001599PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001600{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001601 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001602
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001603 if (o == NULL) {
1604 null_error();
1605 return -1;
1606 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001607
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001608 m = o->ob_type->tp_as_mapping;
1609 if (m && m->mp_length)
1610 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001611
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001612 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001613 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001614}
1615
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001616#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001617Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001618PyMapping_Length(PyObject *o)
1619{
1620 return PyMapping_Size(o);
1621}
1622#define PyMapping_Length PyMapping_Size
1623
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001624PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001625PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001626{
1627 PyObject *okey, *r;
1628
1629 if (key == NULL)
1630 return null_error();
1631
1632 okey = PyString_FromString(key);
1633 if (okey == NULL)
1634 return NULL;
1635 r = PyObject_GetItem(o, okey);
1636 Py_DECREF(okey);
1637 return r;
1638}
1639
1640int
Fred Drake79912472000-07-09 04:06:11 +00001641PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001642{
1643 PyObject *okey;
1644 int r;
1645
1646 if (key == NULL) {
1647 null_error();
1648 return -1;
1649 }
1650
1651 okey = PyString_FromString(key);
1652 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001653 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001654 r = PyObject_SetItem(o, okey, value);
1655 Py_DECREF(okey);
1656 return r;
1657}
1658
1659int
Fred Drake79912472000-07-09 04:06:11 +00001660PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001661{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001662 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001663
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001664 v = PyMapping_GetItemString(o, key);
1665 if (v) {
1666 Py_DECREF(v);
1667 return 1;
1668 }
1669 PyErr_Clear();
1670 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001671}
1672
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001673int
Fred Drake79912472000-07-09 04:06:11 +00001674PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001675{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001676 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001677
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001678 v = PyObject_GetItem(o, key);
1679 if (v) {
1680 Py_DECREF(v);
1681 return 1;
1682 }
1683 PyErr_Clear();
1684 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001685}
1686
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001687/* Operations on callable objects */
1688
1689/* XXX PyCallable_Check() is in object.c */
1690
Guido van Rossume15dee51995-07-18 14:12:02 +00001691PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001692PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001693{
Guido van Rossum5560b742001-09-14 16:47:50 +00001694 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001695}
Guido van Rossume15dee51995-07-18 14:12:02 +00001696
1697PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001698PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1699{
1700 ternaryfunc call;
1701
1702 if ((call = func->ob_type->tp_call) != NULL) {
1703 PyObject *result = (*call)(func, arg, kw);
1704 if (result == NULL && !PyErr_Occurred())
1705 PyErr_SetString(
1706 PyExc_SystemError,
1707 "NULL result without error in PyObject_Call");
1708 return result;
1709 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001710 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00001711 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001712 return NULL;
1713}
1714
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001715static PyObject*
1716call_function_tail(PyObject *callable, PyObject *args)
1717{
1718 PyObject *retval;
1719
1720 if (args == NULL)
1721 return NULL;
1722
1723 if (!PyTuple_Check(args)) {
1724 PyObject *a;
1725
1726 a = PyTuple_New(1);
1727 if (a == NULL) {
1728 Py_DECREF(args);
1729 return NULL;
1730 }
1731 PyTuple_SET_ITEM(a, 0, args);
1732 args = a;
1733 }
1734 retval = PyObject_Call(callable, args, NULL);
1735
1736 Py_DECREF(args);
1737
1738 return retval;
1739}
1740
Tim Peters6d6c1a32001-08-02 04:15:00 +00001741PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001742PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001743{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001744 va_list va;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001745 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
Fred Drakeb92cf062001-10-27 06:16:31 +00001747 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001748 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001749
Fred Drakeb92cf062001-10-27 06:16:31 +00001750 if (format && *format) {
1751 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001752 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001753 va_end(va);
1754 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001755 else
1756 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001757
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001758 return call_function_tail(callable, args);
1759}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001760
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001761PyObject *
1762_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
1763{
1764 va_list va;
1765 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001766
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001767 if (callable == NULL)
1768 return null_error();
1769
1770 if (format && *format) {
1771 va_start(va, format);
1772 args = _Py_VaBuildValue_SizeT(format, va);
1773 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001774 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001775 else
1776 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001777
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001778 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001779}
1780
1781PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001782PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001783{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001784 va_list va;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001785 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001786 PyObject *func = NULL;
1787 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001788
Fred Drakeb92cf062001-10-27 06:16:31 +00001789 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001790 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001791
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001792 func = PyObject_GetAttrString(o, name);
1793 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001794 PyErr_SetString(PyExc_AttributeError, name);
1795 return 0;
1796 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001797
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001798 if (!PyCallable_Check(func)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001799 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001800 goto exit;
1801 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001802
Fred Drakeb92cf062001-10-27 06:16:31 +00001803 if (format && *format) {
1804 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001805 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001806 va_end(va);
1807 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001808 else
1809 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001810
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001811 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001812
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001813 exit:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001814 /* args gets consumed in call_function_tail */
1815 Py_XDECREF(func);
1816
1817 return retval;
1818}
1819
1820PyObject *
1821_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
1822{
1823 va_list va;
1824 PyObject *args;
1825 PyObject *func = NULL;
1826 PyObject *retval = NULL;
1827
1828 if (o == NULL || name == NULL)
1829 return null_error();
1830
1831 func = PyObject_GetAttrString(o, name);
1832 if (func == NULL) {
1833 PyErr_SetString(PyExc_AttributeError, name);
1834 return 0;
1835 }
1836
1837 if (!PyCallable_Check(func)) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001838 type_error("attribute of type '%.200s' is not callable", func);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001839 goto exit;
1840 }
1841
1842 if (format && *format) {
1843 va_start(va, format);
1844 args = _Py_VaBuildValue_SizeT(format, va);
1845 va_end(va);
1846 }
1847 else
1848 args = PyTuple_New(0);
1849
1850 retval = call_function_tail(func, args);
1851
1852 exit:
1853 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00001854 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001855
1856 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001857}
Guido van Rossum823649d2001-03-21 18:40:58 +00001858
1859
Fred Drakeb421b8c2001-10-26 16:21:32 +00001860static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001861objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001862{
1863 int i, n = 0;
1864 va_list countva;
1865 PyObject *result, *tmp;
1866
1867#ifdef VA_LIST_IS_ARRAY
1868 memcpy(countva, va, sizeof(va_list));
1869#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001870#ifdef __va_copy
1871 __va_copy(countva, va);
1872#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001873 countva = va;
1874#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001875#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001876
1877 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1878 ++n;
1879 result = PyTuple_New(n);
1880 if (result != NULL && n > 0) {
1881 for (i = 0; i < n; ++i) {
1882 tmp = (PyObject *)va_arg(va, PyObject *);
1883 PyTuple_SET_ITEM(result, i, tmp);
1884 Py_INCREF(tmp);
1885 }
1886 }
1887 return result;
1888}
1889
1890PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001891PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001892{
1893 PyObject *args, *tmp;
1894 va_list vargs;
1895
1896 if (callable == NULL || name == NULL)
1897 return null_error();
1898
1899 callable = PyObject_GetAttr(callable, name);
1900 if (callable == NULL)
1901 return NULL;
1902
1903 /* count the args */
1904 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001905 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001906 va_end(vargs);
1907 if (args == NULL) {
1908 Py_DECREF(callable);
1909 return NULL;
1910 }
1911 tmp = PyObject_Call(callable, args, NULL);
1912 Py_DECREF(args);
1913 Py_DECREF(callable);
1914
1915 return tmp;
1916}
1917
1918PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001919PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001920{
1921 PyObject *args, *tmp;
1922 va_list vargs;
1923
1924 if (callable == NULL)
1925 return null_error();
1926
1927 /* count the args */
1928 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001929 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001930 va_end(vargs);
1931 if (args == NULL)
1932 return NULL;
1933 tmp = PyObject_Call(callable, args, NULL);
1934 Py_DECREF(args);
1935
1936 return tmp;
1937}
1938
1939
Guido van Rossum823649d2001-03-21 18:40:58 +00001940/* isinstance(), issubclass() */
1941
Barry Warsawf16951c2002-04-23 22:45:44 +00001942/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1943 * state that will almost never happen.
1944 *
1945 * 0. creating the __bases__ static string could get a MemoryError
1946 * 1. getattr(cls, '__bases__') could raise an AttributeError
1947 * 2. getattr(cls, '__bases__') could raise some other exception
1948 * 3. getattr(cls, '__bases__') could return a tuple
1949 * 4. getattr(cls, '__bases__') could return something other than a tuple
1950 *
1951 * Only state #3 is a non-error state and only it returns a non-NULL object
1952 * (it returns the retrieved tuple).
1953 *
1954 * Any raised AttributeErrors are masked by clearing the exception and
1955 * returning NULL. If an object other than a tuple comes out of __bases__,
1956 * then again, the return value is NULL. So yes, these two situations
1957 * produce exactly the same results: NULL is returned and no error is set.
1958 *
1959 * If some exception other than AttributeError is raised, then NULL is also
1960 * returned, but the exception is not cleared. That's because we want the
1961 * exception to be propagated along.
1962 *
1963 * Callers are expected to test for PyErr_Occurred() when the return value
1964 * is NULL to decide whether a valid exception should be propagated or not.
1965 * When there's no exception to propagate, it's customary for the caller to
1966 * set a TypeError.
1967 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001968static PyObject *
1969abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001970{
1971 static PyObject *__bases__ = NULL;
1972 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001973
1974 if (__bases__ == NULL) {
1975 __bases__ = PyString_FromString("__bases__");
1976 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001977 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001978 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001979 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001980 if (bases == NULL) {
1981 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1982 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001983 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001984 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001985 if (!PyTuple_Check(bases)) {
1986 Py_DECREF(bases);
1987 return NULL;
1988 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001989 return bases;
1990}
1991
1992
1993static int
1994abstract_issubclass(PyObject *derived, PyObject *cls)
1995{
1996 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001997 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00001998 int r = 0;
1999
2000
Guido van Rossum823649d2001-03-21 18:40:58 +00002001 if (derived == cls)
2002 return 1;
2003
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002004 if (PyTuple_Check(cls)) {
2005 /* Not a general sequence -- that opens up the road to
2006 recursion and stack overflow. */
2007 n = PyTuple_GET_SIZE(cls);
2008 for (i = 0; i < n; i++) {
2009 if (derived == PyTuple_GET_ITEM(cls, i))
2010 return 1;
2011 }
2012 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002013 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002014 if (bases == NULL) {
2015 if (PyErr_Occurred())
2016 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002017 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002018 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002019 n = PyTuple_GET_SIZE(bases);
2020 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002021 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002022 if (r != 0)
2023 break;
2024 }
2025
2026 Py_DECREF(bases);
2027
2028 return r;
2029}
2030
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002031static int
2032check_class(PyObject *cls, const char *error)
2033{
2034 PyObject *bases = abstract_get_bases(cls);
2035 if (bases == NULL) {
2036 /* Do not mask errors. */
2037 if (!PyErr_Occurred())
2038 PyErr_SetString(PyExc_TypeError, error);
2039 return 0;
2040 }
2041 Py_DECREF(bases);
2042 return -1;
2043}
2044
Brett Cannon4f653312004-03-20 22:52:14 +00002045static int
2046recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002047{
2048 PyObject *icls;
2049 static PyObject *__class__ = NULL;
2050 int retval = 0;
2051
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002052 if (__class__ == NULL) {
2053 __class__ = PyString_FromString("__class__");
2054 if (__class__ == NULL)
2055 return -1;
2056 }
2057
Guido van Rossum45aecf42006-03-15 04:58:47 +00002058 if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002059 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002060 if (retval == 0) {
2061 PyObject *c = PyObject_GetAttr(inst, __class__);
2062 if (c == NULL) {
2063 PyErr_Clear();
2064 }
2065 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002066 if (c != (PyObject *)(inst->ob_type) &&
2067 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002068 retval = PyType_IsSubtype(
2069 (PyTypeObject *)c,
2070 (PyTypeObject *)cls);
2071 Py_DECREF(c);
2072 }
2073 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002074 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002075 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002076 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002077
Brett Cannon4f653312004-03-20 22:52:14 +00002078 if (!recursion_depth) {
2079 PyErr_SetString(PyExc_RuntimeError,
2080 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002081 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002082 }
2083
Guido van Rossum03290ec2001-10-07 20:54:12 +00002084 n = PyTuple_GET_SIZE(cls);
2085 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002086 retval = recursive_isinstance(
2087 inst,
2088 PyTuple_GET_ITEM(cls, i),
2089 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002090 if (retval != 0)
2091 break;
2092 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002093 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002094 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002095 if (!check_class(cls,
2096 "isinstance() arg 2 must be a class, type,"
2097 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002098 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002099 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002100 if (icls == NULL) {
2101 PyErr_Clear();
2102 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002103 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002104 else {
2105 retval = abstract_issubclass(icls, cls);
2106 Py_DECREF(icls);
2107 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002108 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002109
Guido van Rossum823649d2001-03-21 18:40:58 +00002110 return retval;
2111}
2112
2113int
Brett Cannon4f653312004-03-20 22:52:14 +00002114PyObject_IsInstance(PyObject *inst, PyObject *cls)
2115{
2116 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
2117}
2118
2119static int
2120recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002121{
2122 int retval;
2123
Guido van Rossum45aecf42006-03-15 04:58:47 +00002124 {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002125 if (!check_class(derived,
2126 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002127 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002128
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002129 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002130 Py_ssize_t i;
2131 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002132
2133 if (!recursion_depth) {
2134 PyErr_SetString(PyExc_RuntimeError,
2135 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002136 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002137 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002138 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002139 retval = recursive_issubclass(
2140 derived,
2141 PyTuple_GET_ITEM(cls, i),
2142 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002143 if (retval != 0) {
2144 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002145 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002146 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002147 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002148 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002149 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002150 else {
2151 if (!check_class(cls,
2152 "issubclass() arg 2 must be a class"
2153 " or tuple of classes"))
2154 return -1;
2155 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002156
2157 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002158 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002159
2160 return retval;
2161}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002162
Brett Cannon4f653312004-03-20 22:52:14 +00002163int
2164PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2165{
2166 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
2167}
2168
2169
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002170PyObject *
2171PyObject_GetIter(PyObject *o)
2172{
2173 PyTypeObject *t = o->ob_type;
2174 getiterfunc f = NULL;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002175 f = t->tp_iter;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002176 if (f == NULL) {
2177 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002178 return PySeqIter_New(o);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002179 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002180 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002181 else {
2182 PyObject *res = (*f)(o);
2183 if (res != NULL && !PyIter_Check(res)) {
2184 PyErr_Format(PyExc_TypeError,
2185 "iter() returned non-iterator "
2186 "of type '%.100s'",
2187 res->ob_type->tp_name);
2188 Py_DECREF(res);
2189 res = NULL;
2190 }
2191 return res;
2192 }
2193}
2194
Tim Petersf4848da2001-05-05 00:14:56 +00002195/* Return next item.
2196 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2197 * If the iteration terminates normally, return NULL and clear the
2198 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2199 * will be false.
2200 * Else return the next object. PyErr_Occurred() will be false.
2201 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002202PyObject *
2203PyIter_Next(PyObject *iter)
2204{
Tim Petersf4848da2001-05-05 00:14:56 +00002205 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002206 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002207 result = (*iter->ob_type->tp_iternext)(iter);
2208 if (result == NULL &&
2209 PyErr_Occurred() &&
2210 PyErr_ExceptionMatches(PyExc_StopIteration))
2211 PyErr_Clear();
2212 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002213}