blob: a3e159a105e016bf15c11473c0c33b1237629432 [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
8#define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
Guido van Rossumc3189692001-01-17 15:29:42 +00009 Py_TPFLAGS_CHECKTYPES)
Guido van Rossume15dee51995-07-18 14:12:02 +000010
Martin v. Löwis5cb69362006-04-14 09:08:42 +000011
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000012/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000013
14static PyObject *
Georg Brandlccff7852006-06-18 22:17:29 +000015type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000016{
Georg Brandlccff7852006-06-18 22:17:29 +000017 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000018 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000019}
20
Guido van Rossum052b7e11996-11-11 15:08:19 +000021static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000022null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000023{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000024 if (!PyErr_Occurred())
25 PyErr_SetString(PyExc_SystemError,
26 "null argument to internal routine");
27 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000028}
29
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000030/* Operations on any object */
31
32int
Fred Drake79912472000-07-09 04:06:11 +000033PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034{
35 int r;
36
37 if (o1 == NULL || o2 == NULL) {
38 null_error();
39 return -1;
40 }
41 r = PyObject_Compare(o1, o2);
42 if (PyErr_Occurred())
43 return -1;
44 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000045 return 0;
46}
Guido van Rossume15dee51995-07-18 14:12:02 +000047
48PyObject *
Fred Drake79912472000-07-09 04:06:11 +000049PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000050{
51 PyObject *v;
52
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000053 if (o == NULL)
54 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000055 v = (PyObject *)o->ob_type;
56 Py_INCREF(v);
57 return v;
58}
59
Martin v. Löwis18e16552006-02-15 17:27:45 +000060Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000061PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000062{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000063 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000064
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000065 if (o == NULL) {
66 null_error();
67 return -1;
68 }
Guido van Rossume15dee51995-07-18 14:12:02 +000069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000070 m = o->ob_type->tp_as_sequence;
71 if (m && m->sq_length)
72 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000073
Jeremy Hylton6253f832000-07-12 12:56:19 +000074 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000075}
76
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000077#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000078Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000079PyObject_Length(PyObject *o)
80{
81 return PyObject_Size(o);
82}
83#define PyObject_Length PyObject_Size
84
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000085
Raymond Hettinger4e2f7142007-12-06 00:56:53 +000086/* The length hint function returns a non-negative value from o.__len__()
87 or o.__length_hint__(). If those methods aren't found or return a negative
88 value, then the defaultvalue is returned. This function never fails.
89 Accordingly, it will mask exceptions raised in either method.
90*/
91
92Py_ssize_t
93_PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
94{
95 static PyObject *hintstrobj = NULL;
96 PyObject *ro;
97 Py_ssize_t rv;
98
99 /* try o.__len__() */
100 rv = PyObject_Size(o);
101 if (rv >= 0)
102 return rv;
103 if (PyErr_Occurred())
104 PyErr_Clear();
105
106 /* cache a hashed version of the attribute string */
107 if (hintstrobj == NULL) {
108 hintstrobj = PyString_InternFromString("__length_hint__");
109 if (hintstrobj == NULL)
110 goto defaultcase;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000111 }
Raymond Hettinger4e2f7142007-12-06 00:56:53 +0000112
113 /* try o.__length_hint__() */
114 ro = PyObject_CallMethodObjArgs(o, hintstrobj, NULL);
115 if (ro == NULL)
116 goto defaultcase;
117 rv = PyInt_AsLong(ro);
118 Py_DECREF(ro);
119 if (rv >= 0)
120 return rv;
121
122defaultcase:
123 if (PyErr_Occurred())
124 PyErr_Clear();
125 return defaultvalue;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000126}
127
Guido van Rossume15dee51995-07-18 14:12:02 +0000128PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000129PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000130{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000131 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000132
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000133 if (o == NULL || key == NULL)
134 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000136 m = o->ob_type->tp_as_mapping;
137 if (m && m->mp_subscript)
138 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000139
Guido van Rossum21308241998-08-13 16:44:44 +0000140 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000141 if (PyIndex_Check(key)) {
142 Py_ssize_t key_value;
143 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000144 if (key_value == -1 && PyErr_Occurred())
145 return NULL;
146 return PySequence_GetItem(o, key_value);
147 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000148 else if (o->ob_type->tp_as_sequence->sq_item)
Georg Brandlccff7852006-06-18 22:17:29 +0000149 return type_error("sequence index must "
150 "be integer, not '%.200s'", key);
Guido van Rossum21308241998-08-13 16:44:44 +0000151 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000152
Georg Brandlccff7852006-06-18 22:17:29 +0000153 return type_error("'%.200s' object is unsubscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000154}
155
156int
Fred Drake79912472000-07-09 04:06:11 +0000157PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000158{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000159 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000161 if (o == NULL || key == NULL || value == NULL) {
162 null_error();
163 return -1;
164 }
165 m = o->ob_type->tp_as_mapping;
166 if (m && m->mp_ass_subscript)
167 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000168
Guido van Rossum21308241998-08-13 16:44:44 +0000169 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000170 if (PyIndex_Check(key)) {
171 Py_ssize_t key_value;
172 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000173 if (key_value == -1 && PyErr_Occurred())
174 return -1;
175 return PySequence_SetItem(o, key_value, value);
176 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000177 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000178 type_error("sequence index must be "
179 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000180 return -1;
181 }
Guido van Rossum21308241998-08-13 16:44:44 +0000182 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000183
Georg Brandlccff7852006-06-18 22:17:29 +0000184 type_error("'%.200s' object does not support item assignment", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000185 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000186}
187
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000188int
Fred Drake79912472000-07-09 04:06:11 +0000189PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000190{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000191 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000192
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000193 if (o == NULL || key == NULL) {
194 null_error();
195 return -1;
196 }
197 m = o->ob_type->tp_as_mapping;
198 if (m && m->mp_ass_subscript)
199 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000200
Guido van Rossum21308241998-08-13 16:44:44 +0000201 if (o->ob_type->tp_as_sequence) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000202 if (PyIndex_Check(key)) {
203 Py_ssize_t key_value;
204 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000205 if (key_value == -1 && PyErr_Occurred())
206 return -1;
207 return PySequence_DelItem(o, key_value);
208 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000209 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
Georg Brandlccff7852006-06-18 22:17:29 +0000210 type_error("sequence index must be "
211 "integer, not '%.200s'", key);
Guido van Rossum64585f62001-11-24 18:24:47 +0000212 return -1;
213 }
Guido van Rossum21308241998-08-13 16:44:44 +0000214 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000215
Georg Brandlccff7852006-06-18 22:17:29 +0000216 type_error("'%.200s' object does not support item deletion", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000217 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000218}
219
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000220int
221PyObject_DelItemString(PyObject *o, char *key)
222{
223 PyObject *okey;
224 int ret;
225
226 if (o == NULL || key == NULL) {
227 null_error();
228 return -1;
229 }
230 okey = PyString_FromString(key);
231 if (okey == NULL)
232 return -1;
233 ret = PyObject_DelItem(o, okey);
234 Py_DECREF(okey);
235 return ret;
236}
237
Brett Cannonea229bd2006-06-06 18:08:16 +0000238int
239PyObject_AsCharBuffer(PyObject *obj,
Guido van Rossum4c08d552000-03-10 22:55:18 +0000240 const char **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000241 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000242{
243 PyBufferProcs *pb;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000244 char *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000245 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000246
247 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
248 null_error();
249 return -1;
250 }
251 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000252 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000253 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255 PyErr_SetString(PyExc_TypeError,
256 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000257 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000260 PyErr_SetString(PyExc_TypeError,
261 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000262 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000263 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000265 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000266 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000267 *buffer = pp;
268 *buffer_len = len;
269 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000270}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000272int
273PyObject_CheckReadBuffer(PyObject *obj)
274{
275 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
276
277 if (pb == NULL ||
278 pb->bf_getreadbuffer == NULL ||
279 pb->bf_getsegcount == NULL ||
280 (*pb->bf_getsegcount)(obj, NULL) != 1)
281 return 0;
282 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000283}
284
285int PyObject_AsReadBuffer(PyObject *obj,
286 const void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000288{
289 PyBufferProcs *pb;
290 void *pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000291 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292
293 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
294 null_error();
295 return -1;
296 }
297 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000298 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000299 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000300 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 PyErr_SetString(PyExc_TypeError,
302 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000303 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000305 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000306 PyErr_SetString(PyExc_TypeError,
307 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000308 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000310 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000312 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000313 *buffer = pp;
314 *buffer_len = len;
315 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316}
317
318int PyObject_AsWriteBuffer(PyObject *obj,
319 void **buffer,
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000321{
322 PyBufferProcs *pb;
323 void*pp;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000324 Py_ssize_t len;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000325
326 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
327 null_error();
328 return -1;
329 }
330 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000331 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000332 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000333 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000334 PyErr_SetString(PyExc_TypeError,
335 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000336 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000337 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000338 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000339 PyErr_SetString(PyExc_TypeError,
340 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000341 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000342 }
343 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
344 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000345 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000346 *buffer = pp;
347 *buffer_len = len;
348 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000349}
350
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000351/* Operations on numbers */
352
353int
Fred Drake79912472000-07-09 04:06:11 +0000354PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000355{
Guido van Rossum6921eca2003-02-18 16:36:28 +0000356 return o && o->ob_type->tp_as_number &&
357 (o->ob_type->tp_as_number->nb_int ||
358 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000359}
360
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000361/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000362
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000363/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000364
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000365#define NB_SLOT(x) offsetof(PyNumberMethods, x)
366#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000367 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000368#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000369 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000370
371/*
372 Calling scheme used for binary operations:
373
374 v w Action
375 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000376 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000377 new old v.op(v,w), coerce(v,w), v.op(v,w)
378 old new w.op(v,w), coerce(v,w), v.op(v,w)
379 old old coerce(v,w), v.op(v,w)
380
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000381 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
382 v->ob_type
383
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000384 Legend:
385 -------
386 * new == new style number
387 * old == old style number
388 * Action indicates the order in which operations are tried until either
389 a valid result is produced or an error occurs.
390
391 */
392
393static PyObject *
394binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000395{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000396 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000397 binaryfunc slotv = NULL;
398 binaryfunc slotw = NULL;
399
400 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000401 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000402 if (w->ob_type != v->ob_type &&
403 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000404 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000405 if (slotw == slotv)
406 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000407 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000408 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000409 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
410 x = slotw(v, w);
411 if (x != Py_NotImplemented)
412 return x;
413 Py_DECREF(x); /* can't do it */
414 slotw = NULL;
415 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000416 x = slotv(v, w);
417 if (x != Py_NotImplemented)
418 return x;
419 Py_DECREF(x); /* can't do it */
420 }
421 if (slotw) {
422 x = slotw(v, w);
423 if (x != Py_NotImplemented)
424 return x;
425 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000426 }
427 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
428 int err = PyNumber_CoerceEx(&v, &w);
429 if (err < 0) {
430 return NULL;
431 }
432 if (err == 0) {
433 PyNumberMethods *mv = v->ob_type->tp_as_number;
434 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000435 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000436 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000437 if (slot) {
Neal Norwitz0c6e2f12006-01-08 06:13:44 +0000438 x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000439 Py_DECREF(v);
440 Py_DECREF(w);
441 return x;
442 }
443 }
444 /* CoerceEx incremented the reference counts */
445 Py_DECREF(v);
446 Py_DECREF(w);
447 }
448 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000449 Py_INCREF(Py_NotImplemented);
450 return Py_NotImplemented;
451}
Guido van Rossum77660912002-04-16 16:32:50 +0000452
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000453static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000454binop_type_error(PyObject *v, PyObject *w, const char *op_name)
455{
456 PyErr_Format(PyExc_TypeError,
Georg Brandlccff7852006-06-18 22:17:29 +0000457 "unsupported operand type(s) for %.100s: "
458 "'%.100s' and '%.100s'",
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000459 op_name,
460 v->ob_type->tp_name,
461 w->ob_type->tp_name);
462 return NULL;
463}
464
465static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000466binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
467{
468 PyObject *result = binary_op1(v, w, op_slot);
469 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000470 Py_DECREF(result);
471 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000472 }
473 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000474}
475
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000476
477/*
478 Calling scheme used for ternary operations:
479
Guido van Rossum84675ac2001-09-29 01:05:03 +0000480 *** In some cases, w.op is called before v.op; see binary_op1. ***
481
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000482 v w z Action
483 -------------------------------------------------------------------
484 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
485 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
486 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
487 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
488 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
489 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
490 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
491 old old old coerce(v,w,z), v.op(v,w,z)
492
493 Legend:
494 -------
495 * new == new style number
496 * old == old style number
497 * Action indicates the order in which operations are tried until either
498 a valid result is produced or an error occurs.
499 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
500 only if z != Py_None; if z == Py_None, then it is treated as absent
501 variable and only coerce(v,w) is tried.
502
503 */
504
505static PyObject *
506ternary_op(PyObject *v,
507 PyObject *w,
508 PyObject *z,
509 const int op_slot,
510 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000511{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000512 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000513 PyObject *x = NULL;
514 ternaryfunc slotv = NULL;
515 ternaryfunc slotw = NULL;
516 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000517
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000518 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000519 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000520 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000521 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000522 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000523 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000524 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000525 if (slotw == slotv)
526 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000527 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000528 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000529 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
530 x = slotw(v, w, z);
531 if (x != Py_NotImplemented)
532 return x;
533 Py_DECREF(x); /* can't do it */
534 slotw = NULL;
535 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000536 x = slotv(v, w, z);
537 if (x != Py_NotImplemented)
538 return x;
539 Py_DECREF(x); /* can't do it */
540 }
541 if (slotw) {
542 x = slotw(v, w, z);
543 if (x != Py_NotImplemented)
544 return x;
545 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000546 }
547 mz = z->ob_type->tp_as_number;
548 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000549 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000550 if (slotz == slotv || slotz == slotw)
551 slotz = NULL;
552 if (slotz) {
553 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000554 if (x != Py_NotImplemented)
555 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000556 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000557 }
558 }
559
560 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
561 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
562 /* we have an old style operand, coerce */
563 PyObject *v1, *z1, *w2, *z2;
564 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000565
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000566 c = PyNumber_Coerce(&v, &w);
567 if (c != 0)
568 goto error3;
569
570 /* Special case: if the third argument is None, it is
571 treated as absent argument and not coerced. */
572 if (z == Py_None) {
573 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000574 slotz = NB_TERNOP(v->ob_type->tp_as_number,
575 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000576 if (slotz)
577 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000578 else
579 c = -1;
580 }
581 else
582 c = -1;
583 goto error2;
584 }
585 v1 = v;
586 z1 = z;
587 c = PyNumber_Coerce(&v1, &z1);
588 if (c != 0)
589 goto error2;
590 w2 = w;
591 z2 = z1;
592 c = PyNumber_Coerce(&w2, &z2);
593 if (c != 0)
594 goto error1;
595
596 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000597 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
598 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000599 if (slotv)
600 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000601 else
602 c = -1;
603 }
604 else
605 c = -1;
606
607 Py_DECREF(w2);
608 Py_DECREF(z2);
609 error1:
610 Py_DECREF(v1);
611 Py_DECREF(z1);
612 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000613 Py_DECREF(v);
614 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000615 error3:
616 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000617 return x;
618 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000619
620 if (z == Py_None)
621 PyErr_Format(
622 PyExc_TypeError,
623 "unsupported operand type(s) for ** or pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000624 "'%.100s' and '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000625 v->ob_type->tp_name,
626 w->ob_type->tp_name);
627 else
628 PyErr_Format(
629 PyExc_TypeError,
630 "unsupported operand type(s) for pow(): "
Georg Brandlccff7852006-06-18 22:17:29 +0000631 "'%.100s', '%.100s', '%.100s'",
Guido van Rossum5c66a262001-10-22 04:12:44 +0000632 v->ob_type->tp_name,
633 w->ob_type->tp_name,
634 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000635 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000636}
637
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000638#define BINARY_FUNC(func, op, op_name) \
639 PyObject * \
640 func(PyObject *v, PyObject *w) { \
641 return binary_op(v, w, NB_SLOT(op), op_name); \
642 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000643
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000644BINARY_FUNC(PyNumber_Or, nb_or, "|")
645BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
646BINARY_FUNC(PyNumber_And, nb_and, "&")
647BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
648BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
649BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000650BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
651BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000652
653PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000654PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000655{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000656 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
657 if (result == Py_NotImplemented) {
658 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Armin Rigofd163f92005-12-29 15:59:19 +0000659 Py_DECREF(result);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000660 if (m && m->sq_concat) {
Armin Rigofd163f92005-12-29 15:59:19 +0000661 return (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000662 }
Armin Rigofd163f92005-12-29 15:59:19 +0000663 result = binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +0000664 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000665 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000666}
667
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000668static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000669sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000670{
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000671 Py_ssize_t count;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000672 if (PyIndex_Check(n)) {
673 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000674 if (count == -1 && PyErr_Occurred())
675 return NULL;
676 }
677 else {
Georg Brandlccff7852006-06-18 22:17:29 +0000678 return type_error("can't multiply sequence by "
679 "non-int of type '%.200s'", n);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000680 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000681 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000682}
683
684PyObject *
685PyNumber_Multiply(PyObject *v, PyObject *w)
686{
687 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
688 if (result == Py_NotImplemented) {
689 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
690 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000691 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000692 if (mv && mv->sq_repeat) {
693 return sequence_repeat(mv->sq_repeat, v, w);
694 }
695 else if (mw && mw->sq_repeat) {
696 return sequence_repeat(mw->sq_repeat, w, v);
697 }
698 result = binop_type_error(v, w, "*");
699 }
700 return result;
701}
702
Guido van Rossume15dee51995-07-18 14:12:02 +0000703PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000704PyNumber_FloorDivide(PyObject *v, PyObject *w)
705{
706 /* XXX tp_flags test */
707 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
708}
709
710PyObject *
711PyNumber_TrueDivide(PyObject *v, PyObject *w)
712{
713 /* XXX tp_flags test */
714 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
715}
716
717PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000718PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000719{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000720 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000721}
722
723PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000724PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000725{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000727}
728
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000729/* Binary in-place operators */
730
731/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000732 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000734 - If the left hand object has the appropriate struct members, and
735 they are filled, call the appropriate function and return the
736 result. No coercion is done on the arguments; the left-hand object
737 is the one the operation is performed on, and it's up to the
738 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000739
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000740 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000741 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000742
743 */
744
Guido van Rossum77660912002-04-16 16:32:50 +0000745#define HASINPLACE(t) \
746 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000747
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000748static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000749binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000750{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000751 PyNumberMethods *mv = v->ob_type->tp_as_number;
752 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000753 binaryfunc slot = NB_BINOP(mv, iop_slot);
754 if (slot) {
755 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000756 if (x != Py_NotImplemented) {
757 return x;
758 }
759 Py_DECREF(x);
760 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000761 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000762 return binary_op1(v, w, op_slot);
763}
764
765static PyObject *
766binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
767 const char *op_name)
768{
769 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
770 if (result == Py_NotImplemented) {
771 Py_DECREF(result);
772 return binop_type_error(v, w, op_name);
773 }
774 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000775}
776
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000777#define INPLACE_BINOP(func, iop, op, op_name) \
778 PyObject * \
779 func(PyObject *v, PyObject *w) { \
780 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000781 }
782
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000783INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
784INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
785INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
786INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
787INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
788INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
789INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000790
791PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000792PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
793{
794 /* XXX tp_flags test */
795 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
796 NB_SLOT(nb_floor_divide), "//=");
797}
798
799PyObject *
800PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
801{
802 /* XXX tp_flags test */
803 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
804 NB_SLOT(nb_true_divide), "/=");
805}
806
807PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000808PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
809{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000810 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
811 NB_SLOT(nb_add));
812 if (result == Py_NotImplemented) {
813 PySequenceMethods *m = v->ob_type->tp_as_sequence;
814 Py_DECREF(result);
815 if (m != NULL) {
816 binaryfunc f = NULL;
817 if (HASINPLACE(v))
818 f = m->sq_inplace_concat;
819 if (f == NULL)
820 f = m->sq_concat;
821 if (f != NULL)
822 return (*f)(v, w);
823 }
824 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000825 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000826 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000827}
828
829PyObject *
830PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
831{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000832 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
833 NB_SLOT(nb_multiply));
834 if (result == Py_NotImplemented) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000835 ssizeargfunc f = NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000836 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
837 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
838 Py_DECREF(result);
839 if (mv != NULL) {
840 if (HASINPLACE(v))
841 f = mv->sq_inplace_repeat;
842 if (f == NULL)
843 f = mv->sq_repeat;
844 if (f != NULL)
845 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000846 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000847 else if (mw != NULL) {
848 /* Note that the right hand operand should not be
849 * mutated in this case so sq_inplace_repeat is not
850 * used. */
851 if (mw->sq_repeat)
852 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000853 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000854 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000855 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000856 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000857}
858
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000859PyObject *
860PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
861{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000862 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
863 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000864}
865
866PyObject *
867PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
868{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000869 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
870 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
871 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000872 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000873 else {
874 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
875 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000876}
877
878
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000879/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000880
881PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000882PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000883{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000884 PyNumberMethods *m;
885
886 if (o == NULL)
887 return null_error();
888 m = o->ob_type->tp_as_number;
889 if (m && m->nb_negative)
890 return (*m->nb_negative)(o);
891
Georg Brandlccff7852006-06-18 22:17:29 +0000892 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000893}
894
895PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000896PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000897{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000898 PyNumberMethods *m;
899
900 if (o == NULL)
901 return null_error();
902 m = o->ob_type->tp_as_number;
903 if (m && m->nb_positive)
904 return (*m->nb_positive)(o);
905
Georg Brandlccff7852006-06-18 22:17:29 +0000906 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000907}
908
909PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000910PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000911{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000912 PyNumberMethods *m;
913
914 if (o == NULL)
915 return null_error();
916 m = o->ob_type->tp_as_number;
917 if (m && m->nb_invert)
918 return (*m->nb_invert)(o);
919
Georg Brandlccff7852006-06-18 22:17:29 +0000920 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000921}
922
923PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000924PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000925{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000926 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000927
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000928 if (o == NULL)
929 return null_error();
930 m = o->ob_type->tp_as_number;
931 if (m && m->nb_absolute)
932 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000933
Georg Brandlccff7852006-06-18 22:17:29 +0000934 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000935}
936
Guido van Rossum9e896b32000-04-05 20:11:21 +0000937/* Add a check for embedded NULL-bytes in the argument. */
938static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000939int_from_string(const char *s, Py_ssize_t len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000940{
941 char *end;
942 PyObject *x;
943
944 x = PyInt_FromString((char*)s, &end, 10);
945 if (x == NULL)
946 return NULL;
947 if (end != s + len) {
948 PyErr_SetString(PyExc_ValueError,
949 "null byte in argument for int()");
950 Py_DECREF(x);
951 return NULL;
952 }
953 return x;
954}
955
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000956/* Return a Python Int or Long from the object item
957 Raise TypeError if the result is not an int-or-long
958 or if the object cannot be interpreted as an index.
959*/
960PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000961PyNumber_Index(PyObject *item)
962{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000963 PyObject *result = NULL;
964 if (item == NULL)
965 return null_error();
Neal Norwitz271a8682006-08-15 06:29:03 +0000966 if (PyInt_Check(item) || PyLong_Check(item)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000967 Py_INCREF(item);
968 return item;
969 }
970 if (PyIndex_Check(item)) {
971 result = item->ob_type->tp_as_number->nb_index(item);
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000972 if (result &&
Neal Norwitz271a8682006-08-15 06:29:03 +0000973 !PyInt_Check(result) && !PyLong_Check(result)) {
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000974 PyErr_Format(PyExc_TypeError,
975 "__index__ returned non-(int,long) " \
976 "(type %.200s)",
977 result->ob_type->tp_name);
978 Py_DECREF(result);
979 return NULL;
980 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000981 }
982 else {
Armin Rigo314861c2006-03-30 14:04:02 +0000983 PyErr_Format(PyExc_TypeError,
984 "'%.200s' object cannot be interpreted "
985 "as an index", item->ob_type->tp_name);
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000986 }
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000987 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +0000988}
989
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000990/* Return an error on Overflow only if err is not NULL*/
991
992Py_ssize_t
993PyNumber_AsSsize_t(PyObject *item, PyObject *err)
994{
995 Py_ssize_t result;
996 PyObject *runerr;
997 PyObject *value = PyNumber_Index(item);
998 if (value == NULL)
999 return -1;
1000
1001 /* We're done if PyInt_AsSsize_t() returns without error. */
1002 result = PyInt_AsSsize_t(value);
1003 if (result != -1 || !(runerr = PyErr_Occurred()))
1004 goto finish;
1005
1006 /* Error handling code -- only manage OverflowError differently */
1007 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1008 goto finish;
1009
1010 PyErr_Clear();
1011 /* If no error-handling desired then the default clipping
1012 is sufficient.
1013 */
1014 if (!err) {
1015 assert(PyLong_Check(value));
1016 /* Whether or not it is less than or equal to
1017 zero is determined by the sign of ob_size
1018 */
1019 if (_PyLong_Sign(value) < 0)
1020 result = PY_SSIZE_T_MIN;
1021 else
1022 result = PY_SSIZE_T_MAX;
1023 }
1024 else {
1025 /* Otherwise replace the error with caller's error object. */
1026 PyErr_Format(err,
1027 "cannot fit '%.200s' into an index-sized integer",
1028 item->ob_type->tp_name);
1029 }
1030
1031 finish:
1032 Py_DECREF(value);
1033 return result;
1034}
1035
1036
Guido van Rossume15dee51995-07-18 14:12:02 +00001037PyObject *
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001038_PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
1039{
1040 const char *type_name;
1041 static PyObject *int_name = NULL;
1042 if (int_name == NULL) {
1043 int_name = PyString_InternFromString("__int__");
1044 if (int_name == NULL)
1045 return NULL;
1046 }
1047
1048 if (integral && (!PyInt_Check(integral) &&
1049 !PyLong_Check(integral))) {
1050 /* Don't go through tp_as_number->nb_int to avoid
1051 hitting the classic class fallback to __trunc__. */
1052 PyObject *int_func = PyObject_GetAttr(integral, int_name);
1053 if (int_func == NULL) {
1054 PyErr_Clear(); /* Raise a different error. */
1055 goto non_integral_error;
1056 }
1057 Py_DECREF(integral);
1058 integral = PyEval_CallObject(int_func, NULL);
1059 Py_DECREF(int_func);
1060 if (integral && (!PyInt_Check(integral) &&
1061 !PyLong_Check(integral))) {
1062 goto non_integral_error;
1063 }
1064 }
1065 return integral;
1066
1067non_integral_error:
1068 if (PyInstance_Check(integral)) {
1069 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
1070 ->in_class->cl_name);
1071 }
1072 else {
1073 type_name = integral->ob_type->tp_name;
1074 }
1075 PyErr_Format(PyExc_TypeError, error_format, type_name);
1076 Py_DECREF(integral);
1077 return NULL;
1078}
1079
1080
1081PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001082PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001083{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001084 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001085 static PyObject *trunc_name = NULL;
1086 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001087 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001088 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001089
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001090 if (trunc_name == NULL) {
1091 trunc_name = PyString_InternFromString("__trunc__");
1092 if (trunc_name == NULL)
1093 return NULL;
1094 }
1095
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001096 if (o == NULL)
1097 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001098 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001099 Py_INCREF(o);
1100 return o;
1101 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001102 m = o->ob_type->tp_as_number;
1103 if (m && m->nb_int) { /* This should include subclasses of int */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001104 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001105 PyObject *res = m->nb_int(o);
1106 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1107 PyErr_Format(PyExc_TypeError,
1108 "__int__ returned non-int (type %.200s)",
1109 res->ob_type->tp_name);
1110 Py_DECREF(res);
1111 return NULL;
1112 }
1113 return res;
1114 }
1115 if (PyInt_Check(o)) { /* A int subclass without nb_int */
Tim Peters64b5ce32001-09-10 20:52:51 +00001116 PyIntObject *io = (PyIntObject*)o;
1117 return PyInt_FromLong(io->ob_ival);
1118 }
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001119 trunc_func = PyObject_GetAttr(o, trunc_name);
1120 if (trunc_func) {
1121 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1122 Py_DECREF(trunc_func);
1123 /* __trunc__ is specified to return an Integral type, but
1124 int() needs to return an int. */
1125 return _PyNumber_ConvertIntegralToInt(
1126 truncated,
1127 "__trunc__ returned non-Integral (type %.200s)");
1128 }
1129 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1130
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001131 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001132 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +00001133 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001134#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001135 if (PyUnicode_Check(o))
1136 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
1137 PyUnicode_GET_SIZE(o),
1138 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001139#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001140 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +00001141 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001142
Georg Brandlccff7852006-06-18 22:17:29 +00001143 return type_error("int() argument must be a string or a "
1144 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001145}
1146
Guido van Rossum9e896b32000-04-05 20:11:21 +00001147/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001148static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001149long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001150{
Guido van Rossum4c08d552000-03-10 22:55:18 +00001151 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001152 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001153
Guido van Rossum4c08d552000-03-10 22:55:18 +00001154 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001155 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001156 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001157 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001158 PyErr_SetString(PyExc_ValueError,
1159 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +00001160 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001161 return NULL;
1162 }
1163 return x;
1164}
1165
Guido van Rossume15dee51995-07-18 14:12:02 +00001166PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001167PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001168{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001169 PyNumberMethods *m;
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001170 static PyObject *trunc_name = NULL;
1171 PyObject *trunc_func;
Guido van Rossum4c08d552000-03-10 22:55:18 +00001172 const char *buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001173 Py_ssize_t buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +00001174
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001175 if (trunc_name == NULL) {
1176 trunc_name = PyString_InternFromString("__trunc__");
1177 if (trunc_name == NULL)
1178 return NULL;
1179 }
1180
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001181 if (o == NULL)
1182 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001183 m = o->ob_type->tp_as_number;
1184 if (m && m->nb_long) { /* This should include subclasses of long */
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001185 /* Classic classes always take this branch. */
Brett Cannonc3647ac2005-04-26 03:45:26 +00001186 PyObject *res = m->nb_long(o);
1187 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
1188 PyErr_Format(PyExc_TypeError,
1189 "__long__ returned non-long (type %.200s)",
1190 res->ob_type->tp_name);
1191 Py_DECREF(res);
1192 return NULL;
1193 }
1194 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001195 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001196 if (PyLong_Check(o)) /* A long subclass without nb_long */
Tim Petersdb30ac42002-03-02 04:14:21 +00001197 return _PyLong_Copy((PyLongObject *)o);
Jeffrey Yasskina26cf9b2008-02-04 01:04:35 +00001198 trunc_func = PyObject_GetAttr(o, trunc_name);
1199 if (trunc_func) {
1200 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1201 PyObject *int_instance;
1202 Py_DECREF(trunc_func);
1203 /* __trunc__ is specified to return an Integral type,
1204 but long() needs to return a long. */
1205 int_instance = _PyNumber_ConvertIntegralToInt(
1206 truncated,
1207 "__trunc__ returned non-Integral (type %.200s)");
1208 if (int_instance && PyInt_Check(int_instance)) {
1209 /* Make sure that long() returns a long instance. */
1210 long value = PyInt_AS_LONG(int_instance);
1211 Py_DECREF(int_instance);
1212 return PyLong_FromLong(value);
1213 }
1214 return int_instance;
1215 }
1216 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
1217
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001219 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001220 * doesn't do. In particular long('9.5') must raise an
1221 * exception, not truncate the float.
1222 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001223 return long_from_string(PyString_AS_STRING(o),
1224 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001225#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001226 if (PyUnicode_Check(o))
1227 /* The above check is done in PyLong_FromUnicode(). */
1228 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1229 PyUnicode_GET_SIZE(o),
1230 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001231#endif
Guido van Rossum4c08d552000-03-10 22:55:18 +00001232 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1233 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001234
Georg Brandlccff7852006-06-18 22:17:29 +00001235 return type_error("long() argument must be a string or a "
1236 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001237}
1238
1239PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001240PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001241{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001242 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001243
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001244 if (o == NULL)
1245 return null_error();
Brett Cannonc3647ac2005-04-26 03:45:26 +00001246 m = o->ob_type->tp_as_number;
1247 if (m && m->nb_float) { /* This should include subclasses of float */
1248 PyObject *res = m->nb_float(o);
1249 if (res && !PyFloat_Check(res)) {
1250 PyErr_Format(PyExc_TypeError,
1251 "__float__ returned non-float (type %.200s)",
1252 res->ob_type->tp_name);
1253 Py_DECREF(res);
1254 return NULL;
1255 }
1256 return res;
Guido van Rossum9e896b32000-04-05 20:11:21 +00001257 }
Brett Cannonc3647ac2005-04-26 03:45:26 +00001258 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Tim Peters7a50f252001-09-10 21:28:20 +00001259 PyFloatObject *po = (PyFloatObject *)o;
1260 return PyFloat_FromDouble(po->ob_fval);
1261 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001262 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001263}
1264
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267int
Fred Drake79912472000-07-09 04:06:11 +00001268PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001269{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001270 if (s && PyInstance_Check(s))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001271 return PyObject_HasAttrString(s, "__getitem__");
Raymond Hettingerde33c622007-02-07 23:49:03 +00001272 if (PyObject_IsInstance(s, (PyObject *)&PyDict_Type))
Raymond Hettinger4da5bf62007-02-07 22:24:07 +00001273 return 0;
Guido van Rossum8700b422001-09-07 20:20:11 +00001274 return s != NULL && s->ob_type->tp_as_sequence &&
1275 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001276}
1277
Martin v. Löwis18e16552006-02-15 17:27:45 +00001278Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001279PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001280{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001281 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001282
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001283 if (s == NULL) {
1284 null_error();
1285 return -1;
1286 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001287
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001288 m = s->ob_type->tp_as_sequence;
1289 if (m && m->sq_length)
1290 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001291
Georg Brandlb0061c82006-08-08 11:56:21 +00001292 type_error("object of type '%.200s' has no len()", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001293 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001294}
1295
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001296#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001297Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001298PySequence_Length(PyObject *s)
1299{
1300 return PySequence_Size(s);
1301}
1302#define PySequence_Length PySequence_Size
1303
Guido van Rossume15dee51995-07-18 14:12:02 +00001304PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001305PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001306{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001307 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001308
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001309 if (s == NULL || o == NULL)
1310 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001311
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001312 m = s->ob_type->tp_as_sequence;
1313 if (m && m->sq_concat)
1314 return m->sq_concat(s, o);
1315
Armin Rigofd163f92005-12-29 15:59:19 +00001316 /* Instances of user classes defining an __add__() method only
1317 have an nb_add slot, not an sq_concat slot. So we fall back
1318 to nb_add if both arguments appear to be sequences. */
1319 if (PySequence_Check(s) && PySequence_Check(o)) {
1320 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1321 if (result != Py_NotImplemented)
1322 return result;
1323 Py_DECREF(result);
1324 }
Georg Brandlccff7852006-06-18 22:17:29 +00001325 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001326}
1327
1328PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001329PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001330{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001331 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001332
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 if (o == NULL)
1334 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001335
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001336 m = o->ob_type->tp_as_sequence;
1337 if (m && m->sq_repeat)
1338 return m->sq_repeat(o, count);
1339
Armin Rigofd163f92005-12-29 15:59:19 +00001340 /* Instances of user classes defining a __mul__() method only
1341 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1342 to nb_multiply if o appears to be a sequence. */
1343 if (PySequence_Check(o)) {
1344 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001345 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001346 if (n == NULL)
1347 return NULL;
1348 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1349 Py_DECREF(n);
1350 if (result != Py_NotImplemented)
1351 return result;
1352 Py_DECREF(result);
1353 }
Georg Brandlccff7852006-06-18 22:17:29 +00001354 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001355}
1356
1357PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001358PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1359{
1360 PySequenceMethods *m;
1361
1362 if (s == NULL || o == NULL)
1363 return null_error();
1364
1365 m = s->ob_type->tp_as_sequence;
1366 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1367 return m->sq_inplace_concat(s, o);
1368 if (m && m->sq_concat)
1369 return m->sq_concat(s, o);
1370
Armin Rigofd163f92005-12-29 15:59:19 +00001371 if (PySequence_Check(s) && PySequence_Check(o)) {
1372 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1373 NB_SLOT(nb_add));
1374 if (result != Py_NotImplemented)
1375 return result;
1376 Py_DECREF(result);
1377 }
Georg Brandlccff7852006-06-18 22:17:29 +00001378 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001379}
1380
1381PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001382PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001383{
1384 PySequenceMethods *m;
1385
1386 if (o == NULL)
1387 return null_error();
1388
1389 m = o->ob_type->tp_as_sequence;
1390 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1391 return m->sq_inplace_repeat(o, count);
1392 if (m && m->sq_repeat)
1393 return m->sq_repeat(o, count);
1394
Armin Rigofd163f92005-12-29 15:59:19 +00001395 if (PySequence_Check(o)) {
1396 PyObject *n, *result;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001397 n = PyInt_FromSsize_t(count);
Armin Rigofd163f92005-12-29 15:59:19 +00001398 if (n == NULL)
1399 return NULL;
1400 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1401 NB_SLOT(nb_multiply));
1402 Py_DECREF(n);
1403 if (result != Py_NotImplemented)
1404 return result;
1405 Py_DECREF(result);
1406 }
Georg Brandlccff7852006-06-18 22:17:29 +00001407 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001408}
1409
1410PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001411PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001412{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001413 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001414
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001415 if (s == NULL)
1416 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001417
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001418 m = s->ob_type->tp_as_sequence;
1419 if (m && m->sq_item) {
1420 if (i < 0) {
1421 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001422 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001423 if (l < 0)
1424 return NULL;
1425 i += l;
1426 }
1427 }
1428 return m->sq_item(s, i);
1429 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001430
Georg Brandlccff7852006-06-18 22:17:29 +00001431 return type_error("'%.200s' object is unindexable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001432}
1433
1434PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001435PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001436{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001437 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001438 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001439
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001440 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001441
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001442 m = s->ob_type->tp_as_sequence;
1443 if (m && m->sq_slice) {
1444 if (i1 < 0 || i2 < 0) {
1445 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001446 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001447 if (l < 0)
1448 return NULL;
1449 if (i1 < 0)
1450 i1 += l;
1451 if (i2 < 0)
1452 i2 += l;
1453 }
1454 }
1455 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001456 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1457 PyObject *res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001458 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001459 if (!slice)
1460 return NULL;
1461 res = mp->mp_subscript(s, slice);
1462 Py_DECREF(slice);
1463 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001464 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001465
Georg Brandlccff7852006-06-18 22:17:29 +00001466 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001467}
1468
1469int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001470PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001471{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001472 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001473
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001474 if (s == NULL) {
1475 null_error();
1476 return -1;
1477 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001478
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001479 m = s->ob_type->tp_as_sequence;
1480 if (m && m->sq_ass_item) {
1481 if (i < 0) {
1482 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001483 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001485 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001486 i += l;
1487 }
1488 }
1489 return m->sq_ass_item(s, i, o);
1490 }
1491
Georg Brandlccff7852006-06-18 22:17:29 +00001492 type_error("'%.200s' object does not support item assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001493 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001494}
1495
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001496int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001497PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001498{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001499 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001500
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001501 if (s == NULL) {
1502 null_error();
1503 return -1;
1504 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001505
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001506 m = s->ob_type->tp_as_sequence;
1507 if (m && m->sq_ass_item) {
1508 if (i < 0) {
1509 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001510 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001511 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001512 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001513 i += l;
1514 }
1515 }
1516 return m->sq_ass_item(s, i, (PyObject *)NULL);
1517 }
1518
Georg Brandlccff7852006-06-18 22:17:29 +00001519 type_error("'%.200s' object doesn't support item deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001520 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001521}
1522
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001523int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001524PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001525{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001526 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001527 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001528
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001529 if (s == NULL) {
1530 null_error();
1531 return -1;
1532 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001533
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001534 m = s->ob_type->tp_as_sequence;
1535 if (m && m->sq_ass_slice) {
1536 if (i1 < 0 || i2 < 0) {
1537 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001538 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001539 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001540 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001541 if (i1 < 0)
1542 i1 += l;
1543 if (i2 < 0)
1544 i2 += l;
1545 }
1546 }
1547 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001548 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1549 int res;
Neal Norwitzbadc0862006-03-23 06:03:08 +00001550 PyObject *slice = _PySlice_FromIndices(i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001551 if (!slice)
1552 return -1;
1553 res = mp->mp_ass_subscript(s, slice, o);
1554 Py_DECREF(slice);
1555 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001556 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001557
Georg Brandlccff7852006-06-18 22:17:29 +00001558 type_error("'%.200s' object doesn't support slice assignment", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001559 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001560}
1561
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001562int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001563PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001564{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001565 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001566
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001567 if (s == NULL) {
1568 null_error();
1569 return -1;
1570 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001571
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001572 m = s->ob_type->tp_as_sequence;
1573 if (m && m->sq_ass_slice) {
1574 if (i1 < 0 || i2 < 0) {
1575 if (m->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001576 Py_ssize_t l = (*m->sq_length)(s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001577 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001578 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001579 if (i1 < 0)
1580 i1 += l;
1581 if (i2 < 0)
1582 i2 += l;
1583 }
1584 }
1585 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1586 }
Georg Brandlccff7852006-06-18 22:17:29 +00001587 type_error("'%.200s' object doesn't support slice deletion", s);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001588 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001589}
1590
Guido van Rossume15dee51995-07-18 14:12:02 +00001591PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001592PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001593{
Tim Peters6912d4d2001-05-05 03:56:37 +00001594 PyObject *it; /* iter(v) */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001595 Py_ssize_t n; /* guess for result tuple size */
Tim Peters6912d4d2001-05-05 03:56:37 +00001596 PyObject *result;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001597 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001598
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001599 if (v == NULL)
1600 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001601
Tim Peters6912d4d2001-05-05 03:56:37 +00001602 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001603 if (PyTuple_CheckExact(v)) {
1604 /* Note that we can't know whether it's safe to return
1605 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001606 to exact tuples here. In contrast, lists always make
1607 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001608 Py_INCREF(v);
1609 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001610 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001611 if (PyList_Check(v))
1612 return PyList_AsTuple(v);
1613
Tim Peters6912d4d2001-05-05 03:56:37 +00001614 /* Get iterator. */
1615 it = PyObject_GetIter(v);
1616 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001617 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001618
Tim Peters6912d4d2001-05-05 03:56:37 +00001619 /* Guess result size and allocate space. */
Raymond Hettinger4e2f7142007-12-06 00:56:53 +00001620 n = _PyObject_LengthHint(v, 10);
Tim Peters6912d4d2001-05-05 03:56:37 +00001621 result = PyTuple_New(n);
1622 if (result == NULL)
1623 goto Fail;
1624
1625 /* Fill the tuple. */
1626 for (j = 0; ; ++j) {
1627 PyObject *item = PyIter_Next(it);
1628 if (item == NULL) {
1629 if (PyErr_Occurred())
1630 goto Fail;
1631 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001632 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001633 if (j >= n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001634 Py_ssize_t oldn = n;
Raymond Hettinger4d012592004-12-16 10:38:38 +00001635 /* The over-allocation strategy can grow a bit faster
1636 than for lists because unlike lists the
1637 over-allocation isn't permanent -- we reclaim
1638 the excess before the end of this routine.
1639 So, grow by ten and then add 25%.
1640 */
1641 n += 10;
1642 n += n >> 2;
1643 if (n < oldn) {
1644 /* Check for overflow */
1645 PyErr_NoMemory();
Raymond Hettingere6bdb372004-12-16 15:10:21 +00001646 Py_DECREF(item);
Raymond Hettinger4d012592004-12-16 10:38:38 +00001647 goto Fail;
1648 }
Tim Peters4324aa32001-05-28 22:30:08 +00001649 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001650 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001651 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001652 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001653 }
1654 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001655 }
1656
Tim Peters6912d4d2001-05-05 03:56:37 +00001657 /* Cut tuple back if guess was too large. */
1658 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001659 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001660 goto Fail;
1661
1662 Py_DECREF(it);
1663 return result;
1664
1665Fail:
1666 Py_XDECREF(result);
1667 Py_DECREF(it);
1668 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001669}
1670
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001671PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001672PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001673{
Tim Petersf553f892001-05-01 20:45:31 +00001674 PyObject *result; /* result list */
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001675 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001676
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001677 if (v == NULL)
1678 return null_error();
1679
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001680 result = PyList_New(0);
1681 if (result == NULL)
Tim Petersf553f892001-05-01 20:45:31 +00001682 return NULL;
1683
Raymond Hettinger8ca92ae2004-03-11 09:13:12 +00001684 rv = _PyList_Extend((PyListObject *)result, v);
1685 if (rv == NULL) {
1686 Py_DECREF(result);
Tim Petersf553f892001-05-01 20:45:31 +00001687 return NULL;
1688 }
Raymond Hettinger969d8c02004-03-17 05:24:23 +00001689 Py_DECREF(rv);
Tim Petersf553f892001-05-01 20:45:31 +00001690 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001691}
1692
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001693PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001694PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001695{
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001696 PyObject *it;
1697
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001698 if (v == NULL)
1699 return null_error();
1700
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001701 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001702 Py_INCREF(v);
1703 return v;
1704 }
1705
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001706 it = PyObject_GetIter(v);
1707 if (it == NULL) {
1708 if (PyErr_ExceptionMatches(PyExc_TypeError))
Georg Brandlccff7852006-06-18 22:17:29 +00001709 PyErr_SetString(PyExc_TypeError, m);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001710 return NULL;
1711 }
1712
Raymond Hettinger193814c2004-12-18 19:00:59 +00001713 v = PySequence_List(it);
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001714 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001715
1716 return v;
1717}
1718
Tim Peters16a77ad2001-09-08 04:00:12 +00001719/* Iterate over seq. Result depends on the operation:
1720 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1721 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1722 set ValueError and return -1 if none found; also return -1 on error.
1723 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1724*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001725Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001726_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001727{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001728 Py_ssize_t n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001729 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1730 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001731
Tim Peters16a77ad2001-09-08 04:00:12 +00001732 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001733 null_error();
1734 return -1;
1735 }
Tim Peters75f8e352001-05-05 11:33:43 +00001736
Tim Peters16a77ad2001-09-08 04:00:12 +00001737 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001738 if (it == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00001739 type_error("argument of type '%.200s' is not iterable", seq);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001740 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001741 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001742
Tim Peters16a77ad2001-09-08 04:00:12 +00001743 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001744 for (;;) {
1745 int cmp;
1746 PyObject *item = PyIter_Next(it);
1747 if (item == NULL) {
1748 if (PyErr_Occurred())
1749 goto Fail;
1750 break;
1751 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001752
1753 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001754 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001755 if (cmp < 0)
1756 goto Fail;
1757 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001758 switch (operation) {
1759 case PY_ITERSEARCH_COUNT:
Armin Rigo7ccbca92006-10-04 12:17:45 +00001760 if (n == PY_SSIZE_T_MAX) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001761 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00001762 "count exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001763 goto Fail;
1764 }
Armin Rigo7ccbca92006-10-04 12:17:45 +00001765 ++n;
Tim Peters16a77ad2001-09-08 04:00:12 +00001766 break;
1767
1768 case PY_ITERSEARCH_INDEX:
1769 if (wrapped) {
1770 PyErr_SetString(PyExc_OverflowError,
Armin Rigo7ccbca92006-10-04 12:17:45 +00001771 "index exceeds C integer size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001772 goto Fail;
1773 }
1774 goto Done;
1775
1776 case PY_ITERSEARCH_CONTAINS:
1777 n = 1;
1778 goto Done;
1779
1780 default:
1781 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001782 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001783 }
1784
1785 if (operation == PY_ITERSEARCH_INDEX) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00001786 if (n == PY_SSIZE_T_MAX)
Tim Peters16a77ad2001-09-08 04:00:12 +00001787 wrapped = 1;
Armin Rigo7ccbca92006-10-04 12:17:45 +00001788 ++n;
Tim Peters75f8e352001-05-05 11:33:43 +00001789 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001790 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001791
1792 if (operation != PY_ITERSEARCH_INDEX)
1793 goto Done;
1794
1795 PyErr_SetString(PyExc_ValueError,
1796 "sequence.index(x): x not in sequence");
1797 /* fall into failure code */
1798Fail:
1799 n = -1;
1800 /* fall through */
1801Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001802 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001803 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001804
Guido van Rossume15dee51995-07-18 14:12:02 +00001805}
1806
Tim Peters16a77ad2001-09-08 04:00:12 +00001807/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001808Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001809PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001810{
Tim Peters16a77ad2001-09-08 04:00:12 +00001811 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001812}
1813
Tim Peterscb8d3682001-05-05 21:05:01 +00001814/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001815 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001816 */
1817int
1818PySequence_Contains(PyObject *seq, PyObject *ob)
1819{
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001820 Py_ssize_t result;
Tim Peterscb8d3682001-05-05 21:05:01 +00001821 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1822 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1823 if (sqm != NULL && sqm->sq_contains != NULL)
1824 return (*sqm->sq_contains)(seq, ob);
1825 }
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001826 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1827 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001828}
1829
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001830/* Backwards compatibility */
1831#undef PySequence_In
1832int
Fred Drake79912472000-07-09 04:06:11 +00001833PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834{
1835 return PySequence_Contains(w, v);
1836}
1837
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001838Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001839PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001840{
Tim Peters16a77ad2001-09-08 04:00:12 +00001841 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001842}
1843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844/* Operations on mappings */
1845
1846int
Fred Drake79912472000-07-09 04:06:11 +00001847PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001848{
Raymond Hettinger1be1a792004-09-19 06:00:15 +00001849 if (o && PyInstance_Check(o))
Raymond Hettingere2eda602004-04-04 08:51:41 +00001850 return PyObject_HasAttrString(o, "__getitem__");
1851
1852 return o && o->ob_type->tp_as_mapping &&
1853 o->ob_type->tp_as_mapping->mp_subscript &&
Raymond Hettingered9192e2004-04-05 08:14:48 +00001854 !(o->ob_type->tp_as_sequence &&
1855 o->ob_type->tp_as_sequence->sq_slice);
Guido van Rossume15dee51995-07-18 14:12:02 +00001856}
1857
Martin v. Löwis18e16552006-02-15 17:27:45 +00001858Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001859PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001860{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001861 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001862
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001863 if (o == NULL) {
1864 null_error();
1865 return -1;
1866 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001867
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001868 m = o->ob_type->tp_as_mapping;
1869 if (m && m->mp_length)
1870 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001871
Georg Brandlb0061c82006-08-08 11:56:21 +00001872 type_error("object of type '%.200s' has no len()", o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001873 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001874}
1875
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001876#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001877Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001878PyMapping_Length(PyObject *o)
1879{
1880 return PyMapping_Size(o);
1881}
1882#define PyMapping_Length PyMapping_Size
1883
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001884PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001885PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001886{
1887 PyObject *okey, *r;
1888
1889 if (key == NULL)
1890 return null_error();
1891
1892 okey = PyString_FromString(key);
1893 if (okey == NULL)
1894 return NULL;
1895 r = PyObject_GetItem(o, okey);
1896 Py_DECREF(okey);
1897 return r;
1898}
1899
1900int
Fred Drake79912472000-07-09 04:06:11 +00001901PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001902{
1903 PyObject *okey;
1904 int r;
1905
1906 if (key == NULL) {
1907 null_error();
1908 return -1;
1909 }
1910
1911 okey = PyString_FromString(key);
1912 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001913 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001914 r = PyObject_SetItem(o, okey, value);
1915 Py_DECREF(okey);
1916 return r;
1917}
1918
1919int
Fred Drake79912472000-07-09 04:06:11 +00001920PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001921{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001922 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001923
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001924 v = PyMapping_GetItemString(o, key);
1925 if (v) {
1926 Py_DECREF(v);
1927 return 1;
1928 }
1929 PyErr_Clear();
1930 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001931}
1932
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001933int
Fred Drake79912472000-07-09 04:06:11 +00001934PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001935{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001936 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001937
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001938 v = PyObject_GetItem(o, key);
1939 if (v) {
1940 Py_DECREF(v);
1941 return 1;
1942 }
1943 PyErr_Clear();
1944 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001945}
1946
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001947/* Operations on callable objects */
1948
1949/* XXX PyCallable_Check() is in object.c */
1950
Guido van Rossume15dee51995-07-18 14:12:02 +00001951PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001952PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001953{
Guido van Rossum5560b742001-09-14 16:47:50 +00001954 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001955}
Guido van Rossume15dee51995-07-18 14:12:02 +00001956
1957PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001958PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1959{
1960 ternaryfunc call;
1961
1962 if ((call = func->ob_type->tp_call) != NULL) {
Brett Cannon1e534b52007-09-07 04:18:30 +00001963 PyObject *result;
1964 if (Py_EnterRecursiveCall(" while calling a Python object"))
1965 return NULL;
1966 result = (*call)(func, arg, kw);
1967 Py_LeaveRecursiveCall();
Tim Peters6d6c1a32001-08-02 04:15:00 +00001968 if (result == NULL && !PyErr_Occurred())
1969 PyErr_SetString(
1970 PyExc_SystemError,
1971 "NULL result without error in PyObject_Call");
1972 return result;
1973 }
Georg Brandlccff7852006-06-18 22:17:29 +00001974 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
Fred Drake573395a2001-11-01 20:26:12 +00001975 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001976 return NULL;
1977}
1978
Martin v. Löwis5cb69362006-04-14 09:08:42 +00001979static PyObject*
1980call_function_tail(PyObject *callable, PyObject *args)
1981{
1982 PyObject *retval;
1983
1984 if (args == NULL)
1985 return NULL;
1986
1987 if (!PyTuple_Check(args)) {
1988 PyObject *a;
1989
1990 a = PyTuple_New(1);
1991 if (a == NULL) {
1992 Py_DECREF(args);
1993 return NULL;
1994 }
1995 PyTuple_SET_ITEM(a, 0, args);
1996 args = a;
1997 }
1998 retval = PyObject_Call(callable, args, NULL);
1999
2000 Py_DECREF(args);
2001
2002 return retval;
2003}
2004
Tim Peters6d6c1a32001-08-02 04:15:00 +00002005PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002006PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002007{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002008 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002009 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002010
Fred Drakeb92cf062001-10-27 06:16:31 +00002011 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002012 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002013
Fred Drakeb92cf062001-10-27 06:16:31 +00002014 if (format && *format) {
2015 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002016 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002017 va_end(va);
2018 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002019 else
2020 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002021
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002022 return call_function_tail(callable, args);
2023}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002024
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002025PyObject *
2026_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2027{
2028 va_list va;
2029 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002030
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002031 if (callable == NULL)
2032 return null_error();
2033
2034 if (format && *format) {
2035 va_start(va, format);
2036 args = _Py_VaBuildValue_SizeT(format, va);
2037 va_end(va);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002038 }
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002039 else
2040 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002041
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002042 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002043}
2044
2045PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002046PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002047{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002048 va_list va;
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002049 PyObject *args;
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002050 PyObject *func = NULL;
2051 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002052
Fred Drakeb92cf062001-10-27 06:16:31 +00002053 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002054 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002055
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002056 func = PyObject_GetAttrString(o, name);
2057 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002058 PyErr_SetString(PyExc_AttributeError, name);
2059 return 0;
2060 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002061
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002062 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002063 type_error("attribute of type '%.200s' is not callable", func);
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002064 goto exit;
2065 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002066
Fred Drakeb92cf062001-10-27 06:16:31 +00002067 if (format && *format) {
2068 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002069 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00002070 va_end(va);
2071 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002072 else
2073 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002074
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002075 retval = call_function_tail(func, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002076
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002077 exit:
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002078 /* args gets consumed in call_function_tail */
2079 Py_XDECREF(func);
2080
2081 return retval;
2082}
2083
2084PyObject *
2085_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2086{
2087 va_list va;
2088 PyObject *args;
2089 PyObject *func = NULL;
2090 PyObject *retval = NULL;
2091
2092 if (o == NULL || name == NULL)
2093 return null_error();
2094
2095 func = PyObject_GetAttrString(o, name);
2096 if (func == NULL) {
2097 PyErr_SetString(PyExc_AttributeError, name);
2098 return 0;
2099 }
2100
2101 if (!PyCallable_Check(func)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002102 type_error("attribute of type '%.200s' is not callable", func);
Martin v. Löwis5cb69362006-04-14 09:08:42 +00002103 goto exit;
2104 }
2105
2106 if (format && *format) {
2107 va_start(va, format);
2108 args = _Py_VaBuildValue_SizeT(format, va);
2109 va_end(va);
2110 }
2111 else
2112 args = PyTuple_New(0);
2113
2114 retval = call_function_tail(func, args);
2115
2116 exit:
2117 /* args gets consumed in call_function_tail */
Michael W. Hudson0edc7a02005-07-12 10:21:19 +00002118 Py_XDECREF(func);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002119
2120 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002121}
Guido van Rossum823649d2001-03-21 18:40:58 +00002122
2123
Fred Drakeb421b8c2001-10-26 16:21:32 +00002124static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002125objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002126{
2127 int i, n = 0;
2128 va_list countva;
2129 PyObject *result, *tmp;
2130
2131#ifdef VA_LIST_IS_ARRAY
2132 memcpy(countva, va, sizeof(va_list));
2133#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002134#ifdef __va_copy
2135 __va_copy(countva, va);
2136#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00002137 countva = va;
2138#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00002139#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00002140
2141 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2142 ++n;
2143 result = PyTuple_New(n);
2144 if (result != NULL && n > 0) {
2145 for (i = 0; i < n; ++i) {
2146 tmp = (PyObject *)va_arg(va, PyObject *);
2147 PyTuple_SET_ITEM(result, i, tmp);
2148 Py_INCREF(tmp);
2149 }
2150 }
2151 return result;
2152}
2153
2154PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002155PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002156{
2157 PyObject *args, *tmp;
2158 va_list vargs;
2159
2160 if (callable == NULL || name == NULL)
2161 return null_error();
2162
2163 callable = PyObject_GetAttr(callable, name);
2164 if (callable == NULL)
2165 return NULL;
2166
2167 /* count the args */
2168 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002169 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002170 va_end(vargs);
2171 if (args == NULL) {
2172 Py_DECREF(callable);
2173 return NULL;
2174 }
2175 tmp = PyObject_Call(callable, args, NULL);
2176 Py_DECREF(args);
2177 Py_DECREF(callable);
2178
2179 return tmp;
2180}
2181
2182PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002183PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002184{
2185 PyObject *args, *tmp;
2186 va_list vargs;
2187
2188 if (callable == NULL)
2189 return null_error();
2190
2191 /* count the args */
2192 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00002193 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002194 va_end(vargs);
2195 if (args == NULL)
2196 return NULL;
2197 tmp = PyObject_Call(callable, args, NULL);
2198 Py_DECREF(args);
2199
2200 return tmp;
2201}
2202
2203
Guido van Rossum823649d2001-03-21 18:40:58 +00002204/* isinstance(), issubclass() */
2205
Barry Warsawf16951c2002-04-23 22:45:44 +00002206/* abstract_get_bases() has logically 4 return states, with a sort of 0th
2207 * state that will almost never happen.
2208 *
2209 * 0. creating the __bases__ static string could get a MemoryError
2210 * 1. getattr(cls, '__bases__') could raise an AttributeError
2211 * 2. getattr(cls, '__bases__') could raise some other exception
2212 * 3. getattr(cls, '__bases__') could return a tuple
2213 * 4. getattr(cls, '__bases__') could return something other than a tuple
2214 *
2215 * Only state #3 is a non-error state and only it returns a non-NULL object
2216 * (it returns the retrieved tuple).
2217 *
2218 * Any raised AttributeErrors are masked by clearing the exception and
2219 * returning NULL. If an object other than a tuple comes out of __bases__,
2220 * then again, the return value is NULL. So yes, these two situations
2221 * produce exactly the same results: NULL is returned and no error is set.
2222 *
2223 * If some exception other than AttributeError is raised, then NULL is also
2224 * returned, but the exception is not cleared. That's because we want the
2225 * exception to be propagated along.
2226 *
2227 * Callers are expected to test for PyErr_Occurred() when the return value
2228 * is NULL to decide whether a valid exception should be propagated or not.
2229 * When there's no exception to propagate, it's customary for the caller to
2230 * set a TypeError.
2231 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002232static PyObject *
2233abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002234{
2235 static PyObject *__bases__ = NULL;
2236 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002237
2238 if (__bases__ == NULL) {
Christian Heimesd7e1b2b2008-01-28 02:07:53 +00002239 __bases__ = PyString_InternFromString("__bases__");
Guido van Rossum823649d2001-03-21 18:40:58 +00002240 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00002241 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002242 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002243 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00002244 if (bases == NULL) {
2245 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2246 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00002247 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00002248 }
Barry Warsawf16951c2002-04-23 22:45:44 +00002249 if (!PyTuple_Check(bases)) {
2250 Py_DECREF(bases);
2251 return NULL;
2252 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002253 return bases;
2254}
2255
2256
2257static int
2258abstract_issubclass(PyObject *derived, PyObject *cls)
2259{
2260 PyObject *bases;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002261 Py_ssize_t i, n;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002262 int r = 0;
2263
2264
Guido van Rossum823649d2001-03-21 18:40:58 +00002265 if (derived == cls)
2266 return 1;
2267
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002268 if (PyTuple_Check(cls)) {
2269 /* Not a general sequence -- that opens up the road to
2270 recursion and stack overflow. */
2271 n = PyTuple_GET_SIZE(cls);
2272 for (i = 0; i < n; i++) {
2273 if (derived == PyTuple_GET_ITEM(cls, i))
2274 return 1;
2275 }
2276 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002277 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002278 if (bases == NULL) {
2279 if (PyErr_Occurred())
2280 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002281 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002282 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002283 n = PyTuple_GET_SIZE(bases);
2284 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002285 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002286 if (r != 0)
2287 break;
2288 }
2289
2290 Py_DECREF(bases);
2291
2292 return r;
2293}
2294
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002295static int
2296check_class(PyObject *cls, const char *error)
2297{
2298 PyObject *bases = abstract_get_bases(cls);
2299 if (bases == NULL) {
2300 /* Do not mask errors. */
2301 if (!PyErr_Occurred())
2302 PyErr_SetString(PyExc_TypeError, error);
2303 return 0;
2304 }
2305 Py_DECREF(bases);
2306 return -1;
2307}
2308
Brett Cannon4f653312004-03-20 22:52:14 +00002309static int
2310recursive_isinstance(PyObject *inst, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002311{
2312 PyObject *icls;
2313 static PyObject *__class__ = NULL;
2314 int retval = 0;
2315
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002316 if (__class__ == NULL) {
Christian Heimesd7e1b2b2008-01-28 02:07:53 +00002317 __class__ = PyString_InternFromString("__class__");
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002318 if (__class__ == NULL)
2319 return -1;
2320 }
2321
Neil Schemenauer6b471292001-10-18 03:18:43 +00002322 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2323 PyObject *inclass =
2324 (PyObject*)((PyInstanceObject*)inst)->in_class;
2325 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002326 }
2327 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002328 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002329 if (retval == 0) {
2330 PyObject *c = PyObject_GetAttr(inst, __class__);
2331 if (c == NULL) {
2332 PyErr_Clear();
2333 }
2334 else {
Guido van Rossume5b130b2003-02-12 03:36:05 +00002335 if (c != (PyObject *)(inst->ob_type) &&
2336 PyType_Check(c))
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002337 retval = PyType_IsSubtype(
2338 (PyTypeObject *)c,
2339 (PyTypeObject *)cls);
2340 Py_DECREF(c);
2341 }
2342 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002343 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002344 else if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002345 Py_ssize_t i, n;
Guido van Rossum03290ec2001-10-07 20:54:12 +00002346
Brett Cannon4f653312004-03-20 22:52:14 +00002347 if (!recursion_depth) {
2348 PyErr_SetString(PyExc_RuntimeError,
2349 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002350 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002351 }
2352
Guido van Rossum03290ec2001-10-07 20:54:12 +00002353 n = PyTuple_GET_SIZE(cls);
2354 for (i = 0; i < n; i++) {
Brett Cannon4f653312004-03-20 22:52:14 +00002355 retval = recursive_isinstance(
2356 inst,
2357 PyTuple_GET_ITEM(cls, i),
2358 recursion_depth-1);
Guido van Rossum03290ec2001-10-07 20:54:12 +00002359 if (retval != 0)
2360 break;
2361 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002362 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002363 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002364 if (!check_class(cls,
2365 "isinstance() arg 2 must be a class, type,"
2366 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002367 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002368 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002369 if (icls == NULL) {
2370 PyErr_Clear();
2371 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002372 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002373 else {
2374 retval = abstract_issubclass(icls, cls);
2375 Py_DECREF(icls);
2376 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002377 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002378
Guido van Rossum823649d2001-03-21 18:40:58 +00002379 return retval;
2380}
2381
2382int
Brett Cannon4f653312004-03-20 22:52:14 +00002383PyObject_IsInstance(PyObject *inst, PyObject *cls)
2384{
Guido van Rossumb5591132007-09-10 22:36:02 +00002385 PyObject *t, *v, *tb;
2386 PyObject *checker;
2387 PyErr_Fetch(&t, &v, &tb);
2388 checker = PyObject_GetAttrString(cls, "__instancecheck__");
2389 PyErr_Restore(t, v, tb);
2390 if (checker != NULL) {
2391 PyObject *res;
2392 int ok = -1;
2393 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2394 Py_DECREF(checker);
2395 return ok;
2396 }
2397 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2398 Py_LeaveRecursiveCall();
2399 Py_DECREF(checker);
2400 if (res != NULL) {
2401 ok = PyObject_IsTrue(res);
2402 Py_DECREF(res);
2403 }
2404 return ok;
2405 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002406 return recursive_isinstance(inst, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002407}
2408
2409static int
2410recursive_issubclass(PyObject *derived, PyObject *cls, int recursion_depth)
Guido van Rossum823649d2001-03-21 18:40:58 +00002411{
2412 int retval;
2413
2414 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002415 if (!check_class(derived,
2416 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002417 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002418
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002419 if (PyTuple_Check(cls)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002420 Py_ssize_t i;
2421 Py_ssize_t n = PyTuple_GET_SIZE(cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002422
2423 if (!recursion_depth) {
2424 PyErr_SetString(PyExc_RuntimeError,
2425 "nest level of tuple too deep");
Tim Peters5f112eb2004-03-21 16:59:09 +00002426 return -1;
Brett Cannon4f653312004-03-20 22:52:14 +00002427 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002428 for (i = 0; i < n; ++i) {
Brett Cannon4f653312004-03-20 22:52:14 +00002429 retval = recursive_issubclass(
2430 derived,
2431 PyTuple_GET_ITEM(cls, i),
2432 recursion_depth-1);
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002433 if (retval != 0) {
2434 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002435 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002436 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002437 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002438 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002439 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002440 else {
2441 if (!check_class(cls,
2442 "issubclass() arg 2 must be a class"
2443 " or tuple of classes"))
2444 return -1;
2445 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002446
2447 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002448 }
2449 else {
2450 /* shortcut */
2451 if (!(retval = (derived == cls)))
2452 retval = PyClass_IsSubclass(derived, cls);
2453 }
2454
2455 return retval;
2456}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002457
Brett Cannon4f653312004-03-20 22:52:14 +00002458int
2459PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2460{
Guido van Rossumb5591132007-09-10 22:36:02 +00002461 PyObject *t, *v, *tb;
2462 PyObject *checker;
2463 PyErr_Fetch(&t, &v, &tb);
2464 checker = PyObject_GetAttrString(cls, "__subclasscheck__");
2465 PyErr_Restore(t, v, tb);
2466 if (checker != NULL) {
2467 PyObject *res;
2468 int ok = -1;
2469 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2470 return ok;
2471 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2472 Py_LeaveRecursiveCall();
2473 Py_DECREF(checker);
2474 if (res != NULL) {
2475 ok = PyObject_IsTrue(res);
2476 Py_DECREF(res);
2477 }
2478 return ok;
2479 }
Thomas Woutersbbaff4c2007-09-18 23:27:30 +00002480 return recursive_issubclass(derived, cls, Py_GetRecursionLimit());
Brett Cannon4f653312004-03-20 22:52:14 +00002481}
2482
2483
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002484PyObject *
2485PyObject_GetIter(PyObject *o)
2486{
2487 PyTypeObject *t = o->ob_type;
2488 getiterfunc f = NULL;
2489 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2490 f = t->tp_iter;
2491 if (f == NULL) {
2492 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002493 return PySeqIter_New(o);
Georg Brandlccff7852006-06-18 22:17:29 +00002494 return type_error("'%.200s' object is not iterable", o);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002495 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002496 else {
2497 PyObject *res = (*f)(o);
2498 if (res != NULL && !PyIter_Check(res)) {
2499 PyErr_Format(PyExc_TypeError,
2500 "iter() returned non-iterator "
2501 "of type '%.100s'",
2502 res->ob_type->tp_name);
2503 Py_DECREF(res);
2504 res = NULL;
2505 }
2506 return res;
2507 }
2508}
2509
Tim Petersf4848da2001-05-05 00:14:56 +00002510/* Return next item.
2511 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2512 * If the iteration terminates normally, return NULL and clear the
2513 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2514 * will be false.
2515 * Else return the next object. PyErr_Occurred() will be false.
2516 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002517PyObject *
2518PyIter_Next(PyObject *iter)
2519{
Tim Petersf4848da2001-05-05 00:14:56 +00002520 PyObject *result;
Raymond Hettinger8049dde2003-03-01 01:44:32 +00002521 assert(PyIter_Check(iter));
Tim Petersf4848da2001-05-05 00:14:56 +00002522 result = (*iter->ob_type->tp_iternext)(iter);
2523 if (result == NULL &&
2524 PyErr_Occurred() &&
2525 PyErr_ExceptionMatches(PyExc_StopIteration))
2526 PyErr_Clear();
2527 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002528}