blob: 45d22069dbfef255606ee63ba48ddf86b5eb2e2c [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
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000011/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000012
13static PyObject *
Fred Drake4201b9e2000-07-09 04:34:13 +000014type_error(const char *msg)
Guido van Rossume15dee51995-07-18 14:12:02 +000015{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000016 PyErr_SetString(PyExc_TypeError, msg);
17 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000018}
19
Guido van Rossum052b7e11996-11-11 15:08:19 +000020static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000022{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000023 if (!PyErr_Occurred())
24 PyErr_SetString(PyExc_SystemError,
25 "null argument to internal routine");
26 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000027}
28
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000029/* Operations on any object */
30
31int
Fred Drake79912472000-07-09 04:06:11 +000032PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000033{
34 int r;
35
36 if (o1 == NULL || o2 == NULL) {
37 null_error();
38 return -1;
39 }
40 r = PyObject_Compare(o1, o2);
41 if (PyErr_Occurred())
42 return -1;
43 *result = r;
Guido van Rossume15dee51995-07-18 14:12:02 +000044 return 0;
45}
Guido van Rossume15dee51995-07-18 14:12:02 +000046
47PyObject *
Fred Drake79912472000-07-09 04:06:11 +000048PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000049{
50 PyObject *v;
51
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000052 if (o == NULL)
53 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000054 v = (PyObject *)o->ob_type;
55 Py_INCREF(v);
56 return v;
57}
58
59int
Jeremy Hylton6253f832000-07-12 12:56:19 +000060PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000061{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000062 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000063
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000064 if (o == NULL) {
65 null_error();
66 return -1;
67 }
Guido van Rossume15dee51995-07-18 14:12:02 +000068
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000069 m = o->ob_type->tp_as_sequence;
70 if (m && m->sq_length)
71 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000072
Jeremy Hylton6253f832000-07-12 12:56:19 +000073 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000074}
75
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000076#undef PyObject_Length
77int
78PyObject_Length(PyObject *o)
79{
80 return PyObject_Size(o);
81}
82#define PyObject_Length PyObject_Size
83
Guido van Rossume15dee51995-07-18 14:12:02 +000084PyObject *
Fred Drake79912472000-07-09 04:06:11 +000085PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +000086{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000087 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000088
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000089 if (o == NULL || key == NULL)
90 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +000091
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000092 m = o->ob_type->tp_as_mapping;
93 if (m && m->mp_subscript)
94 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +000095
Guido van Rossum21308241998-08-13 16:44:44 +000096 if (o->ob_type->tp_as_sequence) {
97 if (PyInt_Check(key))
98 return PySequence_GetItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +000099 else if (PyLong_Check(key)) {
100 long key_value = PyLong_AsLong(key);
101 if (key_value == -1 && PyErr_Occurred())
102 return NULL;
103 return PySequence_GetItem(o, key_value);
104 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000105 else if (o->ob_type->tp_as_sequence->sq_item)
106 return type_error("sequence index must be integer");
Guido van Rossum21308241998-08-13 16:44:44 +0000107 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000108
109 return type_error("unsubscriptable object");
Guido van Rossume15dee51995-07-18 14:12:02 +0000110}
111
112int
Fred Drake79912472000-07-09 04:06:11 +0000113PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000114{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000115 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000117 if (o == NULL || key == NULL || value == NULL) {
118 null_error();
119 return -1;
120 }
121 m = o->ob_type->tp_as_mapping;
122 if (m && m->mp_ass_subscript)
123 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000124
Guido van Rossum21308241998-08-13 16:44:44 +0000125 if (o->ob_type->tp_as_sequence) {
126 if (PyInt_Check(key))
127 return PySequence_SetItem(o, PyInt_AsLong(key), value);
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000128 else if (PyLong_Check(key)) {
129 long key_value = PyLong_AsLong(key);
130 if (key_value == -1 && PyErr_Occurred())
131 return -1;
132 return PySequence_SetItem(o, key_value, value);
133 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000134 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
135 type_error("sequence index must be integer");
136 return -1;
137 }
Guido van Rossum21308241998-08-13 16:44:44 +0000138 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000139
140 type_error("object does not support item assignment");
141 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000142}
143
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000144int
Fred Drake79912472000-07-09 04:06:11 +0000145PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000146{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000147 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000148
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000149 if (o == NULL || key == NULL) {
150 null_error();
151 return -1;
152 }
153 m = o->ob_type->tp_as_mapping;
154 if (m && m->mp_ass_subscript)
155 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000156
Guido van Rossum21308241998-08-13 16:44:44 +0000157 if (o->ob_type->tp_as_sequence) {
158 if (PyInt_Check(key))
159 return PySequence_DelItem(o, PyInt_AsLong(key));
Andrew M. Kuchling0f223d22000-02-23 22:21:50 +0000160 else if (PyLong_Check(key)) {
161 long key_value = PyLong_AsLong(key);
162 if (key_value == -1 && PyErr_Occurred())
163 return -1;
164 return PySequence_DelItem(o, key_value);
165 }
Guido van Rossum64585f62001-11-24 18:24:47 +0000166 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
167 type_error("sequence index must be integer");
168 return -1;
169 }
Guido van Rossum21308241998-08-13 16:44:44 +0000170 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000171
172 type_error("object does not support item deletion");
173 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000174}
175
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000176int
177PyObject_DelItemString(PyObject *o, char *key)
178{
179 PyObject *okey;
180 int ret;
181
182 if (o == NULL || key == NULL) {
183 null_error();
184 return -1;
185 }
186 okey = PyString_FromString(key);
187 if (okey == NULL)
188 return -1;
189 ret = PyObject_DelItem(o, okey);
190 Py_DECREF(okey);
191 return ret;
192}
193
Guido van Rossum4c08d552000-03-10 22:55:18 +0000194int PyObject_AsCharBuffer(PyObject *obj,
195 const char **buffer,
196 int *buffer_len)
197{
198 PyBufferProcs *pb;
199 const char *pp;
200 int len;
201
202 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
203 null_error();
204 return -1;
205 }
206 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000207 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000208 pb->bf_getcharbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000209 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000210 PyErr_SetString(PyExc_TypeError,
211 "expected a character buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000212 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000213 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000214 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000215 PyErr_SetString(PyExc_TypeError,
216 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000217 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000218 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000219 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000220 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000221 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000222 *buffer = pp;
223 *buffer_len = len;
224 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000225}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000226
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000227int
228PyObject_CheckReadBuffer(PyObject *obj)
229{
230 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
231
232 if (pb == NULL ||
233 pb->bf_getreadbuffer == NULL ||
234 pb->bf_getsegcount == NULL ||
235 (*pb->bf_getsegcount)(obj, NULL) != 1)
236 return 0;
237 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000238}
239
240int PyObject_AsReadBuffer(PyObject *obj,
241 const void **buffer,
242 int *buffer_len)
243{
244 PyBufferProcs *pb;
245 void *pp;
246 int len;
247
248 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
249 null_error();
250 return -1;
251 }
252 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000253 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000254 pb->bf_getreadbuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000255 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000256 PyErr_SetString(PyExc_TypeError,
257 "expected a readable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000258 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000259 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000260 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000261 PyErr_SetString(PyExc_TypeError,
262 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000263 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000264 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000265 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000266 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000267 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000268 *buffer = pp;
269 *buffer_len = len;
270 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271}
272
273int PyObject_AsWriteBuffer(PyObject *obj,
274 void **buffer,
275 int *buffer_len)
276{
277 PyBufferProcs *pb;
278 void*pp;
279 int len;
280
281 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
282 null_error();
283 return -1;
284 }
285 pb = obj->ob_type->tp_as_buffer;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000286 if (pb == NULL ||
Guido van Rossum4c08d552000-03-10 22:55:18 +0000287 pb->bf_getwritebuffer == NULL ||
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000288 pb->bf_getsegcount == NULL) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289 PyErr_SetString(PyExc_TypeError,
290 "expected a writeable buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000291 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292 }
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000293 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
Guido van Rossum4c08d552000-03-10 22:55:18 +0000294 PyErr_SetString(PyExc_TypeError,
295 "expected a single-segment buffer object");
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000296 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297 }
298 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
299 if (len < 0)
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000300 return -1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301 *buffer = pp;
302 *buffer_len = len;
303 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304}
305
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000306/* Operations on numbers */
307
308int
Fred Drake79912472000-07-09 04:06:11 +0000309PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000310{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000311 return o && o->ob_type->tp_as_number;
Guido van Rossume15dee51995-07-18 14:12:02 +0000312}
313
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000314/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000315
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000316/* New style number protocol support */
Guido van Rossume15dee51995-07-18 14:12:02 +0000317
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000318#define NB_SLOT(x) offsetof(PyNumberMethods, x)
319#define NB_BINOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000320 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000321#define NB_TERNOP(nb_methods, slot) \
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000322 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000323
324/*
325 Calling scheme used for binary operations:
326
327 v w Action
328 -------------------------------------------------------------------
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000329 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000330 new old v.op(v,w), coerce(v,w), v.op(v,w)
331 old new w.op(v,w), coerce(v,w), v.op(v,w)
332 old old coerce(v,w), v.op(v,w)
333
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000334 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
335 v->ob_type
336
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000337 Legend:
338 -------
339 * new == new style number
340 * old == old style number
341 * Action indicates the order in which operations are tried until either
342 a valid result is produced or an error occurs.
343
344 */
345
346static PyObject *
347binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000348{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000349 PyObject *x;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000350 binaryfunc slotv = NULL;
351 binaryfunc slotw = NULL;
352
353 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000354 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000355 if (w->ob_type != v->ob_type &&
356 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000357 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000358 if (slotw == slotv)
359 slotw = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000360 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000361 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000362 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
363 x = slotw(v, w);
364 if (x != Py_NotImplemented)
365 return x;
366 Py_DECREF(x); /* can't do it */
367 slotw = NULL;
368 }
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000369 x = slotv(v, w);
370 if (x != Py_NotImplemented)
371 return x;
372 Py_DECREF(x); /* can't do it */
373 }
374 if (slotw) {
375 x = slotw(v, w);
376 if (x != Py_NotImplemented)
377 return x;
378 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000379 }
380 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
381 int err = PyNumber_CoerceEx(&v, &w);
382 if (err < 0) {
383 return NULL;
384 }
385 if (err == 0) {
386 PyNumberMethods *mv = v->ob_type->tp_as_number;
387 if (mv) {
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000388 binaryfunc slot;
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000389 slot = NB_BINOP(mv, op_slot);
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000390 if (slot) {
391 PyObject *x = slot(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000392 Py_DECREF(v);
393 Py_DECREF(w);
394 return x;
395 }
396 }
397 /* CoerceEx incremented the reference counts */
398 Py_DECREF(v);
399 Py_DECREF(w);
400 }
401 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000402 Py_INCREF(Py_NotImplemented);
403 return Py_NotImplemented;
404}
Guido van Rossum77660912002-04-16 16:32:50 +0000405
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000406static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000407binop_type_error(PyObject *v, PyObject *w, const char *op_name)
408{
409 PyErr_Format(PyExc_TypeError,
410 "unsupported operand type(s) for %s: '%s' and '%s'",
411 op_name,
412 v->ob_type->tp_name,
413 w->ob_type->tp_name);
414 return NULL;
415}
416
417static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000418binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
419{
420 PyObject *result = binary_op1(v, w, op_slot);
421 if (result == Py_NotImplemented) {
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000422 Py_DECREF(result);
423 return binop_type_error(v, w, op_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000424 }
425 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000426}
427
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000428
429/*
430 Calling scheme used for ternary operations:
431
Guido van Rossum84675ac2001-09-29 01:05:03 +0000432 *** In some cases, w.op is called before v.op; see binary_op1. ***
433
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000434 v w z Action
435 -------------------------------------------------------------------
436 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
437 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
438 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
439 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
440 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
441 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
442 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
443 old old old coerce(v,w,z), v.op(v,w,z)
444
445 Legend:
446 -------
447 * new == new style number
448 * old == old style number
449 * Action indicates the order in which operations are tried until either
450 a valid result is produced or an error occurs.
451 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
452 only if z != Py_None; if z == Py_None, then it is treated as absent
453 variable and only coerce(v,w) is tried.
454
455 */
456
457static PyObject *
458ternary_op(PyObject *v,
459 PyObject *w,
460 PyObject *z,
461 const int op_slot,
462 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000463{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000464 PyNumberMethods *mv, *mw, *mz;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000465 PyObject *x = NULL;
466 ternaryfunc slotv = NULL;
467 ternaryfunc slotw = NULL;
468 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000469
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000470 mv = v->ob_type->tp_as_number;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000471 mw = w->ob_type->tp_as_number;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000472 if (mv != NULL && NEW_STYLE_NUMBER(v))
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000473 slotv = NB_TERNOP(mv, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000474 if (w->ob_type != v->ob_type &&
Raymond Hettingerc2e095f2002-12-07 10:05:27 +0000475 mw != NULL && NEW_STYLE_NUMBER(w)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000476 slotw = NB_TERNOP(mw, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000477 if (slotw == slotv)
478 slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000479 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000480 if (slotv) {
Guido van Rossum89c42642001-10-01 17:10:18 +0000481 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
482 x = slotw(v, w, z);
483 if (x != Py_NotImplemented)
484 return x;
485 Py_DECREF(x); /* can't do it */
486 slotw = NULL;
487 }
Guido van Rossum84675ac2001-09-29 01:05:03 +0000488 x = slotv(v, w, z);
489 if (x != Py_NotImplemented)
490 return x;
491 Py_DECREF(x); /* can't do it */
492 }
493 if (slotw) {
494 x = slotw(v, w, z);
495 if (x != Py_NotImplemented)
496 return x;
497 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000498 }
499 mz = z->ob_type->tp_as_number;
500 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000501 slotz = NB_TERNOP(mz, op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000502 if (slotz == slotv || slotz == slotw)
503 slotz = NULL;
504 if (slotz) {
505 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000506 if (x != Py_NotImplemented)
507 return x;
Guido van Rossum84675ac2001-09-29 01:05:03 +0000508 Py_DECREF(x); /* can't do it */
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000509 }
510 }
511
512 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
513 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
514 /* we have an old style operand, coerce */
515 PyObject *v1, *z1, *w2, *z2;
516 int c;
Guido van Rossum77660912002-04-16 16:32:50 +0000517
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000518 c = PyNumber_Coerce(&v, &w);
519 if (c != 0)
520 goto error3;
521
522 /* Special case: if the third argument is None, it is
523 treated as absent argument and not coerced. */
524 if (z == Py_None) {
525 if (v->ob_type->tp_as_number) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000526 slotz = NB_TERNOP(v->ob_type->tp_as_number,
527 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000528 if (slotz)
529 x = slotz(v, w, z);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000530 else
531 c = -1;
532 }
533 else
534 c = -1;
535 goto error2;
536 }
537 v1 = v;
538 z1 = z;
539 c = PyNumber_Coerce(&v1, &z1);
540 if (c != 0)
541 goto error2;
542 w2 = w;
543 z2 = z1;
544 c = PyNumber_Coerce(&w2, &z2);
545 if (c != 0)
546 goto error1;
547
548 if (v1->ob_type->tp_as_number != NULL) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000549 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
550 op_slot);
Guido van Rossum84675ac2001-09-29 01:05:03 +0000551 if (slotv)
552 x = slotv(v1, w2, z2);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000553 else
554 c = -1;
555 }
556 else
557 c = -1;
558
559 Py_DECREF(w2);
560 Py_DECREF(z2);
561 error1:
562 Py_DECREF(v1);
563 Py_DECREF(z1);
564 error2:
Guido van Rossume15dee51995-07-18 14:12:02 +0000565 Py_DECREF(v);
566 Py_DECREF(w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000567 error3:
568 if (c >= 0)
Guido van Rossume15dee51995-07-18 14:12:02 +0000569 return x;
570 }
Guido van Rossum5c66a262001-10-22 04:12:44 +0000571
572 if (z == Py_None)
573 PyErr_Format(
574 PyExc_TypeError,
575 "unsupported operand type(s) for ** or pow(): "
576 "'%s' and '%s'",
577 v->ob_type->tp_name,
578 w->ob_type->tp_name);
579 else
580 PyErr_Format(
581 PyExc_TypeError,
582 "unsupported operand type(s) for pow(): "
583 "'%s', '%s', '%s'",
584 v->ob_type->tp_name,
585 w->ob_type->tp_name,
586 z->ob_type->tp_name);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000587 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000588}
589
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000590#define BINARY_FUNC(func, op, op_name) \
591 PyObject * \
592 func(PyObject *v, PyObject *w) { \
593 return binary_op(v, w, NB_SLOT(op), op_name); \
594 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000595
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000596BINARY_FUNC(PyNumber_Or, nb_or, "|")
597BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
598BINARY_FUNC(PyNumber_And, nb_and, "&")
599BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
600BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
601BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000602BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
603BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000604
605PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000606PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000607{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000608 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
609 if (result == Py_NotImplemented) {
610 PySequenceMethods *m = v->ob_type->tp_as_sequence;
Jeremy Hylton0522d982002-03-08 21:28:54 +0000611 if (m && m->sq_concat) {
612 Py_DECREF(result);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000613 result = (*m->sq_concat)(v, w);
Jeremy Hylton0522d982002-03-08 21:28:54 +0000614 }
Jeremy Hylton6ae6a432002-03-08 21:11:37 +0000615 if (result == Py_NotImplemented) {
Jeremy Hylton0522d982002-03-08 21:28:54 +0000616 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000617 return binop_type_error(v, w, "+");
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000618 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000619 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000620 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000621}
622
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000623static PyObject *
624sequence_repeat(intargfunc repeatfunc, PyObject *seq, PyObject *n)
625{
626 long count;
627 if (PyInt_Check(n)) {
628 count = PyInt_AsLong(n);
629 }
630 else if (PyLong_Check(n)) {
631 count = PyLong_AsLong(n);
632 if (count == -1 && PyErr_Occurred())
633 return NULL;
634 }
635 else {
636 return type_error(
637 "can't multiply sequence to non-int");
638 }
639#if LONG_MAX != INT_MAX
640 if (count > INT_MAX) {
641 PyErr_SetString(PyExc_ValueError,
642 "sequence repeat count too large");
643 return NULL;
644 }
645 else if (count < INT_MIN)
646 count = INT_MIN;
647 /* XXX Why don't I either
648
649 - set count to -1 whenever it's negative (after all,
650 sequence repeat usually treats negative numbers
651 as zero(); or
652
653 - raise an exception when it's less than INT_MIN?
654
655 I'm thinking about a hypothetical use case where some
656 sequence type might use a negative value as a flag of
657 some kind. In those cases I don't want to break the
658 code by mapping all negative values to -1. But I also
659 don't want to break e.g. []*(-sys.maxint), which is
660 perfectly safe, returning []. As a compromise, I do
661 map out-of-range negative values.
662 */
663#endif
664 return (*repeatfunc)(seq, (int)count);
665}
666
667PyObject *
668PyNumber_Multiply(PyObject *v, PyObject *w)
669{
670 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
671 if (result == Py_NotImplemented) {
672 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
673 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
Guido van Rossuma3a243e2002-12-31 19:50:03 +0000674 Py_DECREF(result);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000675 if (mv && mv->sq_repeat) {
676 return sequence_repeat(mv->sq_repeat, v, w);
677 }
678 else if (mw && mw->sq_repeat) {
679 return sequence_repeat(mw->sq_repeat, w, v);
680 }
681 result = binop_type_error(v, w, "*");
682 }
683 return result;
684}
685
Guido van Rossume15dee51995-07-18 14:12:02 +0000686PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000687PyNumber_FloorDivide(PyObject *v, PyObject *w)
688{
689 /* XXX tp_flags test */
690 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
691}
692
693PyObject *
694PyNumber_TrueDivide(PyObject *v, PyObject *w)
695{
696 /* XXX tp_flags test */
697 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
698}
699
700PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000701PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000702{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000703 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000704}
705
706PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000707PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000708{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000709 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000710}
711
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000712/* Binary in-place operators */
713
714/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000715 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000716
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000717 - If the left hand object has the appropriate struct members, and
718 they are filled, call the appropriate function and return the
719 result. No coercion is done on the arguments; the left-hand object
720 is the one the operation is performed on, and it's up to the
721 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000722
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000723 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000724 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000725
726 */
727
Guido van Rossum77660912002-04-16 16:32:50 +0000728#define HASINPLACE(t) \
729 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000730
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000732binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000733{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000734 PyNumberMethods *mv = v->ob_type->tp_as_number;
735 if (mv != NULL && HASINPLACE(v)) {
Neil Schemenauerb808c5c2002-11-24 01:34:49 +0000736 binaryfunc slot = NB_BINOP(mv, iop_slot);
737 if (slot) {
738 PyObject *x = (slot)(v, w);
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000739 if (x != Py_NotImplemented) {
740 return x;
741 }
742 Py_DECREF(x);
743 }
Thomas Woutersf2b332d2000-09-02 08:34:40 +0000744 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000745 return binary_op1(v, w, op_slot);
746}
747
748static PyObject *
749binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
750 const char *op_name)
751{
752 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
753 if (result == Py_NotImplemented) {
754 Py_DECREF(result);
755 return binop_type_error(v, w, op_name);
756 }
757 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000758}
759
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000760#define INPLACE_BINOP(func, iop, op, op_name) \
761 PyObject * \
762 func(PyObject *v, PyObject *w) { \
763 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000764 }
765
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000766INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
767INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
768INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
769INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
770INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
771INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
772INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000773
774PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000775PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
776{
777 /* XXX tp_flags test */
778 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
779 NB_SLOT(nb_floor_divide), "//=");
780}
781
782PyObject *
783PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
784{
785 /* XXX tp_flags test */
786 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
787 NB_SLOT(nb_true_divide), "/=");
788}
789
790PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000791PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
792{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000793 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
794 NB_SLOT(nb_add));
795 if (result == Py_NotImplemented) {
796 PySequenceMethods *m = v->ob_type->tp_as_sequence;
797 Py_DECREF(result);
798 if (m != NULL) {
799 binaryfunc f = NULL;
800 if (HASINPLACE(v))
801 f = m->sq_inplace_concat;
802 if (f == NULL)
803 f = m->sq_concat;
804 if (f != NULL)
805 return (*f)(v, w);
806 }
807 result = binop_type_error(v, w, "+=");
Guido van Rossumbb8be932000-09-01 23:27:32 +0000808 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000809 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000810}
811
812PyObject *
813PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
814{
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000815 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
816 NB_SLOT(nb_multiply));
817 if (result == Py_NotImplemented) {
818 intargfunc f = NULL;
819 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
820 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
821 Py_DECREF(result);
822 if (mv != NULL) {
823 if (HASINPLACE(v))
824 f = mv->sq_inplace_repeat;
825 if (f == NULL)
826 f = mv->sq_repeat;
827 if (f != NULL)
828 return sequence_repeat(f, v, w);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000829 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000830 else if (mw != NULL) {
831 /* Note that the right hand operand should not be
832 * mutated in this case so sq_inplace_repeat is not
833 * used. */
834 if (mw->sq_repeat)
835 return sequence_repeat(mw->sq_repeat, w, v);
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000836 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000837 result = binop_type_error(v, w, "*=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000838 }
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000839 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000840}
841
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000842PyObject *
843PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
844{
Neil Schemenauerd46fbc32002-11-24 01:07:42 +0000845 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
846 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000847}
848
849PyObject *
850PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
851{
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000852 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
853 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
854 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000855 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000856 else {
857 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
858 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000859}
860
861
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000862/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +0000863
864PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000865PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000866{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000867 PyNumberMethods *m;
868
869 if (o == NULL)
870 return null_error();
871 m = o->ob_type->tp_as_number;
872 if (m && m->nb_negative)
873 return (*m->nb_negative)(o);
874
875 return type_error("bad operand type for unary -");
Guido van Rossume15dee51995-07-18 14:12:02 +0000876}
877
878PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000879PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000880{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000881 PyNumberMethods *m;
882
883 if (o == NULL)
884 return null_error();
885 m = o->ob_type->tp_as_number;
886 if (m && m->nb_positive)
887 return (*m->nb_positive)(o);
888
889 return type_error("bad operand type for unary +");
Guido van Rossume15dee51995-07-18 14:12:02 +0000890}
891
892PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000893PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000894{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000895 PyNumberMethods *m;
896
897 if (o == NULL)
898 return null_error();
899 m = o->ob_type->tp_as_number;
900 if (m && m->nb_invert)
901 return (*m->nb_invert)(o);
902
903 return type_error("bad operand type for unary ~");
Guido van Rossume15dee51995-07-18 14:12:02 +0000904}
905
906PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000907PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000908{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000909 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000910
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000911 if (o == NULL)
912 return null_error();
913 m = o->ob_type->tp_as_number;
914 if (m && m->nb_absolute)
915 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000916
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000917 return type_error("bad operand type for abs()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000918}
919
Guido van Rossum9e896b32000-04-05 20:11:21 +0000920/* Add a check for embedded NULL-bytes in the argument. */
921static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000922int_from_string(const char *s, int len)
Guido van Rossum9e896b32000-04-05 20:11:21 +0000923{
924 char *end;
925 PyObject *x;
926
927 x = PyInt_FromString((char*)s, &end, 10);
928 if (x == NULL)
929 return NULL;
930 if (end != s + len) {
931 PyErr_SetString(PyExc_ValueError,
932 "null byte in argument for int()");
933 Py_DECREF(x);
934 return NULL;
935 }
936 return x;
937}
938
Guido van Rossume15dee51995-07-18 14:12:02 +0000939PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000940PyNumber_Int(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000941{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000942 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000943 const char *buffer;
944 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000945
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000946 if (o == NULL)
947 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +0000948 if (PyInt_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000949 Py_INCREF(o);
950 return o;
951 }
Tim Peters64b5ce32001-09-10 20:52:51 +0000952 if (PyInt_Check(o)) {
953 PyIntObject *io = (PyIntObject*)o;
954 return PyInt_FromLong(io->ob_ival);
955 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000956 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +0000957 return int_from_string(PyString_AS_STRING(o),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000958 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000959#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +0000960 if (PyUnicode_Check(o))
961 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
962 PyUnicode_GET_SIZE(o),
963 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000964#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000965 m = o->ob_type->tp_as_number;
966 if (m && m->nb_int)
967 return m->nb_int(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +0000968 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
Guido van Rossum9e896b32000-04-05 20:11:21 +0000969 return int_from_string((char*)buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +0000970
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000971 return type_error("int() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +0000972}
973
Guido van Rossum9e896b32000-04-05 20:11:21 +0000974/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000975static PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000976long_from_string(const char *s, int len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000977{
Guido van Rossum4c08d552000-03-10 22:55:18 +0000978 char *end;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000979 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000980
Guido van Rossum4c08d552000-03-10 22:55:18 +0000981 x = PyLong_FromString((char*)s, &end, 10);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000982 if (x == NULL)
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000983 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000984 if (end != s + len) {
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000985 PyErr_SetString(PyExc_ValueError,
986 "null byte in argument for long()");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000987 Py_DECREF(x);
Barry Warsaw226ae6c1999-10-12 19:54:53 +0000988 return NULL;
989 }
990 return x;
991}
992
Guido van Rossume15dee51995-07-18 14:12:02 +0000993PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000994PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000995{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000996 PyNumberMethods *m;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000997 const char *buffer;
998 int buffer_len;
Guido van Rossume15dee51995-07-18 14:12:02 +0000999
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001000 if (o == NULL)
1001 return null_error();
Tim Peters64b5ce32001-09-10 20:52:51 +00001002 if (PyLong_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001003 Py_INCREF(o);
1004 return o;
1005 }
Tim Petersdb30ac42002-03-02 04:14:21 +00001006 if (PyLong_Check(o))
1007 return _PyLong_Copy((PyLongObject *)o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001008 if (PyString_Check(o))
Guido van Rossum77660912002-04-16 16:32:50 +00001009 /* need to do extra error checking that PyLong_FromString()
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001010 * doesn't do. In particular long('9.5') must raise an
1011 * exception, not truncate the float.
1012 */
Guido van Rossum4c08d552000-03-10 22:55:18 +00001013 return long_from_string(PyString_AS_STRING(o),
1014 PyString_GET_SIZE(o));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001015#ifdef Py_USING_UNICODE
Guido van Rossum9e896b32000-04-05 20:11:21 +00001016 if (PyUnicode_Check(o))
1017 /* The above check is done in PyLong_FromUnicode(). */
1018 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
1019 PyUnicode_GET_SIZE(o),
1020 10);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001021#endif
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001022 m = o->ob_type->tp_as_number;
1023 if (m && m->nb_long)
1024 return m->nb_long(o);
Guido van Rossum4c08d552000-03-10 22:55:18 +00001025 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1026 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001027
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001028 return type_error("long() argument must be a string or a number");
Guido van Rossume15dee51995-07-18 14:12:02 +00001029}
1030
1031PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001032PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001033{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001034 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001035
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001036 if (o == NULL)
1037 return null_error();
Tim Peters7a50f252001-09-10 21:28:20 +00001038 if (PyFloat_CheckExact(o)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +00001039 Py_INCREF(o);
1040 return o;
1041 }
Tim Peters7a50f252001-09-10 21:28:20 +00001042 if (PyFloat_Check(o)) {
1043 PyFloatObject *po = (PyFloatObject *)o;
1044 return PyFloat_FromDouble(po->ob_fval);
1045 }
Guido van Rossum4c08d552000-03-10 22:55:18 +00001046 if (!PyString_Check(o)) {
1047 m = o->ob_type->tp_as_number;
1048 if (m && m->nb_float)
1049 return m->nb_float(o);
1050 }
1051 return PyFloat_FromString(o, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001052}
1053
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001054/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001055
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001056int
Fred Drake79912472000-07-09 04:06:11 +00001057PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001058{
Guido van Rossum8700b422001-09-07 20:20:11 +00001059 return s != NULL && s->ob_type->tp_as_sequence &&
1060 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001061}
1062
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001063int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001064PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001065{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001066 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001067
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001068 if (s == NULL) {
1069 null_error();
1070 return -1;
1071 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001072
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001073 m = s->ob_type->tp_as_sequence;
1074 if (m && m->sq_length)
1075 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001076
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001077 type_error("len() of unsized object");
1078 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001079}
1080
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001081#undef PySequence_Length
1082int
1083PySequence_Length(PyObject *s)
1084{
1085 return PySequence_Size(s);
1086}
1087#define PySequence_Length PySequence_Size
1088
Guido van Rossume15dee51995-07-18 14:12:02 +00001089PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001090PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001091{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001092 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001093
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001094 if (s == NULL || o == NULL)
1095 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097 m = s->ob_type->tp_as_sequence;
1098 if (m && m->sq_concat)
1099 return m->sq_concat(s, o);
1100
1101 return type_error("object can't be concatenated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001102}
1103
1104PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001105PySequence_Repeat(PyObject *o, int count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001106{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001107 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001108
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109 if (o == NULL)
1110 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001111
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001112 m = o->ob_type->tp_as_sequence;
1113 if (m && m->sq_repeat)
1114 return m->sq_repeat(o, count);
1115
1116 return type_error("object can't be repeated");
Guido van Rossume15dee51995-07-18 14:12:02 +00001117}
1118
1119PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001120PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1121{
1122 PySequenceMethods *m;
1123
1124 if (s == NULL || o == NULL)
1125 return null_error();
1126
1127 m = s->ob_type->tp_as_sequence;
1128 if (m && HASINPLACE(s) && m->sq_inplace_concat)
1129 return m->sq_inplace_concat(s, o);
1130 if (m && m->sq_concat)
1131 return m->sq_concat(s, o);
1132
1133 return type_error("object can't be concatenated");
1134}
1135
1136PyObject *
1137PySequence_InPlaceRepeat(PyObject *o, int count)
1138{
1139 PySequenceMethods *m;
1140
1141 if (o == NULL)
1142 return null_error();
1143
1144 m = o->ob_type->tp_as_sequence;
1145 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
1146 return m->sq_inplace_repeat(o, count);
1147 if (m && m->sq_repeat)
1148 return m->sq_repeat(o, count);
1149
1150 return type_error("object can't be repeated");
1151}
1152
1153PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001154PySequence_GetItem(PyObject *s, int i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001155{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001156 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001157
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158 if (s == NULL)
1159 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001160
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001161 m = s->ob_type->tp_as_sequence;
1162 if (m && m->sq_item) {
1163 if (i < 0) {
1164 if (m->sq_length) {
1165 int l = (*m->sq_length)(s);
1166 if (l < 0)
1167 return NULL;
1168 i += l;
1169 }
1170 }
1171 return m->sq_item(s, i);
1172 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001173
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174 return type_error("unindexable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001175}
1176
Thomas Wouters1d75a792000-08-17 22:37:32 +00001177static PyObject *
1178sliceobj_from_intint(int i, int j)
1179{
1180 PyObject *start, *end, *slice;
1181 start = PyInt_FromLong((long)i);
1182 if (!start)
1183 return NULL;
1184 end = PyInt_FromLong((long)j);
1185 if (!end) {
1186 Py_DECREF(start);
1187 return NULL;
1188 }
1189 slice = PySlice_New(start, end, NULL);
1190 Py_DECREF(start);
1191 Py_DECREF(end);
1192 return slice;
1193}
1194
Guido van Rossume15dee51995-07-18 14:12:02 +00001195PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001196PySequence_GetSlice(PyObject *s, int i1, int i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001197{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001199 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001200
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001201 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001202
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001203 m = s->ob_type->tp_as_sequence;
1204 if (m && m->sq_slice) {
1205 if (i1 < 0 || i2 < 0) {
1206 if (m->sq_length) {
1207 int l = (*m->sq_length)(s);
1208 if (l < 0)
1209 return NULL;
1210 if (i1 < 0)
1211 i1 += l;
1212 if (i2 < 0)
1213 i2 += l;
1214 }
1215 }
1216 return m->sq_slice(s, i1, i2);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001217 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
1218 PyObject *res;
1219 PyObject *slice = sliceobj_from_intint(i1, i2);
1220 if (!slice)
1221 return NULL;
1222 res = mp->mp_subscript(s, slice);
1223 Py_DECREF(slice);
1224 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001225 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001226
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001227 return type_error("unsliceable object");
Guido van Rossume15dee51995-07-18 14:12:02 +00001228}
1229
1230int
Fred Drake79912472000-07-09 04:06:11 +00001231PySequence_SetItem(PyObject *s, int i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001232{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001233 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001234
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001235 if (s == NULL) {
1236 null_error();
1237 return -1;
1238 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001239
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001240 m = s->ob_type->tp_as_sequence;
1241 if (m && m->sq_ass_item) {
1242 if (i < 0) {
1243 if (m->sq_length) {
1244 int l = (*m->sq_length)(s);
1245 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001246 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001247 i += l;
1248 }
1249 }
1250 return m->sq_ass_item(s, i, o);
1251 }
1252
1253 type_error("object doesn't support item assignment");
1254 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001255}
1256
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001257int
Fred Drake79912472000-07-09 04:06:11 +00001258PySequence_DelItem(PyObject *s, int i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001259{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001260 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001261
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001262 if (s == NULL) {
1263 null_error();
1264 return -1;
1265 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001266
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001267 m = s->ob_type->tp_as_sequence;
1268 if (m && m->sq_ass_item) {
1269 if (i < 0) {
1270 if (m->sq_length) {
1271 int l = (*m->sq_length)(s);
1272 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001273 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001274 i += l;
1275 }
1276 }
1277 return m->sq_ass_item(s, i, (PyObject *)NULL);
1278 }
1279
1280 type_error("object doesn't support item deletion");
1281 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001282}
1283
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001284int
Fred Drake79912472000-07-09 04:06:11 +00001285PySequence_SetSlice(PyObject *s, int i1, int i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001286{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001287 PySequenceMethods *m;
Thomas Wouters1d75a792000-08-17 22:37:32 +00001288 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001289
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001290 if (s == NULL) {
1291 null_error();
1292 return -1;
1293 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001294
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001295 m = s->ob_type->tp_as_sequence;
1296 if (m && m->sq_ass_slice) {
1297 if (i1 < 0 || i2 < 0) {
1298 if (m->sq_length) {
1299 int l = (*m->sq_length)(s);
1300 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001301 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001302 if (i1 < 0)
1303 i1 += l;
1304 if (i2 < 0)
1305 i2 += l;
1306 }
1307 }
1308 return m->sq_ass_slice(s, i1, i2, o);
Thomas Wouters1d75a792000-08-17 22:37:32 +00001309 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
1310 int res;
1311 PyObject *slice = sliceobj_from_intint(i1, i2);
1312 if (!slice)
1313 return -1;
1314 res = mp->mp_ass_subscript(s, slice, o);
1315 Py_DECREF(slice);
1316 return res;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001317 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001318
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001319 type_error("object doesn't support slice assignment");
1320 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001321}
1322
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001323int
Fred Drake79912472000-07-09 04:06:11 +00001324PySequence_DelSlice(PyObject *s, int i1, int i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001325{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001326 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001327
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001328 if (s == NULL) {
1329 null_error();
1330 return -1;
1331 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001332
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001333 m = s->ob_type->tp_as_sequence;
1334 if (m && m->sq_ass_slice) {
1335 if (i1 < 0 || i2 < 0) {
1336 if (m->sq_length) {
1337 int l = (*m->sq_length)(s);
1338 if (l < 0)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001339 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001340 if (i1 < 0)
1341 i1 += l;
1342 if (i2 < 0)
1343 i2 += l;
1344 }
1345 }
1346 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
1347 }
1348 type_error("object doesn't support slice deletion");
1349 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001350}
1351
Guido van Rossume15dee51995-07-18 14:12:02 +00001352PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001353PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001354{
Tim Peters6912d4d2001-05-05 03:56:37 +00001355 PyObject *it; /* iter(v) */
1356 int n; /* guess for result tuple size */
1357 PyObject *result;
1358 int j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001359
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001360 if (v == NULL)
1361 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001362
Tim Peters6912d4d2001-05-05 03:56:37 +00001363 /* Special-case the common tuple and list cases, for efficiency. */
Tim Peters4c3a0a32001-09-10 23:37:46 +00001364 if (PyTuple_CheckExact(v)) {
1365 /* Note that we can't know whether it's safe to return
1366 a tuple *subclass* instance as-is, hence the restriction
Tim Peters8ff70a92001-09-10 23:53:53 +00001367 to exact tuples here. In contrast, lists always make
1368 a copy, so there's no need for exactness below. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001369 Py_INCREF(v);
1370 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001371 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001372 if (PyList_Check(v))
1373 return PyList_AsTuple(v);
1374
Tim Peters6912d4d2001-05-05 03:56:37 +00001375 /* Get iterator. */
1376 it = PyObject_GetIter(v);
1377 if (it == NULL)
Tim Peters1fc240e2001-10-26 05:06:50 +00001378 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001379
Tim Peters6912d4d2001-05-05 03:56:37 +00001380 /* Guess result size and allocate space. */
1381 n = PySequence_Size(v);
1382 if (n < 0) {
1383 PyErr_Clear();
1384 n = 10; /* arbitrary */
1385 }
1386 result = PyTuple_New(n);
1387 if (result == NULL)
1388 goto Fail;
1389
1390 /* Fill the tuple. */
1391 for (j = 0; ; ++j) {
1392 PyObject *item = PyIter_Next(it);
1393 if (item == NULL) {
1394 if (PyErr_Occurred())
1395 goto Fail;
1396 break;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001397 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001398 if (j >= n) {
1399 if (n < 500)
1400 n += 10;
1401 else
1402 n += 100;
Tim Peters4324aa32001-05-28 22:30:08 +00001403 if (_PyTuple_Resize(&result, n) != 0) {
Tim Peters12d0a6c2001-05-05 04:10:25 +00001404 Py_DECREF(item);
Tim Peters6912d4d2001-05-05 03:56:37 +00001405 goto Fail;
Tim Peters12d0a6c2001-05-05 04:10:25 +00001406 }
Tim Peters6912d4d2001-05-05 03:56:37 +00001407 }
1408 PyTuple_SET_ITEM(result, j, item);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001409 }
1410
Tim Peters6912d4d2001-05-05 03:56:37 +00001411 /* Cut tuple back if guess was too large. */
1412 if (j < n &&
Tim Peters4324aa32001-05-28 22:30:08 +00001413 _PyTuple_Resize(&result, j) != 0)
Tim Peters6912d4d2001-05-05 03:56:37 +00001414 goto Fail;
1415
1416 Py_DECREF(it);
1417 return result;
1418
1419Fail:
1420 Py_XDECREF(result);
1421 Py_DECREF(it);
1422 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001423}
1424
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001425PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001426PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001427{
Tim Petersf553f892001-05-01 20:45:31 +00001428 PyObject *it; /* iter(v) */
1429 PyObject *result; /* result list */
1430 int n; /* guess for result list size */
1431 int i;
Guido van Rossum4669fb41997-04-02 05:31:09 +00001432
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001433 if (v == NULL)
1434 return null_error();
1435
Tim Petersf553f892001-05-01 20:45:31 +00001436 /* Special-case list(a_list), for speed. */
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001437 if (PyList_Check(v))
1438 return PyList_GetSlice(v, 0, PyList_GET_SIZE(v));
1439
Tim Petersf553f892001-05-01 20:45:31 +00001440 /* Get iterator. There may be some low-level efficiency to be gained
1441 * by caching the tp_iternext slot instead of using PyIter_Next()
1442 * later, but premature optimization is the root etc.
1443 */
1444 it = PyObject_GetIter(v);
1445 if (it == NULL)
1446 return NULL;
1447
1448 /* Guess a result list size. */
1449 n = -1; /* unknown */
1450 if (PySequence_Check(v) &&
1451 v->ob_type->tp_as_sequence->sq_length) {
1452 n = PySequence_Size(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001453 if (n < 0)
Tim Petersf553f892001-05-01 20:45:31 +00001454 PyErr_Clear();
1455 }
1456 if (n < 0)
1457 n = 8; /* arbitrary */
1458 result = PyList_New(n);
1459 if (result == NULL) {
1460 Py_DECREF(it);
1461 return NULL;
1462 }
1463
1464 /* Run iterator to exhaustion. */
1465 for (i = 0; ; i++) {
1466 PyObject *item = PyIter_Next(it);
1467 if (item == NULL) {
Tim Petersf553f892001-05-01 20:45:31 +00001468 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001469 Py_DECREF(result);
1470 result = NULL;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001471 }
Tim Petersf553f892001-05-01 20:45:31 +00001472 break;
Guido van Rossumbfc725b1998-07-10 16:22:44 +00001473 }
Tim Petersf553f892001-05-01 20:45:31 +00001474 if (i < n)
Tim Peters6ad22c42001-05-02 07:12:39 +00001475 PyList_SET_ITEM(result, i, item); /* steals ref */
1476 else {
1477 int status = PyList_Append(result, item);
1478 Py_DECREF(item); /* append creates a new ref */
1479 if (status < 0) {
1480 Py_DECREF(result);
1481 result = NULL;
1482 break;
1483 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484 }
Guido van Rossum4669fb41997-04-02 05:31:09 +00001485 }
Tim Petersf553f892001-05-01 20:45:31 +00001486
1487 /* Cut back result list if initial guess was too large. */
1488 if (i < n && result != NULL) {
1489 if (PyList_SetSlice(result, i, n, (PyObject *)NULL) != 0) {
1490 Py_DECREF(result);
1491 result = NULL;
1492 }
1493 }
1494 Py_DECREF(it);
1495 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001496}
1497
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001498PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001499PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001500{
1501 if (v == NULL)
1502 return null_error();
1503
Michael W. Hudson2801fe12002-11-05 18:05:49 +00001504 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001505 Py_INCREF(v);
1506 return v;
1507 }
1508
1509 v = PySequence_Tuple(v);
1510 if (v == NULL && PyErr_ExceptionMatches(PyExc_TypeError))
1511 return type_error(m);
1512
1513 return v;
1514}
1515
Tim Peters16a77ad2001-09-08 04:00:12 +00001516/* Iterate over seq. Result depends on the operation:
1517 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1518 PY_ITERSEARCH_INDEX: 0-based index of first occurence of obj in seq;
1519 set ValueError and return -1 if none found; also return -1 on error.
1520 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1521*/
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001522int
Tim Peters16a77ad2001-09-08 04:00:12 +00001523_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001524{
Tim Peters16a77ad2001-09-08 04:00:12 +00001525 int n;
1526 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1527 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001528
Tim Peters16a77ad2001-09-08 04:00:12 +00001529 if (seq == NULL || obj == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001530 null_error();
1531 return -1;
1532 }
Tim Peters75f8e352001-05-05 11:33:43 +00001533
Tim Peters16a77ad2001-09-08 04:00:12 +00001534 it = PyObject_GetIter(seq);
Tim Peters75f8e352001-05-05 11:33:43 +00001535 if (it == NULL) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001536 type_error("iterable argument required");
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001537 return -1;
Tim Peters75f8e352001-05-05 11:33:43 +00001538 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001539
Tim Peters16a77ad2001-09-08 04:00:12 +00001540 n = wrapped = 0;
Tim Peters75f8e352001-05-05 11:33:43 +00001541 for (;;) {
1542 int cmp;
1543 PyObject *item = PyIter_Next(it);
1544 if (item == NULL) {
1545 if (PyErr_Occurred())
1546 goto Fail;
1547 break;
1548 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001549
1550 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551 Py_DECREF(item);
Tim Peters75f8e352001-05-05 11:33:43 +00001552 if (cmp < 0)
1553 goto Fail;
1554 if (cmp > 0) {
Tim Peters16a77ad2001-09-08 04:00:12 +00001555 switch (operation) {
1556 case PY_ITERSEARCH_COUNT:
1557 ++n;
1558 if (n <= 0) {
1559 PyErr_SetString(PyExc_OverflowError,
Tim Peters75f8e352001-05-05 11:33:43 +00001560 "count exceeds C int size");
Tim Peters16a77ad2001-09-08 04:00:12 +00001561 goto Fail;
1562 }
1563 break;
1564
1565 case PY_ITERSEARCH_INDEX:
1566 if (wrapped) {
1567 PyErr_SetString(PyExc_OverflowError,
1568 "index exceeds C int size");
1569 goto Fail;
1570 }
1571 goto Done;
1572
1573 case PY_ITERSEARCH_CONTAINS:
1574 n = 1;
1575 goto Done;
1576
1577 default:
1578 assert(!"unknown operation");
Tim Peters75f8e352001-05-05 11:33:43 +00001579 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001580 }
1581
1582 if (operation == PY_ITERSEARCH_INDEX) {
1583 ++n;
1584 if (n <= 0)
1585 wrapped = 1;
Tim Peters75f8e352001-05-05 11:33:43 +00001586 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001587 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001588
1589 if (operation != PY_ITERSEARCH_INDEX)
1590 goto Done;
1591
1592 PyErr_SetString(PyExc_ValueError,
1593 "sequence.index(x): x not in sequence");
1594 /* fall into failure code */
1595Fail:
1596 n = -1;
1597 /* fall through */
1598Done:
Tim Peters75f8e352001-05-05 11:33:43 +00001599 Py_DECREF(it);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001600 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001601
Guido van Rossume15dee51995-07-18 14:12:02 +00001602}
1603
Tim Peters16a77ad2001-09-08 04:00:12 +00001604/* Return # of times o appears in s. */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001605int
Tim Peters16a77ad2001-09-08 04:00:12 +00001606PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001607{
Tim Peters16a77ad2001-09-08 04:00:12 +00001608 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001609}
1610
Tim Peterscb8d3682001-05-05 21:05:01 +00001611/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001612 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001613 */
1614int
1615PySequence_Contains(PyObject *seq, PyObject *ob)
1616{
1617 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
1618 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1619 if (sqm != NULL && sqm->sq_contains != NULL)
1620 return (*sqm->sq_contains)(seq, ob);
1621 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001622 return _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Tim Peterscb8d3682001-05-05 21:05:01 +00001623}
1624
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001625/* Backwards compatibility */
1626#undef PySequence_In
1627int
Fred Drake79912472000-07-09 04:06:11 +00001628PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001629{
1630 return PySequence_Contains(w, v);
1631}
1632
1633int
Fred Drake79912472000-07-09 04:06:11 +00001634PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001635{
Tim Peters16a77ad2001-09-08 04:00:12 +00001636 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001637}
1638
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639/* Operations on mappings */
1640
1641int
Fred Drake79912472000-07-09 04:06:11 +00001642PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001643{
Guido van Rossum8700b422001-09-07 20:20:11 +00001644 return o && o->ob_type->tp_as_mapping &&
1645 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001646}
1647
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648int
Jeremy Hylton6253f832000-07-12 12:56:19 +00001649PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001650{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001651 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001652
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001653 if (o == NULL) {
1654 null_error();
1655 return -1;
1656 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001658 m = o->ob_type->tp_as_mapping;
1659 if (m && m->mp_length)
1660 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001661
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001662 type_error("len() of unsized object");
1663 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001664}
1665
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001666#undef PyMapping_Length
1667int
1668PyMapping_Length(PyObject *o)
1669{
1670 return PyMapping_Size(o);
1671}
1672#define PyMapping_Length PyMapping_Size
1673
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001674PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001675PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001676{
1677 PyObject *okey, *r;
1678
1679 if (key == NULL)
1680 return null_error();
1681
1682 okey = PyString_FromString(key);
1683 if (okey == NULL)
1684 return NULL;
1685 r = PyObject_GetItem(o, okey);
1686 Py_DECREF(okey);
1687 return r;
1688}
1689
1690int
Fred Drake79912472000-07-09 04:06:11 +00001691PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001692{
1693 PyObject *okey;
1694 int r;
1695
1696 if (key == NULL) {
1697 null_error();
1698 return -1;
1699 }
1700
1701 okey = PyString_FromString(key);
1702 if (okey == NULL)
Guido van Rossumed6219b1998-05-29 02:59:33 +00001703 return -1;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001704 r = PyObject_SetItem(o, okey, value);
1705 Py_DECREF(okey);
1706 return r;
1707}
1708
1709int
Fred Drake79912472000-07-09 04:06:11 +00001710PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001711{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001712 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001713
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714 v = PyMapping_GetItemString(o, key);
1715 if (v) {
1716 Py_DECREF(v);
1717 return 1;
1718 }
1719 PyErr_Clear();
1720 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001721}
1722
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001723int
Fred Drake79912472000-07-09 04:06:11 +00001724PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001725{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001726 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001727
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001728 v = PyObject_GetItem(o, key);
1729 if (v) {
1730 Py_DECREF(v);
1731 return 1;
1732 }
1733 PyErr_Clear();
1734 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001735}
1736
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001737/* Operations on callable objects */
1738
1739/* XXX PyCallable_Check() is in object.c */
1740
Guido van Rossume15dee51995-07-18 14:12:02 +00001741PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001742PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00001743{
Guido van Rossum5560b742001-09-14 16:47:50 +00001744 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001745}
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
1747PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001748PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
1749{
1750 ternaryfunc call;
1751
1752 if ((call = func->ob_type->tp_call) != NULL) {
1753 PyObject *result = (*call)(func, arg, kw);
1754 if (result == NULL && !PyErr_Occurred())
1755 PyErr_SetString(
1756 PyExc_SystemError,
1757 "NULL result without error in PyObject_Call");
1758 return result;
1759 }
Fred Drake573395a2001-11-01 20:26:12 +00001760 PyErr_Format(PyExc_TypeError, "'%s' object is not callable",
1761 func->ob_type->tp_name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001762 return NULL;
1763}
1764
1765PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001766PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001767{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001768 va_list va;
1769 PyObject *args, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001770
Fred Drakeb92cf062001-10-27 06:16:31 +00001771 if (callable == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001772 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001773
Fred Drakeb92cf062001-10-27 06:16:31 +00001774 if (format && *format) {
1775 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001776 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001777 va_end(va);
1778 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001779 else
1780 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001781
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001782 if (args == NULL)
1783 return NULL;
1784
1785 if (!PyTuple_Check(args)) {
1786 PyObject *a;
1787
1788 a = PyTuple_New(1);
1789 if (a == NULL)
1790 return NULL;
1791 if (PyTuple_SetItem(a, 0, args) < 0)
1792 return NULL;
1793 args = a;
1794 }
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001795 retval = PyObject_Call(callable, args, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001796
1797 Py_DECREF(args);
1798
1799 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001800}
1801
1802PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00001803PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00001804{
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001805 va_list va;
1806 PyObject *args, *func = 0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001807
Fred Drakeb92cf062001-10-27 06:16:31 +00001808 if (o == NULL || name == NULL)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001809 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001810
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001811 func = PyObject_GetAttrString(o, name);
1812 if (func == NULL) {
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001813 PyErr_SetString(PyExc_AttributeError, name);
1814 return 0;
1815 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001816
Fred Drakeb92cf062001-10-27 06:16:31 +00001817 if (!PyCallable_Check(func))
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001818 return type_error("call of non-callable attribute");
Guido van Rossume15dee51995-07-18 14:12:02 +00001819
Fred Drakeb92cf062001-10-27 06:16:31 +00001820 if (format && *format) {
1821 va_start(va, format);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001822 args = Py_VaBuildValue(format, va);
Fred Drakeb92cf062001-10-27 06:16:31 +00001823 va_end(va);
1824 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001825 else
1826 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00001827
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001828 if (!args)
1829 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001830
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001831 if (!PyTuple_Check(args)) {
1832 PyObject *a;
Guido van Rossume15dee51995-07-18 14:12:02 +00001833
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834 a = PyTuple_New(1);
1835 if (a == NULL)
1836 return NULL;
1837 if (PyTuple_SetItem(a, 0, args) < 0)
1838 return NULL;
1839 args = a;
1840 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001841
Guido van Rossum84b2bed2002-08-16 17:01:09 +00001842 retval = PyObject_Call(func, args, NULL);
Guido van Rossume15dee51995-07-18 14:12:02 +00001843
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844 Py_DECREF(args);
1845 Py_DECREF(func);
1846
1847 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001848}
Guido van Rossum823649d2001-03-21 18:40:58 +00001849
1850
Fred Drakeb421b8c2001-10-26 16:21:32 +00001851static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001852objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001853{
1854 int i, n = 0;
1855 va_list countva;
1856 PyObject *result, *tmp;
1857
1858#ifdef VA_LIST_IS_ARRAY
1859 memcpy(countva, va, sizeof(va_list));
1860#else
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001861#ifdef __va_copy
1862 __va_copy(countva, va);
1863#else
Fred Drakeb421b8c2001-10-26 16:21:32 +00001864 countva = va;
1865#endif
Martin v. Löwis75d2d942002-07-28 10:23:27 +00001866#endif
Fred Drakeb421b8c2001-10-26 16:21:32 +00001867
1868 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
1869 ++n;
1870 result = PyTuple_New(n);
1871 if (result != NULL && n > 0) {
1872 for (i = 0; i < n; ++i) {
1873 tmp = (PyObject *)va_arg(va, PyObject *);
1874 PyTuple_SET_ITEM(result, i, tmp);
1875 Py_INCREF(tmp);
1876 }
1877 }
1878 return result;
1879}
1880
1881PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001882PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001883{
1884 PyObject *args, *tmp;
1885 va_list vargs;
1886
1887 if (callable == NULL || name == NULL)
1888 return null_error();
1889
1890 callable = PyObject_GetAttr(callable, name);
1891 if (callable == NULL)
1892 return NULL;
1893
1894 /* count the args */
1895 va_start(vargs, name);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001896 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001897 va_end(vargs);
1898 if (args == NULL) {
1899 Py_DECREF(callable);
1900 return NULL;
1901 }
1902 tmp = PyObject_Call(callable, args, NULL);
1903 Py_DECREF(args);
1904 Py_DECREF(callable);
1905
1906 return tmp;
1907}
1908
1909PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00001910PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00001911{
1912 PyObject *args, *tmp;
1913 va_list vargs;
1914
1915 if (callable == NULL)
1916 return null_error();
1917
1918 /* count the args */
1919 va_start(vargs, callable);
Fred Drakeb0c079e2001-10-28 02:39:03 +00001920 args = objargs_mktuple(vargs);
Fred Drakeb421b8c2001-10-26 16:21:32 +00001921 va_end(vargs);
1922 if (args == NULL)
1923 return NULL;
1924 tmp = PyObject_Call(callable, args, NULL);
1925 Py_DECREF(args);
1926
1927 return tmp;
1928}
1929
1930
Guido van Rossum823649d2001-03-21 18:40:58 +00001931/* isinstance(), issubclass() */
1932
Barry Warsawf16951c2002-04-23 22:45:44 +00001933/* abstract_get_bases() has logically 4 return states, with a sort of 0th
1934 * state that will almost never happen.
1935 *
1936 * 0. creating the __bases__ static string could get a MemoryError
1937 * 1. getattr(cls, '__bases__') could raise an AttributeError
1938 * 2. getattr(cls, '__bases__') could raise some other exception
1939 * 3. getattr(cls, '__bases__') could return a tuple
1940 * 4. getattr(cls, '__bases__') could return something other than a tuple
1941 *
1942 * Only state #3 is a non-error state and only it returns a non-NULL object
1943 * (it returns the retrieved tuple).
1944 *
1945 * Any raised AttributeErrors are masked by clearing the exception and
1946 * returning NULL. If an object other than a tuple comes out of __bases__,
1947 * then again, the return value is NULL. So yes, these two situations
1948 * produce exactly the same results: NULL is returned and no error is set.
1949 *
1950 * If some exception other than AttributeError is raised, then NULL is also
1951 * returned, but the exception is not cleared. That's because we want the
1952 * exception to be propagated along.
1953 *
1954 * Callers are expected to test for PyErr_Occurred() when the return value
1955 * is NULL to decide whether a valid exception should be propagated or not.
1956 * When there's no exception to propagate, it's customary for the caller to
1957 * set a TypeError.
1958 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00001959static PyObject *
1960abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00001961{
1962 static PyObject *__bases__ = NULL;
1963 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00001964
1965 if (__bases__ == NULL) {
1966 __bases__ = PyString_FromString("__bases__");
1967 if (__bases__ == NULL)
Neil Schemenauer6b471292001-10-18 03:18:43 +00001968 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001969 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001970 bases = PyObject_GetAttr(cls, __bases__);
Barry Warsawf16951c2002-04-23 22:45:44 +00001971 if (bases == NULL) {
1972 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1973 PyErr_Clear();
Neil Schemenauer6b471292001-10-18 03:18:43 +00001974 return NULL;
Guido van Rossum823649d2001-03-21 18:40:58 +00001975 }
Barry Warsawf16951c2002-04-23 22:45:44 +00001976 if (!PyTuple_Check(bases)) {
1977 Py_DECREF(bases);
1978 return NULL;
1979 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00001980 return bases;
1981}
1982
1983
1984static int
1985abstract_issubclass(PyObject *derived, PyObject *cls)
1986{
1987 PyObject *bases;
1988 int i, n;
1989 int r = 0;
1990
1991
Guido van Rossum823649d2001-03-21 18:40:58 +00001992 if (derived == cls)
1993 return 1;
1994
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00001995 if (PyTuple_Check(cls)) {
1996 /* Not a general sequence -- that opens up the road to
1997 recursion and stack overflow. */
1998 n = PyTuple_GET_SIZE(cls);
1999 for (i = 0; i < n; i++) {
2000 if (derived == PyTuple_GET_ITEM(cls, i))
2001 return 1;
2002 }
2003 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002004 bases = abstract_get_bases(derived);
Barry Warsawf16951c2002-04-23 22:45:44 +00002005 if (bases == NULL) {
2006 if (PyErr_Occurred())
2007 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002008 return 0;
Barry Warsawf16951c2002-04-23 22:45:44 +00002009 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002010 n = PyTuple_GET_SIZE(bases);
2011 for (i = 0; i < n; i++) {
Neil Schemenauer6b471292001-10-18 03:18:43 +00002012 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002013 if (r != 0)
2014 break;
2015 }
2016
2017 Py_DECREF(bases);
2018
2019 return r;
2020}
2021
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002022static int
2023check_class(PyObject *cls, const char *error)
2024{
2025 PyObject *bases = abstract_get_bases(cls);
2026 if (bases == NULL) {
2027 /* Do not mask errors. */
2028 if (!PyErr_Occurred())
2029 PyErr_SetString(PyExc_TypeError, error);
2030 return 0;
2031 }
2032 Py_DECREF(bases);
2033 return -1;
2034}
2035
Guido van Rossum823649d2001-03-21 18:40:58 +00002036int
2037PyObject_IsInstance(PyObject *inst, PyObject *cls)
2038{
2039 PyObject *icls;
2040 static PyObject *__class__ = NULL;
2041 int retval = 0;
2042
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002043 if (__class__ == NULL) {
2044 __class__ = PyString_FromString("__class__");
2045 if (__class__ == NULL)
2046 return -1;
2047 }
2048
Neil Schemenauer6b471292001-10-18 03:18:43 +00002049 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
2050 PyObject *inclass =
2051 (PyObject*)((PyInstanceObject*)inst)->in_class;
2052 retval = PyClass_IsSubclass(inclass, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002053 }
2054 else if (PyType_Check(cls)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002055 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002056 if (retval == 0) {
2057 PyObject *c = PyObject_GetAttr(inst, __class__);
2058 if (c == NULL) {
2059 PyErr_Clear();
2060 }
2061 else {
2062 if (c != inst->ob_type && PyType_Check(c))
2063 retval = PyType_IsSubtype(
2064 (PyTypeObject *)c,
2065 (PyTypeObject *)cls);
2066 Py_DECREF(c);
2067 }
2068 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002069 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002070 else if (PyTuple_Check(cls)) {
2071 /* Not a general sequence -- that opens up the road to
2072 recursion and stack overflow. */
2073 int i, n;
2074
2075 n = PyTuple_GET_SIZE(cls);
2076 for (i = 0; i < n; i++) {
2077 retval = PyObject_IsInstance(
2078 inst, PyTuple_GET_ITEM(cls, i));
2079 if (retval != 0)
2080 break;
2081 }
Guido van Rossum03290ec2001-10-07 20:54:12 +00002082 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002083 else {
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002084 if (!check_class(cls,
2085 "isinstance() arg 2 must be a class, type,"
2086 " or tuple of classes and types"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002087 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002088 icls = PyObject_GetAttr(inst, __class__);
Neil Schemenauer6b471292001-10-18 03:18:43 +00002089 if (icls == NULL) {
2090 PyErr_Clear();
2091 retval = 0;
Guido van Rossum823649d2001-03-21 18:40:58 +00002092 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002093 else {
2094 retval = abstract_issubclass(icls, cls);
2095 Py_DECREF(icls);
2096 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002097 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002098
Guido van Rossum823649d2001-03-21 18:40:58 +00002099 return retval;
2100}
2101
2102int
2103PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2104{
2105 int retval;
2106
2107 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002108 if (!check_class(derived,
2109 "issubclass() arg 1 must be a class"))
Neil Schemenauer6b471292001-10-18 03:18:43 +00002110 return -1;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002111
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002112 if (PyTuple_Check(cls)) {
2113 int i;
2114 int n = PyTuple_GET_SIZE(cls);
2115 for (i = 0; i < n; ++i) {
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002116 retval = PyObject_IsSubclass(
2117 derived, PyTuple_GET_ITEM(cls, i));
2118 if (retval != 0) {
2119 /* either found it, or got an error */
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002120 return retval;
Guido van Rossumf6c9ba82003-02-10 16:05:43 +00002121 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002122 }
Walter Dörwald7e5c6a02002-12-12 19:14:08 +00002123 return 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002124 }
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002125 else {
2126 if (!check_class(cls,
2127 "issubclass() arg 2 must be a class"
2128 " or tuple of classes"))
2129 return -1;
2130 }
Neil Schemenauer6b471292001-10-18 03:18:43 +00002131
2132 retval = abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002133 }
2134 else {
2135 /* shortcut */
2136 if (!(retval = (derived == cls)))
2137 retval = PyClass_IsSubclass(derived, cls);
2138 }
2139
2140 return retval;
2141}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002142
2143PyObject *
2144PyObject_GetIter(PyObject *o)
2145{
2146 PyTypeObject *t = o->ob_type;
2147 getiterfunc f = NULL;
2148 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
2149 f = t->tp_iter;
2150 if (f == NULL) {
2151 if (PySequence_Check(o))
Guido van Rossum213c7a62001-04-23 14:08:49 +00002152 return PySeqIter_New(o);
Guido van Rossum77660912002-04-16 16:32:50 +00002153 PyErr_SetString(PyExc_TypeError,
Jeremy Hylton89c3a222001-11-09 21:59:42 +00002154 "iteration over non-sequence");
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002155 return NULL;
2156 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002157 else {
2158 PyObject *res = (*f)(o);
2159 if (res != NULL && !PyIter_Check(res)) {
2160 PyErr_Format(PyExc_TypeError,
2161 "iter() returned non-iterator "
2162 "of type '%.100s'",
2163 res->ob_type->tp_name);
2164 Py_DECREF(res);
2165 res = NULL;
2166 }
2167 return res;
2168 }
2169}
2170
Tim Petersf4848da2001-05-05 00:14:56 +00002171/* Return next item.
2172 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2173 * If the iteration terminates normally, return NULL and clear the
2174 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2175 * will be false.
2176 * Else return the next object. PyErr_Occurred() will be false.
2177 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002178PyObject *
2179PyIter_Next(PyObject *iter)
2180{
Tim Petersf4848da2001-05-05 00:14:56 +00002181 PyObject *result;
Guido van Rossum213c7a62001-04-23 14:08:49 +00002182 if (!PyIter_Check(iter)) {
2183 PyErr_Format(PyExc_TypeError,
2184 "'%.100s' object is not an iterator",
2185 iter->ob_type->tp_name);
2186 return NULL;
2187 }
Tim Petersf4848da2001-05-05 00:14:56 +00002188 result = (*iter->ob_type->tp_iternext)(iter);
2189 if (result == NULL &&
2190 PyErr_Occurred() &&
2191 PyErr_ExceptionMatches(PyExc_StopIteration))
2192 PyErr_Clear();
2193 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002194}