blob: e0483a1b83813371a2f837a107f35cb650db0984 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Abstract Object Interface (many thanks to Jim Fulton) */
26
27#include "Python.h"
28
29#define Py_TRY(E) if(!(E)) return NULL
30#define Py_ASSERT(EXP,E,V) if(!(EXP)) return PyErr_SetString(E,V), (void*)NULL
31#define SPAM printf("line %d\n",__LINE__)
32
33static PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000034Py_ReturnMethodError(name)
35 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +000036{
37 if(! name) name = "Unknown Error";
38 PyErr_SetString(PyExc_AttributeError,name);
39 return 0;
40}
41
42PyObject *
43Py_ReturnNullError()
44{
45 if(! PyErr_Occurred())
46 PyErr_SetString(PyExc_SystemError,
47 "null argument to internal routine");
48 return 0;
49}
50
51int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000052PyObject_Cmp(o1, o2, result)
53 PyObject *o1;
54 PyObject *o2;
55 int *result;
Guido van Rossume15dee51995-07-18 14:12:02 +000056{
57 int r;
58
59 if(! o1 || ! o2) return Py_ReturnNullError(),-1;
60 r=PyObject_Compare(o1,o2);
61 if(PyErr_Occurred()) return -1;
62 *result=r;
63 return 0;
64}
65
66#if 0 /* Already in object.c */
67int
Guido van Rossum8ba873b1995-09-18 21:17:59 +000068PyCallable_Check(x)
69 PyObject *x;
Guido van Rossume15dee51995-07-18 14:12:02 +000070{
71 if (x == NULL)
72 return 0;
73 if (x->ob_type->tp_call != NULL ||
74 PyFunction_Check(x) ||
75 PyMethod_Check(x) ||
76 PyCFunction_Check(x) ||
77 PyClass_Check(x))
78 return 1;
79 if (PyInstance_Check(x)) {
80 PyObject *call = PyObject_GetAttrString(x, "__call__");
81 if (call == NULL) {
Guido van Rossum8ba873b1995-09-18 21:17:59 +000082 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +000083 return 0;
84 }
85 /* Could test recursively but don't, for fear of endless
86 recursion if some joker sets self.__call__ = self */
87 Py_DECREF(call);
88 return 1;
89 }
90 return 0;
91}
92#endif
93
94PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +000095PyObject_Type(o)
96 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +000097{
98 PyObject *v;
99
100 if(! o) return Py_ReturnNullError();
101 v = (PyObject *)o->ob_type;
102 Py_INCREF(v);
103 return v;
104}
105
106int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000107PyObject_Length(o)
108 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000109{
110 PySequenceMethods *m;
111
112 if(! o) return Py_ReturnNullError(),-1;
113
114 if((m=o->ob_type->tp_as_sequence) && m->sq_length)
115 return m->sq_length(o);
116
117 return PyMapping_Length(o);
118}
119
120PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000121PyObject_GetItem(o, key)
122 PyObject *o;
123 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000124{
125 PyMappingMethods *m;
126
127 if(! o || ! key) return Py_ReturnNullError();
128
129 if((m=o->ob_type->tp_as_mapping) && m->mp_subscript)
130 return m->mp_subscript(o,key);
131
132 if(PyInt_Check(key))
133 return PySequence_GetItem(o,PyInt_AsLong(key));
134
135 PyErr_SetString(PyExc_TypeError,"expected integer index");
136 return NULL;
137}
138
139int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000140PyObject_SetItem(o, key, value)
141 PyObject *o;
142 PyObject *key;
143 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +0000144{
145 PyMappingMethods *m;
146
147 if(! o || ! key || ! value) return Py_ReturnNullError(),-1;
148 if((m=o->ob_type->tp_as_mapping) && m->mp_ass_subscript)
149 return m->mp_ass_subscript(o,key,value);
150
151 if(PyInt_Check(key))
152 return PySequence_SetItem(o,PyInt_AsLong(key),value);
153
154 PyErr_SetString(PyExc_TypeError,"expeced integer index");
155 return -1;
156}
157
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000158int
159PyObject_DelItem(o, key)
160 PyObject *o;
161 PyObject *key;
162{
163 PyMappingMethods *m;
164
165 if(! o || ! key) return Py_ReturnNullError(),-1;
166 if((m=o->ob_type->tp_as_mapping) && m->mp_ass_subscript)
167 return m->mp_ass_subscript(o,key,(PyObject*)NULL);
168
169 if(PyInt_Check(key))
170 return PySequence_SetItem(o,PyInt_AsLong(key),(PyObject*)NULL);
171
172 PyErr_SetString(PyExc_TypeError,"expeced integer index");
173 return -1;
174}
175
Guido van Rossume15dee51995-07-18 14:12:02 +0000176int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000177PyNumber_Check(o)
178 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000179{
180 return o && o->ob_type->tp_as_number;
181}
182
183
184#define BINOP(opname, ropname, thisfunc) \
185 if (!PyInstance_Check(v) && !PyInstance_Check(w)) \
186 ; \
187 else \
188 return PyInstance_DoBinOp(v, w, opname, ropname, thisfunc)
189
190PyObject *
191PyNumber_Or(v, w)
192 PyObject *v, *w;
193{
194 extern int PyNumber_Coerce();
195
196 BINOP("__or__", "__ror__", PyNumber_Or);
197 if (v->ob_type->tp_as_number != NULL) {
198 PyObject *x;
199 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
200 if (PyNumber_Coerce(&v, &w) != 0)
201 return NULL;
202 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
203 x = (*f)(v, w);
204 Py_DECREF(v);
205 Py_DECREF(w);
206 if (f != NULL)
207 return x;
208 }
209 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for |");
210 return NULL;
211}
212
213PyObject *
214PyNumber_Xor(v, w)
215 PyObject *v, *w;
216{
217 extern int PyNumber_Coerce();
218
219 BINOP("__xor__", "__rxor__", PyNumber_Xor);
220 if (v->ob_type->tp_as_number != NULL) {
221 PyObject *x;
222 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
223 if (PyNumber_Coerce(&v, &w) != 0)
224 return NULL;
225 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
226 x = (*f)(v, w);
227 Py_DECREF(v);
228 Py_DECREF(w);
229 if (f != NULL)
230 return x;
231 }
232 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for ^");
233 return NULL;
234}
235
236PyObject *
237PyNumber_And(v, w)
238 PyObject *v, *w;
239{
240 BINOP("__and__", "__rand__", PyNumber_And);
241 if (v->ob_type->tp_as_number != NULL) {
242 PyObject *x;
243 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
244 if (PyNumber_Coerce(&v, &w) != 0)
245 return NULL;
246 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
247 x = (*f)(v, w);
248 Py_DECREF(v);
249 Py_DECREF(w);
250 if (f != NULL)
251 return x;
252 }
253 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for &");
254 return NULL;
255}
256
257PyObject *
258PyNumber_Lshift(v, w)
259 PyObject *v, *w;
260{
261 BINOP("__lshift__", "__rlshift__", PyNumber_Lshift);
262 if (v->ob_type->tp_as_number != NULL) {
263 PyObject *x;
264 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
265 if (PyNumber_Coerce(&v, &w) != 0)
266 return NULL;
267 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
268 x = (*f)(v, w);
269 Py_DECREF(v);
270 Py_DECREF(w);
271 if (f != NULL)
272 return x;
273 }
274 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for <<");
275 return NULL;
276}
277
278PyObject *
279PyNumber_Rshift(v, w)
280 PyObject *v, *w;
281{
282 BINOP("__rshift__", "__rrshift__", PyNumber_Rshift);
283 if (v->ob_type->tp_as_number != NULL) {
284 PyObject *x;
285 PyObject * (*f) Py_FPROTO((PyObject *, PyObject *));
286 if (PyNumber_Coerce(&v, &w) != 0)
287 return NULL;
288 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
289 x = (*f)(v, w);
290 Py_DECREF(v);
291 Py_DECREF(w);
292 if (f != NULL)
293 return x;
294 }
295 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for >>");
296 return NULL;
297}
298
299PyObject *
300PyNumber_Add(v, w)
301 PyObject *v, *w;
302{
303 BINOP("__add__", "__radd__", PyNumber_Add);
304 if (v->ob_type->tp_as_sequence != NULL)
305 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
306 else if (v->ob_type->tp_as_number != NULL) {
307 PyObject *x;
308 if (PyNumber_Coerce(&v, &w) != 0)
309 return NULL;
310 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
311 Py_DECREF(v);
312 Py_DECREF(w);
313 return x;
314 }
315 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for +");
316 return NULL;
317}
318
319PyObject *
320PyNumber_Subtract(v, w)
321 PyObject *v, *w;
322{
323 BINOP("__sub__", "__rsub__", PyNumber_Subtract);
324 if (v->ob_type->tp_as_number != NULL) {
325 PyObject *x;
326 if (PyNumber_Coerce(&v, &w) != 0)
327 return NULL;
328 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
329 Py_DECREF(v);
330 Py_DECREF(w);
331 return x;
332 }
333 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for -");
334 return NULL;
335}
336
337PyObject *
338PyNumber_Multiply(v, w)
339 PyObject *v, *w;
340{
341 PyTypeObject *tp;
342 tp = v->ob_type;
343 BINOP("__mul__", "__rmul__", PyNumber_Multiply);
344 if (tp->tp_as_number != NULL &&
345 w->ob_type->tp_as_sequence != NULL &&
346 !PyInstance_Check(v)) {
347 /* number*sequence -- swap v and w */
348 PyObject *tmp = v;
349 v = w;
350 w = tmp;
351 tp = v->ob_type;
352 }
353 if (tp->tp_as_number != NULL) {
354 PyObject *x;
355 if (PyInstance_Check(v)) {
356 /* Instances of user-defined classes get their
357 other argument uncoerced, so they may
358 implement sequence*number as well as
359 number*number. */
360 Py_INCREF(v);
361 Py_INCREF(w);
362 }
363 else if (PyNumber_Coerce(&v, &w) != 0)
364 return NULL;
365 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
366 Py_DECREF(v);
367 Py_DECREF(w);
368 return x;
369 }
370 if (tp->tp_as_sequence != NULL) {
371 if (!PyInt_Check(w)) {
372 PyErr_SetString(PyExc_TypeError,
373 "can't multiply sequence with non-int");
374 return NULL;
375 }
376 return (*tp->tp_as_sequence->sq_repeat)
377 (v, (int)PyInt_AsLong(w));
378 }
379 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for *");
380 return NULL;
381}
382
383PyObject *
384PyNumber_Divide(v, w)
385 PyObject *v, *w;
386{
387 BINOP("__div__", "__rdiv__", PyNumber_Divide);
388 if (v->ob_type->tp_as_number != NULL) {
389 PyObject *x;
390 if (PyNumber_Coerce(&v, &w) != 0)
391 return NULL;
392 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
393 Py_DECREF(v);
394 Py_DECREF(w);
395 return x;
396 }
397 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for /");
398 return NULL;
399}
400
401PyObject *
402PyNumber_Remainder(v, w)
403 PyObject *v, *w;
404{
405 if (PyString_Check(v)) {
406 return PyString_Format(v, w);
407 }
408 BINOP("__mod__", "__rmod__", PyNumber_Remainder);
409 if (v->ob_type->tp_as_number != NULL) {
410 PyObject *x;
411 if (PyNumber_Coerce(&v, &w) != 0)
412 return NULL;
413 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
414 Py_DECREF(v);
415 Py_DECREF(w);
416 return x;
417 }
418 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for %");
419 return NULL;
420}
421
422PyObject *
423PyNumber_Divmod(v, w)
424 PyObject *v, *w;
425{
426 PyObject *res;
427
428 if (PyInstance_Check(v) || PyInstance_Check(w))
429 return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
430 PyNumber_Divmod);
431 if (v->ob_type->tp_as_number == NULL ||
432 w->ob_type->tp_as_number == NULL) {
433 PyErr_SetString(PyExc_TypeError,
434 "divmod() requires numeric or class instance arguments");
435 return NULL;
436 }
437 if (PyNumber_Coerce(&v, &w) != 0)
438 return NULL;
439 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
440 Py_DECREF(v);
441 Py_DECREF(w);
442 return res;
443}
444
445
446static PyObject *
447do_pow(v, w)
448 PyObject *v, *w;
449{
450 PyObject *res;
451 if (PyInstance_Check(v) || PyInstance_Check(w))
452 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
453 if (v->ob_type->tp_as_number == NULL ||
454 w->ob_type->tp_as_number == NULL) {
455 PyErr_SetString(PyExc_TypeError,
456 "pow() requires numeric arguments");
457 return NULL;
458 }
459 if (PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
460 if (!PyErr_Occurred())
461 PyErr_SetString(PyExc_ValueError,
462 "negative number to float power");
463 return NULL;
464 }
465 if (PyNumber_Coerce(&v, &w) != 0)
466 return NULL;
467 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
468 Py_DECREF(v);
469 Py_DECREF(w);
470 return res;
471}
472
473PyObject *
474PyNumber_Power(v,w,z)
475 PyObject *v, *w, *z;
476{
477 PyObject *res;
478 PyObject *v1, *z1, *w2, *z2;
479
480 if (z == Py_None)
481 return do_pow(v, w);
482 /* XXX The ternary version doesn't do class instance coercions */
483 if (PyInstance_Check(v))
484 return v->ob_type->tp_as_number->nb_power(v, w, z);
485 if (v->ob_type->tp_as_number == NULL ||
486 z->ob_type->tp_as_number == NULL ||
487 w->ob_type->tp_as_number == NULL) {
488 PyErr_SetString(PyExc_TypeError, "pow() requires numeric arguments");
489 return NULL;
490 }
491 if (PyNumber_Coerce(&v, &w) != 0)
492 return NULL;
493 res = NULL;
494 v1 = v;
495 z1 = z;
496 if (PyNumber_Coerce(&v1, &z1) != 0)
497 goto error2;
498 w2 = w;
499 z2 = z1;
500 if (PyNumber_Coerce(&w2, &z2) != 0)
501 goto error1;
502 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
503 Py_DECREF(w2);
504 Py_DECREF(z2);
505 error1:
506 Py_DECREF(v1);
507 Py_DECREF(z1);
508 error2:
509 Py_DECREF(v);
510 Py_DECREF(w);
511 return res;
512}
513
514
515PyObject *
516PyNumber_Negative(v)
517 PyObject *v;
518{
519 if (v->ob_type->tp_as_number != NULL)
520 return (*v->ob_type->tp_as_number->nb_negative)(v);
521 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary -");
522 return NULL;
523}
524
525PyObject *
526PyNumber_Positive(v)
527 PyObject *v;
528{
529 if (v->ob_type->tp_as_number != NULL)
530 return (*v->ob_type->tp_as_number->nb_positive)(v);
531 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary +");
532 return NULL;
533}
534
535PyObject *
536PyNumber_Invert(v)
537 PyObject *v;
538{
539 PyObject * (*f) Py_FPROTO((PyObject *));
540 if (v->ob_type->tp_as_number != NULL &&
541 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
542 return (*f)(v);
543 PyErr_SetString(PyExc_TypeError, "bad operand type(s) for unary ~");
544 return NULL;
545}
546
547PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000548PyNumber_Absolute(o)
549 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000550{
551 PyNumberMethods *m;
552
553 if(! o) return Py_ReturnNullError();
554 if((m=o->ob_type->tp_as_number) && m->nb_absolute)
555 return m->nb_absolute(o);
556
557 return Py_ReturnMethodError("__abs__");
558}
559
560PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000561PyNumber_Int(o)
562 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000563{
564 PyNumberMethods *m;
565
566 if(! o) return Py_ReturnNullError();
567 if((m=o->ob_type->tp_as_number) && m->nb_int)
568 return m->nb_int(o);
569
570 return Py_ReturnMethodError("__int__");
571}
572
573PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000574PyNumber_Long(o)
575 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000576{
577 PyNumberMethods *m;
578
579 if(! o) return Py_ReturnNullError();
580 if((m=o->ob_type->tp_as_number) && m->nb_long)
581 return m->nb_long(o);
582
583 return Py_ReturnMethodError("__long__");
584}
585
586PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000587PyNumber_Float(o)
588 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000589{
590 PyNumberMethods *m;
591
592 if(! o) return Py_ReturnNullError();
593 if((m=o->ob_type->tp_as_number) && m->nb_float)
594 return m->nb_float(o);
595
596 return Py_ReturnMethodError("__float__");
597}
598
599
600int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000601PySequence_Check(o)
602 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000603{
604 return o && o->ob_type->tp_as_sequence;
605}
606
607int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000608PySequence_Length(s)
609 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000610{
611 PySequenceMethods *m;
612
613 if(! s) return Py_ReturnNullError(),-1;
614
615 if((m=s->ob_type->tp_as_sequence) && m->sq_length)
616 return m->sq_length(s);
617
618 Py_ReturnMethodError("__len__");
619 return -1;
620}
621
622PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000623PySequence_Concat(s, o)
624 PyObject *s;
625 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000626{
627 PySequenceMethods *m;
628
629 if(! s || ! o) return Py_ReturnNullError();
630
631 if((m=s->ob_type->tp_as_sequence) && m->sq_concat)
632 return m->sq_concat(s,o);
633
634 return Py_ReturnMethodError("__concat__");
635}
636
637PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000638PySequence_Repeat(o, count)
639 PyObject *o;
640 int count;
Guido van Rossume15dee51995-07-18 14:12:02 +0000641{
642 PySequenceMethods *m;
643
644 if(! o) return Py_ReturnNullError();
645
646 if((m=o->ob_type->tp_as_sequence) && m->sq_repeat)
647 return m->sq_repeat(o,count);
648
649 return Py_ReturnMethodError("__repeat__");
650}
651
652PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000653PySequence_GetItem(s, i)
654 PyObject *s;
655 int i;
Guido van Rossume15dee51995-07-18 14:12:02 +0000656{
657 PySequenceMethods *m;
658 int l;
659
660 if(! s) return Py_ReturnNullError();
661
662 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_item))
663 return Py_ReturnMethodError("__getitem__");
664
665 if(0 > (l=m->sq_length(s))) return NULL;
666
667 if(i < 0) i += l;
668
669 return m->sq_item(s,i);
670}
671
672PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000673PySequence_GetSlice(s, i1, i2)
674 PyObject *s;
675 int i1;
676 int i2;
Guido van Rossume15dee51995-07-18 14:12:02 +0000677{
678 PySequenceMethods *m;
679 int l;
680
681 if(! s) return Py_ReturnNullError();
682
683 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_slice))
684 return Py_ReturnMethodError("__getslice__");
685
686 if(0 > (l=m->sq_length(s))) return NULL;
687
688 if(i1 < 0) i1 += l;
689 if(i2 < 0) i2 += l;
690
691 return m->sq_slice(s,i1,i2);
692}
693
694int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000695PySequence_SetItem(s, i, o)
696 PyObject *s;
697 int i;
698 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000699{
700 PySequenceMethods *m;
701 int l;
702 if(! s) return Py_ReturnNullError(),-1;
703
704 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
705 return Py_ReturnMethodError("__setitem__"),-1;
706
707 if(i < 0)
708 {
709 if(0 > (l=m->sq_length(s))) return -1;
710 i += l;
711 }
712
713 return m->sq_ass_item(s,i,o);
714}
715
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000716int
717PySequence_DelItem(s, i)
718 PyObject *s;
719 int i;
720{
721 PySequenceMethods *m;
722 int l;
723 if(! s) return Py_ReturnNullError(),-1;
724
725 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_item))
726 return Py_ReturnMethodError("__delitem__"),-1;
727
728 if(i < 0)
729 {
730 if(0 > (l=m->sq_length(s))) return -1;
731 i += l;
732 }
733
734 return m->sq_ass_item(s,i,(PyObject*)NULL);
735}
736
Guido van Rossume15dee51995-07-18 14:12:02 +0000737int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000738PySequence_SetSlice(s, i1, i2, o)
739 PyObject *s;
740 int i1;
741 int i2;
742 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000743{
744 PySequenceMethods *m;
745 int l;
746
747 if(! s) return Py_ReturnNullError(),-1;
748
749 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
750 return Py_ReturnMethodError("__setslice__"),-1;
751
752 if(0 > (l=m->sq_length(s))) return -1;
753
754 if(i1 < 0) i1 += l;
755 if(i2 < 0) i2 += l;
756
757 return m->sq_ass_slice(s,i1,i2,o);
758}
759
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000760int
761PySequence_DelSlice(s, i1, i2)
762 PyObject *s;
763 int i1;
764 int i2;
765{
766 PySequenceMethods *m;
767 int l;
768
769 if(! s) return Py_ReturnNullError(),-1;
770
771 if(! ((m=s->ob_type->tp_as_sequence) && m->sq_length && m->sq_ass_slice))
772 return Py_ReturnMethodError("__delslice__"),-1;
773
774 if(0 > (l=m->sq_length(s))) return -1;
775
776 if(i1 < 0) i1 += l;
777 if(i2 < 0) i2 += l;
778
779 return m->sq_ass_slice(s,i1,i2,(PyObject*)NULL);
780}
781
Guido van Rossume15dee51995-07-18 14:12:02 +0000782PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000783PySequence_Tuple(s)
784 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000785{
786 int l, i;
787 PyObject *t, *item;
788
789 if(! s) return Py_ReturnNullError();
790
791 Py_TRY((l=PySequence_Length(s)) != -1);
792 Py_TRY(t=PyTuple_New(l));
793
794 for(i=0; i < l; i++)
795 {
796 if(item=PySequence_GetItem(s,i))
797 {
798 if(PyTuple_SetItem(t,i,item) == -1)
799 {
800 Py_DECREF(item);
801 Py_DECREF(t);
802 return NULL;
803 }
804 }
805 else
806 {
807 Py_DECREF(t);
808 return NULL;
809 }
810 }
811 return t;
812}
813
814int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000815PySequence_Count(s, o)
816 PyObject *s;
817 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000818{
819 int l, i, n=0, not_equal, err;
820 PyObject *item;
821
822 if(! s || ! o) return Py_ReturnNullError(), -1;
823 Py_TRY((l=PySequence_Length(s)) != -1),-1;
824
825 for(i=0; i < l; i++)
826 {
827 Py_TRY(item=PySequence_GetItem(s,i)),-1;
828 err=PyObject_Cmp(item,o,&not_equal) == -1;
829 Py_DECREF(item);
830 if(err) return -1;
831 n += ! not_equal;
832 }
833 return n;
834}
835
836int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000837PySequence_In(s, o)
838 PyObject *s;
839 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000840{
841 int l, i, not_equal, err;
842 PyObject *item;
843
844 if(! o || ! s) return Py_ReturnNullError(), -1;
845 Py_TRY((l=PySequence_Length(s)) != -1),-1;
846
847 for(i=0; i < l; i++)
848 {
849 Py_TRY(item=PySequence_GetItem(s,i)),-1;
850 err=PyObject_Cmp(item,o,&not_equal) == -1;
851 Py_DECREF(item);
852 if(err) return -1;
853 if(! not_equal) return 1;
854 }
855 return 0;
856}
857
858int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000859PySequence_Index(s, o)
860 PyObject *s;
861 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000862{
863 int l, i, n=0, not_equal, err;
864 PyObject *item;
865
866 if(! s || ! o) return Py_ReturnNullError(), -1;
867 Py_TRY((l=PySequence_Length(s)) != -1),-1;
868
869 for(i=0; i < l; i++)
870 {
871 Py_TRY(item=PySequence_GetItem(s,i)),-1;
872 err=PyObject_Cmp(item,o,&not_equal) == -1;
873 Py_DECREF(item);
874 if(err) return -1;
875 if(! not_equal) return n;
876 }
877 return -1;
878}
879
880int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000881PyMapping_Check(o)
882 PyObject *o;
Guido van Rossume15dee51995-07-18 14:12:02 +0000883{
884 return o && o->ob_type->tp_as_mapping;
885}
886
887int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000888PyMapping_Length(s)
889 PyObject *s;
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
891 PyMappingMethods *m;
892
893 if(! s) return Py_ReturnNullError(),-1;
894
895 if((m=s->ob_type->tp_as_mapping) && m->mp_length)
896 return m->mp_length(s);
897
898 Py_ReturnMethodError("__len__");
899 return -1;
900}
901
902int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000903PyMapping_HasKeyString(o, key)
904 PyObject *o;
905 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000906{
907 PyObject *v;
908
909 v=PyMapping_GetItemString(o,key);
910 if(v) return 1;
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000911 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000912 return 0;
913}
914
915int
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000916PyMapping_HasKey(o, key)
917 PyObject *o;
918 PyObject *key;
Guido van Rossume15dee51995-07-18 14:12:02 +0000919{
920 PyObject *v;
921
922 v=PyObject_GetItem(o,key);
923 if(v) return 1;
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000924 PyErr_Clear();
Guido van Rossume15dee51995-07-18 14:12:02 +0000925 return 0;
926}
927
928PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +0000929PyObject_CallObject(o, a)
930 PyObject *o, *a;
Guido van Rossume15dee51995-07-18 14:12:02 +0000931{
932 PyObject *r;
933
934 if(a) return PyEval_CallObject(o,a);
935
936 if(! (a=PyTuple_New(0)))
937 return NULL;
938 r=PyEval_CallObject(o,a);
939 Py_DECREF(a);
940 return r;
941}
942
943PyObject *
944#ifdef HAVE_STDARG_PROTOTYPES
945/* VARARGS 2 */
946PyObject_CallFunction(PyObject *callable, char *format, ...)
947#else
948/* VARARGS */
949PyObject_CallFunction(va_alist) va_dcl
950#endif
951{
952 va_list va;
953 PyObject *args, *retval;
954#ifdef HAVE_STDARG_PROTOTYPES
955 va_start(va, format);
956#else
957 PyObject *callable;
958 char *format;
959 va_start(va);
960 callable = va_arg(va, PyObject *);
961 format = va_arg(va, char *);
962#endif
963
964 if( ! callable)
965 {
966 va_end(va);
967 return Py_ReturnNullError();
968 }
969
970 if(format)
971 args = Py_VaBuildValue(format, va);
972 else
973 args = PyTuple_New(0);
974
975 va_end(va);
976 if(! args) return NULL;
977
978 if(! PyTuple_Check(args))
979 {
980 PyObject *a;
981
982 Py_TRY(a=PyTuple_New(1));
983 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
984 args=a;
985 }
986 retval = PyObject_CallObject(callable,args);
987 Py_DECREF(args);
988 return retval;
989}
990
991PyObject *
992#ifdef HAVE_STDARG_PROTOTYPES
993/* VARARGS 2 */
994PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
995#else
996/* VARARGS */
997PyObject_CallMethod(va_alist) va_dcl
998#endif
999{
1000 va_list va;
1001 PyObject *args, *method=0, *retval;
1002#ifdef HAVE_STDARG_PROTOTYPES
1003 va_start(va, format);
1004#else
1005 PyObject *o;
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001006 char *name;
Guido van Rossume15dee51995-07-18 14:12:02 +00001007 char *format;
1008 va_start(va);
1009 o = va_arg(va, PyObject *);
1010 name = va_arg(va, char *);
1011 format = va_arg(va, char *);
1012#endif
1013
1014 if( ! o || ! name)
1015 {
1016 va_end(va);
1017 return Py_ReturnNullError();
1018 }
1019
1020 method=PyObject_GetAttrString(o,name);
1021 if(! method)
1022 {
1023 va_end(va);
1024 PyErr_SetString(PyExc_AttributeError,name);
1025 return 0;
1026 }
1027
1028 if(! (PyCallable_Check(method)))
1029 {
1030 va_end(va);
1031 PyErr_SetString(PyExc_TypeError,"call of non-callable attribute");
1032 return 0;
1033 }
1034
1035 if(format)
1036 args = Py_VaBuildValue(format, va);
1037 else
1038 args = PyTuple_New(0);
1039
1040 va_end(va);
1041
1042 if(! args) return NULL;
1043
1044 if(! PyTuple_Check(args))
1045 {
1046 PyObject *a;
1047
1048 Py_TRY(a=PyTuple_New(1));
1049 Py_TRY(PyTuple_SetItem(a,0,args) != -1);
1050 args=a;
1051 }
1052
1053 retval = PyObject_CallObject(method,args);
1054 Py_DECREF(args);
1055 Py_DECREF(method);
1056 return retval;
1057}
1058
1059PyObject *
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001060PyMapping_GetItemString(o, key)
1061 PyObject *o;
1062 char *key;
Guido van Rossume15dee51995-07-18 14:12:02 +00001063{
1064 PyObject *okey, *r;
1065
1066 if( ! key) return Py_ReturnNullError();
1067 Py_TRY(okey=PyString_FromString(key));
1068 r = PyObject_GetItem(o,okey);
1069 Py_DECREF(okey);
1070 return r;
1071}
1072
1073int
Guido van Rossum8ba873b1995-09-18 21:17:59 +00001074PyMapping_SetItemString(o, key, value)
1075 PyObject *o;
1076 char *key;
1077 PyObject *value;
Guido van Rossume15dee51995-07-18 14:12:02 +00001078{
1079 PyObject *okey;
1080 int r;
1081
1082 if( ! key) return Py_ReturnNullError(),-1;
1083 if (!(okey=PyString_FromString(key))) return -1;
1084 r = PyObject_SetItem(o,okey,value);
1085 Py_DECREF(okey);
1086 return r;
1087}