annotate Objects/abstract.c @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 872afada51b0
children d17d10c84d27
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Abstract Object Interface (many thanks to Jim Fulton) */
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 #include "Python.h"
8412
4505160a7e5c Address some gcc -Wall warnings (e.g. include <ctype.h>).
Guido van Rossum <guido@python.org>
parents: 8400
diff changeset
4 #include <ctype.h>
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
5 #include "structmember.h" /* we need the offsetof() macro from there */
19837
5158e4789459 SF bug #460020: bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents: 19808
diff changeset
6 #include "longintrepr.h"
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
7
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
8 #define NEW_STYLE_NUMBER(o) PyType_HasFeature((o)->ob_type, \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
9 Py_TPFLAGS_CHECKTYPES)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
37702
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
11
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
12 /* Shorthands to return certain errors */
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
13
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
14 static PyObject *
38871
a3c61c648fc8 Patch #1507676: improve exception messages in abstract.c, object.c and typeobject.c.
Georg Brandl <georg@python.org>
parents: 38707
diff changeset
15 type_error(const char *msg, PyObject *obj)
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
16 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
17 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
18 return NULL;
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
19 }
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
20
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
21 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
22 null_error(void)
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
23 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
24 if (!PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
25 PyErr_SetString(PyExc_SystemError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
26 "null argument to internal routine");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
27 return NULL;
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
28 }
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
29
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
30 /* Operations on any object */
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
31
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
32 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
33 PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
34 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
35 int r;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
36
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
37 if (o1 == NULL || o2 == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
38 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
39 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
40 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
41 r = PyObject_Compare(o1, o2);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
42 if (PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
43 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
44 *result = r;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
45 return 0;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
49 PyObject_Type(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
51 PyObject *v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
52
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
53 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
54 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
55 v = (PyObject *)o->ob_type;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
56 Py_INCREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
57 return v;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
60 Py_ssize_t
13575
7c119f050290 change abstract size functions PySequence_Size &c.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13451
diff changeset
61 PyObject_Size(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
63 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
64
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
65 if (o == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
66 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
67 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
68 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
69
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
70 m = o->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
71 if (m && m->sq_length)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
72 return m->sq_length(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
73
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
74 return PyMapping_Size(o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
76
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
77 #undef PyObject_Length
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
78 Py_ssize_t
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
79 PyObject_Length(PyObject *o)
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
80 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
81 return PyObject_Size(o);
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
82 }
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
83 #define PyObject_Length PyObject_Size
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
84
44193
44c090c74202 Fix Issue 1045.
Raymond Hettinger <python@rcn.com>
parents: 44171
diff changeset
85
44c090c74202 Fix Issue 1045.
Raymond Hettinger <python@rcn.com>
parents: 44171
diff changeset
86 /* The length hint function returns a non-negative value from o.__len__()
44c090c74202 Fix Issue 1045.
Raymond Hettinger <python@rcn.com>
parents: 44171
diff changeset
87 or o.__length_hint__(). If those methods aren't found or return a negative
51282
ca71a44d5432 Issue 1242657: list(obj) can swallow KeyboardInterrupt
Raymond Hettinger <python@rcn.com>
parents: 48876
diff changeset
88 value, then the defaultvalue is returned. If one of the calls fails,
ca71a44d5432 Issue 1242657: list(obj) can swallow KeyboardInterrupt
Raymond Hettinger <python@rcn.com>
parents: 48876
diff changeset
89 this function returns -1.
44193
44c090c74202 Fix Issue 1045.
Raymond Hettinger <python@rcn.com>
parents: 44171
diff changeset
90 */
44c090c74202 Fix Issue 1045.
Raymond Hettinger <python@rcn.com>
parents: 44171
diff changeset
91
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
92 Py_ssize_t
44193
44c090c74202 Fix Issue 1045.
Raymond Hettinger <python@rcn.com>
parents: 44171
diff changeset
93 _PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35364
diff changeset
94 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
95 static PyObject *hintstrobj = NULL;
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
96 PyObject *ro, *hintmeth;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
97 Py_ssize_t rv;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
98
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
99 /* try o.__len__() */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
100 rv = PyObject_Size(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
101 if (rv >= 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
102 return rv;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
103 if (PyErr_Occurred()) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
104 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
105 !PyErr_ExceptionMatches(PyExc_AttributeError))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
106 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
107 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
108 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
109
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
110 if (PyInstance_Check(o))
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
111 return defaultvalue;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
112 /* try o.__length_hint__() */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
113 hintmeth = _PyObject_LookupSpecial(o, "__length_hint__", &hintstrobj);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
114 if (hintmeth == NULL) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
115 if (PyErr_Occurred())
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
116 return -1;
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
117 else
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
118 return defaultvalue;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
119 }
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
120 ro = PyObject_CallFunctionObjArgs(hintmeth, NULL);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
121 Py_DECREF(hintmeth);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
122 if (ro == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
123 if (!PyErr_ExceptionMatches(PyExc_TypeError) &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
124 !PyErr_ExceptionMatches(PyExc_AttributeError))
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
125 return -1;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
126 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
127 return defaultvalue;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
128 }
78102
872afada51b0 allow any number to be returned from __length_hint__ (closes #15354)
Benjamin Peterson <benjamin@python.org>
parents: 73627
diff changeset
129 rv = PyNumber_Check(ro) ? PyInt_AsSsize_t(ro) : defaultvalue;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
130 Py_DECREF(ro);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
131 return rv;
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35364
diff changeset
132 }
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35364
diff changeset
133
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
135 PyObject_GetItem(PyObject *o, PyObject *key)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
137 PyMappingMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
138
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
139 if (o == NULL || key == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
140 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
141
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
142 m = o->ob_type->tp_as_mapping;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
143 if (m && m->mp_subscript)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
144 return m->mp_subscript(o, key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
145
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
146 if (o->ob_type->tp_as_sequence) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
147 if (PyIndex_Check(key)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
148 Py_ssize_t key_value;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
149 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
150 if (key_value == -1 && PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
151 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
152 return PySequence_GetItem(o, key_value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
153 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
154 else if (o->ob_type->tp_as_sequence->sq_item)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
155 return type_error("sequence index must "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
156 "be integer, not '%.200s'", key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
157 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
158
73627
70a949f2a1cd Make an error message more understandable and consistent with other error messages.
Raymond Hettinger <python@rcn.com>
parents: 68256
diff changeset
159 return type_error("'%.200s' object has no attribute '__getitem__'", o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
161
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
163 PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
165 PyMappingMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
166
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
167 if (o == NULL || key == NULL || value == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
168 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
169 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
170 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
171 m = o->ob_type->tp_as_mapping;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
172 if (m && m->mp_ass_subscript)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
173 return m->mp_ass_subscript(o, key, value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
174
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
175 if (o->ob_type->tp_as_sequence) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
176 if (PyIndex_Check(key)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
177 Py_ssize_t key_value;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
178 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
179 if (key_value == -1 && PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
180 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
181 return PySequence_SetItem(o, key_value, value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
182 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
183 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
184 type_error("sequence index must be "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
185 "integer, not '%.200s'", key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
186 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
187 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
188 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
189
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
190 type_error("'%.200s' object does not support item assignment", o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
191 return -1;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
193
4090
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
194 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
195 PyObject_DelItem(PyObject *o, PyObject *key)
4090
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
196 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
197 PyMappingMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
198
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
199 if (o == NULL || key == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
200 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
201 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
202 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
203 m = o->ob_type->tp_as_mapping;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
204 if (m && m->mp_ass_subscript)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
205 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
206
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
207 if (o->ob_type->tp_as_sequence) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
208 if (PyIndex_Check(key)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
209 Py_ssize_t key_value;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
210 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
211 if (key_value == -1 && PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
212 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
213 return PySequence_DelItem(o, key_value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
214 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
215 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
216 type_error("sequence index must be "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
217 "integer, not '%.200s'", key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
218 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
219 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
220 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
221
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
222 type_error("'%.200s' object does not support item deletion", o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
223 return -1;
4090
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
224 }
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
225
21644
3c0bd2f37a78 Implement PyObject_DelItemString. Fixes #498915.
Martin v. Löwis <martin@v.loewis.de>
parents: 21044
diff changeset
226 int
3c0bd2f37a78 Implement PyObject_DelItemString. Fixes #498915.
Martin v. Löwis <martin@v.loewis.de>
parents: 21044
diff changeset
227 PyObject_DelItemString(PyObject *o, char *key)
3c0bd2f37a78 Implement PyObject_DelItemString. Fixes #498915.
Martin v. Löwis <martin@v.loewis.de>
parents: 21044
diff changeset
228 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
229 PyObject *okey;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
230 int ret;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
231
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
232 if (o == NULL || key == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
233 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
234 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
235 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
236 okey = PyString_FromString(key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
237 if (okey == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
238 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
239 ret = PyObject_DelItem(o, okey);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
240 Py_DECREF(okey);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
241 return ret;
21644
3c0bd2f37a78 Implement PyObject_DelItemString. Fixes #498915.
Martin v. Löwis <martin@v.loewis.de>
parents: 21044
diff changeset
242 }
3c0bd2f37a78 Implement PyObject_DelItemString. Fixes #498915.
Martin v. Löwis <martin@v.loewis.de>
parents: 21044
diff changeset
243
38632
931ad06bec56 Fix coding style guide bug.
Brett Cannon <bcannon@gmail.com>
parents: 37813
diff changeset
244 int
931ad06bec56 Fix coding style guide bug.
Brett Cannon <bcannon@gmail.com>
parents: 37813
diff changeset
245 PyObject_AsCharBuffer(PyObject *obj,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
246 const char **buffer,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
247 Py_ssize_t *buffer_len)
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
248 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
249 PyBufferProcs *pb;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
250 char *pp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
251 Py_ssize_t len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
252
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
253 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
254 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
255 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
256 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
257 pb = obj->ob_type->tp_as_buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
258 if (pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
259 pb->bf_getcharbuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
260 pb->bf_getsegcount == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
261 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
262 "expected a character buffer object");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
263 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
264 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
265 if ((*pb->bf_getsegcount)(obj,NULL) != 1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
266 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
267 "expected a single-segment buffer object");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
268 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
269 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
270 len = (*pb->bf_getcharbuffer)(obj, 0, &pp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
271 if (len < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
272 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
273 *buffer = pp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
274 *buffer_len = len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
275 return 0;
20946
ef12c9ddefa7 Add PyObject_CheckReadBuffer(), which returns true if its argument
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20824
diff changeset
276 }
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
277
20946
ef12c9ddefa7 Add PyObject_CheckReadBuffer(), which returns true if its argument
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20824
diff changeset
278 int
ef12c9ddefa7 Add PyObject_CheckReadBuffer(), which returns true if its argument
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20824
diff changeset
279 PyObject_CheckReadBuffer(PyObject *obj)
ef12c9ddefa7 Add PyObject_CheckReadBuffer(), which returns true if its argument
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20824
diff changeset
280 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
281 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
282
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
283 if (pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
284 pb->bf_getreadbuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
285 pb->bf_getsegcount == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
286 (*pb->bf_getsegcount)(obj, NULL) != 1)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
287 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
288 return 1;
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
289 }
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
290
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
291 int PyObject_AsReadBuffer(PyObject *obj,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
292 const void **buffer,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
293 Py_ssize_t *buffer_len)
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
294 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
295 PyBufferProcs *pb;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
296 void *pp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
297 Py_ssize_t len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
298
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
299 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
300 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
301 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
302 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
303 pb = obj->ob_type->tp_as_buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
304 if (pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
305 pb->bf_getreadbuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
306 pb->bf_getsegcount == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
307 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
308 "expected a readable buffer object");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
309 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
310 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
311 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
312 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
313 "expected a single-segment buffer object");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
314 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
315 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
316 len = (*pb->bf_getreadbuffer)(obj, 0, &pp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
317 if (len < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
318 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
319 *buffer = pp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
320 *buffer_len = len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
321 return 0;
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
322 }
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
323
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
324 int PyObject_AsWriteBuffer(PyObject *obj,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
325 void **buffer,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
326 Py_ssize_t *buffer_len)
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
327 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
328 PyBufferProcs *pb;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
329 void*pp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
330 Py_ssize_t len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
331
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
332 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
333 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
334 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
335 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
336 pb = obj->ob_type->tp_as_buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
337 if (pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
338 pb->bf_getwritebuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
339 pb->bf_getsegcount == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
340 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
341 "expected a writeable buffer object");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
342 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
343 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
344 if ((*pb->bf_getsegcount)(obj, NULL) != 1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
345 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
346 "expected a single-segment buffer object");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
347 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
348 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
349 len = (*pb->bf_getwritebuffer)(obj,0,&pp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
350 if (len < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
351 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
352 *buffer = pp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
353 *buffer_len = len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
354 return 0;
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
355 }
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
356
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
357 /* Buffer C-API for Python 3.0 */
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
358
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
359 int
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
360 PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
361 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
362 if (!PyObject_CheckBuffer(obj)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
363 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
364 "'%100s' does not have the buffer interface",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
365 Py_TYPE(obj)->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
366 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
367 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
368 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
369 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
370
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
371 static int
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
372 _IsFortranContiguous(Py_buffer *view)
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
373 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
374 Py_ssize_t sd, dim;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
375 int i;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
376
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
377 if (view->ndim == 0) return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
378 if (view->strides == NULL) return (view->ndim == 1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
379
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
380 sd = view->itemsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
381 if (view->ndim == 1) return (view->shape[0] == 1 ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
382 sd == view->strides[0]);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
383 for (i=0; i<view->ndim; i++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
384 dim = view->shape[i];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
385 if (dim == 0) return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
386 if (view->strides[i] != sd) return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
387 sd *= dim;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
388 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
389 return 1;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
390 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
391
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
392 static int
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
393 _IsCContiguous(Py_buffer *view)
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
394 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
395 Py_ssize_t sd, dim;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
396 int i;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
397
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
398 if (view->ndim == 0) return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
399 if (view->strides == NULL) return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
400
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
401 sd = view->itemsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
402 if (view->ndim == 1) return (view->shape[0] == 1 ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
403 sd == view->strides[0]);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
404 for (i=view->ndim-1; i>=0; i--) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
405 dim = view->shape[i];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
406 if (dim == 0) return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
407 if (view->strides[i] != sd) return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
408 sd *= dim;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
409 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
410 return 1;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
411 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
412
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
413 int
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
414 PyBuffer_IsContiguous(Py_buffer *view, char fort)
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
415 {
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
416
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
417 if (view->suboffsets != NULL) return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
418
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
419 if (fort == 'C')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
420 return _IsCContiguous(view);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
421 else if (fort == 'F')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
422 return _IsFortranContiguous(view);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
423 else if (fort == 'A')
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
424 return (_IsCContiguous(view) || _IsFortranContiguous(view));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
425 return 0;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
426 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
427
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
428
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
429 void*
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
430 PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
431 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
432 char* pointer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
433 int i;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
434 pointer = (char *)view->buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
435 for (i = 0; i < view->ndim; i++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
436 pointer += view->strides[i]*indices[i];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
437 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
438 pointer = *((char**)pointer) + view->suboffsets[i];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
439 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
440 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
441 return (void*)pointer;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
442 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
443
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
444
52749
75efd757434b Issue #2396: backport the memoryview object.
Antoine Pitrou <solipsis@pitrou.net>
parents: 51775
diff changeset
445 void
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
446 _Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
447 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
448 int k;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
449
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
450 for (k=0; k<nd; k++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
451 if (index[k] < shape[k]-1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
452 index[k]++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
453 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
454 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
455 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
456 index[k] = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
457 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
458 }
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
459 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
460
52749
75efd757434b Issue #2396: backport the memoryview object.
Antoine Pitrou <solipsis@pitrou.net>
parents: 51775
diff changeset
461 void
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
462 _Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
463 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
464 int k;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
466 for (k=nd-1; k>=0; k--) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
467 if (index[k] < shape[k]-1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
468 index[k]++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
469 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
470 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
471 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
472 index[k] = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
473 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
474 }
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
475 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
476
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
477 /* view is not checked for consistency in either of these. It is
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
478 assumed that the size of the buffer is view->len in
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
479 view->len / view->itemsize elements.
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
480 */
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
481
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
482 int
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
483 PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
484 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
485 int k;
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
486 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
487 Py_ssize_t *indices, elements;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
488 char *dest, *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
489
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
490 if (len > view->len) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
491 len = view->len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
492 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
493
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
494 if (PyBuffer_IsContiguous(view, fort)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
495 /* simplest copy is all that is needed */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
496 memcpy(buf, view->buf, len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
497 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
498 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
499
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
500 /* Otherwise a more elaborate scheme is needed */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
501
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
502 /* XXX(nnorwitz): need to check for overflow! */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
503 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
504 if (indices == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
505 PyErr_NoMemory();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
506 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
507 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
508 for (k=0; k<view->ndim;k++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
509 indices[k] = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
510 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
511
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
512 if (fort == 'F') {
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
513 addone = _Py_add_one_to_index_F;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
514 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
515 else {
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
516 addone = _Py_add_one_to_index_C;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
517 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
518 dest = buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
519 /* XXX : This is not going to be the fastest code in the world
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
520 several optimizations are possible.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
521 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
522 elements = len / view->itemsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
523 while (elements--) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
524 addone(view->ndim, indices, view->shape);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
525 ptr = PyBuffer_GetPointer(view, indices);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
526 memcpy(dest, ptr, view->itemsize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
527 dest += view->itemsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
528 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
529 PyMem_Free(indices);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
530 return 0;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
531 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
532
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
533 int
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
534 PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
535 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
536 int k;
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
537 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
538 Py_ssize_t *indices, elements;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
539 char *src, *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
540
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
541 if (len > view->len) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
542 len = view->len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
543 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
544
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
545 if (PyBuffer_IsContiguous(view, fort)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
546 /* simplest copy is all that is needed */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
547 memcpy(view->buf, buf, len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
548 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
549 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
550
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
551 /* Otherwise a more elaborate scheme is needed */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
552
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
553 /* XXX(nnorwitz): need to check for overflow! */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
554 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
555 if (indices == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
556 PyErr_NoMemory();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
557 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
558 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
559 for (k=0; k<view->ndim;k++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
560 indices[k] = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
561 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
562
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
563 if (fort == 'F') {
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
564 addone = _Py_add_one_to_index_F;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
565 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
566 else {
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
567 addone = _Py_add_one_to_index_C;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
568 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
569 src = buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
570 /* XXX : This is not going to be the fastest code in the world
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
571 several optimizations are possible.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
572 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
573 elements = len / view->itemsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
574 while (elements--) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
575 addone(view->ndim, indices, view->shape);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
576 ptr = PyBuffer_GetPointer(view, indices);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
577 memcpy(ptr, src, view->itemsize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
578 src += view->itemsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
579 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
580
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
581 PyMem_Free(indices);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
582 return 0;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
583 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
584
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
585 int PyObject_CopyData(PyObject *dest, PyObject *src)
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
586 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
587 Py_buffer view_dest, view_src;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
588 int k;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
589 Py_ssize_t *indices, elements;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
590 char *dptr, *sptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
591
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
592 if (!PyObject_CheckBuffer(dest) ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
593 !PyObject_CheckBuffer(src)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
594 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
595 "both destination and source must have the "\
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
596 "buffer interface");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
597 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
598 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
599
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
600 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
601 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
602 PyBuffer_Release(&view_dest);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
603 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
604 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
605
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
606 if (view_dest.len < view_src.len) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
607 PyErr_SetString(PyExc_BufferError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
608 "destination is too small to receive data from source");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
609 PyBuffer_Release(&view_dest);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
610 PyBuffer_Release(&view_src);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
611 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
612 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
613
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
614 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
615 PyBuffer_IsContiguous(&view_src, 'C')) ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
616 (PyBuffer_IsContiguous(&view_dest, 'F') &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
617 PyBuffer_IsContiguous(&view_src, 'F'))) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
618 /* simplest copy is all that is needed */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
619 memcpy(view_dest.buf, view_src.buf, view_src.len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
620 PyBuffer_Release(&view_dest);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
621 PyBuffer_Release(&view_src);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
622 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
623 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
624
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
625 /* Otherwise a more elaborate copy scheme is needed */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
626
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
627 /* XXX(nnorwitz): need to check for overflow! */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
628 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
629 if (indices == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
630 PyErr_NoMemory();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
631 PyBuffer_Release(&view_dest);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
632 PyBuffer_Release(&view_src);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
633 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
634 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
635 for (k=0; k<view_src.ndim;k++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
636 indices[k] = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
637 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
638 elements = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
639 for (k=0; k<view_src.ndim; k++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
640 /* XXX(nnorwitz): can this overflow? */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
641 elements *= view_src.shape[k];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
642 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
643 while (elements--) {
64345
da19d02aaaaa Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62089
diff changeset
644 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
645 dptr = PyBuffer_GetPointer(&view_dest, indices);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
646 sptr = PyBuffer_GetPointer(&view_src, indices);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
647 memcpy(dptr, sptr, view_src.itemsize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
648 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
649 PyMem_Free(indices);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
650 PyBuffer_Release(&view_dest);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
651 PyBuffer_Release(&view_src);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
652 return 0;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
653 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
654
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
655 void
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
656 PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
657 Py_ssize_t *strides, int itemsize,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
658 char fort)
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
659 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
660 int k;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
661 Py_ssize_t sd;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
662
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
663 sd = itemsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
664 if (fort == 'F') {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
665 for (k=0; k<nd; k++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
666 strides[k] = sd;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
667 sd *= shape[k];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
668 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
669 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
670 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
671 for (k=nd-1; k>=0; k--) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
672 strides[k] = sd;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
673 sd *= shape[k];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
674 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
675 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
676 return;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
677 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
678
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
679 int
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 47910
diff changeset
680 PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
681 int readonly, int flags)
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
682 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
683 if (view == NULL) return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
684 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
685 (readonly == 1)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
686 PyErr_SetString(PyExc_BufferError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
687 "Object is not writable.");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
688 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
689 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
690
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
691 view->obj = obj;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
692 if (obj)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
693 Py_INCREF(obj);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
694 view->buf = buf;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
695 view->len = len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
696 view->readonly = readonly;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
697 view->itemsize = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
698 view->format = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
699 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
700 view->format = "B";
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
701 view->ndim = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
702 view->shape = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
703 if ((flags & PyBUF_ND) == PyBUF_ND)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
704 view->shape = &(view->len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
705 view->strides = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
706 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
707 view->strides = &(view->itemsize);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
708 view->suboffsets = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
709 view->internal = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
710 return 0;
45832
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
711 }
5c0b5cabeec9 Finish backporting new buffer API to Python 2.6. Left to do: memoryview object and structmodule. But, these need to be finished in Python 3.0 first. No objects support the new buffer API in Python 2.6 as of yet, and except for the memoryview object, I don't think they will.
Travis E. Oliphant <oliphant@enthought.com>
parents: 45381
diff changeset
712
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 47910
diff changeset
713 void
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 47910
diff changeset
714 PyBuffer_Release(Py_buffer *view)
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 47910
diff changeset
715 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
716 PyObject *obj = view->obj;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
717 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
718 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
719 Py_XDECREF(obj);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
720 view->obj = NULL;
48221
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 47910
diff changeset
721 }
b8c4bf393794 Issue #3139: Make buffer-interface thread-safe wrt. PyArg_ParseTuple,
Martin v. Löwis <martin@v.loewis.de>
parents: 47910
diff changeset
722
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45359
diff changeset
723 PyObject *
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45359
diff changeset
724 PyObject_Format(PyObject* obj, PyObject *format_spec)
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45359
diff changeset
725 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
726 PyObject *empty = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
727 PyObject *result = NULL;
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
728 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
729 int spec_is_unicode;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
730 int result_is_unicode;
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
731 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
732
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
733 /* If no format_spec is provided, use an empty string */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
734 if (format_spec == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
735 empty = PyString_FromStringAndSize(NULL, 0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
736 format_spec = empty;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
737 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
738
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
739 /* Check the format_spec type, and make sure it's str or unicode */
51034
21cf96cc2216 Fixed compile error on windows.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51032
diff changeset
740 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
741 if (PyUnicode_Check(format_spec))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
742 spec_is_unicode = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
743 else if (PyString_Check(format_spec))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
744 spec_is_unicode = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
745 else {
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
746 #else
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
747 if (!PyString_Check(format_spec)) {
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
748 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
749 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
750 "format expects arg 2 to be string "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
751 "or unicode, not %.100s", Py_TYPE(format_spec)->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
752 goto done;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
753 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
754
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
755 /* Check for a __format__ method and call it. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
756 if (PyInstance_Check(obj)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
757 /* We're an instance of a classic class */
62083
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
758 PyObject *bound_method = PyObject_GetAttrString(obj, "__format__");
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
759 if (bound_method != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
760 result = PyObject_CallFunctionObjArgs(bound_method,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
761 format_spec,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
762 NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
763 Py_DECREF(bound_method);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
764 } else {
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
765 PyObject *self_as_str = NULL;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
766 PyObject *format_method = NULL;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
767 Py_ssize_t format_len;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
768
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
769 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
770 /* Per the PEP, convert to str (or unicode,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
771 depending on the type of the format
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
772 specifier). For new-style classes, this
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
773 logic is done by object.__format__(). */
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
774 #ifdef Py_USING_UNICODE
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
775 if (spec_is_unicode) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
776 format_len = PyUnicode_GET_SIZE(format_spec);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
777 self_as_str = PyObject_Unicode(obj);
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
778 } else
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
779 #endif
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
780 {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
781 format_len = PyString_GET_SIZE(format_spec);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
782 self_as_str = PyObject_Str(obj);
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
783 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
784 if (self_as_str == NULL)
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
785 goto done1;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
786
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
787 if (format_len > 0) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
788 /* See the almost identical code in
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
789 typeobject.c for new-style
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
790 classes. */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
791 if (PyErr_WarnEx(
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
792 PyExc_PendingDeprecationWarning,
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
793 "object.__format__ with a non-empty "
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
794 "format string is deprecated", 1)
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
795 < 0) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
796 goto done1;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
797 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
798 /* Eventually this will become an
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
799 error:
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
800 PyErr_Format(PyExc_TypeError,
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
801 "non-empty format string passed to "
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
802 "object.__format__");
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
803 goto done1;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
804 */
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
805 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
806
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
807 /* Then call str.__format__ on that result */
62083
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
808 format_method = PyObject_GetAttrString(self_as_str, "__format__");
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
809 if (format_method == NULL) {
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
810 goto done1;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
811 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
812 result = PyObject_CallFunctionObjArgs(format_method,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
813 format_spec,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
814 NULL);
60162
20497d85e011 Issue 7994: Make object.__format__ with a non-empty format string a PendingDecprecationWarning. Still need to remove uses of this from various tests.
Eric Smith <eric@trueblade.com>
parents: 57631
diff changeset
815 done1:
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
816 Py_XDECREF(self_as_str);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
817 Py_XDECREF(format_method);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
818 if (result == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
819 goto done;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
820 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
821 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
822 /* Not an instance of a classic class, use the code
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
823 from py3k */
62084
d7541a490cbd remove PyType_Ready call; float should be initialized in interpreter startup
Benjamin Peterson <benjamin@python.org>
parents: 62083
diff changeset
824 static PyObject *format_cache = NULL;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
825
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
826 /* Find the (unbound!) __format__ method (a borrowed
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
827 reference) */
62083
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
828 PyObject *method = _PyObject_LookupSpecial(obj, "__format__",
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
829 &format_cache);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
830 if (method == NULL) {
62083
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
831 if (!PyErr_Occurred())
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
832 PyErr_Format(PyExc_TypeError,
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
833 "Type %.100s doesn't define __format__",
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
834 Py_TYPE(obj)->tp_name);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
835 goto done;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
836 }
62083
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
837 /* And call it. */
09176d0bde38 properly lookup the __format__ special method
Benjamin Peterson <benjamin@python.org>
parents: 61463
diff changeset
838 result = PyObject_CallFunctionObjArgs(method, format_spec, NULL);
62089
dda9bee5c84a _PyObject_LookupSpecial returns a new reference
Benjamin Peterson <benjamin@python.org>
parents: 62084
diff changeset
839 Py_DECREF(method);
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
840 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
841
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
842 if (result == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
843 goto done;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
844
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
845 /* Check the result type, and make sure it's str or unicode */
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
846 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
847 if (PyUnicode_Check(result))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
848 result_is_unicode = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
849 else if (PyString_Check(result))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
850 result_is_unicode = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
851 else {
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
852 #else
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
853 if (!PyString_Check(result)) {
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
854 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
855 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
856 "%.100s.__format__ must return string or "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
857 "unicode, not %.100s", Py_TYPE(obj)->tp_name,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
858 Py_TYPE(result)->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
859 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
860 result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
861 goto done;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
862 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
863
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
864 /* Convert to unicode, if needed. Required if spec is unicode
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
865 and result is str */
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
866 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
867 if (spec_is_unicode && !result_is_unicode) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
868 PyObject *tmp = PyObject_Unicode(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
869 /* This logic works whether or not tmp is NULL */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
870 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
871 result = tmp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
872 }
51032
551257c8058a fix building the core with --disable-unicode
Benjamin Peterson <benjamin@python.org>
parents: 50754
diff changeset
873 #endif
45381
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45359
diff changeset
874
b7231bf6bfb7 Backport of PEP 3101, Advanced String Formatting, from py3k.
Eric Smith <eric@trueblade.com>
parents: 45359
diff changeset
875 done:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
876 Py_XDECREF(empty);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
877 return result;
11969
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
878 }
74b7213fb609 Many changes for Unicode, by Marc-Andre Lemburg.
Guido van Rossum <guido@python.org>
parents: 11943
diff changeset
879
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
880 /* Operations on numbers */
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
881
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
882 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
883 PyNumber_Check(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
884 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
885 return o && o->ob_type->tp_as_number &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
886 (o->ob_type->tp_as_number->nb_int ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
887 o->ob_type->tp_as_number->nb_float);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
888 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
889
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
890 /* Binary operators */
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
891
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
892 /* New style number protocol support */
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
893
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
894 #define NB_SLOT(x) offsetof(PyNumberMethods, x)
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
895 #define NB_BINOP(nb_methods, slot) \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
896 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
897 #define NB_TERNOP(nb_methods, slot) \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
898 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
899
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
900 /*
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
901 Calling scheme used for binary operations:
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
902
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
903 v w Action
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
904 -------------------------------------------------------------------
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
905 new new w.op(v,w)[*], v.op(v,w), w.op(v,w)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
906 new old v.op(v,w), coerce(v,w), v.op(v,w)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
907 old new w.op(v,w), coerce(v,w), v.op(v,w)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
908 old old coerce(v,w), v.op(v,w)
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
909
20169
abd6a08b2c32 It's a fact: for binary operators, *under certain circumstances*,
Guido van Rossum <guido@python.org>
parents: 19910
diff changeset
910 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
abd6a08b2c32 It's a fact: for binary operators, *under certain circumstances*,
Guido van Rossum <guido@python.org>
parents: 19910
diff changeset
911 v->ob_type
abd6a08b2c32 It's a fact: for binary operators, *under certain circumstances*,
Guido van Rossum <guido@python.org>
parents: 19910
diff changeset
912
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
913 Legend:
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
914 -------
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
915 * new == new style number
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
916 * old == old style number
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
917 * Action indicates the order in which operations are tried until either
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
918 a valid result is produced or an error occurs.
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
919
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
920 */
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
921
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
922 static PyObject *
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
923 binary_op1(PyObject *v, PyObject *w, const int op_slot)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
924 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
925 PyObject *x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
926 binaryfunc slotv = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
927 binaryfunc slotw = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
928
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
929 if (v->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(v))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
930 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
931 if (w->ob_type != v->ob_type &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
932 w->ob_type->tp_as_number != NULL && NEW_STYLE_NUMBER(w)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
933 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
934 if (slotw == slotv)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
935 slotw = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
936 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
937 if (slotv) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
938 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
939 x = slotw(v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
940 if (x != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
941 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
942 Py_DECREF(x); /* can't do it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
943 slotw = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
944 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
945 x = slotv(v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
946 if (x != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
947 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
948 Py_DECREF(x); /* can't do it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
949 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
950 if (slotw) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
951 x = slotw(v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
952 if (x != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
953 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
954 Py_DECREF(x); /* can't do it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
955 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
956 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
957 int err = PyNumber_CoerceEx(&v, &w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
958 if (err < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
959 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
960 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
961 if (err == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
962 PyNumberMethods *mv = v->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
963 if (mv) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
964 binaryfunc slot;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
965 slot = NB_BINOP(mv, op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
966 if (slot) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
967 x = slot(v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
968 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
969 Py_DECREF(w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
970 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
971 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
972 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
973 /* CoerceEx incremented the reference counts */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
974 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
975 Py_DECREF(w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
976 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
977 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
978 Py_INCREF(Py_NotImplemented);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
979 return Py_NotImplemented;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
980 }
23089
314f92a24293 Whitespace normalization and fold some long lines.
Guido van Rossum <guido@python.org>
parents: 22194
diff changeset
981
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
982 static PyObject *
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
983 binop_type_error(PyObject *v, PyObject *w, const char *op_name)
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
984 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
985 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
986 "unsupported operand type(s) for %.100s: "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
987 "'%.100s' and '%.100s'",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
988 op_name,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
989 v->ob_type->tp_name,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
990 w->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
991 return NULL;
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
992 }
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
993
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
994 static PyObject *
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
995 binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
996 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
997 PyObject *result = binary_op1(v, w, op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
998 if (result == Py_NotImplemented) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
999 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1000 return binop_type_error(v, w, op_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1001 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1002 return result;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1003 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1005
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1006 /*
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1007 Calling scheme used for ternary operations:
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1008
20172
de3e851818a4 The changes to ternary_op could cause a core dump. Fix this, and
Guido van Rossum <guido@python.org>
parents: 20169
diff changeset
1009 *** In some cases, w.op is called before v.op; see binary_op1. ***
de3e851818a4 The changes to ternary_op could cause a core dump. Fix this, and
Guido van Rossum <guido@python.org>
parents: 20169
diff changeset
1010
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1011 v w z Action
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1012 -------------------------------------------------------------------
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1013 new new new v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1014 new old new v.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1015 old new new w.op(v,w,z), z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1016 old old new z.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1017 new new old v.op(v,w,z), w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1018 new old old v.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1019 old new old w.op(v,w,z), coerce(v,w,z), v.op(v,w,z)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1020 old old old coerce(v,w,z), v.op(v,w,z)
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1021
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1022 Legend:
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1023 -------
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1024 * new == new style number
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1025 * old == old style number
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1026 * Action indicates the order in which operations are tried until either
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1027 a valid result is produced or an error occurs.
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1028 * coerce(v,w,z) actually does: coerce(v,w), coerce(v,z), coerce(w,z) and
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1029 only if z != Py_None; if z == Py_None, then it is treated as absent
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1030 variable and only coerce(v,w) is tried.
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1031
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1032 */
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1033
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1034 static PyObject *
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1035 ternary_op(PyObject *v,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1036 PyObject *w,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1037 PyObject *z,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1038 const int op_slot,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1039 const char *op_name)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1040 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1041 PyNumberMethods *mv, *mw, *mz;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1042 PyObject *x = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1043 ternaryfunc slotv = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1044 ternaryfunc slotw = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1045 ternaryfunc slotz = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1046
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1047 mv = v->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1048 mw = w->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1049 if (mv != NULL && NEW_STYLE_NUMBER(v))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1050 slotv = NB_TERNOP(mv, op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1051 if (w->ob_type != v->ob_type &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1052 mw != NULL && NEW_STYLE_NUMBER(w)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1053 slotw = NB_TERNOP(mw, op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1054 if (slotw == slotv)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1055 slotw = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1056 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1057 if (slotv) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1058 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1059 x = slotw(v, w, z);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1060 if (x != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1061 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1062 Py_DECREF(x); /* can't do it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1063 slotw = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1064 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1065 x = slotv(v, w, z);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1066 if (x != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1067 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1068 Py_DECREF(x); /* can't do it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1069 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1070 if (slotw) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1071 x = slotw(v, w, z);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1072 if (x != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1073 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1074 Py_DECREF(x); /* can't do it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1075 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1076 mz = z->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1077 if (mz != NULL && NEW_STYLE_NUMBER(z)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1078 slotz = NB_TERNOP(mz, op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1079 if (slotz == slotv || slotz == slotw)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1080 slotz = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1081 if (slotz) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1082 x = slotz(v, w, z);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1083 if (x != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1084 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1085 Py_DECREF(x); /* can't do it */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1086 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1087 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1088
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1089 if (!NEW_STYLE_NUMBER(v) || !NEW_STYLE_NUMBER(w) ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1090 (z != Py_None && !NEW_STYLE_NUMBER(z))) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1091 /* we have an old style operand, coerce */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1092 PyObject *v1, *z1, *w2, *z2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1093 int c;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1094
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1095 c = PyNumber_Coerce(&v, &w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1096 if (c != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1097 goto error3;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1098
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1099 /* Special case: if the third argument is None, it is
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1100 treated as absent argument and not coerced. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1101 if (z == Py_None) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1102 if (v->ob_type->tp_as_number) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1103 slotz = NB_TERNOP(v->ob_type->tp_as_number,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1104 op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1105 if (slotz)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1106 x = slotz(v, w, z);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1107 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1108 c = -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1109 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1110 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1111 c = -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1112 goto error2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1113 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1114 v1 = v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1115 z1 = z;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1116 c = PyNumber_Coerce(&v1, &z1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1117 if (c != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1118 goto error2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1119 w2 = w;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1120 z2 = z1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1121 c = PyNumber_Coerce(&w2, &z2);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1122 if (c != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1123 goto error1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1124
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1125 if (v1->ob_type->tp_as_number != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1126 slotv = NB_TERNOP(v1->ob_type->tp_as_number,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1127 op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1128 if (slotv)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1129 x = slotv(v1, w2, z2);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1130 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1131 c = -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1132 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1133 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1134 c = -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1135
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1136 Py_DECREF(w2);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1137 Py_DECREF(z2);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1138 error1:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1139 Py_DECREF(v1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1140 Py_DECREF(z1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1141 error2:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1142 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1143 Py_DECREF(w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1144 error3:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1145 if (c >= 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1146 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1147 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1148
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1149 if (z == Py_None)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1150 PyErr_Format(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1151 PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1152 "unsupported operand type(s) for ** or pow(): "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1153 "'%.100s' and '%.100s'",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1154 v->ob_type->tp_name,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1155 w->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1156 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1157 PyErr_Format(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1158 PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1159 "unsupported operand type(s) for pow(): "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1160 "'%.100s', '%.100s', '%.100s'",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1161 v->ob_type->tp_name,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1162 w->ob_type->tp_name,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1163 z->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1164 return NULL;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1165 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1166
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1167 #define BINARY_FUNC(func, op, op_name) \
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1168 PyObject * \
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1169 func(PyObject *v, PyObject *w) { \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1170 return binary_op(v, w, NB_SLOT(op), op_name); \
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1171 }
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1172
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1173 BINARY_FUNC(PyNumber_Or, nb_or, "|")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1174 BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1175 BINARY_FUNC(PyNumber_And, nb_and, "&")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1176 BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1177 BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1178 BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1179 BINARY_FUNC(PyNumber_Divide, nb_divide, "/")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1180 BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1181
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1182 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1183 PyNumber_Add(PyObject *v, PyObject *w)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1184 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1185 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1186 if (result == Py_NotImplemented) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1187 PySequenceMethods *m = v->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1188 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1189 if (m && m->sq_concat) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1190 return (*m->sq_concat)(v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1191 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1192 result = binop_type_error(v, w, "+");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1193 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1194 return result;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1195 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1196
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1197 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1198 sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1199 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1200 Py_ssize_t count;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1201 if (PyIndex_Check(n)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1202 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1203 if (count == -1 && PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1204 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1205 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1206 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1207 return type_error("can't multiply sequence by "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1208 "non-int of type '%.200s'", n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1209 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1210 return (*repeatfunc)(seq, count);
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1211 }
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1212
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1213 PyObject *
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1214 PyNumber_Multiply(PyObject *v, PyObject *w)
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1215 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1216 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1217 if (result == Py_NotImplemented) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1218 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1219 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1220 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1221 if (mv && mv->sq_repeat) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1222 return sequence_repeat(mv->sq_repeat, v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1223 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1224 else if (mw && mw->sq_repeat) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1225 return sequence_repeat(mw->sq_repeat, w, v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1226 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1227 result = binop_type_error(v, w, "*");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1228 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1229 return result;
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1230 }
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1231
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1232 PyObject *
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1233 PyNumber_FloorDivide(PyObject *v, PyObject *w)
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1234 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1235 /* XXX tp_flags test */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1236 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1237 }
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1238
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1239 PyObject *
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1240 PyNumber_TrueDivide(PyObject *v, PyObject *w)
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1241 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1242 /* XXX tp_flags test */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1243 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1244 }
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1245
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1246 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1247 PyNumber_Remainder(PyObject *v, PyObject *w)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1248 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1249 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1250 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1251
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1252 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1253 PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1254 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1255 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1256 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1257
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1258 /* Binary in-place operators */
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1259
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1260 /* The in-place operators are defined to fall back to the 'normal',
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1261 non in-place operations, if the in-place methods are not in place.
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1262
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1263 - If the left hand object has the appropriate struct members, and
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1264 they are filled, call the appropriate function and return the
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1265 result. No coercion is done on the arguments; the left-hand object
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1266 is the one the operation is performed on, and it's up to the
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1267 function to deal with the right-hand object.
23089
314f92a24293 Whitespace normalization and fold some long lines.
Guido van Rossum <guido@python.org>
parents: 22194
diff changeset
1268
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1269 - Otherwise, in-place modification is not supported. Handle it exactly as
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1270 a non in-place operation of the same kind.
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1271
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1272 */
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1273
23089
314f92a24293 Whitespace normalization and fold some long lines.
Guido van Rossum <guido@python.org>
parents: 22194
diff changeset
1274 #define HASINPLACE(t) \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1275 PyType_HasFeature((t)->ob_type, Py_TPFLAGS_HAVE_INPLACEOPS)
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1276
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1277 static PyObject *
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1278 binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1279 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1280 PyNumberMethods *mv = v->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1281 if (mv != NULL && HASINPLACE(v)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1282 binaryfunc slot = NB_BINOP(mv, iop_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1283 if (slot) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1284 PyObject *x = (slot)(v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1285 if (x != Py_NotImplemented) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1286 return x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1287 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1288 Py_DECREF(x);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1289 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1290 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1291 return binary_op1(v, w, op_slot);
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1292 }
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1293
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1294 static PyObject *
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1295 binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1296 const char *op_name)
26865
aaca8a3b23cd Always try nb_* slots before trying sq_concat, sq_inplace_concat, sq_repeat,
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 26622
diff changeset
1297 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1298 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1299 if (result == Py_NotImplemented) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1300 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1301 return binop_type_error(v, w, op_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1302 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1303 return result;
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1304 }
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1305
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1306 #define INPLACE_BINOP(func, iop, op, op_name) \
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1307 PyObject * \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1308 func(PyObject *v, PyObject *w) { \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1309 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1310 }
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1311
15721
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1312 INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1313 INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1314 INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1315 INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1316 INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1317 INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
ead8b5b994ad Massive changes as per PEP 208. Read it for details.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 15029
diff changeset
1318 INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=")
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1319
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1320 PyObject *
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1321 PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1322 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1323 /* XXX tp_flags test */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1324 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1325 NB_SLOT(nb_floor_divide), "//=");
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1326 }
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1327
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1328 PyObject *
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1329 PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1330 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1331 /* XXX tp_flags test */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1332 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1333 NB_SLOT(nb_true_divide), "/=");
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1334 }
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1335
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
1336 PyObject *
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1337 PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1338 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1339 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1340 NB_SLOT(nb_add));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1341 if (result == Py_NotImplemented) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1342 PySequenceMethods *m = v->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1343 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1344 if (m != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1345 binaryfunc f = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1346 if (HASINPLACE(v))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1347 f = m->sq_inplace_concat;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1348 if (f == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1349 f = m->sq_concat;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1350 if (f != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1351 return (*f)(v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1352 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1353 result = binop_type_error(v, w, "+=");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1354 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1355 return result;
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1356 }
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1357
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1358 PyObject *
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1359 PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1360 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1361 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1362 NB_SLOT(nb_multiply));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1363 if (result == Py_NotImplemented) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1364 ssizeargfunc f = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1365 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1366 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1367 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1368 if (mv != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1369 if (HASINPLACE(v))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1370 f = mv->sq_inplace_repeat;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1371 if (f == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1372 f = mv->sq_repeat;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1373 if (f != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1374 return sequence_repeat(f, v, w);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1375 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1376 else if (mw != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1377 /* Note that the right hand operand should not be
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1378 * mutated in this case so sq_inplace_repeat is not
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1379 * used. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1380 if (mw->sq_repeat)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1381 return sequence_repeat(mw->sq_repeat, w, v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1382 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1383 result = binop_type_error(v, w, "*=");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1384 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1385 return result;
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1386 }
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1387
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1388 PyObject *
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1389 PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1390 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1391 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1392 NB_SLOT(nb_remainder), "%=");
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1393 }
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1394
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1395 PyObject *
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1396 PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1397 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1398 if (HASINPLACE(v) && v->ob_type->tp_as_number &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1399 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1400 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1401 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1402 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1403 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1404 }
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1405 }
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1406
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1407
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
1408 /* Unary operators and functions */
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1409
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1410 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1411 PyNumber_Negative(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1412 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1413 PyNumberMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1414
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1415 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1416 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1417 m = o->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1418 if (m && m->nb_negative)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1419 return (*m->nb_negative)(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1420
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1421 return type_error("bad operand type for unary -: '%.200s'", o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1422 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1423
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1424 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1425 PyNumber_Positive(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1426 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1427 PyNumberMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1428
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1429 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1430 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1431 m = o->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1432 if (m && m->nb_positive)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1433 return (*m->nb_positive)(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1434
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1435 return type_error("bad operand type for unary +: '%.200s'", o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1436 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1437
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1438 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1439 PyNumber_Invert(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1440 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1441 PyNumberMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1442
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1443 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1444 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1445 m = o->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1446 if (m && m->nb_invert)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1447 return (*m->nb_invert)(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1448
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1449 return type_error("bad operand type for unary ~: '%.200s'", o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1450 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1451
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1452 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1453 PyNumber_Absolute(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1454 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1455 PyNumberMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1456
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1457 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1458 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1459 m = o->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1460 if (m && m->nb_absolute)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1461 return m->nb_absolute(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1462
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1463 return type_error("bad operand type for abs(): '%.200s'", o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1464 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1465
12248
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1466 /* Add a check for embedded NULL-bytes in the argument. */
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1467 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1468 int_from_string(const char *s, Py_ssize_t len)
12248
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1469 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1470 char *end;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1471 PyObject *x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1472
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1473 x = PyInt_FromString((char*)s, &end, 10);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1474 if (x == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1475 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1476 if (end != s + len) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1477 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1478 "null byte in argument for int()");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1479 Py_DECREF(x);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1480 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1481 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1482 return x;
12248
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1483 }
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1484
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1485 /* Return a Python Int or Long from the object item
39463
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1486 Raise TypeError if the result is not an int-or-long
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1487 or if the object cannot be interpreted as an index.
39463
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1488 */
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1489 PyObject *
36882
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36834
diff changeset
1490 PyNumber_Index(PyObject *item)
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36834
diff changeset
1491 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1492 PyObject *result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1493 if (item == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1494 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1495 if (PyInt_Check(item) || PyLong_Check(item)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1496 Py_INCREF(item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1497 return item;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1498 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1499 if (PyIndex_Check(item)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1500 result = item->ob_type->tp_as_number->nb_index(item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1501 if (result &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1502 !PyInt_Check(result) && !PyLong_Check(result)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1503 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1504 "__index__ returned non-(int,long) " \
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1505 "(type %.200s)",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1506 result->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1507 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1508 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1509 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1510 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1511 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1512 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1513 "'%.200s' object cannot be interpreted "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1514 "as an index", item->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1515 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1516 return result;
36882
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36834
diff changeset
1517 }
6a9c7165b17b Checking in the code for PEP 357.
Guido van Rossum <guido@python.org>
parents: 36834
diff changeset
1518
39463
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1519 /* Return an error on Overflow only if err is not NULL*/
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1520
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1521 Py_ssize_t
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1522 PyNumber_AsSsize_t(PyObject *item, PyObject *err)
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1523 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1524 Py_ssize_t result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1525 PyObject *runerr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1526 PyObject *value = PyNumber_Index(item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1527 if (value == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1528 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1529
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1530 /* We're done if PyInt_AsSsize_t() returns without error. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1531 result = PyInt_AsSsize_t(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1532 if (result != -1 || !(runerr = PyErr_Occurred()))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1533 goto finish;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1534
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1535 /* Error handling code -- only manage OverflowError differently */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1536 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1537 goto finish;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1538
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1539 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1540 /* If no error-handling desired then the default clipping
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1541 is sufficient.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1542 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1543 if (!err) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1544 assert(PyLong_Check(value));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1545 /* Whether or not it is less than or equal to
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1546 zero is determined by the sign of ob_size
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1547 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1548 if (_PyLong_Sign(value) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1549 result = PY_SSIZE_T_MIN;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1550 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1551 result = PY_SSIZE_T_MAX;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1552 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1553 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1554 /* Otherwise replace the error with caller's error object. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1555 PyErr_Format(err,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1556 "cannot fit '%.200s' into an index-sized integer",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1557 item->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1558 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1559
39463
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1560 finish:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1561 Py_DECREF(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1562 return result;
39463
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1563 }
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1564
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1565
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1566 PyObject *
45142
f03955faffb4 Make int() and long() fall back to __trunc__(). See issue 2002.
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45028
diff changeset
1567 _PyNumber_ConvertIntegralToInt(PyObject *integral, const char* error_format)
f03955faffb4 Make int() and long() fall back to __trunc__(). See issue 2002.
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45028
diff changeset
1568 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1569 const char *type_name;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1570 static PyObject *int_name = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1571 if (int_name == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1572 int_name = PyString_InternFromString("__int__");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1573 if (int_name == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1574 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1575 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1576
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1577 if (integral && (!PyInt_Check(integral) &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1578 !PyLong_Check(integral))) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1579 /* Don't go through tp_as_number->nb_int to avoid
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1580 hitting the classic class fallback to __trunc__. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1581 PyObject *int_func = PyObject_GetAttr(integral, int_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1582 if (int_func == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1583 PyErr_Clear(); /* Raise a different error. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1584 goto non_integral_error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1585 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1586 Py_DECREF(integral);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1587 integral = PyEval_CallObject(int_func, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1588 Py_DECREF(int_func);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1589 if (integral && (!PyInt_Check(integral) &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1590 !PyLong_Check(integral))) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1591 goto non_integral_error;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1592 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1593 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1594 return integral;
45142
f03955faffb4 Make int() and long() fall back to __trunc__(). See issue 2002.
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45028
diff changeset
1595
f03955faffb4 Make int() and long() fall back to __trunc__(). See issue 2002.
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 45028
diff changeset
1596 non_integral_error:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1597 if (PyInstance_Check(integral)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1598 type_name = PyString_AS_STRING(((PyInstanceObject *)integral)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1599 ->in_class->cl_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1600 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1601 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1602 type_name = integral->ob_type->tp_name;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1603 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1604 PyErr_Format(PyExc_TypeError, error_format, type_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1605 Py_DECREF(integral);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1606 return NULL;
39463
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1607 }
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1608
6cafdc81cfde Patch #1538606, Patch to fix __index__() clipping.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39394
diff changeset
1609
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1610 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1611 PyNumber_Int(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1612 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1613 PyNumberMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1614 static PyObject *trunc_name = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1615 PyObject *trunc_func;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1616 const char *buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1617 Py_ssize_t buffer_len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1618
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1619 if (trunc_name == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1620 trunc_name = PyString_InternFromString("__trunc__");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1621 if (trunc_name == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1622 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1623 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1624
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1625 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1626 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1627 if (PyInt_CheckExact(o)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1628 Py_INCREF(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1629 return o;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1630 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1631 m = o->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1632 if (m && m->nb_int) { /* This should include subclasses of int */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1633 /* Classic classes always take this branch. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1634 PyObject *res = m->nb_int(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1635 if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1636 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1637 "__int__ returned non-int (type %.200s)",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1638 res->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1639 Py_DECREF(res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1640 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1641 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1642 return res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1643 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1644 if (PyInt_Check(o)) { /* A int subclass without nb_int */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1645 PyIntObject *io = (PyIntObject*)o;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1646 return PyInt_FromLong(io->ob_ival);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1647 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1648 trunc_func = PyObject_GetAttr(o, trunc_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1649 if (trunc_func) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1650 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1651 Py_DECREF(trunc_func);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1652 /* __trunc__ is specified to return an Integral type, but
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1653 int() needs to return an int. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1654 return _PyNumber_ConvertIntegralToInt(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1655 truncated,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1656 "__trunc__ returned non-Integral (type %.200s)");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1657 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1658 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1659
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1660 if (PyString_Check(o))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1661 return int_from_string(PyString_AS_STRING(o),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1662 PyString_GET_SIZE(o));
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
1663 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1664 if (PyUnicode_Check(o))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1665 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(o),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1666 PyUnicode_GET_SIZE(o),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1667 10);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
1668 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1669 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1670 return int_from_string((char*)buffer, buffer_len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1671
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1672 return type_error("int() argument must be a string or a "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1673 "number, not '%.200s'", o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1674 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1675
12248
70154e2e9c89 Marc-Andre's third try at this bulk patch seems to work (except that
Guido van Rossum <guido@python.org>
parents: 11969
diff changeset
1676 /* Add a check for embedded NULL-bytes in the argument. */
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 9834
diff changeset
1677 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1678 long_from_string(const char *s, Py_ssize_t len)
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 9834
diff changeset
1679 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1680 char *end;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1681 PyObject *x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1682
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1683 x = PyLong_FromString((char*)s, &end, 10);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1684 if (x == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1685 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1686 if (end != s + len) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1687 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1688 "null byte in argument for long()");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1689 Py_DECREF(x);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1690 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1691 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1692 return x;
11383
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 9834
diff changeset
1693 }
aca7b5eaf5e8 Mainlining the string_methods branch. See branch revision log
Barry Warsaw <barry@python.org>
parents: 9834
diff changeset
1694
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1695 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1696 PyNumber_Long(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1697 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1698 PyNumberMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1699 static PyObject *trunc_name = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1700 PyObject *trunc_func;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1701 const char *buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1702 Py_ssize_t buffer_len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1703
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1704 if (trunc_name == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1705 trunc_name = PyString_InternFromString("__trunc__");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1706 if (trunc_name == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1707 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1708 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1709
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1710 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1711 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1712 m = o->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1713 if (m && m->nb_long) { /* This should include subclasses of long */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1714 /* Classic classes always take this branch. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1715 PyObject *res = m->nb_long(o);
64946
6c68dbf932d0 Issue #9869: Make long() and PyNumber_Long return something of type
Mark Dickinson <dickinsm@gmail.com>
parents: 64345
diff changeset
1716 if (res == NULL)
6c68dbf932d0 Issue #9869: Make long() and PyNumber_Long return something of type
Mark Dickinson <dickinsm@gmail.com>
parents: 64345
diff changeset
1717 return NULL;
6c68dbf932d0 Issue #9869: Make long() and PyNumber_Long return something of type
Mark Dickinson <dickinsm@gmail.com>
parents: 64345
diff changeset
1718 if (PyInt_Check(res)) {
6c68dbf932d0 Issue #9869: Make long() and PyNumber_Long return something of type
Mark Dickinson <dickinsm@gmail.com>
parents: 64345
diff changeset
1719 long value = PyInt_AS_LONG(res);
6c68dbf932d0 Issue #9869: Make long() and PyNumber_Long return something of type
Mark Dickinson <dickinsm@gmail.com>
parents: 64345
diff changeset
1720 Py_DECREF(res);
6c68dbf932d0 Issue #9869: Make long() and PyNumber_Long return something of type
Mark Dickinson <dickinsm@gmail.com>
parents: 64345
diff changeset
1721 return PyLong_FromLong(value);
6c68dbf932d0 Issue #9869: Make long() and PyNumber_Long return something of type
Mark Dickinson <dickinsm@gmail.com>
parents: 64345
diff changeset
1722 }
6c68dbf932d0 Issue #9869: Make long() and PyNumber_Long return something of type
Mark Dickinson <dickinsm@gmail.com>
parents: 64345
diff changeset
1723 else if (!PyLong_Check(res)) {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1724 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1725 "__long__ returned non-long (type %.200s)",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1726 res->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1727 Py_DECREF(res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1728 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1729 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1730 return res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1731 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1732 if (PyLong_Check(o)) /* A long subclass without nb_long */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1733 return _PyLong_Copy((PyLongObject *)o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1734 trunc_func = PyObject_GetAttr(o, trunc_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1735 if (trunc_func) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1736 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1737 PyObject *int_instance;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1738 Py_DECREF(trunc_func);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1739 /* __trunc__ is specified to return an Integral type,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1740 but long() needs to return a long. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1741 int_instance = _PyNumber_ConvertIntegralToInt(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1742 truncated,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1743 "__trunc__ returned non-Integral (type %.200s)");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1744 if (int_instance && PyInt_Check(int_instance)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1745 /* Make sure that long() returns a long instance. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1746 long value = PyInt_AS_LONG(int_instance);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1747 Py_DECREF(int_instance);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1748 return PyLong_FromLong(value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1749 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1750 return int_instance;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1751 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1752 PyErr_Clear(); /* It's not an error if o.__trunc__ doesn't exist. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1753
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1754 if (PyString_Check(o))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1755 /* need to do extra error checking that PyLong_FromString()
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1756 * doesn't do. In particular long('9.5') must raise an
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1757 * exception, not truncate the float.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1758 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1759 return long_from_string(PyString_AS_STRING(o),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1760 PyString_GET_SIZE(o));
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
1761 #ifdef Py_USING_UNICODE
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1762 if (PyUnicode_Check(o))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1763 /* The above check is done in PyLong_FromUnicode(). */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1764 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(o),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1765 PyUnicode_GET_SIZE(o),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1766 10);
19343
7257e87e0720 Patch #445762: Support --disable-unicode
Martin v. Löwis <martin@v.loewis.de>
parents: 19051
diff changeset
1767 #endif
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1768 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1769 return long_from_string(buffer, buffer_len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1770
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1771 return type_error("long() argument must be a string or a "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1772 "number, not '%.200s'", o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1773 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1774
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1775 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1776 PyNumber_Float(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1777 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1778 PyNumberMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1779
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1780 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1781 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1782 m = o->ob_type->tp_as_number;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1783 if (m && m->nb_float) { /* This should include subclasses of float */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1784 PyObject *res = m->nb_float(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1785 if (res && !PyFloat_Check(res)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1786 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1787 "__float__ returned non-float (type %.200s)",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1788 res->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1789 Py_DECREF(res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1790 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1791 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1792 return res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1793 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1794 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1795 PyFloatObject *po = (PyFloatObject *)o;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1796 return PyFloat_FromDouble(po->ob_fval);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1797 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1798 return PyFloat_FromString(o, NULL);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1799 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1800
45262
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45142
diff changeset
1801 PyObject *
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45142
diff changeset
1802 PyNumber_ToBase(PyObject *n, int base)
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45142
diff changeset
1803 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1804 PyObject *res = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1805 PyObject *index = PyNumber_Index(n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1806
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1807 if (!index)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1808 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1809 if (PyLong_Check(index))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1810 res = _PyLong_Format(index, base, 0, 1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1811 else if (PyInt_Check(index))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1812 res = _PyInt_Format((PyIntObject*)index, base, 1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1813 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1814 /* It should not be possible to get here, as
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1815 PyNumber_Index already has a check for the same
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1816 condition */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1817 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1818 "int or long");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1819 Py_DECREF(index);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1820 return res;
45262
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45142
diff changeset
1821 }
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45142
diff changeset
1822
86906a5ceca6 Added PyNumber_ToBase and supporting routines _PyInt_Format and
Eric Smith <eric@trueblade.com>
parents: 45142
diff changeset
1823
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
1824 /* Operations on sequences */
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1825
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
1826 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1827 PySequence_Check(PyObject *s)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1828 {
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
1829 if (s == NULL)
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
1830 return 0;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
1831 if (PyInstance_Check(s))
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1832 return PyObject_HasAttrString(s, "__getitem__");
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
1833 if (PyDict_Check(s))
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1834 return 0;
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
1835 return s->ob_type->tp_as_sequence &&
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1836 s->ob_type->tp_as_sequence->sq_item != NULL;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1837 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1838
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1839 Py_ssize_t
13575
7c119f050290 change abstract size functions PySequence_Size &c.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13451
diff changeset
1840 PySequence_Size(PyObject *s)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1841 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1842 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1843
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1844 if (s == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1845 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1846 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1847 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1848
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1849 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1850 if (m && m->sq_length)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1851 return m->sq_length(s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1852
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1853 type_error("object of type '%.200s' has no len()", s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1854 return -1;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1855 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1856
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
1857 #undef PySequence_Length
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1858 Py_ssize_t
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
1859 PySequence_Length(PyObject *s)
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
1860 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1861 return PySequence_Size(s);
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
1862 }
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
1863 #define PySequence_Length PySequence_Size
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
1864
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1865 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
1866 PySequence_Concat(PyObject *s, PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1867 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1868 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1869
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1870 if (s == NULL || o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1871 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1872
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1873 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1874 if (m && m->sq_concat)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1875 return m->sq_concat(s, o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1876
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1877 /* Instances of user classes defining an __add__() method only
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1878 have an nb_add slot, not an sq_concat slot. So we fall back
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1879 to nb_add if both arguments appear to be sequences. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1880 if (PySequence_Check(s) && PySequence_Check(o)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1881 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1882 if (result != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1883 return result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1884 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1885 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1886 return type_error("'%.200s' object can't be concatenated", s);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1887 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1888
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1889 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1890 PySequence_Repeat(PyObject *o, Py_ssize_t count)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1891 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1892 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1893
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1894 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1895 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1896
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1897 m = o->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1898 if (m && m->sq_repeat)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1899 return m->sq_repeat(o, count);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1900
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1901 /* Instances of user classes defining a __mul__() method only
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1902 have an nb_multiply slot, not an sq_repeat slot. so we fall back
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1903 to nb_multiply if o appears to be a sequence. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1904 if (PySequence_Check(o)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1905 PyObject *n, *result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1906 n = PyInt_FromSsize_t(count);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1907 if (n == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1908 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1909 result = binary_op1(o, n, NB_SLOT(nb_multiply));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1910 Py_DECREF(n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1911 if (result != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1912 return result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1913 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1914 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1915 return type_error("'%.200s' object can't be repeated", o);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1916 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1917
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1918 PyObject *
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1919 PySequence_InPlaceConcat(PyObject *s, PyObject *o)
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1920 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1921 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1922
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1923 if (s == NULL || o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1924 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1925
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1926 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1927 if (m && HASINPLACE(s) && m->sq_inplace_concat)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1928 return m->sq_inplace_concat(s, o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1929 if (m && m->sq_concat)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1930 return m->sq_concat(s, o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1931
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1932 if (PySequence_Check(s) && PySequence_Check(o)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1933 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1934 NB_SLOT(nb_add));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1935 if (result != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1936 return result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1937 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1938 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1939 return type_error("'%.200s' object can't be concatenated", s);
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1940 }
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1941
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1942 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1943 PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1944 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1945 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1946
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1947 if (o == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1948 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1949
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1950 m = o->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1951 if (m && HASINPLACE(o) && m->sq_inplace_repeat)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1952 return m->sq_inplace_repeat(o, count);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1953 if (m && m->sq_repeat)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1954 return m->sq_repeat(o, count);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1955
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1956 if (PySequence_Check(o)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1957 PyObject *n, *result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1958 n = PyInt_FromSsize_t(count);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1959 if (n == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1960 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1961 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1962 NB_SLOT(nb_multiply));
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1963 Py_DECREF(n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1964 if (result != Py_NotImplemented)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1965 return result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1966 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1967 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1968 return type_error("'%.200s' object can't be repeated", o);
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1969 }
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1970
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14146
diff changeset
1971 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1972 PySequence_GetItem(PyObject *s, Py_ssize_t i)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1973 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1974 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1975
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1976 if (s == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1977 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1978
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1979 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1980 if (m && m->sq_item) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1981 if (i < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1982 if (m->sq_length) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1983 Py_ssize_t l = (*m->sq_length)(s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1984 if (l < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1985 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1986 i += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1987 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1988 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1989 return m->sq_item(s, i);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1990 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1991
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1992 return type_error("'%.200s' object does not support indexing", s);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1993 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1994
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1995 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1996 PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
1997 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1998 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
1999 PyMappingMethods *mp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2000
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2001 if (!s) return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2002
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2003 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2004 if (m && m->sq_slice) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2005 if (i1 < 0 || i2 < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2006 if (m->sq_length) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2007 Py_ssize_t l = (*m->sq_length)(s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2008 if (l < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2009 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2010 if (i1 < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2011 i1 += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2012 if (i2 < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2013 i2 += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2014 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2015 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2016 return m->sq_slice(s, i1, i2);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2017 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_subscript) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2018 PyObject *res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2019 PyObject *slice = _PySlice_FromIndices(i1, i2);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2020 if (!slice)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2021 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2022 res = mp->mp_subscript(s, slice);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2023 Py_DECREF(slice);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2024 return res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2025 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2026
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2027 return type_error("'%.200s' object is unsliceable", s);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2028 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2029
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2030 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
2031 PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2032 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2033 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2034
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2035 if (s == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2036 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2037 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2038 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2039
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2040 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2041 if (m && m->sq_ass_item) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2042 if (i < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2043 if (m->sq_length) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2044 Py_ssize_t l = (*m->sq_length)(s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2045 if (l < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2046 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2047 i += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2048 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2049 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2050 return m->sq_ass_item(s, i, o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2051 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2052
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2053 type_error("'%.200s' object does not support item assignment", s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2054 return -1;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2055 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2056
4090
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
2057 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
2058 PySequence_DelItem(PyObject *s, Py_ssize_t i)
4090
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
2059 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2060 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2061
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2062 if (s == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2063 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2064 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2065 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2066
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2067 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2068 if (m && m->sq_ass_item) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2069 if (i < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2070 if (m->sq_length) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2071 Py_ssize_t l = (*m->sq_length)(s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2072 if (l < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2073 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2074 i += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2075 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2076 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2077 return m->sq_ass_item(s, i, (PyObject *)NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2078 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2079
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2080 type_error("'%.200s' object doesn't support item deletion", s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2081 return -1;
4090
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
2082 }
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
2083
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2084 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
2085 PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2086 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2087 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2088 PyMappingMethods *mp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2089
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2090 if (s == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2091 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2092 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2093 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2094
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2095 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2096 if (m && m->sq_ass_slice) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2097 if (i1 < 0 || i2 < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2098 if (m->sq_length) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2099 Py_ssize_t l = (*m->sq_length)(s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2100 if (l < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2101 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2102 if (i1 < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2103 i1 += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2104 if (i2 < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2105 i2 += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2106 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2107 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2108 return m->sq_ass_slice(s, i1, i2, o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2109 } else if ((mp = s->ob_type->tp_as_mapping) && mp->mp_ass_subscript) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2110 int res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2111 PyObject *slice = _PySlice_FromIndices(i1, i2);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2112 if (!slice)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2113 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2114 res = mp->mp_ass_subscript(s, slice, o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2115 Py_DECREF(slice);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2116 return res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2117 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2118
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2119 type_error("'%.200s' object doesn't support slice assignment", s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2120 return -1;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2121 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2122
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2123 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
2124 PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
4090
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
2125 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2126 PySequenceMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2127
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2128 if (s == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2129 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2130 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2131 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2132
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2133 m = s->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2134 if (m && m->sq_ass_slice) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2135 if (i1 < 0 || i2 < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2136 if (m->sq_length) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2137 Py_ssize_t l = (*m->sq_length)(s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2138 if (l < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2139 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2140 if (i1 < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2141 i1 += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2142 if (i2 < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2143 i2 += l;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2144 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2145 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2146 return m->sq_ass_slice(s, i1, i2, (PyObject *)NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2147 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2148 type_error("'%.200s' object doesn't support slice deletion", s);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2149 return -1;
4090
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
2150 }
0b40c8d5b21d Added PyObject_DelItem and PySequence_Del{Item,Slice}.
Guido van Rossum <guido@python.org>
parents: 3097
diff changeset
2151
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2152 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2153 PySequence_Tuple(PyObject *v)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2154 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2155 PyObject *it; /* iter(v) */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2156 Py_ssize_t n; /* guess for result tuple size */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2157 PyObject *result = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2158 Py_ssize_t j;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2159
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2160 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2161 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2162
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2163 /* Special-case the common tuple and list cases, for efficiency. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2164 if (PyTuple_CheckExact(v)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2165 /* Note that we can't know whether it's safe to return
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2166 a tuple *subclass* instance as-is, hence the restriction
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2167 to exact tuples here. In contrast, lists always make
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2168 a copy, so there's no need for exactness below. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2169 Py_INCREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2170 return v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2171 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2172 if (PyList_Check(v))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2173 return PyList_AsTuple(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2174
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2175 /* Get iterator. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2176 it = PyObject_GetIter(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2177 if (it == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2178 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2179
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2180 /* Guess result size and allocate space. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2181 n = _PyObject_LengthHint(v, 10);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2182 if (n == -1)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2183 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2184 result = PyTuple_New(n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2185 if (result == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2186 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2187
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2188 /* Fill the tuple. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2189 for (j = 0; ; ++j) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2190 PyObject *item = PyIter_Next(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2191 if (item == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2192 if (PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2193 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2194 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2195 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2196 if (j >= n) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2197 Py_ssize_t oldn = n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2198 /* The over-allocation strategy can grow a bit faster
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2199 than for lists because unlike lists the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2200 over-allocation isn't permanent -- we reclaim
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2201 the excess before the end of this routine.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2202 So, grow by ten and then add 25%.
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2203 */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2204 n += 10;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2205 n += n >> 2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2206 if (n < oldn) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2207 /* Check for overflow */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2208 PyErr_NoMemory();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2209 Py_DECREF(item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2210 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2211 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2212 if (_PyTuple_Resize(&result, n) != 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2213 Py_DECREF(item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2214 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2215 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2216 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2217 PyTuple_SET_ITEM(result, j, item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2218 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2219
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2220 /* Cut tuple back if guess was too large. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2221 if (j < n &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2222 _PyTuple_Resize(&result, j) != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2223 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2224
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2225 Py_DECREF(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2226 return result;
17684
399d99601b2d Generalize tuple() to work nicely with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
2227
399d99601b2d Generalize tuple() to work nicely with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17683
diff changeset
2228 Fail:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2229 Py_XDECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2230 Py_DECREF(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2231 return NULL;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2232 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2233
4582
2f8d9c22de62 Added missing PySequence_List.
Guido van Rossum <guido@python.org>
parents: 4529
diff changeset
2234 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2235 PySequence_List(PyObject *v)
4582
2f8d9c22de62 Added missing PySequence_List.
Guido van Rossum <guido@python.org>
parents: 4529
diff changeset
2236 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2237 PyObject *result; /* result list */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2238 PyObject *rv; /* return value from PyList_Extend */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2239
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2240 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2241 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2242
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2243 result = PyList_New(0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2244 if (result == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2245 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2246
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2247 rv = _PyList_Extend((PyListObject *)result, v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2248 if (rv == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2249 Py_DECREF(result);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2250 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2251 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2252 Py_DECREF(rv);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2253 return result;
4582
2f8d9c22de62 Added missing PySequence_List.
Guido van Rossum <guido@python.org>
parents: 4529
diff changeset
2254 }
2f8d9c22de62 Added missing PySequence_List.
Guido van Rossum <guido@python.org>
parents: 4529
diff changeset
2255
12952
51949de76365 Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12248
diff changeset
2256 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2257 PySequence_Fast(PyObject *v, const char *m)
12952
51949de76365 Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12248
diff changeset
2258 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2259 PyObject *it;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2260
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2261 if (v == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2262 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2263
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2264 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2265 Py_INCREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2266 return v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2267 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2268
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2269 it = PyObject_GetIter(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2270 if (it == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2271 if (PyErr_ExceptionMatches(PyExc_TypeError))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2272 PyErr_SetString(PyExc_TypeError, m);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2273 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2274 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2275
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2276 v = PySequence_List(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2277 Py_DECREF(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2278
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2279 return v;
12952
51949de76365 Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12248
diff changeset
2280 }
51949de76365 Patch from /F:
Andrew M. Kuchling <amk@amk.ca>
parents: 12248
diff changeset
2281
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2282 /* Iterate over seq. Result depends on the operation:
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2283 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
55049
74c0a78114ae Merged revisions 69846 via svnmerge from
Jesus Cea <jcea@jcea.es>
parents: 51466
diff changeset
2284 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2285 set ValueError and return -1 if none found; also return -1 on error.
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2286 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2287 */
36834
0b7809660456 Change some sequnce APIs to use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36675
diff changeset
2288 Py_ssize_t
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2289 _PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2290 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2291 Py_ssize_t n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2292 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2293 PyObject *it; /* iter(seq) */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2294
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2295 if (seq == NULL || obj == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2296 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2297 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2298 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2299
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2300 it = PyObject_GetIter(seq);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2301 if (it == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2302 type_error("argument of type '%.200s' is not iterable", seq);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2303 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2304 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2305
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2306 n = wrapped = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2307 for (;;) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2308 int cmp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2309 PyObject *item = PyIter_Next(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2310 if (item == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2311 if (PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2312 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2313 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2314 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2315
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2316 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2317 Py_DECREF(item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2318 if (cmp < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2319 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2320 if (cmp > 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2321 switch (operation) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2322 case PY_ITERSEARCH_COUNT:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2323 if (n == PY_SSIZE_T_MAX) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2324 PyErr_SetString(PyExc_OverflowError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2325 "count exceeds C integer size");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2326 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2327 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2328 ++n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2329 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2330
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2331 case PY_ITERSEARCH_INDEX:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2332 if (wrapped) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2333 PyErr_SetString(PyExc_OverflowError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2334 "index exceeds C integer size");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2335 goto Fail;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2336 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2337 goto Done;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2338
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2339 case PY_ITERSEARCH_CONTAINS:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2340 n = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2341 goto Done;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2342
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2343 default:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2344 assert(!"unknown operation");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2345 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2346 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2347
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2348 if (operation == PY_ITERSEARCH_INDEX) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2349 if (n == PY_SSIZE_T_MAX)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2350 wrapped = 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2351 ++n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2352 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2353 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2354
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2355 if (operation != PY_ITERSEARCH_INDEX)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2356 goto Done;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2357
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2358 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2359 "sequence.index(x): x not in sequence");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2360 /* fall into failure code */
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2361 Fail:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2362 n = -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2363 /* fall through */
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2364 Done:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2365 Py_DECREF(it);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2366 return n;
17690
ee4d17862b61 Generalize PySequence_Count() (operator.countOf) to work with iterators.
Tim Peters <tim.peters@gmail.com>
parents: 17688
diff changeset
2367
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2368 }
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2369
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2370 /* Return # of times o appears in s. */
36834
0b7809660456 Change some sequnce APIs to use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36675
diff changeset
2371 Py_ssize_t
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2372 PySequence_Count(PyObject *s, PyObject *o)
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2373 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2374 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2375 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2376
17692
1812476b7fe4 Reimplement PySequence_Contains() and instance_contains(), so they work
Tim Peters <tim.peters@gmail.com>
parents: 17690
diff changeset
2377 /* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
19808
0584c9132525 Generalize operator.indexOf (PySequence_Index) to work with any
Tim Peters <tim.peters@gmail.com>
parents: 19804
diff changeset
2378 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
17692
1812476b7fe4 Reimplement PySequence_Contains() and instance_contains(), so they work
Tim Peters <tim.peters@gmail.com>
parents: 17690
diff changeset
2379 */
1812476b7fe4 Reimplement PySequence_Contains() and instance_contains(), so they work
Tim Peters <tim.peters@gmail.com>
parents: 17690
diff changeset
2380 int
1812476b7fe4 Reimplement PySequence_Contains() and instance_contains(), so they work
Tim Peters <tim.peters@gmail.com>
parents: 17690
diff changeset
2381 PySequence_Contains(PyObject *seq, PyObject *ob)
1812476b7fe4 Reimplement PySequence_Contains() and instance_contains(), so they work
Tim Peters <tim.peters@gmail.com>
parents: 17690
diff changeset
2382 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2383 Py_ssize_t result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2384 if (PyType_HasFeature(seq->ob_type, Py_TPFLAGS_HAVE_SEQUENCE_IN)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2385 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2386 if (sqm != NULL && sqm->sq_contains != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2387 return (*sqm->sq_contains)(seq, ob);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2388 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2389 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2390 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
17692
1812476b7fe4 Reimplement PySequence_Contains() and instance_contains(), so they work
Tim Peters <tim.peters@gmail.com>
parents: 17690
diff changeset
2391 }
1812476b7fe4 Reimplement PySequence_Contains() and instance_contains(), so they work
Tim Peters <tim.peters@gmail.com>
parents: 17690
diff changeset
2392
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2393 /* Backwards compatibility */
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2394 #undef PySequence_In
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2395 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2396 PySequence_In(PyObject *w, PyObject *v)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2397 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2398 return PySequence_Contains(w, v);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2399 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2400
36834
0b7809660456 Change some sequnce APIs to use Py_ssize_t.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36675
diff changeset
2401 Py_ssize_t
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2402 PySequence_Index(PyObject *s, PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2403 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2404 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2405 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2406
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2407 /* Operations on mappings */
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2408
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2409 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2410 PyMapping_Check(PyObject *o)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2411 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2412 if (o && PyInstance_Check(o))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2413 return PyObject_HasAttrString(o, "__getitem__");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2414
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2415 return o && o->ob_type->tp_as_mapping &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2416 o->ob_type->tp_as_mapping->mp_subscript &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2417 !(o->ob_type->tp_as_sequence &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2418 o->ob_type->tp_as_sequence->sq_slice);
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2419 }
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2420
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
2421 Py_ssize_t
13575
7c119f050290 change abstract size functions PySequence_Size &c.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 13451
diff changeset
2422 PyMapping_Size(PyObject *o)
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2423 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2424 PyMappingMethods *m;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2425
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2426 if (o == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2427 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2428 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2429 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2430
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2431 m = o->ob_type->tp_as_mapping;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2432 if (m && m->mp_length)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2433 return m->mp_length(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2434
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2435 type_error("object of type '%.200s' has no len()", o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2436 return -1;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2437 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2438
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
2439 #undef PyMapping_Length
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
2440 Py_ssize_t
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
2441 PyMapping_Length(PyObject *o)
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
2442 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2443 return PyMapping_Size(o);
13634
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
2444 }
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
2445 #define PyMapping_Length PyMapping_Size
6f0d96e6b5a5 Restore PyXXX_Length() APIs for binary compatibility.
Marc-André Lemburg <mal@egenix.com>
parents: 13575
diff changeset
2446
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2447 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2448 PyMapping_GetItemString(PyObject *o, char *key)
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2449 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2450 PyObject *okey, *r;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2451
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2452 if (key == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2453 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2454
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2455 okey = PyString_FromString(key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2456 if (okey == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2457 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2458 r = PyObject_GetItem(o, okey);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2459 Py_DECREF(okey);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2460 return r;
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2461 }
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2462
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2463 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2464 PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2465 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2466 PyObject *okey;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2467 int r;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2468
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2469 if (key == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2470 null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2471 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2472 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2473
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2474 okey = PyString_FromString(key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2475 if (okey == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2476 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2477 r = PyObject_SetItem(o, okey, value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2478 Py_DECREF(okey);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2479 return r;
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2480 }
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2481
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2482 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2483 PyMapping_HasKeyString(PyObject *o, char *key)
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2484 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2485 PyObject *v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2486
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2487 v = PyMapping_GetItemString(o, key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2488 if (v) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2489 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2490 return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2491 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2492 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2493 return 0;
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2494 }
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2495
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2496 int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2497 PyMapping_HasKey(PyObject *o, PyObject *key)
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2498 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2499 PyObject *v;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2500
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2501 v = PyObject_GetItem(o, key);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2502 if (v) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2503 Py_DECREF(v);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2504 return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2505 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2506 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2507 return 0;
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2508 }
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2509
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2510 /* Operations on callable objects */
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2511
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2512 /* XXX PyCallable_Check() is in object.c */
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2513
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2514 PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13447
diff changeset
2515 PyObject_CallObject(PyObject *o, PyObject *a)
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2516 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2517 return PyEval_CallObjectWithKeywords(o, a, NULL);
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2518 }
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2519
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2520 PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17976
diff changeset
2521 PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17976
diff changeset
2522 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2523 ternaryfunc call;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2524
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2525 if ((call = func->ob_type->tp_call) != NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2526 PyObject *result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2527 if (Py_EnterRecursiveCall(" while calling a Python object"))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2528 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2529 result = (*call)(func, arg, kw);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2530 Py_LeaveRecursiveCall();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2531 if (result == NULL && !PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2532 PyErr_SetString(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2533 PyExc_SystemError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2534 "NULL result without error in PyObject_Call");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2535 return result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2536 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2537 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2538 func->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2539 return NULL;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17976
diff changeset
2540 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17976
diff changeset
2541
37702
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2542 static PyObject*
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2543 call_function_tail(PyObject *callable, PyObject *args)
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2544 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2545 PyObject *retval;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2546
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2547 if (args == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2548 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2549
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2550 if (!PyTuple_Check(args)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2551 PyObject *a;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2552
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2553 a = PyTuple_New(1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2554 if (a == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2555 Py_DECREF(args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2556 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2557 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2558 PyTuple_SET_ITEM(a, 0, args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2559 args = a;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2560 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2561 retval = PyObject_Call(callable, args, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2562
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2563 Py_DECREF(args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2564
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2565 return retval;
37702
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2566 }
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2567
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17976
diff changeset
2568 PyObject *
8400
6270c6bad811 Completely reformatted, standardizing indentation as well as
Guido van Rossum <guido@python.org>
parents: 7854
diff changeset
2569 PyObject_CallFunction(PyObject *callable, char *format, ...)
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2570 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2571 va_list va;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2572 PyObject *args;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2573
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2574 if (callable == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2575 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2576
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2577 if (format && *format) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2578 va_start(va, format);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2579 args = Py_VaBuildValue(format, va);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2580 va_end(va);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2581 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2582 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2583 args = PyTuple_New(0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2584
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2585 return call_function_tail(callable, args);
37702
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2586 }
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2587
37702
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2588 PyObject *
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2589 _PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2590 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2591 va_list va;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2592 PyObject *args;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2593
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2594 if (callable == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2595 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2596
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2597 if (format && *format) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2598 va_start(va, format);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2599 args = _Py_VaBuildValue_SizeT(format, va);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2600 va_end(va);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2601 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2602 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2603 args = PyTuple_New(0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2604
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2605 return call_function_tail(callable, args);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2606 }
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2607
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2608 PyObject *
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2609 PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2610 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2611 va_list va;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2612 PyObject *args;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2613 PyObject *func = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2614 PyObject *retval = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2615
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2616 if (o == NULL || name == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2617 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2618
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2619 func = PyObject_GetAttrString(o, name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2620 if (func == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2621 PyErr_SetString(PyExc_AttributeError, name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2622 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2623 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2624
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2625 if (!PyCallable_Check(func)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2626 type_error("attribute of type '%.200s' is not callable", func);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2627 goto exit;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2628 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2629
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2630 if (format && *format) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2631 va_start(va, format);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2632 args = Py_VaBuildValue(format, va);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2633 va_end(va);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2634 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2635 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2636 args = PyTuple_New(0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2637
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2638 retval = call_function_tail(func, args);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2639
37702
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2640 exit:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2641 /* args gets consumed in call_function_tail */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2642 Py_XDECREF(func);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2643
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2644 return retval;
37702
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2645 }
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2646
37702
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2647 PyObject *
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2648 _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
9b22d8b7bcaa Make Py_BuildValue, PyObject_CallFunction and
Martin v. Löwis <martin@v.loewis.de>
parents: 37308
diff changeset
2649 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2650 va_list va;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2651 PyObject *args;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2652 PyObject *func = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2653 PyObject *retval = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2654
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2655 if (o == NULL || name == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2656 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2657
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2658 func = PyObject_GetAttrString(o, name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2659 if (func == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2660 PyErr_SetString(PyExc_AttributeError, name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2661 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2662 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2663
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2664 if (!PyCallable_Check(func)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2665 type_error("attribute of type '%.200s' is not callable", func);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2666 goto exit;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2667 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2668
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2669 if (format && *format) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2670 va_start(va, format);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2671 args = _Py_VaBuildValue_SizeT(format, va);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2672 va_end(va);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2673 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2674 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2675 args = PyTuple_New(0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2676
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2677 retval = call_function_tail(func, args);
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2678
35225
Michael W. Hudson <mwh@python.net>
parents: 34931
diff changeset
2679 exit:
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2680 /* args gets consumed in call_function_tail */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2681 Py_XDECREF(func);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2682
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2683 return retval;
2840
d5398acafa2c Generic Abstract Object Interface
Guido van Rossum <guido@python.org>
parents:
diff changeset
2684 }
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2685
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2686
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2687 static PyObject *
20729
cd600039a123 PyObject_CallFunctionObArgs() ---> PyObject_CallFunctionObjArgs()
Fred Drake <fdrake@acm.org>
parents: 20719
diff changeset
2688 objargs_mktuple(va_list va)
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2689 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2690 int i, n = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2691 va_list countva;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2692 PyObject *result, *tmp;
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2693
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2694 #ifdef VA_LIST_IS_ARRAY
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2695 memcpy(countva, va, sizeof(va_list));
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2696 #else
24400
81ca6ca5c307 Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents: 23703
diff changeset
2697 #ifdef __va_copy
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2698 __va_copy(countva, va);
24400
81ca6ca5c307 Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents: 23703
diff changeset
2699 #else
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2700 countva = va;
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2701 #endif
24400
81ca6ca5c307 Patch #554716: Use __va_copy where available.
Martin v. Löwis <martin@v.loewis.de>
parents: 23703
diff changeset
2702 #endif
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2703
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2704 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2705 ++n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2706 result = PyTuple_New(n);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2707 if (result != NULL && n > 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2708 for (i = 0; i < n; ++i) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2709 tmp = (PyObject *)va_arg(va, PyObject *);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2710 PyTuple_SET_ITEM(result, i, tmp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2711 Py_INCREF(tmp);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2712 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2713 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2714 return result;
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2715 }
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2716
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2717 PyObject *
20729
cd600039a123 PyObject_CallFunctionObArgs() ---> PyObject_CallFunctionObjArgs()
Fred Drake <fdrake@acm.org>
parents: 20719
diff changeset
2718 PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2719 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2720 PyObject *args, *tmp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2721 va_list vargs;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2722
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2723 if (callable == NULL || name == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2724 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2725
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2726 callable = PyObject_GetAttr(callable, name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2727 if (callable == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2728 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2729
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2730 /* count the args */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2731 va_start(vargs, name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2732 args = objargs_mktuple(vargs);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2733 va_end(vargs);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2734 if (args == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2735 Py_DECREF(callable);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2736 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2737 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2738 tmp = PyObject_Call(callable, args, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2739 Py_DECREF(args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2740 Py_DECREF(callable);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2741
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2742 return tmp;
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2743 }
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2744
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2745 PyObject *
20729
cd600039a123 PyObject_CallFunctionObArgs() ---> PyObject_CallFunctionObjArgs()
Fred Drake <fdrake@acm.org>
parents: 20719
diff changeset
2746 PyObject_CallFunctionObjArgs(PyObject *callable, ...)
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2747 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2748 PyObject *args, *tmp;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2749 va_list vargs;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2750
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2751 if (callable == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2752 return null_error();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2753
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2754 /* count the args */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2755 va_start(vargs, callable);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2756 args = objargs_mktuple(vargs);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2757 va_end(vargs);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2758 if (args == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2759 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2760 tmp = PyObject_Call(callable, args, NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2761 Py_DECREF(args);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2762
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2763 return tmp;
20694
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2764 }
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2765
d02068d163cf Added two new functions to conveniently call functions/methods from C.
Fred Drake <fdrake@acm.org>
parents: 20683
diff changeset
2766
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2767 /* isinstance(), issubclass() */
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2768
23260
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2769 /* abstract_get_bases() has logically 4 return states, with a sort of 0th
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2770 * state that will almost never happen.
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2771 *
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2772 * 0. creating the __bases__ static string could get a MemoryError
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2773 * 1. getattr(cls, '__bases__') could raise an AttributeError
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2774 * 2. getattr(cls, '__bases__') could raise some other exception
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2775 * 3. getattr(cls, '__bases__') could return a tuple
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2776 * 4. getattr(cls, '__bases__') could return something other than a tuple
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2777 *
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2778 * Only state #3 is a non-error state and only it returns a non-NULL object
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2779 * (it returns the retrieved tuple).
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2780 *
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2781 * Any raised AttributeErrors are masked by clearing the exception and
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2782 * returning NULL. If an object other than a tuple comes out of __bases__,
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2783 * then again, the return value is NULL. So yes, these two situations
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2784 * produce exactly the same results: NULL is returned and no error is set.
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2785 *
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2786 * If some exception other than AttributeError is raised, then NULL is also
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2787 * returned, but the exception is not cleared. That's because we want the
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2788 * exception to be propagated along.
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2789 *
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2790 * Callers are expected to test for PyErr_Occurred() when the return value
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2791 * is NULL to decide whether a valid exception should be propagated or not.
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2792 * When there's no exception to propagate, it's customary for the caller to
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2793 * set a TypeError.
9e3532b75471 abstract_get_bases(): Clarify exactly what the return values and
Barry Warsaw <barry@python.org>
parents: 23090
diff changeset
2794 */
20507
364c238a6871 Fix error checking done by abstract_issubclass and abstract_isinstance.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20307
diff changeset
2795 static PyObject *
364c238a6871 Fix error checking done by abstract_issubclass and abstract_isinstance.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20307
diff changeset
2796 abstract_get_bases(PyObject *cls)
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2797 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2798 static PyObject *__bases__ = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2799 PyObject *bases;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2800
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2801 if (__bases__ == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2802 __bases__ = PyString_InternFromString("__bases__");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2803 if (__bases__ == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2804 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2805 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2806 bases = PyObject_GetAttr(cls, __bases__);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2807 if (bases == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2808 if (PyErr_ExceptionMatches(PyExc_AttributeError))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2809 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2810 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2811 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2812 if (!PyTuple_Check(bases)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2813 Py_DECREF(bases);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2814 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2815 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2816 return bases;
20507
364c238a6871 Fix error checking done by abstract_issubclass and abstract_isinstance.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20307
diff changeset
2817 }
364c238a6871 Fix error checking done by abstract_issubclass and abstract_isinstance.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20307
diff changeset
2818
364c238a6871 Fix error checking done by abstract_issubclass and abstract_isinstance.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20307
diff changeset
2819
364c238a6871 Fix error checking done by abstract_issubclass and abstract_isinstance.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20307
diff changeset
2820 static int
364c238a6871 Fix error checking done by abstract_issubclass and abstract_isinstance.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20307
diff changeset
2821 abstract_issubclass(PyObject *derived, PyObject *cls)
364c238a6871 Fix error checking done by abstract_issubclass and abstract_isinstance.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 20307
diff changeset
2822 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2823 PyObject *bases = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2824 Py_ssize_t i, n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2825 int r = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2826
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2827 while (1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2828 if (derived == cls)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2829 return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2830 bases = abstract_get_bases(derived);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2831 if (bases == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2832 if (PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2833 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2834 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2835 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2836 n = PyTuple_GET_SIZE(bases);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2837 if (n == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2838 Py_DECREF(bases);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2839 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2840 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2841 /* Avoid recursivity in the single inheritance case */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2842 if (n == 1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2843 derived = PyTuple_GET_ITEM(bases, 0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2844 Py_DECREF(bases);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2845 continue;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2846 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2847 for (i = 0; i < n; i++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2848 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2849 if (r != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2850 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2851 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2852 Py_DECREF(bases);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2853 return r;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2854 }
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2855 }
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2856
26612
97f83542f8ee Enhance issubclass() and PyObject_IsSubclass() so that a tuple is
Walter Dörwald <walter@livinglogic.de>
parents: 26567
diff changeset
2857 static int
97f83542f8ee Enhance issubclass() and PyObject_IsSubclass() so that a tuple is
Walter Dörwald <walter@livinglogic.de>
parents: 26567
diff changeset
2858 check_class(PyObject *cls, const char *error)
97f83542f8ee Enhance issubclass() and PyObject_IsSubclass() so that a tuple is
Walter Dörwald <walter@livinglogic.de>
parents: 26567
diff changeset
2859 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2860 PyObject *bases = abstract_get_bases(cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2861 if (bases == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2862 /* Do not mask errors. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2863 if (!PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2864 PyErr_SetString(PyExc_TypeError, error);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2865 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2866 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2867 Py_DECREF(bases);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2868 return -1;
26612
97f83542f8ee Enhance issubclass() and PyObject_IsSubclass() so that a tuple is
Walter Dörwald <walter@livinglogic.de>
parents: 26567
diff changeset
2869 }
97f83542f8ee Enhance issubclass() and PyObject_IsSubclass() so that a tuple is
Walter Dörwald <walter@livinglogic.de>
parents: 26567
diff changeset
2870
31723
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
2871 static int
48876
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
2872 recursive_isinstance(PyObject *inst, PyObject *cls)
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2873 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2874 PyObject *icls;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2875 static PyObject *__class__ = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2876 int retval = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2877
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2878 if (__class__ == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2879 __class__ = PyString_InternFromString("__class__");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2880 if (__class__ == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2881 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2882 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2883
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2884 if (PyClass_Check(cls) && PyInstance_Check(inst)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2885 PyObject *inclass =
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2886 (PyObject*)((PyInstanceObject*)inst)->in_class;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2887 retval = PyClass_IsSubclass(inclass, cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2888 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2889 else if (PyType_Check(cls)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2890 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2891 if (retval == 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2892 PyObject *c = PyObject_GetAttr(inst, __class__);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2893 if (c == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2894 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2895 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2896 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2897 if (c != (PyObject *)(inst->ob_type) &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2898 PyType_Check(c))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2899 retval = PyType_IsSubtype(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2900 (PyTypeObject *)c,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2901 (PyTypeObject *)cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2902 Py_DECREF(c);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2903 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2904 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2905 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2906 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2907 if (!check_class(cls,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2908 "isinstance() arg 2 must be a class, type,"
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2909 " or tuple of classes and types"))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2910 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2911 icls = PyObject_GetAttr(inst, __class__);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2912 if (icls == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2913 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2914 retval = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2915 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2916 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2917 retval = abstract_issubclass(icls, cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2918 Py_DECREF(icls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2919 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2920 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2921
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2922 return retval;
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2923 }
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2924
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2925 int
31723
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
2926 PyObject_IsInstance(PyObject *inst, PyObject *cls)
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
2927 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2928 static PyObject *name = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2929
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2930 /* Quick test for an exact match */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2931 if (Py_TYPE(inst) == (PyTypeObject *)cls)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2932 return 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2933
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2934 if (PyTuple_Check(cls)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2935 Py_ssize_t i;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2936 Py_ssize_t n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2937 int r = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2938
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2939 if (Py_EnterRecursiveCall(" in __instancecheck__"))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2940 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2941 n = PyTuple_GET_SIZE(cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2942 for (i = 0; i < n; ++i) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2943 PyObject *item = PyTuple_GET_ITEM(cls, i);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2944 r = PyObject_IsInstance(inst, item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2945 if (r != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2946 /* either found it, or got an error */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2947 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2948 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2949 Py_LeaveRecursiveCall();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2950 return r;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2951 }
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2952
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2953 if (!(PyClass_Check(cls) || PyInstance_Check(cls))) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2954 PyObject *checker;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2955 checker = _PyObject_LookupSpecial(cls, "__instancecheck__", &name);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2956 if (checker != NULL) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2957 PyObject *res;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2958 int ok = -1;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2959 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2960 Py_DECREF(checker);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2961 return ok;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2962 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2963 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2964 Py_LeaveRecursiveCall();
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2965 Py_DECREF(checker);
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2966 if (res != NULL) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2967 ok = PyObject_IsTrue(res);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2968 Py_DECREF(res);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2969 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2970 return ok;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2971 }
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2972 else if (PyErr_Occurred())
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
2973 return -1;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2974 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2975 return recursive_isinstance(inst, cls);
31723
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
2976 }
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
2977
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
2978 static int
48876
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
2979 recursive_issubclass(PyObject *derived, PyObject *cls)
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
2980 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2981 int retval;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2982
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2983 if (PyType_Check(cls) && PyType_Check(derived)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2984 /* Fast path (non-recursive) */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2985 return PyType_IsSubtype(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2986 (PyTypeObject *)derived, (PyTypeObject *)cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2987 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2988 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2989 if (!check_class(derived,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2990 "issubclass() arg 1 must be a class"))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2991 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2992
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2993 if (!check_class(cls,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2994 "issubclass() arg 2 must be a class"
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2995 " or tuple of classes"))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2996 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2997 retval = abstract_issubclass(derived, cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2998 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
2999 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3000 /* shortcut */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3001 if (!(retval = (derived == cls)))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3002 retval = PyClass_IsSubclass(derived, cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3003 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3004
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3005 return retval;
17111
bf678a11c21a Move the code implementing isinstance() and issubclass() to new C
Guido van Rossum <guido@python.org>
parents: 15944
diff changeset
3006 }
17597
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17111
diff changeset
3007
31723
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
3008 int
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
3009 PyObject_IsSubclass(PyObject *derived, PyObject *cls)
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
3010 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3011 static PyObject *name = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3012
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3013 if (PyTuple_Check(cls)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3014 Py_ssize_t i;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3015 Py_ssize_t n;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3016 int r = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3017
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3018 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3019 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3020 n = PyTuple_GET_SIZE(cls);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3021 for (i = 0; i < n; ++i) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3022 PyObject *item = PyTuple_GET_ITEM(cls, i);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3023 r = PyObject_IsSubclass(derived, item);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3024 if (r != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3025 /* either found it, or got an error */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3026 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3027 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3028 Py_LeaveRecursiveCall();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3029 return r;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3030 }
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3031 if (!(PyClass_Check(cls) || PyInstance_Check(cls))) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3032 PyObject *checker;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3033 checker = _PyObject_LookupSpecial(cls, "__subclasscheck__", &name);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3034 if (checker != NULL) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3035 PyObject *res;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3036 int ok = -1;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3037 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3038 Py_DECREF(checker);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3039 return ok;
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3040 }
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3041 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3042 Py_LeaveRecursiveCall();
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3043 Py_DECREF(checker);
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3044 if (res != NULL) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3045 ok = PyObject_IsTrue(res);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3046 Py_DECREF(res);
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3047 }
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3048 return ok;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3049 }
61463
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3050 else if (PyErr_Occurred()) {
fd25030223b0 Untabify C files. Will watch buildbots.
Antoine Pitrou <solipsis@pitrou.net>
parents: 61205
diff changeset
3051 return -1;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3052 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3053 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3054 return recursive_issubclass(derived, cls);
48876
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3055 }
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3056
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3057 int
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3058 _PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3059 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3060 return recursive_isinstance(inst, cls);
48876
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3061 }
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3062
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3063 int
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3064 _PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
d01c1d768841 Issue #2534: speed up isinstance() and issubclass() by 50-70%, so as to
Antoine Pitrou <solipsis@pitrou.net>
parents: 48236
diff changeset
3065 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3066 return recursive_issubclass(derived, cls);
31723
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
3067 }
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
3068
d69fb35f1eae Limit the nesting depth of a tuple passed as the second argument to
Brett Cannon <bcannon@gmail.com>
parents: 31676
diff changeset
3069
17597
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17111
diff changeset
3070 PyObject *
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17111
diff changeset
3071 PyObject_GetIter(PyObject *o)
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17111
diff changeset
3072 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3073 PyTypeObject *t = o->ob_type;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3074 getiterfunc f = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3075 if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3076 f = t->tp_iter;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3077 if (f == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3078 if (PySequence_Check(o))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3079 return PySeqIter_New(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3080 return type_error("'%.200s' object is not iterable", o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3081 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3082 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3083 PyObject *res = (*f)(o);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3084 if (res != NULL && !PyIter_Check(res)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3085 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3086 "iter() returned non-iterator "
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3087 "of type '%.100s'",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3088 res->ob_type->tp_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3089 Py_DECREF(res);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3090 res = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3091 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3092 return res;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3093 }
17597
32e7d0898eab Iterators phase 1. This comprises:
Guido van Rossum <guido@python.org>
parents: 17111
diff changeset
3094 }
17617
aac65f50df6f Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents: 17597
diff changeset
3095
17683
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17653
diff changeset
3096 /* Return next item.
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17653
diff changeset
3097 * If an error occurs, return NULL. PyErr_Occurred() will be true.
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17653
diff changeset
3098 * If the iteration terminates normally, return NULL and clear the
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17653
diff changeset
3099 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17653
diff changeset
3100 * will be false.
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17653
diff changeset
3101 * Else return the next object. PyErr_Occurred() will be false.
e9a4e27e8d4e Make PyIter_Next() a little smarter (wrt its knowledge of iterator
Tim Peters <tim.peters@gmail.com>
parents: 17653
diff changeset
3102 */
17617
aac65f50df6f Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents: 17597
diff changeset
3103 PyObject *
aac65f50df6f Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents: 17597
diff changeset
3104 PyIter_Next(PyObject *iter)
aac65f50df6f Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents: 17597
diff changeset
3105 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3106 PyObject *result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3107 result = (*iter->ob_type->tp_iternext)(iter);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3108 if (result == NULL &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3109 PyErr_Occurred() &&
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3110 PyErr_ExceptionMatches(PyExc_StopIteration))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3111 PyErr_Clear();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55049
diff changeset
3112 return result;
17617
aac65f50df6f Mondo changes to the iterator stuff, without changing how Python code
Guido van Rossum <guido@python.org>
parents: 17597
diff changeset
3113 }