blob: 0835fe30b4e2b2544c476d6bb03f6f95d7797b8d [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossume15dee51995-07-18 14:12:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossume15dee51995-07-18 14:12:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossume15dee51995-07-18 14:12:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossume15dee51995-07-18 14:12:02 +000029
30******************************************************************/
31
32/* Abstract Object Interface (many thanks to Jim Fulton) */
33
34#include "Python.h"
35
36#define Py_TRY(E) if(!(E)) return NULL
37#define Py_ASSERT(EXP,E,V) if(!(EXP)) return PyErr_SetString(E,V), (void*)NULL
38#define SPAM printf("line %d\n",__LINE__)
39
40static PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000041Py_ReturnMethodError(name)
42 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +000043{
44 if(! name) name = "Unknown Error";
45 PyErr_SetString(PyExc_AttributeError,name);
46 return 0;
47}
48
Guido van Rossum052b7e11996-11-11 15:08:19 +000049static PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +000050Py_ReturnNullError()
51{
52 if(! PyErr_Occurred())
53 PyErr_SetString(PyExc_SystemError,
54 "null argument to internal routine");
55 return 0;
56}
57
58int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000059PyObject_Cmp(o1, o2, result)
60 PyObject *o1;
61 PyObject *o2;
62 int *result;
Guido van Rossume15dee51995-07-18 14:12:02 +000063{
64 int r;
65
66 if(! o1 || ! o2) return Py_ReturnNullError(),-1;
67 r=PyObject_Compare(o1,o2);
68 if(PyErr_Occurred()) return -1;
69 *result=r;
70 return 0;
71}
72
73#if 0 /* Already in object.c */
74int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000075PyCallable_Check(x)
76 PyObject *x;
Guido van Rossume15dee51995-07-18 14:12:02 +000077{
78 if (x == NULL)
79 return 0;
80 if (x->ob_type->tp_call != NULL ||
81 PyFunction_Check(x) ||
82 PyMethod_Check(x) ||
83 PyCFunction_Check(x) ||
84 PyClass_Check(x))
85 return 1;
86 if (PyInstance_Check(x)) {
87 PyObject *call = PyObject_GetAttrString(x, "__call__");
88 if (call == NULL) {
Guido van Rossum8ba873b1995-09-18 21:17:59 +000089 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +000090 return 0;
91 }
92 /* Could test recursively but don't, for fear of endless
93 recursion if some joker sets self.__call__ = self */
94 Py_DECREF(call);
95 return 1;
96 }
97 return 0;
98}
99#endif
100
101PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000102PyObject_Type(o)
103 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000104{
105 PyObject *v;
106
107 if(! o) return Py_ReturnNullError();
108 v = (PyObject *)o->ob_type;
109 Py_INCREF(v);
110 return v;
111}
112
113int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000114PyObject_Length(o)
115 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000116{
117 PySequenceMethods *m;
118
119 if(! o) return Py_ReturnNullError(),-1;
120
121 if((m=o->ob_type->tp_as_sequence) && m->sq_length)
122 return m->sq_length(o);
123
124 return PyMapping_Length(o);
125}
126
127PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000128PyObject_GetItem(o, key)
129 PyObject *o;
130 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000131{
132 PyMappingMethods *m;
133
134 if(! o || ! key) return Py_ReturnNullError();
135
136 if((m=o->ob_type->tp_as_mapping) && m->mp_subscript)
137 return m->mp_subscript(o,key);
138
139 if(PyInt_Check(key))
140 return PySequence_GetItem(o,PyInt_AsLong(key));
141
142 PyErr_SetString(PyExc_TypeError,"expected integer index");
143 return NULL;
144}
145
146int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000147PyObject_SetItem(o, key, value)
148 PyObject *o;
149 PyObject *key;
150 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000151{
152 PyMappingMethods *m;
153
154 if(! o || ! key || ! value) return Py_ReturnNullError(),-1;
155 if((m=o->ob_type->tp_as_mapping) && m->mp_ass_subscript)
156 return m->mp_ass_subscript(o,key,value);
157
158 if(PyInt_Check(key))
159 return PySequence_SetItem(o,PyInt_AsLong(key),value);
160
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000161 PyErr_SetString(PyExc_TypeError,"expected integer index");
Guido van Rossume15dee51995-07-18 14:12:02 +0000162 return -1;
163}
164
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000165int
166PyObject_DelItem(o, key)
167 PyObject *o;
168 PyObject *key;
169{
170 PyMappingMethods *m;
171
172 if(! o || ! key) return Py_ReturnNullError(),-1;
173 if((m=o->ob_type->tp_as_mapping) && m->mp_ass_subscript)
174 return m->mp_ass_subscript(o,key,(PyObject*)NULL);
175
176 if(PyInt_Check(key))
177 return PySequence_SetItem(o,PyInt_AsLong(key),(PyObject*)NULL);
178
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000179 PyErr_SetString(PyExc_TypeError,"expected integer index");
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000180 return -1;
181}
182
Guido van Rossume15dee51995-07-18 14:12:02 +0000183int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000184PyNumber_Check(o)
185 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000186{
187 return o && o->ob_type->tp_as_number;
188}
189
190
191#define BINOP(opname, ropname, thisfunc) \
192 if (!PyInstance_Check(v) && !PyInstance_Check(w)) \
193 ; \
194 else \
195 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
196
197PyObject *
198PyNumber_Or(v, w)
199 PyObject *v, *w;
200{
201 extern int PyNumber_Coerce();
202
203 BINOP("__or__", "__ror__", PyNumber_Or);
204 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000205 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000206 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
207 if (PyNumber_Coerce(&v, &w) != 0)
208 return NULL;
209 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
210 x = (*f)(v, w);
211 Py_DECREF(v);
212 Py_DECREF(w);
213 if (f != NULL)
214 return x;
215 }
216 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for |");
217 return NULL;
218}
219
220PyObject *
221PyNumber_Xor(v, w)
222 PyObject *v, *w;
223{
224 extern int PyNumber_Coerce();
225
226 BINOP("__xor__", "__rxor__", PyNumber_Xor);
227 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000228 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000229 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
230 if (PyNumber_Coerce(&v, &w) != 0)
231 return NULL;
232 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
233 x = (*f)(v, w);
234 Py_DECREF(v);
235 Py_DECREF(w);
236 if (f != NULL)
237 return x;
238 }
239 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for ^");
240 return NULL;
241}
242
243PyObject *
244PyNumber_And(v, w)
245 PyObject *v, *w;
246{
247 BINOP("__and__", "__rand__", PyNumber_And);
248 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000249 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000250 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
251 if (PyNumber_Coerce(&v, &w) != 0)
252 return NULL;
253 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
254 x = (*f)(v, w);
255 Py_DECREF(v);
256 Py_DECREF(w);
257 if (f != NULL)
258 return x;
259 }
260 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for &");
261 return NULL;
262}
263
264PyObject *
265PyNumber_Lshift(v, w)
266 PyObject *v, *w;
267{
268 BINOP("__lshift__", "__rlshift__", PyNumber_Lshift);
269 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000270 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000271 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
272 if (PyNumber_Coerce(&v, &w) != 0)
273 return NULL;
274 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
275 x = (*f)(v, w);
276 Py_DECREF(v);
277 Py_DECREF(w);
278 if (f != NULL)
279 return x;
280 }
281 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for <<");
282 return NULL;
283}
284
285PyObject *
286PyNumber_Rshift(v, w)
287 PyObject *v, *w;
288{
289 BINOP("__rshift__", "__rrshift__", PyNumber_Rshift);
290 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000291 PyObject *x = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000292 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
293 if (PyNumber_Coerce(&v, &w) != 0)
294 return NULL;
295 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
296 x = (*f)(v, w);
297 Py_DECREF(v);
298 Py_DECREF(w);
299 if (f != NULL)
300 return x;
301 }
302 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for >>");
303 return NULL;
304}
305
306PyObject *
307PyNumber_Add(v, w)
308 PyObject *v, *w;
309{
310 BINOP("__add__", "__radd__", PyNumber_Add);
311 if (v->ob_type->tp_as_sequence != NULL)
312 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
313 else if (v->ob_type->tp_as_number != NULL) {
314 PyObject *x;
315 if (PyNumber_Coerce(&v, &w) != 0)
316 return NULL;
317 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
318 Py_DECREF(v);
319 Py_DECREF(w);
320 return x;
321 }
322 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for +");
323 return NULL;
324}
325
326PyObject *
327PyNumber_Subtract(v, w)
328 PyObject *v, *w;
329{
330 BINOP("__sub__", "__rsub__", PyNumber_Subtract);
331 if (v->ob_type->tp_as_number != NULL) {
332 PyObject *x;
333 if (PyNumber_Coerce(&v, &w) != 0)
334 return NULL;
335 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
336 Py_DECREF(v);
337 Py_DECREF(w);
338 return x;
339 }
340 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for -");
341 return NULL;
342}
343
344PyObject *
345PyNumber_Multiply(v, w)
346 PyObject *v, *w;
347{
348 PyTypeObject *tp;
349 tp = v->ob_type;
350 BINOP("__mul__", "__rmul__", PyNumber_Multiply);
351 if (tp->tp_as_number != NULL &&
352 w->ob_type->tp_as_sequence != NULL &&
353 !PyInstance_Check(v)) {
354 /* number*sequence -- swap v and w */
355 PyObject *tmp = v;
356 v = w;
357 w = tmp;
358 tp = v->ob_type;
359 }
360 if (tp->tp_as_number != NULL) {
361 PyObject *x;
362 if (PyInstance_Check(v)) {
363 /* Instances of user-defined classes get their
364 other argument uncoerced, so they may
365 implement sequence*number as well as
366 number*number. */
367 Py_INCREF(v);
368 Py_INCREF(w);
369 }
370 else if (PyNumber_Coerce(&v, &w) != 0)
371 return NULL;
372 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
373 Py_DECREF(v);
374 Py_DECREF(w);
375 return x;
376 }
377 if (tp->tp_as_sequence != NULL) {
378 if (!PyInt_Check(w)) {
379 PyErr_SetString(PyExc_TypeError,
380 "can't multiply sequence with non-int");
381 return NULL;
382 }
383 return (*tp->tp_as_sequence->sq_repeat)
384 (v, (int)PyInt_AsLong(w));
385 }
386 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for *");
387 return NULL;
388}
389
390PyObject *
391PyNumber_Divide(v, w)
392 PyObject *v, *w;
393{
394 BINOP("__div__", "__rdiv__", PyNumber_Divide);
395 if (v->ob_type->tp_as_number != NULL) {
396 PyObject *x;
397 if (PyNumber_Coerce(&v, &w) != 0)
398 return NULL;
399 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
400 Py_DECREF(v);
401 Py_DECREF(w);
402 return x;
403 }
404 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for /");
405 return NULL;
406}
407
408PyObject *
409PyNumber_Remainder(v, w)
410 PyObject *v, *w;
411{
412 if (PyString_Check(v)) {
413 return PyString_Format(v, w);
414 }
415 BINOP("__mod__", "__rmod__", PyNumber_Remainder);
416 if (v->ob_type->tp_as_number != NULL) {
417 PyObject *x;
418 if (PyNumber_Coerce(&v, &w) != 0)
419 return NULL;
420 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
421 Py_DECREF(v);
422 Py_DECREF(w);
423 return x;
424 }
425 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for %");
426 return NULL;
427}
428
429PyObject *
430PyNumber_Divmod(v, w)
431 PyObject *v, *w;
432{
433 PyObject *res;
434
435 if (PyInstance_Check(v) || PyInstance_Check(w))
436 return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
437 PyNumber_Divmod);
438 if (v->ob_type->tp_as_number == NULL ||
439 w->ob_type->tp_as_number == NULL) {
440 PyErr_SetString(PyExc_TypeError,
441 "divmod() requires numeric or class instance arguments");
442 return NULL;
443 }
444 if (PyNumber_Coerce(&v, &w) != 0)
445 return NULL;
446 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
447 Py_DECREF(v);
448 Py_DECREF(w);
449 return res;
450}
451
452
453static PyObject *
454do_pow(v, w)
455 PyObject *v, *w;
456{
457 PyObject *res;
458 if (PyInstance_Check(v) || PyInstance_Check(w))
459 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
460 if (v->ob_type->tp_as_number == NULL ||
461 w->ob_type->tp_as_number == NULL) {
462 PyErr_SetString(PyExc_TypeError,
463 "pow() requires numeric arguments");
464 return NULL;
465 }
Guido van Rossumf7d590c1998-04-03 23:38:59 +0000466 if (PyFloat_Check(v) && PyFloat_Check(w) &&
467 PyFloat_AsDouble(v) < 0.0) {
Guido van Rossume15dee51995-07-18 14:12:02 +0000468 if (!PyErr_Occurred())
469 PyErr_SetString(PyExc_ValueError,
470 "negative number to float power");
471 return NULL;
472 }
473 if (PyNumber_Coerce(&v, &w) != 0)
474 return NULL;
475 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
476 Py_DECREF(v);
477 Py_DECREF(w);
478 return res;
479}
480
481PyObject *
482PyNumber_Power(v,w,z)
483 PyObject *v, *w, *z;
484{
485 PyObject *res;
486 PyObject *v1, *z1, *w2, *z2;
487
488 if (z == Py_None)
489 return do_pow(v, w);
490 /* XXX The ternary version doesn't do class instance coercions */
491 if (PyInstance_Check(v))
492 return v->ob_type->tp_as_number->nb_power(v, w, z);
493 if (v->ob_type->tp_as_number == NULL ||
494 z->ob_type->tp_as_number == NULL ||
495 w->ob_type->tp_as_number == NULL) {
496 PyErr_SetString(PyExc_TypeError, "pow() requires numeric arguments");
497 return NULL;
498 }
499 if (PyNumber_Coerce(&v, &w) != 0)
500 return NULL;
501 res = NULL;
502 v1 = v;
503 z1 = z;
504 if (PyNumber_Coerce(&v1, &z1) != 0)
505 goto error2;
506 w2 = w;
507 z2 = z1;
508 if (PyNumber_Coerce(&w2, &z2) != 0)
509 goto error1;
510 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
511 Py_DECREF(w2);
512 Py_DECREF(z2);
513 error1:
514 Py_DECREF(v1);
515 Py_DECREF(z1);
516 error2:
517 Py_DECREF(v);
518 Py_DECREF(w);
519 return res;
520}
521
522
523PyObject *
524PyNumber_Negative(v)
525 PyObject *v;
526{
527 if (v->ob_type->tp_as_number != NULL)
528 return (*v->ob_type->tp_as_number->nb_negative)(v);
529 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary -");
530 return NULL;
531}
532
533PyObject *
534PyNumber_Positive(v)
535 PyObject *v;
536{
537 if (v->ob_type->tp_as_number != NULL)
538 return (*v->ob_type->tp_as_number->nb_positive)(v);
539 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary +");
540 return NULL;
541}
542
543PyObject *
544PyNumber_Invert(v)
545 PyObject *v;
546{
547 PyObject * (*f) Py_FPROTO((PyObject *));
548 if (v->ob_type->tp_as_number != NULL &&
549 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
550 return (*f)(v);
551 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary ~");
552 return NULL;
553}
554
555PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000556PyNumber_Absolute(o)
557 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000558{
559 PyNumberMethods *m;
560
561 if(! o) return Py_ReturnNullError();
562 if((m=o->ob_type->tp_as_number) && m->nb_absolute)
563 return m->nb_absolute(o);
564
565 return Py_ReturnMethodError("__abs__");
566}
567
568PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000569PyNumber_Int(o)
570 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000571{
572 PyNumberMethods *m;
573
574 if(! o) return Py_ReturnNullError();
575 if((m=o->ob_type->tp_as_number) && m->nb_int)
576 return m->nb_int(o);
577
578 return Py_ReturnMethodError("__int__");
579}
580
581PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000582PyNumber_Long(o)
583 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000584{
585 PyNumberMethods *m;
586
587 if(! o) return Py_ReturnNullError();
588 if((m=o->ob_type->tp_as_number) && m->nb_long)
589 return m->nb_long(o);
590
591 return Py_ReturnMethodError("__long__");
592}
593
594PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000595PyNumber_Float(o)
596 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000597{
598 PyNumberMethods *m;
599
600 if(! o) return Py_ReturnNullError();
601 if((m=o->ob_type->tp_as_number) && m->nb_float)
602 return m->nb_float(o);
603
604 return Py_ReturnMethodError("__float__");
605}
606
607
608int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000609PySequence_Check(o)
610 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000611{
612 return o && o->ob_type->tp_as_sequence;
613}
614
615int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000616PySequence_Length(s)
617 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000618{
619 PySequenceMethods *m;
620
621 if(! s) return Py_ReturnNullError(),-1;
622
623 if((m=s->ob_type->tp_as_sequence) && m->sq_length)
624 return m->sq_length(s);
625
626 Py_ReturnMethodError("__len__");
627 return -1;
628}
629
630PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000631PySequence_Concat(s, o)
632 PyObject *s;
633 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000634{
635 PySequenceMethods *m;
636
637 if(! s || ! o) return Py_ReturnNullError();
638
639 if((m=s->ob_type->tp_as_sequence) && m->sq_concat)
640 return m->sq_concat(s,o);
641
642 return Py_ReturnMethodError("__concat__");
643}
644
645PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000646PySequence_Repeat(o, count)
647 PyObject *o;
648 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000649{
650 PySequenceMethods *m;
651
652 if(! o) return Py_ReturnNullError();
653
654 if((m=o->ob_type->tp_as_sequence) && m->sq_repeat)
655 return m->sq_repeat(o,count);
656
657 return Py_ReturnMethodError("__repeat__");
658}
659
660PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000661PySequence_GetItem(s, i)
662 PyObject *s;
663 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000664{
665 PySequenceMethods *m;
666 int l;
667
668 if(! s) return Py_ReturnNullError();
669
Guido van Rossum08ef9d91996-11-09 22:32:05 +0000670 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_item))
Guido van Rossume15dee51995-07-18 14:12:02 +0000671 return Py_ReturnMethodError("__getitem__");
672
Guido van Rossum08ef9d91996-11-09 22:32:05 +0000673 if(i < 0)
674 {
Guido van Rossum4669fb41997-04-02 05:31:09 +0000675 if(! m->sq_length || 0 > (l=m->sq_length(s))) return NULL;
Guido van Rossum08ef9d91996-11-09 22:32:05 +0000676 i += l;
677 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000678
679 return m->sq_item(s,i);
680}
681
682PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000683PySequence_GetSlice(s, i1, i2)
684 PyObject *s;
685 int i1;
686 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000687{
688 PySequenceMethods *m;
689 int l;
690
691 if(! s) return Py_ReturnNullError();
692
Guido van Rossum4669fb41997-04-02 05:31:09 +0000693 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_slice))
Guido van Rossume15dee51995-07-18 14:12:02 +0000694 return Py_ReturnMethodError("__getslice__");
695
Guido van Rossum4669fb41997-04-02 05:31:09 +0000696 if(i1 < 0 || i2 < 0)
697 {
Guido van Rossume15dee51995-07-18 14:12:02 +0000698
Guido van Rossum4669fb41997-04-02 05:31:09 +0000699 if(! m->sq_length || 0 > (l=m->sq_length(s))) return NULL;
700
701 if(i1 < 0) i1 += l;
702 if(i2 < 0) i2 += l;
703 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000704
705 return m->sq_slice(s,i1,i2);
706}
707
708int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000709PySequence_SetItem(s, i, o)
710 PyObject *s;
711 int i;
712 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000713{
714 PySequenceMethods *m;
715 int l;
716 if(! s) return Py_ReturnNullError(),-1;
717
718 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
719 return Py_ReturnMethodError("__setitem__"),-1;
720
721 if(i < 0)
722 {
723 if(0 > (l=m->sq_length(s))) return -1;
724 i += l;
725 }
726
727 return m->sq_ass_item(s,i,o);
728}
729
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000730int
731PySequence_DelItem(s, i)
732 PyObject *s;
733 int i;
734{
735 PySequenceMethods *m;
736 int l;
737 if(! s) return Py_ReturnNullError(),-1;
738
739 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
740 return Py_ReturnMethodError("__delitem__"),-1;
741
742 if(i < 0)
743 {
744 if(0 > (l=m->sq_length(s))) return -1;
745 i += l;
746 }
747
748 return m->sq_ass_item(s,i,(PyObject*)NULL);
749}
750
Guido van Rossume15dee51995-07-18 14:12:02 +0000751int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000752PySequence_SetSlice(s, i1, i2, o)
753 PyObject *s;
754 int i1;
755 int i2;
756 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000757{
758 PySequenceMethods *m;
759 int l;
760
761 if(! s) return Py_ReturnNullError(),-1;
762
763 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
764 return Py_ReturnMethodError("__setslice__"),-1;
765
766 if(0 > (l=m->sq_length(s))) return -1;
767
768 if(i1 < 0) i1 += l;
769 if(i2 < 0) i2 += l;
770
771 return m->sq_ass_slice(s,i1,i2,o);
772}
773
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000774int
775PySequence_DelSlice(s, i1, i2)
776 PyObject *s;
777 int i1;
778 int i2;
779{
780 PySequenceMethods *m;
781 int l;
782
783 if(! s) return Py_ReturnNullError(),-1;
784
785 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
786 return Py_ReturnMethodError("__delslice__"),-1;
787
788 if(0 > (l=m->sq_length(s))) return -1;
789
790 if(i1 < 0) i1 += l;
791 if(i2 < 0) i2 += l;
792
793 return m->sq_ass_slice(s,i1,i2,(PyObject*)NULL);
794}
795
Guido van Rossume15dee51995-07-18 14:12:02 +0000796PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000797PySequence_Tuple(s)
798 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000799{
800 int l, i;
801 PyObject *t, *item;
802
803 if(! s) return Py_ReturnNullError();
804
805 Py_TRY((l=PySequence_Length(s)) != -1);
806 Py_TRY(t=PyTuple_New(l));
807
808 for(i=0; i < l; i++)
809 {
Guido van Rossume61093c1997-05-14 18:43:29 +0000810 if(!(item=PySequence_GetItem(s,i)) ||
Guido van Rossum4669fb41997-04-02 05:31:09 +0000811 PyTuple_SetItem(t,i,item) == -1)
Guido van Rossume15dee51995-07-18 14:12:02 +0000812 {
813 Py_DECREF(t);
814 return NULL;
815 }
816 }
817 return t;
818}
819
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000820PyObject *
821PySequence_List(s)
822 PyObject *s;
823{
824 int l, i;
825 PyObject *t, *item;
Guido van Rossum4669fb41997-04-02 05:31:09 +0000826
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000827 if(! s) return Py_ReturnNullError();
Guido van Rossum4669fb41997-04-02 05:31:09 +0000828
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000829 Py_TRY((l=PySequence_Length(s)) != -1);
830 Py_TRY(t=PyList_New(l));
Guido van Rossum4669fb41997-04-02 05:31:09 +0000831
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000832 for(i=0; i < l; i++)
833 {
Guido van Rossume61093c1997-05-14 18:43:29 +0000834 if(!(item=PySequence_GetItem(s,i)) ||
Guido van Rossum4669fb41997-04-02 05:31:09 +0000835 PyList_SetItem(t,i,item) == -1)
836 {
837 Py_DECREF(t);
838 return NULL;
839 }
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000840 }
841 return t;
842}
843
Guido van Rossume15dee51995-07-18 14:12:02 +0000844int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000845PySequence_Count(s, o)
846 PyObject *s;
847 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000848{
849 int l, i, n=0, not_equal, err;
850 PyObject *item;
851
852 if(! s || ! o) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000853 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000854
855 for(i=0; i < l; i++)
856 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000857 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000858 err=PyObject_Cmp(item,o,&not_equal) == -1;
859 Py_DECREF(item);
860 if(err) return -1;
861 n += ! not_equal;
862 }
863 return n;
864}
865
866int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000867PySequence_In(s, o)
868 PyObject *s;
869 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000870{
871 int l, i, not_equal, err;
872 PyObject *item;
873
874 if(! o || ! s) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000875 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000876
877 for(i=0; i < l; i++)
878 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000879 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000880 err=PyObject_Cmp(item,o,&not_equal) == -1;
881 Py_DECREF(item);
882 if(err) return -1;
883 if(! not_equal) return 1;
884 }
885 return 0;
886}
887
888int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000889PySequence_Index(s, o)
890 PyObject *s;
891 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000892{
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000893 int l, i, not_equal, err;
Guido van Rossume15dee51995-07-18 14:12:02 +0000894 PyObject *item;
895
896 if(! s || ! o) return Py_ReturnNullError(), -1;
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000897 if((l=PySequence_Length(s)) == -1) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000898
899 for(i=0; i < l; i++)
900 {
Guido van Rossum3c5936a1996-12-05 21:51:24 +0000901 if((item=PySequence_GetItem(s,i)) == NULL) return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000902 err=PyObject_Cmp(item,o,&not_equal) == -1;
903 Py_DECREF(item);
904 if(err) return -1;
Guido van Rossum8dbcdd01996-11-06 15:31:46 +0000905 if(! not_equal) return i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000906 }
Barry Warsawf90edde1996-12-18 19:32:18 +0000907 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossume15dee51995-07-18 14:12:02 +0000908 return -1;
909}
910
911int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000912PyMapping_Check(o)
913 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000914{
915 return o && o->ob_type->tp_as_mapping;
916}
917
918int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000919PyMapping_Length(s)
920 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000921{
922 PyMappingMethods *m;
923
924 if(! s) return Py_ReturnNullError(),-1;
925
926 if((m=s->ob_type->tp_as_mapping) && m->mp_length)
927 return m->mp_length(s);
928
929 Py_ReturnMethodError("__len__");
930 return -1;
931}
932
933int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000934PyMapping_HasKeyString(o, key)
935 PyObject *o;
936 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000937{
938 PyObject *v;
939
940 v=PyMapping_GetItemString(o,key);
Guido van Rossum4669fb41997-04-02 05:31:09 +0000941 if(v) {
942 Py_DECREF(v);
943 return 1;
944 }
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000945 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000946 return 0;
947}
948
949int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000950PyMapping_HasKey(o, key)
951 PyObject *o;
952 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000953{
954 PyObject *v;
955
956 v=PyObject_GetItem(o,key);
Guido van Rossum4669fb41997-04-02 05:31:09 +0000957 if(v) {
958 Py_DECREF(v);
959 return 1;
960 }
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000961 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000962 return 0;
963}
964
965PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000966PyObject_CallObject(o, a)
967 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +0000968{
969 PyObject *r;
970
971 if(a) return PyEval_CallObject(o,a);
972
973 if(! (a=PyTuple_New(0)))
974 return NULL;
975 r=PyEval_CallObject(o,a);
976 Py_DECREF(a);
977 return r;
978}
979
980PyObject *
981#ifdef HAVE_STDARG_PROTOTYPES
982/* VARARGS 2 */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983PyObject_CallFunction(PyObject *PyCallable_Check, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +0000984#else
985/* VARARGS */
986PyObject_CallFunction(va_alist) va_dcl
987#endif
988{
989 va_list va;
990 PyObject *args, *retval;
991#ifdef HAVE_STDARG_PROTOTYPES
992 va_start(va, format);
993#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994 PyObject *PyCallable_Check;
Guido van Rossume15dee51995-07-18 14:12:02 +0000995 char *format;
996 va_start(va);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 PyCallable_Check = va_arg(va, PyObject *);
Guido van Rossume15dee51995-07-18 14:12:02 +0000998 format = va_arg(va, char *);
999#endif
1000
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001 if( ! PyCallable_Check)
Guido van Rossume15dee51995-07-18 14:12:02 +00001002 {
1003 va_end(va);
1004 return Py_ReturnNullError();
1005 }
1006
1007 if(format)
1008 args = Py_VaBuildValue(format, va);
1009 else
1010 args = PyTuple_New(0);
1011
1012 va_end(va);
1013 if(! args) return NULL;
1014
1015 if(! PyTuple_Check(args))
1016 {
1017 PyObject *a;
1018
1019 Py_TRY(a=PyTuple_New(1));
1020 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1021 args=a;
1022 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 retval = PyObject_CallObject(PyCallable_Check,args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001024 Py_DECREF(args);
1025 return retval;
1026}
1027
1028PyObject *
1029#ifdef HAVE_STDARG_PROTOTYPES
1030/* VARARGS 2 */
1031PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
1032#else
1033/* VARARGS */
1034PyObject_CallMethod(va_alist) va_dcl
1035#endif
1036{
1037 va_list va;
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001038 PyObject *args, *func=0, *retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00001039#ifdef HAVE_STDARG_PROTOTYPES
1040 va_start(va, format);
1041#else
1042 PyObject *o;
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001043 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +00001044 char *format;
1045 va_start(va);
1046 o = va_arg(va, PyObject *);
1047 name = va_arg(va, char *);
1048 format = va_arg(va, char *);
1049#endif
1050
1051 if( ! o || ! name)
1052 {
1053 va_end(va);
1054 return Py_ReturnNullError();
1055 }
1056
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001057 func=PyObject_GetAttrString(o,name);
1058 if(! func)
Guido van Rossume15dee51995-07-18 14:12:02 +00001059 {
1060 va_end(va);
1061 PyErr_SetString(PyExc_AttributeError,name);
1062 return 0;
1063 }
1064
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001065 if(! (PyCallable_Check(func)))
Guido van Rossume15dee51995-07-18 14:12:02 +00001066 {
1067 va_end(va);
1068 PyErr_SetString(PyExc_TypeError,"call of non-callable attribute");
1069 return 0;
1070 }
1071
Guido van Rossum336c6991996-09-30 22:00:50 +00001072 if(format && *format)
Guido van Rossume15dee51995-07-18 14:12:02 +00001073 args = Py_VaBuildValue(format, va);
1074 else
1075 args = PyTuple_New(0);
1076
1077 va_end(va);
1078
1079 if(! args) return NULL;
1080
1081 if(! PyTuple_Check(args))
1082 {
1083 PyObject *a;
1084
1085 Py_TRY(a=PyTuple_New(1));
1086 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1087 args=a;
1088 }
1089
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001090 retval = PyObject_CallObject(func,args);
Guido van Rossume15dee51995-07-18 14:12:02 +00001091 Py_DECREF(args);
Guido van Rossuma9040ec1997-05-20 22:09:08 +00001092 Py_DECREF(func);
Guido van Rossume15dee51995-07-18 14:12:02 +00001093 return retval;
1094}
1095
1096PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001097PyMapping_GetItemString(o, key)
1098 PyObject *o;
1099 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001100{
1101 PyObject *okey, *r;
1102
1103 if( ! key) return Py_ReturnNullError();
1104 Py_TRY(okey=PyString_FromString(key));
1105 r = PyObject_GetItem(o,okey);
1106 Py_DECREF(okey);
1107 return r;
1108}
1109
1110int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001111PyMapping_SetItemString(o, key, value)
1112 PyObject *o;
1113 char *key;
1114 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +00001115{
1116 PyObject *okey;
1117 int r;
1118
1119 if( ! key) return Py_ReturnNullError(),-1;
1120 if (!(okey=PyString_FromString(key))) return -1;
1121 r = PyObject_SetItem(o,okey,value);
1122 Py_DECREF(okey);
1123 return r;
1124}